aliencharts 0.3.0 → 0.3.2
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/README.md +67 -32
- package/dist/aliencharts.global.js +3327 -0
- package/dist/aliencharts.global.js.map +7 -0
- package/dist/aliencharts.global.min.js +159 -0
- package/dist/aliencharts.global.min.js.map +7 -0
- package/package.json +3 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/vanilla/index.js", "../src/icons.js", "../src/core/drawingUtils.js", "../src/core/chartModel.js", "../src/core/coordinateTransform.js", "../src/core/renderers/webglUtils.js", "../src/core/renderers/barRenderer.js", "../src/core/lodSeries.js", "../src/core/renderers/lineRenderer.js", "../src/core/renderers/index.js", "../src/core/chartRenderer.js", "../src/vanilla/createChartGrid.js", "../src/core/mockData.js"],
|
|
4
|
+
"sourcesContent": ["export { createChartGrid } from \"./createChartGrid.js\";\nexport {\n BarSeries,\n LineSeries,\n createBarSeries,\n createLineSeries,\n createSeries,\n} from \"../core/lodSeries.js\";\nexport { createMockCharts } from \"../core/mockData.js\";\n", "// Icons downloaded from https://phosphoricons.com/\nconst icons = {\n arrowLineRight: '<line x1=\"32\" y1=\"128\" x2=\"176\" y2=\"128\"/><polyline points=\"104 56 176 128 104 200\"/><line x1=\"216\" y1=\"40\" x2=\"216\" y2=\"216\"/>',\n pushPinSimple: '<path d=\"M224,176a8,8,0,0,1-8,8H136v56a8,8,0,0,1-16,0V184H40a8,8,0,0,1,0-16h9.29L70.46,48H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16h-6.46l21.17,120H216A8,8,0,0,1,224,176Z\"/>',\n arrowCounterClockwise: '<polyline points=\"24 56 24 104 72 104\"/><path d=\"M67.59,192A88,88,0,1,0,65.77,65.77L24,104\"/>',\n arrowsIn: '<polyline points=\"192 104 152 104 152 64\"/><line x1=\"208\" y1=\"48\" x2=\"152\" y2=\"104\"/><polyline points=\"64 152 104 152 104 192\"/><line x1=\"48\" y1=\"208\" x2=\"104\" y2=\"152\"/><polyline points=\"152 192 152 152 192 152\"/><line x1=\"208\" y1=\"208\" x2=\"152\" y2=\"152\"/><polyline points=\"104 64 104 104 64 104\"/><line x1=\"48\" y1=\"48\" x2=\"104\" y2=\"104\"/>',\n arrowsOut: '<polyline points=\"160 48 208 48 208 96\"/><line x1=\"152\" y1=\"104\" x2=\"208\" y2=\"48\"/><polyline points=\"96 208 48 208 48 160\"/><line x1=\"104\" y1=\"152\" x2=\"48\" y2=\"208\"/><polyline points=\"208 160 208 208 160 208\"/><line x1=\"152\" y1=\"152\" x2=\"208\" y2=\"208\"/><polyline points=\"48 96 48 48 96 48\"/><line x1=\"104\" y1=\"104\" x2=\"48\" y2=\"48\"/>',\n broom: '<path d=\"M112,224a95.2,95.2,0,0,1-29-48\"/><path d=\"M192,152c0,31.67,13.31,59,40,72H61A103.65,103.65,0,0,1,32,152c0-28.21,11.23-50.89,29.47-69.64a8,8,0,0,1,8.67-1.81L95.52,90.83a16,16,0,0,0,20.82-9l21-53.11c4.15-10,15.47-15.32,25.63-11.53a20,20,0,0,1,11.51,26.4L153.13,96.69a16,16,0,0,0,8.93,20.76L187,127.29a8,8,0,0,1,5,7.43Z\"/><line x1=\"40.54\" y1=\"112.21\" x2=\"194.26\" y2=\"173.7\"/>',\n waveSine: '<path d=\"M24,128c104-221.7,104,221.7,208,0\"/>',\n magnifyingGlassPlus: '<line x1=\"80\" y1=\"112\" x2=\"144\" y2=\"112\"/><circle cx=\"112\" cy=\"112\" r=\"80\"/><line x1=\"168.57\" y1=\"168.57\" x2=\"224\" y2=\"224\"/><line x1=\"112\" y1=\"80\" x2=\"112\" y2=\"144\"/>',\n mapPin: '<circle cx=\"128\" cy=\"104\" r=\"32\"/><path d=\"M208,104c0,72-80,128-80,128S48,176,48,104a80,80,0,0,1,160,0Z\"/>',\n minus: '<line x1=\"40\" y1=\"128\" x2=\"216\" y2=\"128\"/>',\n eye: '<path d=\"M128,56C48,56,16,128,16,128s32,72,112,72,112-72,112-72S208,56,128,56Z\"/><circle cx=\"128\" cy=\"128\" r=\"32\"/>',\n};\n\nconst filledIcons = new Set([\"pushPinSimple\"]);\n\nexport const iconSvg = (name, { size = 16, className = \"\" } = {}) => {\n const body = icons[name];\n if (!body) throw new Error(`Unknown AlienCharts icon: ${name}`);\n const paint = filledIcons.has(name)\n ? 'fill=\"currentColor\"'\n : 'fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"24\"';\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" width=\"${size}\" height=\"${size}\" class=\"${className}\" aria-hidden=\"true\" ${paint}>${body}</svg>`;\n};\n\nexport const createIconElement = (documentRef, name, options) => {\n const template = documentRef.createElement(\"template\");\n template.innerHTML = iconSvg(name, options).trim();\n return template.content.firstElementChild;\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\nconst extendRayToPlotBoundary = (origin, through, plot) => {\n const dx = through.x - origin.x;\n const dy = through.y - origin.y;\n if (Math.abs(dx) <= 0.000001 && Math.abs(dy) <= 0.000001) return through;\n\n const candidates = [];\n if (dx > 0.000001) candidates.push((plot.x + plot.width - origin.x) / dx);\n else if (dx < -0.000001) candidates.push((plot.x - origin.x) / dx);\n if (dy > 0.000001) candidates.push((plot.y + plot.height - origin.y) / dy);\n else if (dy < -0.000001) candidates.push((plot.y - origin.y) / dy);\n\n const boundaryScale = Math.min(\n ...candidates.filter((scale) => Number.isFinite(scale) && scale >= 0),\n );\n const scale = Number.isFinite(boundaryScale) ? Math.max(1, boundaryScale) : 1;\n return {\n x: origin.x + dx * scale,\n y: origin.y + dy * scale,\n };\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 if (style.extendLeft) lineStart = extendRayToPlotBoundary(end, start, layout.plot);\n if (style.extendRight) lineEnd = extendRayToPlotBoundary(start, end, layout.plot);\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", "const LINE_CAPABILITIES = Object.freeze({\n appendAnimation: true,\n drawings: true,\n latestValue: true,\n markers: true,\n movingAverage: true,\n});\n\nconst BAR_CAPABILITIES = Object.freeze({\n appendAnimation: false,\n drawings: false,\n latestValue: false,\n markers: false,\n movingAverage: false,\n});\n\nconst CHART_DEFINITIONS = Object.freeze({\n line: Object.freeze({\n capabilities: LINE_CAPABILITIES,\n defaultOrientation: \"vertical\",\n orientationFromSeries: false,\n orientations: Object.freeze([\"vertical\"]),\n rangeIncludesZero: false,\n }),\n bar: Object.freeze({\n capabilities: BAR_CAPABILITIES,\n defaultOrientation: \"vertical\",\n orientationFromSeries: true,\n orientations: Object.freeze([\"vertical\", \"horizontal\"]),\n rangeIncludesZero: true,\n }),\n});\n\nexport const getChartCategories = (chart) => {\n if (chart?.categories == null) return [];\n if (!Array.isArray(chart.categories)) {\n throw new TypeError(`Chart \"${chart.id}\" categories must be an array`);\n }\n const values = new Set();\n return chart.categories.map((category, index) => {\n const normalized =\n typeof category === \"string\"\n ? { value: index, label: category }\n : { value: Number(category?.value), label: category?.label };\n if (\n !Number.isFinite(normalized.value) ||\n typeof normalized.label !== \"string\"\n ) {\n throw new TypeError(\n `Chart \"${chart.id}\" category ${index} must be a string or a { value, label } object`,\n );\n }\n if (values.has(normalized.value)) {\n throw new TypeError(\n `Chart \"${chart.id}\" has duplicate category value ${normalized.value}`,\n );\n }\n values.add(normalized.value);\n return normalized;\n });\n};\n\nexport const getCategoryLabel = (chart, value) =>\n getChartCategories(chart).find((category) => category.value === value)\n ?.label;\n\nexport const getSeriesType = (series) => {\n if (series?.type == null) return \"line\";\n if (Object.prototype.hasOwnProperty.call(CHART_DEFINITIONS, series.type)) {\n return series.type;\n }\n throw new TypeError(`Unknown AlienCharts series type: \"${series.type}\"`);\n};\n\nexport const resolveChartDescriptor = (chart) => {\n const series = Array.isArray(chart?.series) ? chart.series : [];\n const categories = getChartCategories(chart);\n const type = series.length ? getSeriesType(series[0]) : \"line\";\n const definition = CHART_DEFINITIONS[type];\n const orientation =\n definition.orientationFromSeries\n ? series[0]?.orientation || definition.defaultOrientation\n : definition.defaultOrientation;\n\n series.forEach((item) => {\n const itemType = getSeriesType(item);\n if (itemType !== type) {\n const mixedTypes = new Set([type, itemType]);\n const typeLabel =\n mixedTypes.has(\"line\") && mixedTypes.has(\"bar\")\n ? \"line and bar\"\n : `${type} and ${itemType}`;\n throw new TypeError(\n `Chart \"${chart.id}\" cannot mix ${typeLabel} series`,\n );\n }\n const itemOrientation =\n definition.orientationFromSeries\n ? item.orientation || definition.defaultOrientation\n : definition.defaultOrientation;\n if (!definition.orientations.includes(itemOrientation)) {\n throw new TypeError(\n `Chart \"${chart.id}\" has an invalid ${itemType} orientation`,\n );\n }\n if (itemOrientation !== orientation) {\n throw new TypeError(\n `Chart \"${chart.id}\" cannot mix ${itemType} orientations`,\n );\n }\n });\n\n return Object.freeze({\n capabilities: definition.capabilities,\n categorical: categories.length > 0,\n orientation,\n rangeIncludesZero: definition.rangeIncludesZero,\n rendererType: type,\n type,\n });\n};\n\nexport const resolveChartDescriptors = (charts) => {\n const descriptors = new Map();\n charts.forEach((chart) => {\n descriptors.set(chart.id, resolveChartDescriptor(chart));\n });\n return descriptors;\n};\n\nexport const getChartDescriptor = (chart, descriptors) =>\n descriptors?.get(chart?.id) || resolveChartDescriptor(chart);\n\nexport const 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 return ordered.length === series.length ? ordered : series;\n};\n\nexport const CHART_TYPES = Object.freeze(Object.keys(CHART_DEFINITIONS));\n", "const safeSpan = (min, max) => Math.max(0.000000000001, max - min);\n\nexport const createCoordinateTransform = ({\n orientation = \"vertical\",\n categoryRange,\n valueRange,\n plot,\n}) => {\n const horizontal = orientation === \"horizontal\";\n const categorySpan = safeSpan(categoryRange.min, categoryRange.max);\n const valueSpan = safeSpan(valueRange.min, valueRange.max);\n const categoryPixelLength = horizontal ? plot.height : plot.width;\n const valuePixelLength = horizontal ? plot.width : plot.height;\n\n const categoryRatio = (point) =>\n horizontal\n ? (point.y - plot.y) / plot.height\n : (point.x - plot.x) / plot.width;\n\n const valueRatio = (point) =>\n horizontal\n ? (point.x - plot.x) / plot.width\n : 1 - (point.y - plot.y) / plot.height;\n\n const dataToScreen = (point) => {\n const category = point.category ?? point.x;\n const value = point.value ?? point.y;\n const categoryPosition =\n (category - categoryRange.min) / categorySpan;\n const valuePosition = (value - valueRange.min) / valueSpan;\n return horizontal\n ? {\n x: plot.x + valuePosition * plot.width,\n y: plot.y + categoryPosition * plot.height,\n }\n : {\n x: plot.x + categoryPosition * plot.width,\n y: plot.y + (1 - valuePosition) * plot.height,\n };\n };\n\n const screenToData = (point) => ({\n x: categoryRange.min + categoryRatio(point) * categorySpan,\n y: valueRange.min + valueRatio(point) * valueSpan,\n });\n\n const categoryDragDelta = (start, current) =>\n ((horizontal ? current.y - start.y : current.x - start.x) /\n categoryPixelLength) *\n categorySpan;\n\n const valueOffsetDelta = (start, current) =>\n horizontal\n ? -((current.x - start.x) / valuePixelLength) * valueSpan\n : ((current.y - start.y) / valuePixelLength) * valueSpan;\n\n const categoryScaleDelta = (start, current) =>\n horizontal ? current.y - start.y : current.x - start.x;\n\n const valueScaleDelta = (start, current) =>\n horizontal ? current.x - start.x : current.y - start.y;\n\n const dataBoundsForRect = (rect) => {\n const first = screenToData({ x: rect.left, y: rect.top });\n const second = screenToData({\n x: rect.left + rect.width,\n y: rect.top + rect.height,\n });\n return {\n categoryMin: Math.min(first.x, second.x),\n categoryMax: Math.max(first.x, second.x),\n valueMin: Math.min(first.y, second.y),\n valueMax: Math.max(first.y, second.y),\n };\n };\n\n return Object.freeze({\n categoryDragDelta,\n categoryPixelLength,\n categoryRatio,\n categoryScaleDelta,\n dataBoundsForRect,\n dataToScreen,\n horizontal,\n orientation,\n screenToData,\n valueOffsetDelta,\n valuePixelLength,\n valueRatio,\n valueScaleDelta,\n });\n};\n", "const INITIAL_GPU_VERTEX_CAPACITY = 4096;\n\nexport const createProgram = (gl, vertexSource, fragmentSource) => {\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 const vertexShader = compile(gl.VERTEX_SHADER, vertexSource);\n const fragmentShader = compile(gl.FRAGMENT_SHADER, fragmentSource);\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new Error(gl.getProgramInfoLog(program) || \"Program link failed\");\n }\n return program;\n};\n\nexport const hexToRgb = (color) => {\n const value = String(color || \"#38bdf8\").replace(\"#\", \"\");\n const normalized =\n value.length === 3\n ? value.split(\"\").map((char) => char + char).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 getNextVertexCapacity = (currentCapacity, requiredCapacity) => {\n let nextCapacity = Math.max(\n INITIAL_GPU_VERTEX_CAPACITY,\n currentCapacity || 0,\n );\n while (nextCapacity < requiredCapacity) nextCapacity *= 2;\n return nextCapacity;\n};\n\nexport const getDynamicBuffer = (gl, cache, key, requiredFloats) => {\n let entry = cache.get(key);\n if (!entry) {\n entry = {\n buffer: gl.createBuffer(),\n gpuCapacity: 0,\n vertices: new Float32Array(\n getNextVertexCapacity(0, requiredFloats),\n ),\n };\n cache.set(key, entry);\n }\n if (entry.vertices.length < requiredFloats) {\n entry.vertices = new Float32Array(\n getNextVertexCapacity(entry.vertices.length, requiredFloats),\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 return entry;\n};\n\nexport const deleteBufferCache = (gl, cache) => {\n cache.forEach((entry) => {\n if (entry.buffer) gl.deleteBuffer(entry.buffer);\n });\n cache.clear();\n};\n", "import { getOrderedSeries } from \"../chartModel.js\";\nimport {\n createProgram,\n deleteBufferCache,\n getDynamicBuffer,\n hexToRgb,\n} from \"./webglUtils.js\";\n\nconst BAR_GROUP_WIDTH_RATIO = 0.8;\nconst BAR_SLICE_WIDTH_RATIO = 0.9;\nconst BAR_VERTEX_FLOAT_STRIDE = 3;\n\nconst VERTEX_SOURCE = `#version 300 es\n in vec2 a_unit;\n in vec3 a_bar;\n uniform vec2 u_resolution;\n uniform vec4 u_rect;\n uniform vec2 u_categoryRange;\n uniform vec2 u_valueRange;\n uniform float u_baseline;\n uniform float u_seriesIndex;\n uniform float u_seriesCount;\n uniform int u_orientation;\n\n void main() {\n float groupWidth = a_bar.z * ${BAR_GROUP_WIDTH_RATIO.toFixed(1)};\n float sliceWidth = groupWidth / max(1.0, u_seriesCount);\n float center = a_bar.x - groupWidth * 0.5\n + sliceWidth * (u_seriesIndex + 0.5);\n float halfWidth = sliceWidth * ${(\n BAR_SLICE_WIDTH_RATIO / 2\n ).toFixed(2)};\n float category = mix(center - halfWidth, center + halfWidth, a_unit.x);\n float value = mix(u_baseline, a_bar.y, a_unit.y);\n float categoryDenom = max(\n 0.000000000001,\n abs(u_categoryRange.y - u_categoryRange.x)\n );\n float valueDenom = max(\n 0.000000000001,\n abs(u_valueRange.y - u_valueRange.x)\n );\n float categoryRatio = (category - u_categoryRange.x) / categoryDenom;\n float valueRatio = (value - u_valueRange.x) / valueDenom;\n vec2 px = u_orientation == 0\n ? vec2(\n u_rect.x + categoryRatio * u_rect.z,\n u_rect.y + (1.0 - valueRatio) * u_rect.w\n )\n : vec2(\n u_rect.x + valueRatio * u_rect.z,\n u_rect.y + categoryRatio * u_rect.w\n );\n vec2 clip = (px / u_resolution) * 2.0 - 1.0;\n gl_Position = vec4(clip.x, -clip.y, 0.0, 1.0);\n }\n`;\n\nconst FRAGMENT_SOURCE = `#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\nconst getBarCategoryInterval = ({\n visiblePoints,\n index,\n categoryMin,\n categoryMax,\n}) => {\n const count = visiblePoints.pointCount;\n const category = visiblePoints.x[index];\n const fallbackInterval =\n (categoryMax - categoryMin) / Math.max(10, count || 1);\n const previousGap =\n index > 0 ? category - visiblePoints.x[index - 1] : Infinity;\n const nextGap =\n index + 1 < count ? visiblePoints.x[index + 1] - category : Infinity;\n let interval = Math.min(\n previousGap > 0 ? previousGap : Infinity,\n nextGap > 0 ? nextGap : Infinity,\n );\n if (!Number.isFinite(interval)) {\n interval = Number.isFinite(previousGap) && previousGap > 0\n ? previousGap\n : Number.isFinite(nextGap) && nextGap > 0\n ? nextGap\n : fallbackInterval;\n }\n return Math.max(Number.EPSILON, interval || fallbackInterval || 1);\n};\n\nexport const getGroupedBarCategory = ({\n visiblePoints,\n pointIndex,\n seriesIndex,\n seriesCount,\n categoryMin,\n categoryMax,\n}) => {\n const category = visiblePoints.x[pointIndex];\n const interval = getBarCategoryInterval({\n visiblePoints,\n index: pointIndex,\n categoryMin,\n categoryMax,\n });\n const groupWidth = interval * BAR_GROUP_WIDTH_RATIO;\n const sliceWidth = groupWidth / Math.max(1, seriesCount);\n return category - groupWidth / 2 + sliceWidth * (seriesIndex + 0.5);\n};\n\nconst fillBarInstances = ({\n vertices,\n visiblePoints,\n categoryMin,\n categoryMax,\n}) => {\n for (let index = 0; index < visiblePoints.pointCount; index += 1) {\n const offset = index * BAR_VERTEX_FLOAT_STRIDE;\n vertices[offset] = visiblePoints.x[index];\n vertices[offset + 1] = visiblePoints.y[index];\n vertices[offset + 2] = getBarCategoryInterval({\n visiblePoints,\n index,\n categoryMin,\n categoryMax,\n });\n }\n return visiblePoints.pointCount;\n};\n\nexport const createBarRenderer = (gl) => {\n const program = createProgram(gl, VERTEX_SOURCE, FRAGMENT_SOURCE);\n const quadBuffer = gl.createBuffer();\n const buffers = new Map();\n gl.bindBuffer(gl.ARRAY_BUFFER, quadBuffer);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Float32Array([\n 0, 0, 1, 0, 0, 1,\n 0, 1, 1, 0, 1, 1,\n ]),\n gl.STATIC_DRAW,\n );\n\n const locations = Object.freeze({\n aBar: gl.getAttribLocation(program, \"a_bar\"),\n aUnit: gl.getAttribLocation(program, \"a_unit\"),\n uBaseline: gl.getUniformLocation(program, \"u_baseline\"),\n uCategoryRange: gl.getUniformLocation(program, \"u_categoryRange\"),\n uColor: gl.getUniformLocation(program, \"u_color\"),\n uOrientation: gl.getUniformLocation(program, \"u_orientation\"),\n uRect: gl.getUniformLocation(program, \"u_rect\"),\n uResolution: gl.getUniformLocation(program, \"u_resolution\"),\n uSeriesCount: gl.getUniformLocation(program, \"u_seriesCount\"),\n uSeriesIndex: gl.getUniformLocation(program, \"u_seriesIndex\"),\n uValueRange: gl.getUniformLocation(program, \"u_valueRange\"),\n });\n\n return {\n draw({\n categoryPixelLength,\n chart,\n descriptor,\n pixelHeight,\n pixelWidth,\n scaledPlot,\n seriesOrderByChart,\n state,\n yRange,\n }) {\n gl.disable(gl.BLEND);\n gl.useProgram(program);\n gl.enableVertexAttribArray(locations.aUnit);\n gl.enableVertexAttribArray(locations.aBar);\n gl.bindBuffer(gl.ARRAY_BUFFER, quadBuffer);\n gl.vertexAttribPointer(locations.aUnit, 2, gl.FLOAT, false, 0, 0);\n gl.vertexAttribDivisor(locations.aUnit, 0);\n gl.uniform2f(locations.uResolution, pixelWidth, pixelHeight);\n gl.uniform4f(\n locations.uRect,\n scaledPlot.x,\n scaledPlot.y,\n scaledPlot.width,\n scaledPlot.height,\n );\n gl.uniform2f(\n locations.uCategoryRange,\n state.xMin,\n state.xMax,\n );\n gl.uniform2f(\n locations.uValueRange,\n yRange.minY,\n yRange.maxY,\n );\n gl.uniform1f(locations.uBaseline, 0);\n gl.uniform1i(\n locations.uOrientation,\n descriptor.orientation === \"horizontal\" ? 1 : 0,\n );\n const orderedSeries = getOrderedSeries(chart, seriesOrderByChart);\n gl.uniform1f(locations.uSeriesCount, Math.max(1, orderedSeries.length));\n\n orderedSeries.forEach((series, seriesIndex) => {\n const visiblePoints = series.getVisiblePoints(\n state.xMin,\n state.xMax,\n categoryPixelLength,\n );\n if (!visiblePoints.pointCount) return;\n const requiredFloats =\n visiblePoints.pointCount * BAR_VERTEX_FLOAT_STRIDE;\n const bufferEntry = getDynamicBuffer(\n gl,\n buffers,\n series.id,\n requiredFloats,\n );\n const instanceCount = fillBarInstances({\n vertices: bufferEntry.vertices,\n visiblePoints,\n categoryMin: state.xMin,\n categoryMax: state.xMax,\n });\n const [r, g, b] = hexToRgb(series.color);\n gl.uniform3f(locations.uColor, r, g, b);\n gl.uniform1f(locations.uSeriesIndex, seriesIndex);\n gl.bindBuffer(gl.ARRAY_BUFFER, bufferEntry.buffer);\n gl.vertexAttribPointer(\n locations.aBar,\n BAR_VERTEX_FLOAT_STRIDE,\n gl.FLOAT,\n false,\n 0,\n 0,\n );\n gl.vertexAttribDivisor(locations.aBar, 1);\n gl.bufferSubData(\n gl.ARRAY_BUFFER,\n 0,\n bufferEntry.vertices,\n 0,\n instanceCount * BAR_VERTEX_FLOAT_STRIDE,\n );\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, instanceCount);\n });\n gl.vertexAttribDivisor(locations.aBar, 0);\n return { seriesEndpoints: new Map() };\n },\n\n getTooltipCategory(payload) {\n return getGroupedBarCategory(payload);\n },\n\n destroy() {\n deleteBufferCache(gl, buffers);\n gl.deleteBuffer(quadBuffer);\n gl.deleteProgram(program);\n },\n };\n};\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\nclass LodSeries {\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 class LineSeries extends LodSeries {\n constructor(options) {\n super(options);\n this.type = \"line\";\n }\n}\n\nexport class BarSeries extends LodSeries {\n constructor({ orientation = \"vertical\", ...options }) {\n super(options);\n if (orientation !== \"vertical\" && orientation !== \"horizontal\") {\n throw new TypeError(\n 'BarSeries orientation must be \"vertical\" or \"horizontal\"',\n );\n }\n this.type = \"bar\";\n this.orientation = orientation;\n }\n}\n\nexport const createLineSeries = (options) => new LineSeries(options);\nexport const createSeries = createLineSeries;\nexport const createBarSeries = (options) => new BarSeries(options);\n", "import { getOrderedSeries } from \"../chartModel.js\";\nimport { createLineSeries } from \"../lodSeries.js\";\nimport {\n createProgram,\n deleteBufferCache,\n getDynamicBuffer,\n hexToRgb,\n} from \"./webglUtils.js\";\n\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;\n\nconst LINE_VERTEX_SOURCE = `#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 clip = (vec2(px, py) / u_resolution) * 2.0 - 1.0;\n gl_Position = vec4(clip.x, -clip.y, 0.0, 1.0);\n }\n`;\n\nconst LINE_FRAGMENT_SOURCE = `#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\nconst AA_VERTEX_SOURCE = `#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 clip = (px / u_resolution) * 2.0 - 1.0;\n v_side = a_side;\n gl_Position = vec4(clip.x, -clip.y, 0.0, 1.0);\n }\n`;\n\nconst AA_FRAGMENT_SOURCE = `#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\nconst fillSeriesPoints = ({\n vertices,\n visiblePoints,\n pointCount,\n animatedPoint,\n}) => {\n for (let index = 0; index < pointCount; index += 1) {\n const source =\n animatedPoint && index === animatedPoint.index\n ? animatedPoint\n : { x: visiblePoints.x[index], y: visiblePoints.y[index] };\n vertices[index * 2] = source.x;\n vertices[index * 2 + 1] = source.y;\n }\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 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 getSeriesPoint = (visiblePoints, animatedPoint, index) =>\n animatedPoint && index === animatedPoint.index\n ? { x: animatedPoint.x, y: animatedPoint.y }\n : { x: visiblePoints.x[index], y: visiblePoints.y[index] };\n\nconst fillAntialiasSeriesSegments = ({\n vertices,\n visiblePoints,\n pointCount,\n animatedPoint,\n}) => {\n let offset = 0;\n for (let index = 0; index < pointCount - 1; index += 1) {\n const start = getSeriesPoint(visiblePoints, animatedPoint, index);\n const end = getSeriesPoint(visiblePoints, animatedPoint, index + 1);\n [\n [-1, 0], [1, 0], [-1, 1],\n [-1, 1], [1, 0], [1, 1],\n ].forEach(([side, along]) => {\n writeAntialiasVertex(vertices, offset, start, end, side, along);\n offset += AA_VERTEX_FLOAT_STRIDE;\n });\n }\n return offset / AA_VERTEX_FLOAT_STRIDE;\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 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 for (let index = 0; index < pointCount - 1; index += 1) {\n const start = { x: visiblePoints.x[index], y: visiblePoints.y[index] };\n const end = {\n x: visiblePoints.x[index + 1],\n y: visiblePoints.y[index + 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 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) return offset / 2;\n const t0 = consumed / pixelLength;\n const t1 = (consumed + step) / pixelLength;\n vertices[offset] = start.x + (end.x - start.x) * t0;\n vertices[offset + 1] = start.y + (end.y - start.y) * t0;\n vertices[offset + 2] = start.x + (end.x - start.x) * t1;\n vertices[offset + 3] = start.y + (end.y - start.y) * t1;\n offset += 4;\n }\n consumed += step;\n distance += step;\n }\n }\n return offset / 2;\n};\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 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) return out;\n if (type === \"sma\") {\n let sum = 0;\n const firstWindowStart = Math.max(0, startIndex - period + 1);\n for (let index = firstWindowStart; index < startIndex; index += 1) {\n sum += sourceY[index];\n }\n for (let index = startIndex; index < sourceY.length; index += 1) {\n sum += sourceY[index];\n const removeIndex = index - period;\n if (removeIndex >= firstWindowStart) sum -= sourceY[removeIndex];\n out[index - startIndex] = sum / Math.min(period, index + 1);\n }\n return out;\n }\n const multiplier = 2 / (period + 1);\n let previous = Number.isFinite(previousAverage)\n ? previousAverage\n : sourceY[startIndex];\n for (let index = startIndex; index < sourceY.length; index += 1) {\n previous = sourceY[index] * multiplier + previous * (1 - multiplier);\n out[index - startIndex] = previous;\n }\n return out;\n};\n\nconst getMovingAverageSeriesForChart = ({\n chart,\n movingAverage,\n cache,\n}) => {\n const normalized = normalizeMovingAverage(movingAverage);\n if (!normalized) return [];\n return chart.series.map((series) => {\n if (!series.length) return null;\n const key =\n `${series.id}::ma:${normalized.type}:${normalized.period}`;\n const cached = cache.get(key);\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 =\n `${series.name} ${normalized.type.toUpperCase()} ${normalized.period}`;\n return cached.series;\n }\n const movingY = calculateMovingAverageChunk({\n sourceY: series.rawY.subarray(0, series.length),\n startIndex: 0,\n period: normalized.period,\n type: normalized.type,\n });\n const movingSeries = createLineSeries({\n id: key,\n name:\n `${series.name} ${normalized.type.toUpperCase()} ${normalized.period}`,\n color: series.color,\n x: series.rawX.subarray(0, series.length),\n y: movingY,\n });\n cache.set(key, {\n sourceSeries: series,\n sourceLength: series.length,\n series: movingSeries,\n });\n return movingSeries;\n }).filter(Boolean);\n};\n\nconst getLineLocations = (gl, program) => Object.freeze({\n aXy: gl.getAttribLocation(program, \"a_xy\"),\n uColor: gl.getUniformLocation(program, \"u_color\"),\n uRect: gl.getUniformLocation(program, \"u_rect\"),\n uResolution: gl.getUniformLocation(program, \"u_resolution\"),\n uXRange: gl.getUniformLocation(program, \"u_xRange\"),\n uYRange: gl.getUniformLocation(program, \"u_yRange\"),\n});\n\nexport const createLineRenderer = (gl) => {\n const program = createProgram(\n gl,\n LINE_VERTEX_SOURCE,\n LINE_FRAGMENT_SOURCE,\n );\n const antialiasProgram = createProgram(\n gl,\n AA_VERTEX_SOURCE,\n AA_FRAGMENT_SOURCE,\n );\n const locations = getLineLocations(gl, program);\n const aaLocations = Object.freeze({\n aAlong: gl.getAttribLocation(antialiasProgram, \"a_along\"),\n aEnd: gl.getAttribLocation(antialiasProgram, \"a_end\"),\n aSide: gl.getAttribLocation(antialiasProgram, \"a_side\"),\n aStart: gl.getAttribLocation(antialiasProgram, \"a_start\"),\n uColor: gl.getUniformLocation(antialiasProgram, \"u_color\"),\n uEdgeWidth: gl.getUniformLocation(antialiasProgram, \"u_edgeWidth\"),\n uLineHalfWidth:\n gl.getUniformLocation(antialiasProgram, \"u_lineHalfWidth\"),\n uRect: gl.getUniformLocation(antialiasProgram, \"u_rect\"),\n uResolution: gl.getUniformLocation(antialiasProgram, \"u_resolution\"),\n uXRange: gl.getUniformLocation(antialiasProgram, \"u_xRange\"),\n uYRange: gl.getUniformLocation(antialiasProgram, \"u_yRange\"),\n });\n const buffers = new Map();\n const antialiasBuffers = new Map();\n const movingAverageCache = new Map();\n\n const setCommonUniforms = (\n activeLocations,\n pixelWidth,\n pixelHeight,\n scaledPlot,\n state,\n yRange,\n ) => {\n gl.uniform2f(activeLocations.uResolution, pixelWidth, pixelHeight);\n gl.uniform4f(\n activeLocations.uRect,\n scaledPlot.x,\n scaledPlot.y,\n scaledPlot.width,\n scaledPlot.height,\n );\n gl.uniform2f(activeLocations.uXRange, state.xMin, state.xMax);\n gl.uniform2f(activeLocations.uYRange, yRange.minY, yRange.maxY);\n };\n\n return {\n draw({\n antialiasLines,\n chart,\n descriptor,\n dpr,\n getAppendAnimatedPoint,\n movingAverage,\n now,\n pixelHeight,\n pixelWidth,\n plot,\n scaledPlot,\n seriesOrderByChart,\n state,\n yRange,\n }) {\n const useAntialias = Boolean(antialiasLines);\n const activeProgram = useAntialias ? antialiasProgram : program;\n const activeLocations = useAntialias ? aaLocations : locations;\n gl.useProgram(activeProgram);\n setCommonUniforms(\n activeLocations,\n pixelWidth,\n pixelHeight,\n scaledPlot,\n state,\n yRange,\n );\n if (useAntialias) {\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n gl.enableVertexAttribArray(aaLocations.aStart);\n gl.enableVertexAttribArray(aaLocations.aEnd);\n gl.enableVertexAttribArray(aaLocations.aSide);\n gl.enableVertexAttribArray(aaLocations.aAlong);\n gl.uniform1f(\n aaLocations.uLineHalfWidth,\n (AA_LINE_WIDTH_PX * dpr) / 2,\n );\n gl.uniform1f(aaLocations.uEdgeWidth, AA_EDGE_WIDTH_PX * dpr);\n } else {\n gl.disable(gl.BLEND);\n gl.enableVertexAttribArray(locations.aXy);\n }\n\n const seriesEndpoints = new Map();\n const hideBaseSeries =\n descriptor.capabilities.movingAverage &&\n Boolean(movingAverage?.enabled) &&\n Boolean(movingAverage?.hideBase);\n\n if (!hideBaseSeries) {\n 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 =\n 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 const [r, g, b] = hexToRgb(series.color);\n gl.uniform3f(activeLocations.uColor, r, g, b);\n\n if (useAntialias) {\n const requiredFloats =\n Math.max(0, pointCount - 1) *\n 6 *\n AA_VERTEX_FLOAT_STRIDE;\n const entry = getDynamicBuffer(\n gl,\n antialiasBuffers,\n series.id,\n requiredFloats,\n );\n const drawVertexCount = fillAntialiasSeriesSegments({\n vertices: entry.vertices,\n visiblePoints,\n pointCount,\n animatedPoint,\n });\n const stride =\n AA_VERTEX_FLOAT_STRIDE * Float32Array.BYTES_PER_ELEMENT;\n gl.bindBuffer(gl.ARRAY_BUFFER, entry.buffer);\n gl.vertexAttribPointer(\n aaLocations.aStart,\n 2,\n gl.FLOAT,\n false,\n stride,\n 0,\n );\n gl.vertexAttribPointer(\n aaLocations.aEnd,\n 2,\n gl.FLOAT,\n false,\n stride,\n 2 * Float32Array.BYTES_PER_ELEMENT,\n );\n gl.vertexAttribPointer(\n aaLocations.aSide,\n 1,\n gl.FLOAT,\n false,\n stride,\n 4 * Float32Array.BYTES_PER_ELEMENT,\n );\n gl.vertexAttribPointer(\n aaLocations.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 entry.vertices,\n 0,\n drawVertexCount * AA_VERTEX_FLOAT_STRIDE,\n );\n gl.drawArrays(gl.TRIANGLES, 0, drawVertexCount);\n return;\n }\n\n const entry = getDynamicBuffer(\n gl,\n buffers,\n series.id,\n pointCount * 2,\n );\n fillSeriesPoints({\n vertices: entry.vertices,\n visiblePoints,\n pointCount,\n animatedPoint,\n });\n gl.bindBuffer(gl.ARRAY_BUFFER, entry.buffer);\n gl.vertexAttribPointer(locations.aXy, 2, gl.FLOAT, false, 0, 0);\n gl.bufferSubData(\n gl.ARRAY_BUFFER,\n 0,\n entry.vertices,\n 0,\n pointCount * 2,\n );\n gl.drawArrays(gl.LINE_STRIP, 0, pointCount);\n });\n }\n\n const movingSeries = getMovingAverageSeriesForChart({\n chart,\n movingAverage: descriptor.capabilities.movingAverage\n ? movingAverage\n : null,\n cache: movingAverageCache,\n });\n if (movingSeries.length) {\n gl.disable(gl.BLEND);\n gl.useProgram(program);\n gl.enableVertexAttribArray(locations.aXy);\n setCommonUniforms(\n locations,\n pixelWidth,\n pixelHeight,\n scaledPlot,\n state,\n yRange,\n );\n getOrderedSeries(\n { ...chart, series: movingSeries },\n seriesOrderByChart,\n ).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 entry = getDynamicBuffer(\n gl,\n buffers,\n series.id,\n visiblePoints.pointCount * 8 * 2,\n );\n const drawVertexCount = fillDashedSeriesSegments({\n vertices: entry.vertices,\n visiblePoints,\n pointCount: visiblePoints.pointCount,\n state,\n yRange,\n plot,\n });\n if (drawVertexCount < 2) return;\n const [r, g, b] = hexToRgb(series.color);\n gl.uniform3f(locations.uColor, r, g, b);\n gl.bindBuffer(gl.ARRAY_BUFFER, entry.buffer);\n gl.vertexAttribPointer(locations.aXy, 2, gl.FLOAT, false, 0, 0);\n gl.bufferSubData(\n gl.ARRAY_BUFFER,\n 0,\n entry.vertices,\n 0,\n drawVertexCount * 2,\n );\n gl.drawArrays(gl.LINES, 0, drawVertexCount);\n });\n }\n gl.disable(gl.BLEND);\n return { seriesEndpoints };\n },\n\n destroy() {\n deleteBufferCache(gl, buffers);\n deleteBufferCache(gl, antialiasBuffers);\n movingAverageCache.clear();\n gl.deleteProgram(program);\n gl.deleteProgram(antialiasProgram);\n },\n };\n};\n", "import { createBarRenderer } from \"./barRenderer.js\";\nimport { createLineRenderer } from \"./lineRenderer.js\";\n\nconst RENDERER_FACTORIES = Object.freeze({\n bar: createBarRenderer,\n line: createLineRenderer,\n});\n\nexport const createRendererRegistry = (gl) => {\n const renderers = new Map(\n Object.entries(RENDERER_FACTORIES).map(([type, createRenderer]) => [\n type,\n createRenderer(gl),\n ]),\n );\n\n return {\n draw(type, payload) {\n const renderer = renderers.get(type);\n if (!renderer) {\n throw new TypeError(`No AlienCharts renderer registered for \"${type}\"`);\n }\n return renderer.draw(payload);\n },\n\n getTooltipCategory(type, payload) {\n const renderer = renderers.get(type);\n if (!renderer) {\n throw new TypeError(`No AlienCharts renderer registered for \"${type}\"`);\n }\n return renderer.getTooltipCategory?.(payload) ??\n payload.visiblePoints.x[payload.pointIndex];\n },\n\n destroy() {\n renderers.forEach((renderer) => renderer.destroy());\n renderers.clear();\n },\n };\n};\n", "import {\n getChartCategories,\n getChartDescriptor,\n getOrderedSeries,\n resolveChartDescriptor,\n} from \"./chartModel.js\";\nimport { createCoordinateTransform } from \"./coordinateTransform.js\";\nimport { hexToRgb } from \"./renderers/webglUtils.js\";\n\nconst CHART_HEIGHT = 360;\nconst RIGHT_AXIS_WIDTH = 58;\nconst PLOT_PADDING = Object.freeze({\n left: 38,\n right: RIGHT_AXIS_WIDTH,\n top: 34,\n bottom: 28,\n});\nconst HORIZONTAL_PLOT_PADDING = Object.freeze({\n left: RIGHT_AXIS_WIDTH,\n right: 20,\n top: 34,\n bottom: 28,\n});\nconst CATEGORICAL_PLOT_PADDING = Object.freeze({\n ...PLOT_PADDING,\n bottom: 42,\n});\nconst CATEGORICAL_HORIZONTAL_PLOT_PADDING = Object.freeze({\n ...HORIZONTAL_PLOT_PADDING,\n left: 128,\n});\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 DEFAULT_CHART_BACKGROUND = \"#f5f9ff\";\n\nconst getChartType = (chart, descriptor) =>\n (descriptor || resolveChartDescriptor(chart)).type;\n\nconst getChartOrientation = (chart, descriptor) =>\n (descriptor || resolveChartDescriptor(chart)).orientation;\n\nconst getPlotPadding = (chart, descriptor) => {\n const categorical = getChartCategories(chart).length > 0;\n if (getChartOrientation(chart, descriptor) === \"horizontal\") {\n return categorical\n ? CATEGORICAL_HORIZONTAL_PLOT_PADDING\n : HORIZONTAL_PLOT_PADDING;\n }\n return categorical ? CATEGORICAL_PLOT_PADDING : PLOT_PADDING;\n};\n\nconst getCategoryPixelLength = (chart, plot, descriptor) =>\n getChartOrientation(chart, descriptor) === \"horizontal\"\n ? plot.height\n : plot.width;\n\nconst validateChartSeries = (chart) => resolveChartDescriptor(chart);\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 lowerBound = (array, value) => {\n let low = 0;\n let high = array.length;\n while (low < high) {\n const middle = (low + high) >> 1;\n if (array[middle] < value) low = middle + 1;\n else high = middle;\n }\n return low;\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) 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 getMinimumCategorySpan = (chart) => {\n const categories = getChartCategories(chart)\n .map((category) => category.value)\n .sort((left, right) => left - right);\n if (!categories.length) return X_SCALE_MIN_SPAN;\n let minimumGap = Infinity;\n for (let index = 1; index < categories.length; index += 1) {\n minimumGap = Math.min(minimumGap, categories[index] - categories[index - 1]);\n }\n return Number.isFinite(minimumGap) ? minimumGap : 1;\n};\n\nconst getInitialView = (chart, initialVisiblePoints = null) => {\n const categories = getChartCategories(chart)\n .map((category) => category.value)\n .sort((left, right) => left - right);\n if (categories.length) {\n const requestedCount =\n Number.isFinite(initialVisiblePoints) && initialVisiblePoints > 0\n ? Math.max(1, Math.floor(initialVisiblePoints))\n : categories.length;\n const visible = categories.slice(-requestedCount);\n const first = visible[0];\n const last = visible[visible.length - 1];\n const firstIndex = categories.indexOf(first);\n const lastIndex = categories.lastIndexOf(last);\n const leftGap =\n firstIndex > 0\n ? first - categories[firstIndex - 1]\n : visible[1] - first || 1;\n const rightGap =\n lastIndex + 1 < categories.length\n ? categories[lastIndex + 1] - last\n : last - visible[visible.length - 2] || leftGap;\n return {\n xMin: first - leftGap / 2,\n xMax: last + rightGap / 2,\n };\n }\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 nextMax = maxX + span * JUMP_LATEST_RIGHT_PADDING_RATIO;\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 nextMax = maxX + span * JUMP_LATEST_RIGHT_PADDING_RATIO;\n return { xMin: nextMax - span, xMax: nextMax };\n }\n return {\n xMin: minX,\n xMax: maxX + span * JUMP_LATEST_RIGHT_PADDING_RATIO,\n };\n};\n\nconst getYRange = (chart, xMin, xMax, width, suppliedDescriptor) => {\n const descriptor =\n suppliedDescriptor || resolveChartDescriptor(chart);\n let minY = Infinity;\n let maxY = -Infinity;\n let renderedPoints = 0;\n let bucketSize = 1;\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 index = 0; index < visible.y.length; index += 1) {\n minY = Math.min(minY, visible.y[index]);\n maxY = Math.max(maxY, visible.y[index]);\n }\n });\n\n const fixedMinY = Number(chart.yRange?.min);\n const fixedMaxY = Number(chart.yRange?.max);\n if (\n Number.isFinite(fixedMinY) &&\n Number.isFinite(fixedMaxY) &&\n fixedMinY < fixedMaxY\n ) {\n return {\n minY: fixedMinY,\n maxY: fixedMaxY,\n renderedPoints,\n bucketSize,\n };\n }\n if (!Number.isFinite(minY) || !Number.isFinite(maxY)) {\n return { minY: 0, maxY: 1, renderedPoints, bucketSize };\n }\n if (descriptor.rangeIncludesZero) {\n if (minY >= 0) {\n return {\n minY: 0,\n maxY: maxY === 0 ? 1 : maxY * 1.08,\n renderedPoints,\n bucketSize,\n };\n }\n if (maxY <= 0) {\n return {\n minY: minY === 0 ? -1 : minY * 1.08,\n maxY: 0,\n renderedPoints,\n bucketSize,\n };\n }\n }\n if (minY === maxY) {\n minY -= 1;\n maxY += 1;\n }\n const padding = (maxY - minY) * 0.08;\n return {\n minY: minY - padding,\n maxY: maxY + padding,\n renderedPoints,\n bucketSize,\n };\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 trimFormattedNumber = (value) =>\n value.replace(/(\\.\\d*?)0+$/, \"$1\").replace(/\\.$/, \"\");\n\nconst formatNumber = (value) => {\n if (!Number.isFinite(value)) return \"\";\n const absolute = Math.abs(value);\n if (absolute !== 0 && absolute < 0.0001) return value.toExponential(2);\n if (absolute < 1) return trimFormattedNumber(value.toPrecision(5));\n if (absolute >= 100000) return value.toFixed(0);\n if (absolute >= 1000) return trimFormattedNumber(value.toFixed(1));\n if (absolute >= 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 absolute = Math.abs(value);\n if (absolute >= 1000000000) {\n return `${(value / 1000000000).toFixed(\n absolute >= 10000000000 ? 0 : 1,\n )}B`;\n }\n if (absolute >= 1000000) {\n return `${(value / 1000000).toFixed(\n absolute >= 10000000 ? 0 : 1,\n )}M`;\n }\n if (absolute >= 1000) {\n return `${(value / 1000).toFixed(absolute >= 10000 ? 0 : 1)}k`;\n }\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 getScaledYRangeForLayout = ({\n chart,\n descriptor,\n state,\n plot,\n yScaleRef,\n yCenterOffsetRef,\n}) =>\n applyYScale(\n getYRange(\n chart,\n state.xMin,\n state.xMax,\n getCategoryPixelLength(chart, plot, descriptor),\n descriptor,\n ),\n yScaleRef.current.get(chart.id) ?? 1,\n yCenterOffsetRef.current.get(chart.id) ?? 0,\n );\n\nconst applyRectangleZoom = ({\n chart,\n descriptor: suppliedDescriptor,\n plot,\n start,\n end,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n yManualScaleRef,\n}) => {\n const rect = normalizeRect(\n clampPointToPlot(start, plot),\n clampPointToPlot(end, plot),\n );\n if (!rect || rect.width < 6 || rect.height < 6) return false;\n const descriptor =\n suppliedDescriptor || resolveChartDescriptor(chart);\n const state =\n viewStateRef.current.get(chart.id) ||\n getInitialView(chart, initialVisiblePoints);\n const currentYRange = getScaledYRangeForLayout({\n chart,\n descriptor,\n state,\n plot,\n yScaleRef,\n yCenterOffsetRef,\n });\n const transform = createCoordinateTransform({\n orientation: descriptor.orientation,\n categoryRange: { min: state.xMin, max: state.xMax },\n valueRange: {\n min: currentYRange.minY,\n max: currentYRange.maxY,\n },\n plot,\n });\n const selected = transform.dataBoundsForRect(rect);\n if (\n selected.categoryMax - selected.categoryMin <\n getMinimumCategorySpan(chart)\n ) {\n return false;\n }\n const selectedSpan = selected.valueMax - selected.valueMin;\n if (!Number.isFinite(selectedSpan) || selectedSpan <= 0) return false;\n\n viewStateRef.current.set(chart.id, {\n xMin: selected.categoryMin,\n xMax: selected.categoryMax,\n });\n const baseYRange = getYRange(\n chart,\n selected.categoryMin,\n selected.categoryMax,\n getCategoryPixelLength(chart, plot, descriptor),\n descriptor,\n );\n const baseSpan = baseYRange.maxY - baseYRange.minY;\n if (Number.isFinite(baseSpan) && baseSpan > 0) {\n const selectedCenter = (selected.valueMin + selected.valueMax) / 2;\n const baseCenter = (baseYRange.minY + baseYRange.maxY) / 2;\n yScaleRef.current.set(\n chart.id,\n Math.min(\n Y_SCALE_MAX,\n Math.max(Y_SCALE_MIN, selectedSpan / baseSpan),\n ),\n );\n yCenterOffsetRef.current.set(chart.id, selectedCenter - baseCenter);\n yManualScaleRef.current.add(chart.id);\n }\n return true;\n};\n\nconst screenPointToDataPoint = ({\n point,\n chart,\n descriptor: suppliedDescriptor,\n plot,\n initialVisiblePoints,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n}) => {\n const descriptor =\n suppliedDescriptor || resolveChartDescriptor(chart);\n const state =\n viewStateRef.current.get(chart.id) ||\n getInitialView(chart, initialVisiblePoints);\n const yRange = getScaledYRangeForLayout({\n chart,\n descriptor,\n state,\n plot,\n yScaleRef,\n yCenterOffsetRef,\n });\n return createCoordinateTransform({\n orientation: descriptor.orientation,\n categoryRange: { min: state.xMin, max: state.xMax },\n valueRange: { min: yRange.minY, max: yRange.maxY },\n plot,\n }).screenToData(point);\n};\n\nconst dataPointToScreenPoint = ({\n point,\n state,\n yRange,\n plot,\n orientation = \"vertical\",\n}) =>\n createCoordinateTransform({\n orientation,\n categoryRange: { min: state.xMin, max: state.xMax },\n valueRange: { min: yRange.minY, max: yRange.maxY },\n plot,\n }).dataToScreen(point);\n\nconst createAxisOverlay = ({\n chart,\n descriptor,\n plot,\n state,\n yRange,\n seriesEndpoints,\n seriesOrderByChart,\n}) => {\n const horizontal = descriptor.orientation === \"horizontal\";\n const transform = createCoordinateTransform({\n orientation: descriptor.orientation,\n categoryRange: { min: state.xMin, max: state.xMax },\n valueRange: { min: yRange.minY, max: yRange.maxY },\n plot: { x: 0, y: 0, width: plot.width, height: plot.height },\n });\n const ticks = Array.from({ length: Y_AXIS_TICK_COUNT }, (_, index) => {\n const ratio = index / (Y_AXIS_TICK_COUNT - 1);\n const value = yRange.maxY - ratio * (yRange.maxY - yRange.minY);\n const screen = transform.dataToScreen({\n x: state.xMin,\n y: value,\n });\n return {\n id: `${chart.id}-tick-${index}`,\n value,\n top: horizontal ? undefined : screen.y,\n left: horizontal ? screen.x : undefined,\n };\n });\n const categories = getChartCategories(chart);\n const visibleCategories = categories.filter(\n (category) =>\n category.value >= state.xMin && category.value <= state.xMax,\n ).sort((left, right) => left.value - right.value);\n const categoryPixelLength = horizontal ? plot.height : plot.width;\n const maximumCategoryLabels = Math.max(\n 1,\n Math.floor(categoryPixelLength / (horizontal ? 22 : 72)),\n );\n const categoryLabelStride = Math.max(\n 1,\n Math.ceil(visibleCategories.length / maximumCategoryLabels),\n );\n const displayedCategories = visibleCategories.filter(\n (_, index) =>\n index % categoryLabelStride === 0 ||\n index === visibleCategories.length - 1,\n );\n const xTicks = categories.length\n ? displayedCategories.map((category, index) => {\n const screen = transform.dataToScreen({\n x: category.value,\n y: yRange.minY,\n });\n return {\n id: `${chart.id}-category-${index}-${category.value}`,\n categorical: true,\n label: category.label,\n value: category.value,\n left: horizontal ? undefined : screen.x,\n top: horizontal ? screen.y : undefined,\n };\n })\n : Array.from({ length: X_AXIS_TICK_COUNT }, (_, index) => {\n const ratio = 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: horizontal\n ? undefined\n : 18 + ratio * Math.max(1, plot.width - 36),\n top: horizontal\n ? 10 + ratio * Math.max(1, plot.height - 20)\n : undefined,\n };\n });\n const latestValues = descriptor.capabilities.latestValue\n ? getOrderedSeries(chart, seriesOrderByChart)\n .map((series) => {\n if (!series.length) 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 screen = transform.dataToScreen(endpoint);\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: screen.x,\n top: screen.y,\n };\n })\n .filter(\n (item) =>\n item &&\n Number.isFinite(item.top) &&\n item.top >= -10 &&\n item.top <= plot.height + 10,\n )\n : [];\n const { maxX } = getChartXBounds(chart);\n return {\n orientation: descriptor.orientation,\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\nconst drawChartLayouts = ({\n canvas,\n width,\n height,\n gl,\n rendererRegistry,\n antialiasLines = false,\n layouts,\n viewStateRef,\n yScaleRef,\n yCenterOffsetRef,\n initialVisiblePoints,\n getAppendAnimatedPoint,\n movingAverageByChart,\n seriesOrderByChart,\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 gl.viewport(0, 0, pixelWidth, pixelHeight);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n const now = performance.now();\n const nextAxisOverlays = {};\n\n layouts.forEach((layout) => {\n if (!layout.visible) return;\n const { chart, plot } = layout;\n const descriptor =\n layout.descriptor || getChartDescriptor(chart);\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 categoryPixelLength = getCategoryPixelLength(\n chart,\n plot,\n descriptor,\n );\n const yRange = applyYScale(\n getYRange(\n chart,\n state.xMin,\n state.xMax,\n categoryPixelLength,\n descriptor,\n ),\n yScaleRef.current.get(chart.id) ?? 1,\n yCenterOffsetRef.current.get(chart.id) ?? 0,\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 const result = rendererRegistry.draw(descriptor.rendererType, {\n antialiasLines,\n categoryPixelLength,\n chart,\n descriptor,\n dpr,\n getAppendAnimatedPoint,\n movingAverage: movingAverageByChart?.[chart.id],\n now,\n pixelHeight,\n pixelWidth,\n plot,\n scaledPlot,\n seriesOrderByChart,\n state,\n yRange,\n });\n nextAxisOverlays[chart.id] = createAxisOverlay({\n chart,\n descriptor,\n plot,\n state,\n yRange,\n seriesEndpoints: result?.seriesEndpoints || new Map(),\n seriesOrderByChart,\n });\n gl.disable(gl.SCISSOR_TEST);\n });\n gl.disable(gl.BLEND);\n return nextAxisOverlays;\n};\n\nexport {\n CHART_HEIGHT,\n RIGHT_AXIS_WIDTH,\n PLOT_PADDING,\n Y_SCALE_MIN,\n Y_SCALE_MAX,\n X_SCALE_MIN_SPAN,\n X_SCALE_MAX_SPAN,\n DEFAULT_CHART_BACKGROUND,\n drawChartLayouts,\n getChartXBounds,\n getChartType,\n getChartOrientation,\n getOrderedSeries,\n getPlotPadding,\n getCategoryPixelLength,\n getMinimumCategorySpan,\n validateChartSeries,\n getInitialView,\n getYRange,\n applyYScale,\n getNearestPointIndex,\n screenPointToDataPoint,\n dataPointToScreenPoint,\n normalizeRect,\n applyRectangleZoom,\n formatNumber,\n formatCompactNumber,\n};\n", "import { iconSvg } from \"../icons.js\";\nimport {\n DRAWING_TOOLS,\n createDraftDrawing,\n createDrawing,\n getDrawingGeometry,\n getDrawingsForChart,\n hitTestDrawing,\n removeDrawingById,\n updateDrawingById,\n} from \"../core/drawingUtils.js\";\nimport {\n getCategoryLabel,\n getOrderedSeries,\n resolveChartDescriptors,\n} from \"../core/chartModel.js\";\nimport { createCoordinateTransform } from \"../core/coordinateTransform.js\";\nimport { createRendererRegistry } from \"../core/renderers/index.js\";\nimport {\n CHART_HEIGHT,\n RIGHT_AXIS_WIDTH,\n PLOT_PADDING,\n Y_SCALE_MIN,\n Y_SCALE_MAX,\n X_SCALE_MAX_SPAN,\n DEFAULT_CHART_BACKGROUND,\n drawChartLayouts,\n getChartXBounds,\n getPlotPadding,\n getCategoryPixelLength,\n getMinimumCategorySpan,\n getInitialView,\n getYRange,\n applyYScale,\n getNearestPointIndex,\n screenPointToDataPoint,\n dataPointToScreenPoint,\n normalizeRect,\n applyRectangleZoom,\n formatNumber,\n formatCompactNumber,\n} from \"../core/chartRenderer.js\";\n\nconst BASE_ROOT_CLASSES = [\"aliencharts-root\", \"relative\", \"h-full\", \"overflow-y-auto\"];\nconst EMPTY_OBJECT = Object.freeze({});\nlet controllerIdSequence = 0;\nconst DEFAULT_OPTIONS = Object.freeze({\n charts: [],\n columns: 2,\n initialVisiblePoints: null,\n backgroundColor: DEFAULT_CHART_BACKGROUND,\n antialiasLines: false,\n gridLines: false,\n showToolbar: true,\n showLatestValueLine: true,\n showTooltips: true,\n followLatest: false,\n followVisibleLatest: true,\n xAxisLabel: \"STEP\",\n disableDrawings: false,\n seriesOrderByChart: EMPTY_OBJECT,\n topMarkers: [],\n formatXTick: formatCompactNumber,\n formatXValue: formatNumber,\n formatYValue: formatNumber,\n});\n\nconst APPEND_ANIMATION = Object.freeze({\n durationMs: 300,\n maxBucketSize: 64,\n maxRevealPoints: 100,\n});\nconst POINTER_SCALE_SENSITIVITY = 0.01;\nconst WHEEL_SCALE_SENSITIVITY = 0.001;\n\nconst scaleValueRange = (scale, delta, sensitivity) =>\n clamp(\n scale * Math.exp(delta * sensitivity),\n Y_SCALE_MIN,\n Y_SCALE_MAX,\n );\n\nconst escapeHtml = (value) => String(value ?? \"\")\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n\nconst withAlpha = (color, alpha) => {\n const value = String(color || DEFAULT_CHART_BACKGROUND).trim();\n const match = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(value);\n if (!match) return value;\n return `rgba(${Number.parseInt(match[1], 16)}, ${Number.parseInt(match[2], 16)}, ${Number.parseInt(match[3], 16)}, ${alpha})`;\n};\n\nconst getTextColor = (color) => {\n const value = String(color || \"#38bdf8\").replace(\"#\", \"\");\n const normalized = value.length === 3\n ? value.split(\"\").map((part) => part + part).join(\"\")\n : value.padEnd(6, \"0\").slice(0, 6);\n const number = Number.parseInt(normalized, 16);\n const rgb = [16, 8, 0].map((shift) => ((number >> shift) & 255) / 255);\n const linear = rgb.map((part) => part <= 0.03928 ? part / 12.92 : ((part + 0.055) / 1.055) ** 2.4);\n return 0.2126 * linear[0] + 0.7152 * linear[1] + 0.0722 * linear[2] > 0.45\n ? \"#111827\"\n : \"#ffffff\";\n};\n\nconst hasOwn = (object, key) => Object.prototype.hasOwnProperty.call(object, key);\nconst clamp = (value, min, max) => Math.min(max, Math.max(min, value));\n\nconst toolbarButton = ({ action, title, icon, hotkey = \"\", active = false, className = \"\" }) => `\n <button type=\"button\" data-action=\"${action}\" title=\"${escapeHtml(title)}\" aria-label=\"${escapeHtml(title)}\"\n class=\"relative inline-flex size-6 items-center justify-center rounded-sm text-foreground hover:bg-accent hover:text-accent-foreground ${active ? \"bg-primary/15 text-primary ring-1 ring-primary/40\" : \"\"} ${className}\">\n ${icon}\n ${hotkey ? `<span class=\"pointer-events-none absolute left-full top-1/2 -translate-y-1/2 text-[10px] font-semibold leading-none text-foreground/50\">${hotkey}</span>` : \"\"}\n </button>`;\n\nconst chartCellHtml = (chart, descriptor, index, backgroundColor) => {\n const padding = getPlotPadding(chart, descriptor);\n const horizontal = descriptor.orientation === \"horizontal\";\n const valueAxisStyle = horizontal\n ? `left:${padding.left}px;right:${padding.right}px;bottom:0;height:${padding.bottom}px;cursor:ew-resize`\n : `right:0;top:${padding.top}px;bottom:${padding.bottom}px;width:${padding.right}px;cursor:ns-resize`;\n const categoryAxisStyle = horizontal\n ? `left:0;top:${padding.top}px;bottom:${padding.bottom}px;width:${padding.left}px;cursor:ns-resize`\n : `left:${padding.left}px;right:${padding.right}px;bottom:0;height:${padding.bottom}px;cursor:ew-resize`;\n return `\n <div data-chart-index=\"${index}\" class=\"relative select-none overflow-hidden rounded-sm\" style=\"height:${CHART_HEIGHT}px;background-color:${escapeHtml(backgroundColor)}\">\n <div class=\"pointer-events-none absolute inset-x-0 top-0 z-10 flex h-8 items-center px-2 backdrop-blur\" data-header>\n <div class=\"flex min-w-0 items-center gap-1 rounded-sm px-1 text-sm font-semibold text-foreground\" data-title-wrap>\n ${chart.pinned ? iconSvg(\"pushPinSimple\", { size: 14, className: \"shrink-0 text-foreground/80\" }) : \"\"}\n <span class=\"truncate\">${escapeHtml(chart.title)}</span>\n </div>\n </div>\n <div data-grid-lines class=\"pointer-events-none absolute text-border/40\"></div>\n <div data-latest-lines></div>\n <div data-y-axis class=\"absolute z-20\" style=\"${valueAxisStyle}\"></div>\n <div data-x-axis class=\"absolute z-20\" style=\"${categoryAxisStyle}\"></div>\n <div data-toolbar></div>\n </div>`;\n};\n\nconst makeSurface = (canvas, gl) => ({\n canvas,\n gl,\n renderers: createRendererRegistry(gl),\n});\n\nconst destroySurface = (surface) => {\n if (!surface) return;\n surface.renderers.destroy();\n surface.gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n};\n\nclass AppendAnimator {\n constructor(requestRender) {\n this.requestRender = requestRender;\n this.latest = new Map();\n this.animations = new Map();\n this.frame = null;\n }\n\n scan(charts, descriptors) {\n const now = performance.now();\n charts.forEach((chart) => {\n const descriptor = descriptors.get(chart.id);\n if (!descriptor?.capabilities.appendAnimation) return;\n chart.series.forEach((series) => {\n if (!series.length) 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 = this.latest.get(series.id);\n if (previous && next.x > previous.x) {\n this.animations.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: APPEND_ANIMATION.durationMs,\n });\n }\n this.latest.set(series.id, next);\n });\n });\n if (this.animations.size) this.start();\n }\n\n start() {\n if (this.frame != null) return;\n const tick = () => {\n const now = performance.now();\n this.animations.forEach((animation, id) => {\n if (now - animation.startedAt >= animation.duration) this.animations.delete(id);\n });\n this.requestRender();\n this.frame = this.animations.size ? requestAnimationFrame(tick) : null;\n };\n this.frame = requestAnimationFrame(tick);\n }\n\n getPoint({ seriesId, visiblePoints, now }) {\n if (visiblePoints.bucketSize > APPEND_ANIMATION.maxBucketSize) return null;\n const animation = this.animations.get(seriesId);\n if (!animation || visiblePoints.x[0] > animation.fromX || visiblePoints.x[visiblePoints.pointCount - 1] < animation.toX) return null;\n let stableCount = 0;\n while (stableCount < visiblePoints.pointCount && visiblePoints.x[stableCount] <= animation.fromX) stableCount += 1;\n if (!stableCount) return null;\n const rawProgress = clamp((now - animation.startedAt) / animation.duration, 0, 1);\n const progress = 1 - (1 - rawProgress) ** 2;\n if (animation.appendedCount > APPEND_ANIMATION.maxRevealPoints) {\n return {\n index: stableCount,\n pointCount: stableCount + 1,\n x: animation.fromX + (animation.toX - animation.fromX) * progress,\n y: animation.fromY + (animation.toY - animation.fromY) * progress,\n };\n }\n const appendedCount = visiblePoints.pointCount - stableCount;\n const position = progress * appendedCount;\n const revealed = Math.min(appendedCount, Math.floor(position));\n const nextIndex = Math.min(visiblePoints.pointCount - 1, stableCount + revealed);\n const previousIndex = Math.max(stableCount - 1, nextIndex - 1);\n const partial = position - revealed;\n const partialPoint = revealed < appendedCount;\n return {\n index: nextIndex,\n pointCount: Math.min(visiblePoints.pointCount, nextIndex + 1),\n x: partialPoint ? visiblePoints.x[previousIndex] + (visiblePoints.x[nextIndex] - visiblePoints.x[previousIndex]) * partial : visiblePoints.x[nextIndex],\n y: partialPoint ? visiblePoints.y[previousIndex] + (visiblePoints.y[nextIndex] - visiblePoints.y[previousIndex]) * partial : visiblePoints.y[nextIndex],\n };\n }\n\n destroy() {\n if (this.frame != null) cancelAnimationFrame(this.frame);\n this.frame = null;\n this.animations.clear();\n }\n}\n\nclass ChartGridController {\n constructor(container, options) {\n if (!(container instanceof HTMLElement)) throw new TypeError(\"createChartGrid requires an HTMLElement target\");\n this.container = container;\n this.controllerId = `aliencharts-${controllerIdSequence += 1}`;\n this.options = { ...DEFAULT_OPTIONS, ...options };\n if (!Array.isArray(this.options.charts)) throw new TypeError(\"charts must be an array\");\n this.chartDescriptors = resolveChartDescriptors(this.options.charts);\n this.destroyed = false;\n this.frame = null;\n this.structureDirty = true;\n this.focusedChartId = null;\n this.fullscreenChartId = null;\n this.rectangleZoomChartId = null;\n this.rectangleZoomRect = null;\n this.crosshair = null;\n this.drag = null;\n this.draftDrawing = null;\n this.drawingSession = null;\n this.drawings = Array.isArray(options.drawings) ? [...options.drawings] : [];\n this.activeDrawingTool = options.activeDrawingTool ?? null;\n this.selectedDrawingId = options.selectedDrawingId ?? null;\n this.movingAverageByChart = { ...(options.movingAverageByChart || {}) };\n this.viewStates = new Map();\n this.yScales = new Map();\n this.yOffsets = new Map();\n this.latestX = new Map();\n this.axisOverlays = {};\n this.layouts = [];\n this.fullscreenLayouts = [];\n this.addedClasses = BASE_ROOT_CLASSES.filter((name) => !container.classList.contains(name));\n BASE_ROOT_CLASSES.forEach((name) => container.classList.add(name));\n\n this.canvas = document.createElement(\"canvas\");\n this.canvas.className = \"pointer-events-none absolute left-0 top-0 z-10 block\";\n this.grid = document.createElement(\"div\");\n this.grid.className = \"relative z-0 grid gap-1 pt-1\";\n this.overlays = document.createElement(\"div\");\n this.overlays.className = \"pointer-events-none absolute left-0 top-0 z-20\";\n this.overlays.style.width = \"100%\";\n container.append(this.canvas, this.grid, this.overlays);\n\n const gl = this.canvas.getContext(\"webgl2\", { antialias: true, alpha: true, depth: false, stencil: false });\n if (!gl) {\n this.cleanupDom();\n throw new Error(\"AlienCharts requires WebGL2 support\");\n }\n this.surface = makeSurface(this.canvas, gl);\n this.fullscreenSurface = null;\n this.animator = new AppendAnimator(() => this.requestRender());\n this.animator.scan(this.options.charts, this.chartDescriptors);\n this.bound = {\n click: (event) => this.handleClick(event),\n input: (event) => this.handleInput(event),\n change: (event) => this.handleInput(event),\n pointerdown: (event) => this.handlePointerDown(event),\n pointermove: (event) => this.handlePointerMove(event),\n pointerup: (event) => this.handlePointerUp(event),\n pointerleave: () => this.clearCrosshair(),\n contextmenu: (event) => this.handleContextMenu(event),\n wheel: (event) => this.handleWheel(event),\n scroll: () => this.requestRender(),\n keydown: (event) => this.handleKeyDown(event),\n };\n Object.entries(this.bound).forEach(([name, handler]) => {\n const target = name === \"keydown\" ? window : container;\n target.addEventListener(name, handler, name === \"wheel\" ? { passive: false } : undefined);\n });\n this.resizeObserver = new ResizeObserver(() => this.requestRender());\n this.resizeObserver.observe(container);\n this.initializeChartState();\n this.requestRender();\n }\n\n assertAlive() {\n if (this.destroyed) throw new Error(\"AlienCharts controller has been destroyed\");\n }\n\n initializeChartState() {\n const ids = new Set(this.options.charts.map((chart) => chart.id));\n [this.viewStates, this.yScales, this.yOffsets, this.latestX].forEach((map) => {\n [...map.keys()].forEach((id) => { if (!ids.has(id)) map.delete(id); });\n });\n this.options.charts.forEach((chart) => {\n if (!this.viewStates.has(chart.id)) this.viewStates.set(chart.id, getInitialView(chart, this.options.initialVisiblePoints));\n if (!this.yScales.has(chart.id)) this.yScales.set(chart.id, 1);\n if (!this.yOffsets.has(chart.id)) this.yOffsets.set(chart.id, 0);\n if (!this.latestX.has(chart.id)) this.latestX.set(chart.id, getChartXBounds(chart).maxX);\n });\n if (this.focusedChartId && !ids.has(this.focusedChartId)) this.focusedChartId = null;\n if (this.fullscreenChartId && !ids.has(this.fullscreenChartId)) this.closeFullscreen();\n }\n\n requestRender() {\n if (this.destroyed || this.frame != null) return;\n this.frame = requestAnimationFrame(() => {\n this.frame = null;\n this.render();\n });\n }\n\n setOptions(next) {\n this.assertAlive();\n if (!next || typeof next !== \"object\") return;\n const previousCharts = this.options.charts;\n const previousActiveDrawingTool = this.activeDrawingTool;\n const nextOptions = { ...this.options, ...next };\n if (!Array.isArray(nextOptions.charts)) throw new TypeError(\"charts must be an array\");\n const nextDescriptors = resolveChartDescriptors(nextOptions.charts);\n const descriptorLayoutChanged = nextOptions.charts.some((chart) => {\n const previous = this.chartDescriptors.get(chart.id);\n const current = nextDescriptors.get(chart.id);\n return (\n previous?.rendererType !== current?.rendererType ||\n previous?.orientation !== current?.orientation ||\n previous?.categorical !== current?.categorical\n );\n });\n this.options = nextOptions;\n this.chartDescriptors = nextDescriptors;\n if (hasOwn(next, \"drawings\")) this.drawings = Array.isArray(next.drawings) ? [...next.drawings] : [];\n if (hasOwn(next, \"activeDrawingTool\")) {\n this.activeDrawingTool = next.activeDrawingTool ?? null;\n if (this.activeDrawingTool !== previousActiveDrawingTool) {\n this.draftDrawing = null;\n this.drawingSession = null;\n }\n }\n if (hasOwn(next, \"selectedDrawingId\")) this.selectedDrawingId = next.selectedDrawingId ?? null;\n if (hasOwn(next, \"movingAverageByChart\")) this.movingAverageByChart = { ...(next.movingAverageByChart || {}) };\n if (previousCharts !== this.options.charts || descriptorLayoutChanged || hasOwn(next, \"columns\") || hasOwn(next, \"backgroundColor\") || hasOwn(next, \"gridLines\")) this.structureDirty = true;\n this.initializeChartState();\n this.requestRender();\n }\n\n setCharts(charts) {\n this.setOptions({ charts });\n }\n\n invalidate() {\n this.assertAlive();\n this.followAppendedData();\n this.animator.scan(this.options.charts, this.chartDescriptors);\n this.requestRender();\n }\n\n followAppendedData() {\n this.options.charts.forEach((chart) => {\n const previous = this.latestX.get(chart.id);\n const next = getChartXBounds(chart).maxX;\n if (Number.isFinite(previous) && Number.isFinite(next) && next !== previous) {\n const state = this.viewStates.get(chart.id) || getInitialView(chart, this.options.initialVisiblePoints);\n const span = state.xMax - state.xMin;\n const nearEdge = previous >= state.xMax - span * 0.15 && previous >= state.xMin && previous <= state.xMax;\n if (this.options.followLatest || (this.options.followVisibleLatest && nearEdge)) {\n const delta = next - previous;\n this.viewStates.set(chart.id, { xMin: state.xMin + delta, xMax: state.xMax + delta });\n }\n }\n this.latestX.set(chart.id, next);\n });\n }\n\n jumpToLatest(chartId) {\n this.assertAlive();\n this.options.charts.forEach((chart) => {\n if (chartId != null && chart.id !== chartId) return;\n const maxX = getChartXBounds(chart).maxX;\n if (!Number.isFinite(maxX)) return;\n const state = this.viewStates.get(chart.id) || getInitialView(chart, this.options.initialVisiblePoints);\n const span = Math.max(\n getMinimumCategorySpan(chart),\n state.xMax - state.xMin,\n );\n const nextMax = maxX + span * 0.1;\n this.viewStates.set(chart.id, { xMin: nextMax - span, xMax: nextMax });\n });\n this.requestRender();\n }\n\n scrollToTop(options = {}) {\n this.assertAlive();\n this.container.scrollTo({ ...options, top: 0 });\n }\n\n renderStructure() {\n this.grid.style.gridTemplateColumns = `repeat(${Math.max(1, Number(this.options.columns) || 1)}, minmax(18rem, 1fr))`;\n this.grid.innerHTML = this.options.charts.map((chart, index) =>\n chartCellHtml(\n chart,\n this.chartDescriptors.get(chart.id),\n index,\n this.options.backgroundColor,\n )).join(\"\");\n this.chartNodes = [...this.grid.querySelectorAll(\"[data-chart-index]\")];\n this.chartNodes.forEach((node) => {\n node.querySelector(\"[data-header]\").style.backgroundColor = withAlpha(this.options.backgroundColor, 0.82);\n });\n this.structureDirty = false;\n }\n\n getLayouts(fullscreen = false) {\n const nodes = fullscreen ? (this.fullscreenNode ? [this.fullscreenNode] : []) : this.chartNodes || [];\n const charts = fullscreen\n ? this.options.charts.filter((chart) => chart.id === this.fullscreenChartId)\n : this.options.charts;\n const host = fullscreen ? this.fullscreenOverlay : this.container;\n const hostRect = host.getBoundingClientRect();\n return nodes.map((node, index) => {\n const rect = node.getBoundingClientRect();\n const x = rect.left - hostRect.left + host.scrollLeft;\n const y = rect.top - hostRect.top + host.scrollTop;\n const chart = charts[index];\n const descriptor = this.chartDescriptors.get(chart.id);\n const padding = getPlotPadding(chart, descriptor);\n const layout = {\n chart,\n descriptor,\n rect: { x, y, width: rect.width, height: rect.height },\n plot: {\n x: x + padding.left,\n y: y + padding.top,\n width: Math.max(1, rect.width - padding.left - padding.right),\n height: Math.max(1, rect.height - padding.top - padding.bottom),\n },\n visible: fullscreen || (rect.bottom >= hostRect.top && rect.top <= hostRect.bottom),\n node,\n fullscreen,\n };\n return layout;\n });\n }\n\n render() {\n const focusState = this.captureControlFocus();\n if (this.structureDirty) this.renderStructure();\n this.layouts = this.getLayouts(false);\n this.axisOverlays = this.drawSurface(this.surface, this.layouts, this.container.scrollWidth, this.container.scrollHeight);\n this.updateCells(this.layouts, this.axisOverlays, false);\n if (this.fullscreenChartId) {\n this.fullscreenLayouts = this.getLayouts(true);\n const axes = this.drawSurface(this.fullscreenSurface, this.fullscreenLayouts, this.fullscreenOverlay.clientWidth, this.fullscreenOverlay.clientHeight);\n this.updateCells(this.fullscreenLayouts, axes, true);\n }\n this.renderOverlays();\n this.restoreControlFocus(focusState);\n }\n\n captureControlFocus() {\n const active = document.activeElement;\n if (!(active instanceof HTMLInputElement)) return null;\n const selector = active.matches(\"[data-moving-period]\")\n ? \"[data-moving-period]\"\n : active.matches(\"[data-pin-text]\")\n ? \"[data-pin-text]\"\n : active.matches(\"[data-drawing-color]\")\n ? \"[data-drawing-color]\"\n : null;\n if (!selector) return null;\n const fullscreen = Boolean(active.closest(\"[data-aliencharts-fullscreen]\"));\n let selectionStart = null;\n let selectionEnd = null;\n if (active.type === \"text\") {\n selectionStart = active.selectionStart;\n selectionEnd = active.selectionEnd;\n }\n return { selector, fullscreen, selectionStart, selectionEnd };\n }\n\n restoreControlFocus(state) {\n if (!state) return;\n const host = state.fullscreen ? this.fullscreenOverlay : this.container;\n const input = host?.querySelector(state.selector);\n if (!(input instanceof HTMLInputElement)) return;\n input.focus({ preventScroll: true });\n if (input.type === \"text\" && state.selectionStart != null) {\n input.setSelectionRange(state.selectionStart, state.selectionEnd);\n }\n }\n\n drawSurface(surface, layouts, width, height) {\n if (!surface) return {};\n return drawChartLayouts({\n canvas: surface.canvas,\n width: Math.max(1, width),\n height: Math.max(1, height),\n gl: surface.gl,\n rendererRegistry: surface.renderers,\n antialiasLines: this.options.antialiasLines,\n layouts,\n viewStateRef: { current: this.viewStates },\n yScaleRef: { current: this.yScales },\n yCenterOffsetRef: { current: this.yOffsets },\n initialVisiblePoints: this.options.initialVisiblePoints,\n getAppendAnimatedPoint: (payload) => this.animator.getPoint(payload),\n movingAverageByChart: this.movingAverageByChart,\n seriesOrderByChart: this.options.seriesOrderByChart,\n });\n }\n\n updateCells(layouts, axes, fullscreen) {\n layouts.forEach(({ chart, descriptor, node }) => {\n const axis = axes[chart.id];\n const padding = getPlotPadding(chart, descriptor);\n const horizontal = axis?.orientation === \"horizontal\";\n node.querySelector(\"[data-title-wrap]\").classList.toggle(\"ring-1\", this.focusedChartId === chart.id);\n node.querySelector(\"[data-title-wrap]\").classList.toggle(\"ring-primary/70\", this.focusedChartId === chart.id);\n const grid = node.querySelector(\"[data-grid-lines]\");\n const gridOptions = this.options.gridLines === true ? {} : this.options.gridLines || {};\n grid.style.display = this.options.gridLines ? \"block\" : \"none\";\n Object.assign(grid.style, {\n left: `${padding.left}px`, right: `${padding.right}px`, top: `${padding.top}px`, bottom: `${padding.bottom}px`,\n backgroundImage: \"linear-gradient(to right, transparent calc(100% - 1px), currentColor calc(100% - 1px)), linear-gradient(to bottom, transparent calc(100% - 1px), currentColor calc(100% - 1px))\",\n backgroundSize: `${Math.max(8, Number(gridOptions.xSpacing) || 80)}px 100%, 100% ${Math.max(8, Number(gridOptions.ySpacing) || 48)}px`,\n });\n const yAxis = node.querySelector(\"[data-y-axis]\");\n yAxis.style.backgroundColor = withAlpha(this.options.backgroundColor, 0.78);\n yAxis.innerHTML = (axis?.ticks || []).map((tick) => horizontal\n ? `<div class=\"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\" style=\"left:${tick.left}px\">${escapeHtml(this.options.formatYValue(tick.value))}</div>`\n : `<div class=\"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\" style=\"top:${tick.top}px\">${escapeHtml(this.options.formatYValue(tick.value))}</div>`).join(\"\") +\n (axis?.latestValues || []).map((latest) => `<div class=\"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\" style=\"top:${latest.top}px;background:${latest.color};color:${getTextColor(latest.color)}\">${escapeHtml(this.options.formatYValue(latest.value))}</div>`).join(\"\");\n const xAxis = node.querySelector(\"[data-x-axis]\");\n xAxis.style.backgroundColor = withAlpha(this.options.backgroundColor, 0.7);\n xAxis.innerHTML = (axis?.xTicks || []).map((tick) => {\n const label = tick.categorical\n ? tick.label\n : this.options.formatXTick(tick.value);\n if (horizontal && tick.categorical) {\n return `<div data-category-label title=\"${escapeHtml(label)}\" class=\"pointer-events-none absolute inset-x-2 -translate-y-1/2 truncate text-right text-[11px] font-medium text-foreground/70\" style=\"top:${tick.top}px\">${escapeHtml(label)}</div>`;\n }\n if (tick.categorical) {\n return `<div data-category-label title=\"${escapeHtml(label)}\" class=\"pointer-events-none absolute top-1/2 w-24 -translate-x-1/2 -translate-y-1/2 truncate text-center text-[11px] font-medium text-foreground/70\" style=\"left:${tick.left}px\">${escapeHtml(label)}</div>`;\n }\n return horizontal\n ? `<div class=\"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\" style=\"top:${tick.top}px\">${escapeHtml(label)}</div>`\n : `<div class=\"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\" style=\"left:${tick.left}px\">${escapeHtml(label)}</div>`;\n }).join(\"\");\n const latestLayer = node.querySelector(\"[data-latest-lines]\");\n latestLayer.innerHTML = this.options.showLatestValueLine ? (axis?.latestValues || []).filter((item) => item.left >= 0 && item.left <= axis.plotWidth).map((item) => `<div class=\"pointer-events-none absolute z-10 opacity-70\" style=\"left:${padding.left + item.left}px;top:${padding.top + item.top}px;height:1px;width:${Math.max(0, axis.plotWidth - item.left)}px;background-image:repeating-linear-gradient(to right,${item.color} 0 4px,transparent 4px 8px)\"></div>`).join(\"\") : \"\";\n this.updateToolbar(node, chart, axis, fullscreen);\n });\n }\n\n updateToolbar(node, chart, axis, fullscreen) {\n const target = node.querySelector(\"[data-toolbar]\");\n const focused = fullscreen || this.focusedChartId === chart.id;\n const descriptor = this.chartDescriptors.get(chart.id);\n const drawingsAvailable = descriptor.capabilities.drawings;\n const movingAverageAvailable = descriptor.capabilities.movingAverage;\n const padding = getPlotPadding(chart, descriptor);\n let html = \"\";\n if (axis?.showJumpLatest) html += `<button type=\"button\" data-action=\"jump-latest\" aria-label=\"Jump to latest\" class=\"absolute z-30 inline-flex size-7 items-center justify-center rounded-sm text-foreground hover:bg-accent\" style=\"right:${padding.right + 6}px;bottom:${padding.bottom + 6}px;background:${withAlpha(this.options.backgroundColor, 0.7)}\">${iconSvg(\"arrowLineRight\", { className: axis.orientation === \"horizontal\" ? \"rotate-90\" : \"\" })}</button>`;\n if (focused && this.options.showToolbar) {\n const moving = movingAverageAvailable && Boolean(this.movingAverageByChart[chart.id]?.enabled);\n const hasDrawings = getDrawingsForChart(this.drawings, chart.id).length > 0;\n html += `<div class=\"absolute left-2 top-12 z-30 flex flex-col gap-0.5 rounded-sm bg-background/80 pr-3 text-foreground shadow-sm backdrop-blur\">`;\n html += toolbarButton({ action: \"fullscreen\", title: fullscreen ? \"Exit fullscreen\" : \"Maximize chart\", hotkey: \"F\", icon: iconSvg(fullscreen ? \"arrowsIn\" : \"arrowsOut\") });\n html += toolbarButton({ action: \"reset\", title: \"Reset chart\", hotkey: \"R\", icon: iconSvg(\"arrowCounterClockwise\") });\n html += toolbarButton({ action: \"rectangle-zoom\", title: \"Rectangle zoom\", hotkey: \"Z\", active: this.rectangleZoomChartId === chart.id, icon: iconSvg(\"magnifyingGlassPlus\") });\n if (drawingsAvailable && !this.options.disableDrawings && hasDrawings) html += toolbarButton({ action: \"clear-drawings\", title: \"Clear drawings\", className: \"text-orange-500\", icon: iconSvg(\"broom\") });\n if ((drawingsAvailable || movingAverageAvailable) && !this.options.disableDrawings) {\n html += '<div class=\"my-1 h-px w-full\"></div>';\n if (drawingsAvailable) {\n html += toolbarButton({ action: \"tool-trendline\", title: \"Draw trendline\", hotkey: \"T\", active: this.activeDrawingTool === \"trendline\", icon: iconSvg(\"minus\", { className: \"-rotate-45\" }) });\n html += toolbarButton({ action: \"tool-hline\", title: \"Draw horizontal line\", hotkey: \"H\", active: this.activeDrawingTool === \"hline\", icon: iconSvg(\"minus\") });\n html += toolbarButton({ action: \"tool-vline\", title: \"Draw vertical line\", hotkey: \"V\", active: this.activeDrawingTool === \"vline\", icon: iconSvg(\"minus\", { className: \"rotate-90\" }) });\n html += toolbarButton({ action: \"tool-pin\", title: \"Place pin\", hotkey: \"P\", active: this.activeDrawingTool === \"pin\", icon: iconSvg(\"mapPin\") });\n }\n if (movingAverageAvailable) html += toolbarButton({ action: \"moving-average\", title: \"Toggle moving average\", hotkey: \"M\", active: moving, icon: iconSvg(\"waveSine\") });\n }\n html += \"</div>\";\n if (movingAverageAvailable && !this.options.disableDrawings && moving) html += this.movingAverageOptionsHtml(chart);\n }\n target.innerHTML = html;\n }\n\n movingAverageOptionsHtml(chart) {\n const moving = this.movingAverageByChart[chart.id] || { enabled: true, period: 21, type: \"ema\", hideBase: false };\n return `<div data-moving-options class=\"absolute right-16 top-2 z-40 flex items-center gap-1 rounded-sm bg-background/85 p-1 text-xs text-foreground shadow-sm\">\n <button type=\"button\" data-action=\"toggle-base\" title=\"${moving.hideBase ? \"Show\" : \"Hide\"} base series\" aria-label=\"${moving.hideBase ? \"Show\" : \"Hide\"} base series\" class=\"inline-flex size-6 items-center justify-center rounded-sm ${moving.hideBase ? \"bg-primary/15 text-primary ring-1 ring-primary/40\" : \"\"}\">${iconSvg(\"eye\", { size: 14 })}</button>\n <button type=\"button\" data-action=\"moving-type\" title=\"Toggle moving average type\" class=\"h-6 rounded-sm px-2 text-[11px] font-semibold uppercase\">${moving.type === \"sma\" ? \"sma\" : \"ema\"}</button>\n <input data-moving-period type=\"number\" min=\"1\" step=\"1\" value=\"${Math.max(1, Number(moving.period) || 21)}\" title=\"Moving average period\" class=\"h-6 w-14 rounded-sm border border-border/50 px-1 text-xs\" />\n </div>`;\n }\n\n renderOverlays() {\n const surface = this.fullscreenChartId ? this.fullscreenOverlay : this.container;\n const overlay = this.fullscreenChartId ? this.fullscreenOverlays : this.overlays;\n const layouts = this.fullscreenChartId ? this.fullscreenLayouts : this.layouts;\n if (!overlay) return;\n overlay.style.height = `${surface.scrollHeight}px`;\n let html = this.drawingOverlayHtml(layouts);\n html += this.topMarkersHtml(layouts);\n html += this.crosshairHtml();\n html += this.rectangleOverlayHtml();\n html += this.drawingOptionsHtml(layouts);\n overlay.innerHTML = html;\n }\n\n drawingOverlayHtml(layouts) {\n const drawings = this.draftDrawing ? [...this.drawings, this.draftDrawing] : this.drawings;\n if (!drawings.length) return \"\";\n const drawableLayouts = layouts\n .map((layout, index) => ({\n layout,\n index,\n drawings: layout.descriptor.capabilities.drawings\n ? getDrawingsForChart(drawings, layout.chart.id)\n : [],\n }))\n .filter((entry) => entry.drawings.length > 0);\n if (!drawableLayouts.length) return \"\";\n\n const definitions = drawableLayouts.map(({ layout, index }) => {\n const clipId = `${this.controllerId}-drawing-clip-${layout.fullscreen ? \"fullscreen\" : \"grid\"}-${index}`;\n return `<clipPath id=\"${clipId}\"><rect data-drawing-clip=\"${escapeHtml(layout.chart.id)}\" x=\"${layout.plot.x}\" y=\"${layout.plot.y}\" width=\"${layout.plot.width}\" height=\"${layout.plot.height}\"/></clipPath>`;\n }).join(\"\");\n\n const body = drawableLayouts.map(({ layout, index, drawings: chartDrawings }) => {\n const clipId = `${this.controllerId}-drawing-clip-${layout.fullscreen ? \"fullscreen\" : \"grid\"}-${index}`;\n const chartBody = chartDrawings.map((drawing) => {\n const geometry = getDrawingGeometry({ drawing, layout, projectPoint: (point) => this.projectPoint(point, layout) });\n if (!geometry) return \"\";\n const selected = drawing.id === this.selectedDrawingId || drawing.id === \"__draft__\";\n if (drawing.type === \"pin\") {\n const text = escapeHtml(geometry.style.text?.trim() || \"\");\n return `<g opacity=\"${drawing.id === \"__draft__\" ? 0.72 : 1}\"><g transform=\"translate(${geometry.start.x} ${geometry.start.y})\"><path 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\" fill=\"${geometry.style.color}\" stroke=\"var(--background,#fff)\" stroke-width=\"1.5\"/><circle cy=\"-2\" r=\"3\" fill=\"var(--background,#fff)\"/></g>${text ? `<text x=\"${geometry.start.x + 14}\" y=\"${geometry.start.y}\" fill=\"${geometry.style.color}\" stroke=\"var(--background,#fff)\" stroke-width=\"3\" paint-order=\"stroke\" font-size=\"12\" font-weight=\"600\">${text}</text>` : \"\"}${selected ? `<circle cx=\"${geometry.start.x}\" cy=\"${geometry.start.y}\" r=\"4\" fill=\"${geometry.style.color}\" stroke=\"var(--background,#fff)\"/>` : \"\"}</g>`;\n }\n return `<g><line data-drawing-line x1=\"${geometry.lineStart.x}\" y1=\"${geometry.lineStart.y}\" x2=\"${geometry.lineEnd.x}\" y2=\"${geometry.lineEnd.y}\" stroke=\"${geometry.style.color}\" stroke-width=\"${geometry.style.lineWidth}\" stroke-dasharray=\"${geometry.style.dashPattern.join(\" \")}\" opacity=\"${drawing.id === \"__draft__\" ? 0.72 : 1}\"/>${selected ? `<circle data-drawing-anchor=\"start\" cx=\"${geometry.start.x}\" cy=\"${geometry.start.y}\" r=\"4\" fill=\"${geometry.style.color}\" stroke=\"var(--background,#fff)\"/>${drawing.type === \"trendline\" ? `<circle data-drawing-anchor=\"end\" cx=\"${geometry.end.x}\" cy=\"${geometry.end.y}\" r=\"4\" fill=\"${geometry.style.color}\" stroke=\"var(--background,#fff)\"/>` : \"\"}` : \"\"}</g>`;\n }).join(\"\");\n return `<g data-drawing-chart=\"${escapeHtml(layout.chart.id)}\" clip-path=\"url(#${clipId})\">${chartBody}</g>`;\n }).join(\"\");\n return `<svg class=\"pointer-events-none absolute left-0 top-0 z-20 block overflow-visible\" style=\"width:100%;height:100%\"><defs>${definitions}</defs>${body}</svg>`;\n }\n\n topMarkersHtml(layouts) {\n if (!this.options.topMarkers?.length) return \"\";\n return layouts.flatMap((layout) => !layout.descriptor.capabilities.markers\n ? []\n : this.options.topMarkers.map((marker, markerIndex) => {\n const value = Number(marker.x ?? marker.step);\n const state = this.viewStates.get(layout.chart.id);\n const ratio = (value - state.xMin) / (state.xMax - state.xMin);\n if (!Number.isFinite(value) || ratio < 0 || ratio > 1) return \"\";\n return `<button type=\"button\" data-marker-index=\"${markerIndex}\" class=\"pointer-events-auto absolute z-30 -translate-x-1/2 rounded-full\" style=\"left:${layout.plot.x + ratio * layout.plot.width}px;top:${layout.plot.y + 4}px\" title=\"${escapeHtml(marker.title || \"\")}\" aria-label=\"${escapeHtml(marker.ariaLabel || marker.title || \"Chart marker\")}\"><span class=\"block size-2.5 rounded-full border border-background shadow-sm\" style=\"background:${marker.color || \"#f97316\"}\"></span></button>`;\n })).join(\"\");\n }\n\n crosshairHtml() {\n const crosshair = this.options.showTooltips ? this.crosshair : null;\n if (!crosshair) return \"\";\n const chart = this.options.charts.find(\n (item) => item.id === crosshair.chartId,\n );\n const xAxisLabel = chart?.xAxisLabel ?? this.options.xAxisLabel;\n return `<div class=\"pointer-events-none absolute z-20 border-l border-foreground/40\" style=\"left:${crosshair.x}px;top:0;height:100%\"></div><div class=\"pointer-events-none absolute z-20 border-t border-foreground/40\" style=\"top:${crosshair.y}px;left:0;width:100%\"></div>\n ${crosshair.points.map((point) => `<div class=\"pointer-events-none absolute z-30 size-2.5 -translate-x-1/2 -translate-y-1/2 rounded-full border border-background\" style=\"left:${point.x}px;top:${point.y}px;background:${point.color}\"></div>`).join(\"\")}\n <div data-crosshair-tooltip class=\"pointer-events-none absolute z-30 w-[220px] rounded-sm border border-border/70 bg-popover/80 px-2 py-1.5 text-xs text-popover-foreground shadow-sm backdrop-blur-sm\" style=\"left:${crosshair.tooltipX}px;top:${crosshair.tooltipY}px\"><div class=\"mb-1 font-medium\">${escapeHtml(xAxisLabel)}: ${escapeHtml(crosshair.categoryLabel ?? this.options.formatXValue(crosshair.xValue))}</div>${crosshair.points.map((point) => `<div class=\"grid grid-cols-[auto_1fr] gap-x-2\"><span class=\"mt-1 size-2 rounded-full\" style=\"background:${point.color}\"></span><div class=\"min-w-0\"><div class=\"truncate text-muted-foreground\">${escapeHtml(point.name)}</div><div class=\"tabular-nums\">${escapeHtml(this.options.formatYValue(point.yValue))}</div></div></div>`).join(\"\")}</div>`;\n }\n\n rectangleOverlayHtml() {\n const rect = this.rectangleZoomRect && normalizeRect(this.rectangleZoomRect.start, this.rectangleZoomRect.end);\n return rect ? `<div class=\"pointer-events-none absolute z-40 rounded-sm border border-primary/70 bg-primary/10\" style=\"left:${rect.left}px;top:${rect.top}px;width:${rect.width}px;height:${rect.height}px\"></div>` : \"\";\n }\n\n drawingOptionsHtml(layouts) {\n const drawing = this.drawings.find((item) => item.id === this.selectedDrawingId);\n if (!drawing) return \"\";\n const layout = layouts.find((item) => item.chart.id === drawing.chartId);\n if (!layout || !layout.descriptor.capabilities.drawings) return \"\";\n const style = drawing.style || {};\n const canExtend = drawing.type === \"trendline\" || drawing.type === \"hline\";\n const canText = drawing.type === \"pin\";\n const left = Math.max(\n layout.rect.x + 42,\n layout.rect.x + layout.rect.width - PLOT_PADDING.right - 8,\n );\n return `<div data-drawing-options class=\"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\" style=\"left:${left}px;top:${layout.plot.y + 6}px;transform:translateX(-100%)\">\n ${canExtend ? `<button type=\"button\" data-action=\"extend-drawing\" class=\"h-6 rounded-sm px-2 text-[11px] font-semibold ${style.extendRight ? \"bg-primary/15 text-primary ring-1 ring-primary/40\" : \"\"}\">Ext</button>` : \"\"}\n ${canText ? `<input data-pin-text type=\"text\" value=\"${escapeHtml(style.text || \"\")}\" placeholder=\"Text\" class=\"h-6 w-24 rounded-sm border border-border/50 px-1.5 text-xs\"/>` : \"\"}\n <input data-drawing-color type=\"color\" value=\"${/^#[0-9a-f]{6}$/i.test(style.color || \"\") ? style.color : \"#60a5fa\"}\" title=\"Line color\" class=\"size-6 rounded-sm border border-border/70\"/>\n </div>`;\n }\n\n projectPoint(point, layout) {\n const state = this.viewStates.get(layout.chart.id);\n const range = this.getRange(layout, state);\n return this.getTransform(layout, state, range).dataToScreen(point);\n }\n\n getRange(layout, state = this.viewStates.get(layout.chart.id)) {\n return applyYScale(\n getYRange(\n layout.chart,\n state.xMin,\n state.xMax,\n getCategoryPixelLength(\n layout.chart,\n layout.plot,\n layout.descriptor,\n ),\n layout.descriptor,\n ),\n this.yScales.get(layout.chart.id),\n this.yOffsets.get(layout.chart.id),\n );\n }\n\n getTransform(layout, state, range) {\n return createCoordinateTransform({\n orientation: layout.descriptor.orientation,\n categoryRange: { min: state.xMin, max: state.xMax },\n valueRange: { min: range.minY, max: range.maxY },\n plot: layout.plot,\n });\n }\n\n pointForEvent(event, host) {\n const rect = host.getBoundingClientRect();\n return { x: event.clientX - rect.left + host.scrollLeft, y: event.clientY - rect.top + host.scrollTop };\n }\n\n eventContext(event) {\n const cell = event.target.closest?.(\"[data-chart-index]\");\n if (!cell) return null;\n const fullscreen = Boolean(cell.closest(\"[data-aliencharts-fullscreen]\"));\n const layouts = fullscreen ? this.fullscreenLayouts : this.layouts;\n const index = Number(cell.dataset.chartIndex);\n const layout = fullscreen ? layouts[0] : layouts[index];\n const host = fullscreen ? this.fullscreenOverlay : this.container;\n return layout ? { layout, host, point: this.pointForEvent(event, host), fullscreen } : null;\n }\n\n handleClick(event) {\n const marker = event.target.closest?.(\"[data-marker-index]\");\n if (marker) {\n event.stopPropagation();\n this.options.onTopMarkerClick?.(this.options.topMarkers[Number(marker.dataset.markerIndex)]);\n return;\n }\n const button = event.target.closest?.(\"[data-action]\");\n if (!button) return;\n event.preventDefault();\n event.stopPropagation();\n const context = this.eventContext(event);\n const chartId = context?.layout.chart.id || this.focusedChartId || this.fullscreenChartId;\n switch (button.dataset.action) {\n case \"fullscreen\": this.fullscreenChartId ? this.closeFullscreen() : this.openFullscreen(chartId); break;\n case \"reset\": this.resetChart(chartId); break;\n case \"jump-latest\": this.jumpToLatest(chartId); break;\n case \"rectangle-zoom\": this.rectangleZoomChartId = this.rectangleZoomChartId === chartId ? null : chartId; this.activeDrawingTool = null; this.emit(\"onActiveDrawingToolChange\", null); this.requestRender(); break;\n case \"clear-drawings\": this.options.onClearDrawingsRequest ? this.emit(\"onClearDrawingsRequest\", chartId) : this.setDrawings(this.drawings.filter((item) => item.chartId !== chartId)); break;\n case \"moving-average\": this.toggleMovingAverage(chartId); break;\n case \"tool-trendline\": this.toggleDrawingTool(\"trendline\"); break;\n case \"tool-hline\": this.toggleDrawingTool(\"hline\"); break;\n case \"tool-vline\": this.toggleDrawingTool(\"vline\"); break;\n case \"tool-pin\": this.toggleDrawingTool(\"pin\"); break;\n case \"toggle-base\": this.updateMovingAverage(chartId, { hideBase: !this.movingAverageByChart[chartId]?.hideBase }); break;\n case \"moving-type\": this.updateMovingAverage(chartId, { type: this.movingAverageByChart[chartId]?.type === \"sma\" ? \"ema\" : \"sma\" }); break;\n case \"extend-drawing\": this.updateSelectedDrawing((drawing) => ({ ...drawing, style: { ...drawing.style, extendRight: drawing.style?.extendRight === false } })); break;\n default: break;\n }\n }\n\n handleInput(event) {\n if (event.target.matches(\"[data-moving-period]\")) {\n const context = this.eventContext(event);\n this.updateMovingAverage(context?.layout.chart.id, { period: Math.max(1, Math.round(Number(event.target.value) || 1)) });\n } else if (event.target.matches(\"[data-pin-text]\")) {\n this.updateSelectedDrawing((drawing) => ({ ...drawing, style: { ...drawing.style, text: event.target.value } }));\n } else if (event.target.matches(\"[data-drawing-color]\")) {\n this.updateSelectedDrawing((drawing) => ({ ...drawing, style: { ...drawing.style, color: event.target.value } }));\n }\n }\n\n handlePointerDown(event) {\n if (event.target.closest?.(\"button,input\")) return;\n if (event.button !== 0) return;\n const context = this.eventContext(event);\n if (!context) return;\n const { layout, point } = context;\n this.activePointerContext = context;\n this.focusedChartId = layout.chart.id;\n const inPlot = point.x >= layout.plot.x && point.x <= layout.plot.x + layout.plot.width && point.y >= layout.plot.y && point.y <= layout.plot.y + layout.plot.height;\n if (inPlot && this.activeDrawingTool && !this.options.disableDrawings && layout.descriptor.capabilities.drawings) {\n const dataPoint = screenPointToDataPoint({ point, chart: layout.chart, descriptor: layout.descriptor, plot: layout.plot, initialVisiblePoints: this.options.initialVisiblePoints, viewStateRef: { current: this.viewStates }, yScaleRef: { current: this.yScales }, yCenterOffsetRef: { current: this.yOffsets } });\n if ([\"hline\", \"vline\", \"pin\"].includes(this.activeDrawingTool)) {\n this.commitDrawing(layout.chart.id, this.activeDrawingTool, dataPoint, dataPoint);\n } else if (this.drawingSession?.chartId === layout.chart.id) {\n this.commitDrawing(layout.chart.id, \"trendline\", this.drawingSession.start, dataPoint);\n } else {\n this.drawingSession = { chartId: layout.chart.id, type: \"trendline\", start: dataPoint };\n this.draftDrawing = createDraftDrawing({ chartId: layout.chart.id, type: \"trendline\", start: dataPoint, end: dataPoint });\n }\n } else if (inPlot && this.rectangleZoomChartId === layout.chart.id) {\n this.drag = { type: \"rectangle\", layout, start: point };\n this.rectangleZoomRect = { start: point, end: point };\n } else if (inPlot) {\n const hit = layout.descriptor.capabilities.drawings\n ? this.hitDrawing(point, layout)\n : null;\n if (hit) {\n this.selectedDrawingId = hit.drawing.id;\n this.emit(\"onSelectedDrawingIdChange\", hit.drawing.id);\n if (hit.endpoint != null || [\"hline\", \"vline\", \"pin\"].includes(hit.drawing.type)) {\n this.drag = { type: \"drawing-edit\", layout, drawingId: hit.drawing.id, endpoint: hit.endpoint };\n }\n } else {\n this.selectedDrawingId = null;\n this.emit(\"onSelectedDrawingIdChange\", null);\n this.drag = { type: \"pan\", layout, start: point, state: { ...this.viewStates.get(layout.chart.id) }, yOffset: this.yOffsets.get(layout.chart.id) || 0 };\n }\n } else if (\n layout.descriptor.orientation === \"vertical\" &&\n point.x >= layout.plot.x + layout.plot.width\n ) {\n this.drag = { type: \"y-scale\", layout, start: point, scale: this.yScales.get(layout.chart.id) || 1 };\n } else if (\n layout.descriptor.orientation === \"horizontal\" &&\n point.y >= layout.plot.y + layout.plot.height\n ) {\n this.drag = { type: \"y-scale\", layout, start: point, scale: this.yScales.get(layout.chart.id) || 1 };\n } else if (\n layout.descriptor.orientation === \"vertical\" &&\n point.y >= layout.plot.y + layout.plot.height\n ) {\n this.drag = { type: \"x-scale\", layout, start: point, state: { ...this.viewStates.get(layout.chart.id) } };\n } else if (\n layout.descriptor.orientation === \"horizontal\" &&\n point.x <= layout.plot.x\n ) {\n this.drag = { type: \"x-scale\", layout, start: point, state: { ...this.viewStates.get(layout.chart.id) } };\n }\n context.host.setPointerCapture?.(event.pointerId);\n this.pointerCaptureTarget = context.host;\n this.requestRender();\n }\n\n handlePointerMove(event) {\n if (event.target.closest?.(\"button,input\") && !this.drag && !this.drawingSession) return;\n const context = this.eventContext(event) || (this.activePointerContext && (this.drag || this.drawingSession)\n ? { ...this.activePointerContext, point: this.pointForEvent(event, this.activePointerContext.host) }\n : null);\n if (!context) return this.clearCrosshair();\n const { layout, point } = context;\n if (this.drawingSession) {\n if (layout.chart.id !== this.drawingSession.chartId) return;\n const end = screenPointToDataPoint({ point, chart: layout.chart, descriptor: layout.descriptor, plot: layout.plot, initialVisiblePoints: this.options.initialVisiblePoints, viewStateRef: { current: this.viewStates }, yScaleRef: { current: this.yScales }, yCenterOffsetRef: { current: this.yOffsets } });\n this.draftDrawing = createDraftDrawing({ ...this.drawingSession, end });\n this.requestRender();\n return;\n }\n if (this.drag) {\n const { chart, descriptor, plot } = this.drag.layout;\n if (this.drag.type === \"drawing-edit\") {\n const dataPoint = screenPointToDataPoint({ point, chart, descriptor, plot, initialVisiblePoints: this.options.initialVisiblePoints, viewStateRef: { current: this.viewStates }, yScaleRef: { current: this.yScales }, yCenterOffsetRef: { current: this.yOffsets } });\n const next = updateDrawingById(this.drawings, this.drag.drawingId, (drawing) => {\n if (drawing.type === \"hline\") {\n const deltaX = (drawing.end?.x ?? drawing.start.x) - drawing.start.x;\n return { ...drawing, start: { x: dataPoint.x, y: dataPoint.y }, end: { x: dataPoint.x + deltaX, y: dataPoint.y } };\n }\n if (drawing.type === \"vline\") return { ...drawing, start: { ...drawing.start, x: dataPoint.x }, end: { ...drawing.end, x: dataPoint.x } };\n if (drawing.type === \"pin\") return { ...drawing, start: dataPoint, end: dataPoint };\n if (this.drag.endpoint === \"start\" || this.drag.endpoint === \"end\") return { ...drawing, [this.drag.endpoint]: dataPoint };\n return drawing;\n });\n this.drawings = next;\n this.emit(\"onDrawingsChange\", [...next]);\n this.requestRender();\n return;\n }\n if (this.drag.type === \"rectangle\") this.rectangleZoomRect = { start: this.drag.start, end: point };\n if (this.drag.type === \"pan\") {\n const span = this.drag.state.xMax - this.drag.state.xMin;\n const baseRange = getYRange(\n chart,\n this.drag.state.xMin,\n this.drag.state.xMax,\n getCategoryPixelLength(chart, plot, descriptor),\n descriptor,\n );\n const rangeSpan = (baseRange.maxY - baseRange.minY) * (this.yScales.get(chart.id) || 1);\n const transform = createCoordinateTransform({\n orientation: descriptor.orientation,\n categoryRange: {\n min: this.drag.state.xMin,\n max: this.drag.state.xMax,\n },\n valueRange: { min: 0, max: rangeSpan },\n plot,\n });\n const categoryDelta = transform.categoryDragDelta(\n this.drag.start,\n point,\n );\n const valueDelta = transform.valueOffsetDelta(\n this.drag.start,\n point,\n );\n this.viewStates.set(chart.id, { xMin: this.drag.state.xMin - categoryDelta, xMax: this.drag.state.xMax - categoryDelta });\n this.yOffsets.set(chart.id, this.drag.yOffset + valueDelta);\n }\n if (this.drag.type === \"y-scale\") {\n const transform = createCoordinateTransform({\n orientation: descriptor.orientation,\n categoryRange: { min: 0, max: 1 },\n valueRange: { min: 0, max: 1 },\n plot,\n });\n const delta = transform.valueScaleDelta(this.drag.start, point);\n this.yScales.set(\n chart.id,\n scaleValueRange(\n this.drag.scale,\n delta,\n POINTER_SCALE_SENSITIVITY,\n ),\n );\n }\n if (this.drag.type === \"x-scale\") {\n const center = (this.drag.state.xMin + this.drag.state.xMax) / 2;\n const transform = createCoordinateTransform({\n orientation: descriptor.orientation,\n categoryRange: { min: 0, max: 1 },\n valueRange: { min: 0, max: 1 },\n plot,\n });\n const delta = transform.categoryScaleDelta(this.drag.start, point);\n const span = clamp(\n (this.drag.state.xMax - this.drag.state.xMin) *\n Math.exp(delta * 0.01),\n getMinimumCategorySpan(chart),\n X_SCALE_MAX_SPAN,\n );\n this.viewStates.set(chart.id, { xMin: center - span / 2, xMax: center + span / 2 });\n }\n if (this.drag.type === \"pan\") {\n this.updateCrosshair(point, layout);\n this.requestRender();\n } else {\n this.requestRender();\n }\n return;\n }\n this.updateCrosshair(point, layout, context.fullscreen);\n }\n\n handlePointerUp(event) {\n if (event.target.closest?.(\"button,input\") && !this.drag && !this.drawingSession) return;\n const context = this.eventContext(event) || (this.activePointerContext\n ? { ...this.activePointerContext, point: this.pointForEvent(event, this.activePointerContext.host) }\n : null);\n if (this.drag?.type === \"rectangle\" && this.rectangleZoomRect) {\n const normalized = normalizeRect(this.rectangleZoomRect.start, this.rectangleZoomRect.end);\n if (normalized?.width >= 4 && normalized?.height >= 4) {\n const layout = this.drag.layout;\n applyRectangleZoom({\n chart: layout.chart,\n descriptor: layout.descriptor,\n plot: layout.plot,\n start: this.rectangleZoomRect.start,\n end: this.rectangleZoomRect.end,\n initialVisiblePoints: this.options.initialVisiblePoints,\n viewStateRef: { current: this.viewStates },\n yScaleRef: { current: this.yScales },\n yCenterOffsetRef: { current: this.yOffsets },\n yManualScaleRef: { current: new Set() },\n });\n }\n this.rectangleZoomChartId = null;\n this.rectangleZoomRect = null;\n }\n this.drag = null;\n this.pointerCaptureTarget?.releasePointerCapture?.(event.pointerId);\n this.pointerCaptureTarget = null;\n this.activePointerContext = null;\n this.requestRender();\n }\n\n handleWheel(event) {\n const context = this.eventContext(event);\n if (!context) return;\n const { layout, point } = context;\n const inPlot = point.x >= layout.plot.x && point.x <= layout.plot.x + layout.plot.width && point.y >= layout.plot.y && point.y <= layout.plot.y + layout.plot.height;\n if (!inPlot) return;\n event.preventDefault();\n if (event.shiftKey) {\n const wheelDelta = event.deltaY || event.deltaX;\n const currentScale = this.yScales.get(layout.chart.id) || 1;\n this.yScales.set(\n layout.chart.id,\n scaleValueRange(\n currentScale,\n wheelDelta,\n WHEEL_SCALE_SENSITIVITY,\n ),\n );\n this.requestRender();\n return;\n }\n const state = this.viewStates.get(layout.chart.id);\n const range = this.getRange(layout, state);\n const ratio = clamp(\n this.getTransform(layout, state, range).categoryRatio(point),\n 0,\n 1,\n );\n const anchor = state.xMin + ratio * (state.xMax - state.xMin);\n const zoom = Math.exp(event.deltaY * 0.001);\n const span = clamp(\n (state.xMax - state.xMin) * zoom,\n getMinimumCategorySpan(layout.chart),\n X_SCALE_MAX_SPAN,\n );\n this.viewStates.set(layout.chart.id, { xMin: anchor - ratio * span, xMax: anchor + (1 - ratio) * span });\n this.requestRender();\n }\n\n handleContextMenu(event) {\n const context = this.eventContext(event);\n if (!context || !this.options.onChartContextMenu) return;\n event.preventDefault();\n const { layout, point } = context;\n const inPlot = point.x >= layout.plot.x && point.x <= layout.plot.x + layout.plot.width && point.y >= layout.plot.y && point.y <= layout.plot.y + layout.plot.height;\n const data = inPlot ? screenPointToDataPoint({ point, chart: layout.chart, descriptor: layout.descriptor, plot: layout.plot, initialVisiblePoints: this.options.initialVisiblePoints, viewStateRef: { current: this.viewStates }, yScaleRef: { current: this.yScales }, yCenterOffsetRef: { current: this.yOffsets } }) : null;\n this.options.onChartContextMenu({ chart: layout.chart, event, point: data });\n }\n\n updateCrosshair(point, layout) {\n const inPlot = point.x >= layout.plot.x && point.x <= layout.plot.x + layout.plot.width && point.y >= layout.plot.y && point.y <= layout.plot.y + layout.plot.height;\n if (!inPlot || !this.options.showTooltips) return this.clearCrosshair();\n const state = this.viewStates.get(layout.chart.id);\n const orientation = layout.descriptor.orientation;\n const range = this.getRange(layout, state);\n const transform = this.getTransform(layout, state, range);\n const xValue = transform.screenToData(point).x;\n const tooltipSeries = getOrderedSeries(\n layout.chart,\n this.options.seriesOrderByChart,\n );\n const points = tooltipSeries.map((series, seriesIndex) => {\n const visible = series.getVisiblePoints(state.xMin, state.xMax, transform.categoryPixelLength);\n if (!visible.pointCount) return null;\n const index = getNearestPointIndex(visible.x, xValue);\n const category = this.surface.renderers.getTooltipCategory(\n layout.descriptor.rendererType,\n {\n visiblePoints: visible,\n pointIndex: index,\n seriesIndex,\n seriesCount: tooltipSeries.length,\n categoryMin: state.xMin,\n categoryMax: state.xMax,\n },\n );\n const data = { x: category, y: visible.y[index] };\n const screen = transform.dataToScreen(data);\n return { id: series.id, name: series.name, color: series.color, x: screen.x, y: screen.y, xValue: visible.x[index], yValue: data.y };\n }).filter(Boolean);\n if (!points.length) return this.clearCrosshair();\n const nearest = points.reduce((best, item) => {\n const itemDistance = orientation === \"horizontal\"\n ? Math.abs(item.y - point.y)\n : Math.abs(item.x - point.x);\n const bestDistance = orientation === \"horizontal\"\n ? Math.abs(best.y - point.y)\n : Math.abs(best.x - point.x);\n return itemDistance < bestDistance ? item : best;\n });\n this.crosshair = {\n chartId: layout.chart.id,\n x: point.x,\n y: point.y,\n xValue: nearest.xValue,\n categoryLabel: getCategoryLabel(layout.chart, nearest.xValue),\n points,\n tooltipX: point.x + 232 > layout.rect.x + layout.rect.width ? point.x - 232 : point.x + 12,\n tooltipY: clamp(point.y + 12, layout.plot.y, layout.rect.y + layout.rect.height - 96),\n };\n this.requestRender();\n }\n\n clearCrosshair() {\n if (!this.crosshair) return;\n this.crosshair = null;\n this.requestRender();\n }\n\n hitDrawing(point, layout) {\n for (const drawing of getDrawingsForChart(this.drawings, layout.chart.id)) {\n const hit = hitTestDrawing({ point, drawing, layout, projectPoint: (data) => this.projectPoint(data, layout) });\n if (hit) return hit;\n }\n return null;\n }\n\n commitDrawing(chartId, type, start, end) {\n const drawing = createDrawing({ chartId, type, start, end, createDrawingId: this.options.createDrawingId });\n this.setDrawings([...this.drawings, drawing]);\n this.selectedDrawingId = drawing.id;\n this.activeDrawingTool = null;\n this.draftDrawing = null;\n this.drawingSession = null;\n this.emit(\"onSelectedDrawingIdChange\", drawing.id);\n this.emit(\"onActiveDrawingToolChange\", null);\n }\n\n setDrawings(drawings) {\n this.drawings = drawings;\n this.emit(\"onDrawingsChange\", [...drawings]);\n this.requestRender();\n }\n\n updateSelectedDrawing(updater) {\n if (!this.selectedDrawingId) return;\n this.setDrawings(updateDrawingById(this.drawings, this.selectedDrawingId, updater));\n }\n\n toggleDrawingTool(tool) {\n if (!DRAWING_TOOLS.has(tool) || this.options.disableDrawings) return;\n this.activeDrawingTool = this.activeDrawingTool === tool ? null : tool;\n this.rectangleZoomChartId = null;\n this.draftDrawing = null;\n this.drawingSession = null;\n this.emit(\"onActiveDrawingToolChange\", this.activeDrawingTool);\n this.requestRender();\n }\n\n toggleMovingAverage(chartId) {\n if (!chartId || this.options.disableDrawings) return;\n const chart = this.options.charts.find((item) => item.id === chartId);\n if (!chart || !this.chartDescriptors.get(chartId)?.capabilities.movingAverage) return;\n const current = this.movingAverageByChart[chartId] || { period: 21, type: \"ema\", hideBase: false };\n this.movingAverageByChart = { ...this.movingAverageByChart, [chartId]: { ...current, enabled: !current.enabled } };\n this.emit(\"onMovingAverageToggle\", chartId);\n this.requestRender();\n }\n\n updateMovingAverage(chartId, changes) {\n if (!chartId) return;\n const next = { enabled: true, period: 21, type: \"ema\", hideBase: false, ...(this.movingAverageByChart[chartId] || {}), ...changes };\n this.movingAverageByChart = { ...this.movingAverageByChart, [chartId]: next };\n this.emit(\"onMovingAverageChange\", chartId, { ...next });\n this.requestRender();\n }\n\n resetChart(chartId) {\n const chart = this.options.charts.find((item) => item.id === chartId);\n if (!chart) return;\n this.viewStates.set(chartId, getInitialView(chart, this.options.initialVisiblePoints));\n this.yScales.set(chartId, 1);\n this.yOffsets.set(chartId, 0);\n this.requestRender();\n }\n\n openFullscreen(chartId) {\n const chart = this.options.charts.find((item) => item.id === chartId);\n if (!chart || this.fullscreenChartId) return;\n this.fullscreenChartId = chartId;\n const overlay = document.createElement(\"div\");\n overlay.dataset.alienchartsFullscreen = \"\";\n overlay.className = \"aliencharts-root fixed inset-0 z-[60] bg-background p-2\";\n overlay.innerHTML = `<canvas class=\"pointer-events-none absolute left-0 top-0 z-10 block\"></canvas><div data-fullscreen-cell>${chartCellHtml(chart, this.chartDescriptors.get(chart.id), 0, this.options.backgroundColor)}</div><div data-fullscreen-overlays class=\"pointer-events-none absolute left-0 top-0 z-20\" style=\"width:100%;height:100%\"></div>`;\n document.body.append(overlay);\n this.fullscreenOverlay = overlay;\n this.fullscreenNode = overlay.querySelector(\"[data-chart-index]\");\n this.fullscreenNode.style.height = \"calc(100vh - 16px)\";\n this.fullscreenOverlays = overlay.querySelector(\"[data-fullscreen-overlays]\");\n const canvas = overlay.querySelector(\"canvas\");\n const gl = canvas.getContext(\"webgl2\", { antialias: true, alpha: true, depth: false, stencil: false });\n if (!gl) { overlay.remove(); this.fullscreenChartId = null; return; }\n this.fullscreenSurface = makeSurface(canvas, gl);\n this.fullscreenListeners = Object.entries(this.bound).filter(([name]) => name !== \"keydown\" && name !== \"scroll\");\n this.fullscreenListeners.forEach(([name, handler]) => overlay.addEventListener(name, handler, name === \"wheel\" ? { passive: false } : undefined));\n this.resizeObserver.observe(overlay);\n this.requestRender();\n }\n\n closeFullscreen() {\n if (!this.fullscreenChartId) return;\n if (this.fullscreenOverlay) this.resizeObserver?.unobserve(this.fullscreenOverlay);\n this.fullscreenListeners?.forEach(([name, handler]) => this.fullscreenOverlay?.removeEventListener(name, handler));\n this.fullscreenListeners = null;\n destroySurface(this.fullscreenSurface);\n this.fullscreenOverlay?.remove();\n this.fullscreenSurface = null;\n this.fullscreenOverlay = null;\n this.fullscreenNode = null;\n this.fullscreenOverlays = null;\n this.fullscreenLayouts = [];\n this.fullscreenChartId = null;\n this.requestRender();\n }\n\n handleKeyDown(event) {\n const editable = event.target instanceof HTMLElement && (event.target.isContentEditable || [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(event.target.tagName));\n if (editable) return;\n const chartId = this.fullscreenChartId || this.focusedChartId;\n const chart = this.options.charts.find((item) => item.id === chartId);\n const capabilities =\n chart && this.chartDescriptors.get(chartId)?.capabilities;\n const key = event.key.toLowerCase();\n if ([\"arrowleft\", \"arrowright\", \"arrowup\", \"arrowdown\"].includes(key) && !this.fullscreenChartId) {\n this.moveFocus(key.replace(\"arrow\", \"\")); event.preventDefault(); return;\n }\n if (key === \"r\") { this.resetChart(chartId); event.preventDefault(); }\n else if (key === \"z\") { this.rectangleZoomChartId = this.rectangleZoomChartId === chartId ? null : chartId; event.preventDefault(); this.requestRender(); }\n else if (key === \"m\" && capabilities?.movingAverage) { this.toggleMovingAverage(chartId); event.preventDefault(); }\n else if ([\"t\", \"h\", \"v\", \"p\"].includes(key) && capabilities?.drawings) { this.toggleDrawingTool({ t: \"trendline\", h: \"hline\", v: \"vline\", p: \"pin\" }[key]); event.preventDefault(); }\n else if ((key === \"delete\" || key === \"backspace\") && this.selectedDrawingId) { this.setDrawings(removeDrawingById(this.drawings, this.selectedDrawingId)); this.selectedDrawingId = null; this.emit(\"onSelectedDrawingIdChange\", null); event.preventDefault(); }\n else if (key === \"escape\" && (this.activeDrawingTool || this.draftDrawing || this.rectangleZoomChartId)) { this.activeDrawingTool = null; this.draftDrawing = null; this.drawingSession = null; this.rectangleZoomChartId = null; this.rectangleZoomRect = null; this.emit(\"onActiveDrawingToolChange\", null); this.requestRender(); event.preventDefault(); }\n else if (key === \"f\" || (key === \"escape\" && this.fullscreenChartId)) { this.fullscreenChartId ? this.closeFullscreen() : this.openFullscreen(chartId); event.preventDefault(); }\n }\n\n moveFocus(direction) {\n const charts = this.options.charts;\n if (!charts.length) return;\n let index = Math.max(0, charts.findIndex((chart) => chart.id === this.focusedChartId));\n const columns = Math.max(1, Number(this.options.columns) || 1);\n if (direction === \"left\") index = Math.max(Math.floor(index / columns) * columns, index - 1);\n if (direction === \"right\") index = Math.min(charts.length - 1, index + 1);\n if (direction === \"up\") index = Math.max(0, index - columns);\n if (direction === \"down\") index = Math.min(charts.length - 1, index + columns);\n this.focusedChartId = charts[index].id;\n this.chartNodes[index]?.scrollIntoView({ block: \"nearest\", inline: \"nearest\" });\n this.requestRender();\n }\n\n emit(name, ...args) {\n this.options[name]?.(...args);\n }\n\n cleanupDom() {\n this.canvas?.remove();\n this.grid?.remove();\n this.overlays?.remove();\n this.addedClasses?.forEach((name) => this.container.classList.remove(name));\n }\n\n destroy() {\n if (this.destroyed) return;\n this.closeFullscreen();\n this.destroyed = true;\n if (this.frame != null) cancelAnimationFrame(this.frame);\n this.animator.destroy();\n this.resizeObserver.disconnect();\n Object.entries(this.bound).forEach(([name, handler]) => {\n const target = name === \"keydown\" ? window : this.container;\n target.removeEventListener(name, handler);\n });\n destroySurface(this.surface);\n this.cleanupDom();\n }\n}\n\nexport const createChartGrid = (container, options = {}) => new ChartGridController(container, options);\n", "import { createLineSeries } 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 createLineSeries({\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["scale", "entry", "lowerBound", "span", "_"]
|
|
7
|
+
}
|