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": ["index_exports", "__export", "BarSeries", "LineSeries", "createBarSeries", "createChartGrid", "createLineSeries", "createMockCharts", "createSeries", "icons", "filledIcons", "iconSvg", "name", "size", "className", "body", "paint", "DEFAULT_DRAWING_COLOR", "DRAWING_TOOLS", "getDrawingStyle", "drawing", "DEFAULT_DRAWING_COLOR", "getDrawingsForChart", "drawings", "chartId", "getDefaultDrawingStyle", "type", "createDrawing", "start", "end", "createDrawingId", "createDraftDrawing", "extendRayToPlotBoundary", "origin", "through", "plot", "dx", "dy", "candidates", "boundaryScale", "scale", "getDrawingGeometry", "layout", "projectPoint", "style", "lineStart", "lineEnd", "lineEndX", "distanceToSegment", "point", "t", "hitTestDrawing", "geometry", "updateDrawingById", "drawingId", "updater", "removeDrawingById", "LINE_CAPABILITIES", "BAR_CAPABILITIES", "CHART_DEFINITIONS", "getChartCategories", "chart", "values", "category", "index", "normalized", "getCategoryLabel", "value", "getSeriesType", "series", "resolveChartDescriptor", "categories", "type", "definition", "orientation", "item", "itemType", "mixedTypes", "typeLabel", "itemOrientation", "resolveChartDescriptors", "charts", "descriptors", "getChartDescriptor", "getOrderedSeries", "seriesOrderByChart", "order", "used", "ordered", "seriesIndex", "CHART_TYPES", "safeSpan", "min", "max", "createCoordinateTransform", "orientation", "categoryRange", "valueRange", "plot", "horizontal", "categorySpan", "valueSpan", "categoryPixelLength", "valuePixelLength", "categoryRatio", "point", "valueRatio", "dataToScreen", "category", "value", "categoryPosition", "valuePosition", "screenToData", "start", "current", "rect", "first", "second", "createProgram", "gl", "vertexSource", "fragmentSource", "compile", "type", "source", "shader", "program", "vertexShader", "fragmentShader", "hexToRgb", "color", "value", "normalized", "char", "number", "getNextVertexCapacity", "currentCapacity", "requiredCapacity", "nextCapacity", "getDynamicBuffer", "cache", "key", "requiredFloats", "entry", "deleteBufferCache", "BAR_GROUP_WIDTH_RATIO", "BAR_SLICE_WIDTH_RATIO", "BAR_VERTEX_FLOAT_STRIDE", "VERTEX_SOURCE", "FRAGMENT_SOURCE", "getBarCategoryInterval", "visiblePoints", "index", "categoryMin", "categoryMax", "count", "category", "fallbackInterval", "previousGap", "nextGap", "interval", "getGroupedBarCategory", "pointIndex", "seriesIndex", "seriesCount", "groupWidth", "sliceWidth", "fillBarInstances", "vertices", "offset", "createBarRenderer", "gl", "program", "createProgram", "quadBuffer", "buffers", "locations", "categoryPixelLength", "chart", "descriptor", "pixelHeight", "pixelWidth", "scaledPlot", "seriesOrderByChart", "state", "yRange", "orderedSeries", "getOrderedSeries", "series", "requiredFloats", "bufferEntry", "getDynamicBuffer", "instanceCount", "r", "g", "b", "hexToRgb", "payload", "deleteBufferCache", "toTypedArray", "value", "Type", "lowerBound", "array", "lo", "hi", "mid", "upperBound", "pushUniqueSorted", "indices", "index", "buildLod", "rawX", "rawY", "bucketSize", "startIndex", "endIndex", "alignedStart", "alignedEnd", "estimated", "x", "y", "out", "start", "end", "minIndex", "maxIndex", "i", "a", "sourceIndex", "concatTyped", "left", "right", "LodSeries", "id", "name", "color", "maxLevels", "initialX", "initialY", "capacity", "xValues", "yValues", "nextX", "nextY", "appendLength", "currentLength", "requiredLength", "nextCapacity", "previousLength", "level", "dirtyRawStart", "cutoffX", "keepCount", "tail", "xMin", "xMax", "pixelWidth", "targetPointsPerPixel", "from", "to", "visibleRawPoints", "targetPoints", "desiredBucket", "selectedIndex", "LineSeries", "options", "BarSeries", "orientation", "createLineSeries", "createSeries", "createBarSeries", "AA_VERTEX_FLOAT_STRIDE", "AA_LINE_WIDTH_PX", "AA_EDGE_WIDTH_PX", "DASH_LENGTH_PX", "DASH_GAP_PX", "LINE_VERTEX_SOURCE", "LINE_FRAGMENT_SOURCE", "AA_VERTEX_SOURCE", "AA_FRAGMENT_SOURCE", "fillSeriesPoints", "vertices", "visiblePoints", "pointCount", "animatedPoint", "index", "source", "getSinglePointSegment", "series", "state", "yRange", "plot", "x", "y", "halfWidth", "writeAntialiasVertex", "offset", "start", "end", "side", "along", "getSeriesPoint", "fillAntialiasSeriesSegments", "projectDataToPixel", "fillDashedSeriesSegments", "distance", "dashTotal", "startPx", "endPx", "pixelLength", "consumed", "phase", "boundary", "step", "t0", "t1", "normalizeMovingAverage", "movingAverage", "calculateMovingAverageChunk", "sourceY", "startIndex", "period", "type", "previousAverage", "out", "sum", "firstWindowStart", "removeIndex", "multiplier", "previous", "getMovingAverageSeriesForChart", "chart", "cache", "normalized", "key", "cached", "appendStart", "appendedY", "movingY", "movingSeries", "createLineSeries", "getLineLocations", "gl", "program", "createLineRenderer", "createProgram", "antialiasProgram", "locations", "aaLocations", "buffers", "antialiasBuffers", "movingAverageCache", "setCommonUniforms", "activeLocations", "pixelWidth", "pixelHeight", "scaledPlot", "antialiasLines", "descriptor", "dpr", "getAppendAnimatedPoint", "now", "seriesOrderByChart", "useAntialias", "activeProgram", "seriesEndpoints", "getOrderedSeries", "singlePointEndpoint", "singlePointSegment", "r", "g", "b", "hexToRgb", "requiredFloats", "entry", "getDynamicBuffer", "drawVertexCount", "stride", "deleteBufferCache", "RENDERER_FACTORIES", "createBarRenderer", "createLineRenderer", "createRendererRegistry", "gl", "renderers", "type", "createRenderer", "payload", "renderer", "CHART_HEIGHT", "RIGHT_AXIS_WIDTH", "PLOT_PADDING", "HORIZONTAL_PLOT_PADDING", "CATEGORICAL_PLOT_PADDING", "CATEGORICAL_HORIZONTAL_PLOT_PADDING", "Y_SCALE_MIN", "Y_SCALE_MAX", "Y_AXIS_TICK_COUNT", "X_AXIS_TICK_COUNT", "X_SCALE_MIN_SPAN", "X_SCALE_MAX_SPAN", "JUMP_LATEST_RIGHT_PADDING_RATIO", "DEFAULT_CHART_BACKGROUND", "getChartOrientation", "chart", "descriptor", "resolveChartDescriptor", "getPlotPadding", "categorical", "getChartCategories", "CATEGORICAL_HORIZONTAL_PLOT_PADDING", "HORIZONTAL_PLOT_PADDING", "CATEGORICAL_PLOT_PADDING", "PLOT_PADDING", "getCategoryPixelLength", "plot", "getReadableTextColor", "backgroundColor", "r", "g", "b", "hexToRgb", "toLinear", "value", "getSeriesLabelTextColor", "series", "lowerBound", "array", "low", "high", "middle", "getNearestPointIndex", "xValues", "xValue", "nextIndex", "previousIndex", "getChartXBounds", "chart", "minX", "maxX", "getMinimumCategorySpan", "categories", "getChartCategories", "category", "left", "right", "X_SCALE_MIN_SPAN", "minimumGap", "index", "getInitialView", "initialVisiblePoints", "requestedCount", "visible", "first", "last", "firstIndex", "lastIndex", "leftGap", "rightGap", "span", "nextMax", "JUMP_LATEST_RIGHT_PADDING_RATIO", "getYRange", "xMin", "xMax", "width", "suppliedDescriptor", "descriptor", "resolveChartDescriptor", "minY", "maxY", "renderedPoints", "bucketSize", "fixedMinY", "fixedMaxY", "padding", "applyYScale", "yRange", "scale", "centerOffset", "clampedScale", "Y_SCALE_MAX", "Y_SCALE_MIN", "center", "halfRange", "trimFormattedNumber", "formatNumber", "absolute", "formatCompactNumber", "normalizeRect", "start", "end", "top", "clampPointToPlot", "point", "plot", "getScaledYRangeForLayout", "state", "yScaleRef", "yCenterOffsetRef", "getCategoryPixelLength", "applyRectangleZoom", "viewStateRef", "yManualScaleRef", "rect", "currentYRange", "selected", "createCoordinateTransform", "selectedSpan", "baseYRange", "baseSpan", "selectedCenter", "baseCenter", "screenPointToDataPoint", "createAxisOverlay", "chart", "descriptor", "plot", "state", "yRange", "seriesEndpoints", "seriesOrderByChart", "horizontal", "transform", "createCoordinateTransform", "ticks", "Y_AXIS_TICK_COUNT", "_", "index", "ratio", "value", "screen", "categories", "getChartCategories", "visibleCategories", "category", "left", "right", "categoryPixelLength", "maximumCategoryLabels", "categoryLabelStride", "displayedCategories", "xTicks", "X_AXIS_TICK_COUNT", "latestValues", "getOrderedSeries", "series", "x", "endpoint", "getSeriesLabelTextColor", "item", "maxX", "getChartXBounds", "drawChartLayouts", "canvas", "width", "height", "gl", "rendererRegistry", "antialiasLines", "layouts", "viewStateRef", "yScaleRef", "yCenterOffsetRef", "initialVisiblePoints", "getAppendAnimatedPoint", "movingAverageByChart", "dpr", "pixelWidth", "pixelHeight", "now", "nextAxisOverlays", "layout", "getChartDescriptor", "getInitialView", "scaledPlot", "getCategoryPixelLength", "applyYScale", "getYRange", "result", "BASE_ROOT_CLASSES", "EMPTY_OBJECT", "controllerIdSequence", "DEFAULT_OPTIONS", "DEFAULT_CHART_BACKGROUND", "formatCompactNumber", "formatNumber", "APPEND_ANIMATION", "POINTER_SCALE_SENSITIVITY", "WHEEL_SCALE_SENSITIVITY", "scaleValueRange", "scale", "delta", "sensitivity", "clamp", "Y_SCALE_MIN", "Y_SCALE_MAX", "escapeHtml", "value", "withAlpha", "color", "alpha", "match", "getTextColor", "normalized", "part", "number", "linear", "shift", "hasOwn", "object", "key", "min", "max", "toolbarButton", "action", "title", "icon", "hotkey", "active", "className", "chartCellHtml", "chart", "descriptor", "index", "backgroundColor", "padding", "getPlotPadding", "horizontal", "valueAxisStyle", "categoryAxisStyle", "CHART_HEIGHT", "iconSvg", "makeSurface", "canvas", "gl", "createRendererRegistry", "destroySurface", "surface", "AppendAnimator", "requestRender", "charts", "descriptors", "now", "series", "next", "previous", "tick", "animation", "id", "seriesId", "visiblePoints", "stableCount", "progress", "appendedCount", "position", "revealed", "nextIndex", "previousIndex", "partial", "partialPoint", "ChartGridController", "container", "options", "resolveChartDescriptors", "name", "event", "handler", "ids", "map", "getInitialView", "getChartXBounds", "previousCharts", "previousActiveDrawingTool", "nextOptions", "nextDescriptors", "descriptorLayoutChanged", "current", "state", "span", "nearEdge", "chartId", "maxX", "getMinimumCategorySpan", "nextMax", "node", "fullscreen", "nodes", "host", "hostRect", "rect", "x", "y", "focusState", "axes", "selector", "selectionStart", "selectionEnd", "input", "layouts", "width", "height", "drawChartLayouts", "payload", "axis", "grid", "gridOptions", "yAxis", "latest", "xAxis", "label", "latestLayer", "item", "target", "focused", "drawingsAvailable", "movingAverageAvailable", "html", "moving", "hasDrawings", "getDrawingsForChart", "overlay", "drawings", "drawableLayouts", "layout", "entry", "definitions", "body", "chartDrawings", "clipId", "chartBody", "drawing", "geometry", "getDrawingGeometry", "point", "selected", "text", "marker", "markerIndex", "ratio", "crosshair", "xAxisLabel", "normalizeRect", "style", "canExtend", "canText", "PLOT_PADDING", "range", "applyYScale", "getYRange", "getCategoryPixelLength", "createCoordinateTransform", "cell", "button", "context", "inPlot", "dataPoint", "screenPointToDataPoint", "createDraftDrawing", "hit", "end", "plot", "updateDrawingById", "deltaX", "baseRange", "rangeSpan", "transform", "categoryDelta", "valueDelta", "center", "X_SCALE_MAX_SPAN", "applyRectangleZoom", "wheelDelta", "currentScale", "anchor", "zoom", "data", "orientation", "xValue", "tooltipSeries", "getOrderedSeries", "points", "seriesIndex", "visible", "getNearestPointIndex", "screen", "nearest", "best", "itemDistance", "bestDistance", "getCategoryLabel", "hitTestDrawing", "type", "start", "createDrawing", "updater", "tool", "DRAWING_TOOLS", "changes", "capabilities", "removeDrawingById", "direction", "columns", "args", "createChartGrid", "palette", "createRandom", "seed", "value", "makeSeries", "chartIndex", "seriesIndex", "pointCount", "x", "y", "random", "baseline", "waveA", "waveB", "waveC", "amplitudeA", "amplitudeB", "trend", "noise", "spikeInterval", "spikeMagnitude", "i", "spike", "createLineSeries", "createMockCharts", "chartCount", "seriesPerChart", "_"]
|
|
7
|
+
}
|