velo-plot 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/README.md +22 -15
  2. package/dist/ChartCore-AnR_3Xkb.js +7338 -0
  3. package/dist/ChartCore-AnR_3Xkb.js.map +1 -0
  4. package/dist/GpuChartRenderer-Dxc0hrQA.js +75 -0
  5. package/dist/GpuChartRenderer-Dxc0hrQA.js.map +1 -0
  6. package/dist/{index.core-BmZe2jRQ.js → PluginRegistry-CzMHebYP.js} +19 -33
  7. package/dist/PluginRegistry-CzMHebYP.js.map +1 -0
  8. package/dist/angular-hooks.js +1 -1
  9. package/dist/angular.js +8 -8
  10. package/dist/{axisFormat-CzumxpCL.js → axisFormat-Sz4WIJfQ.js} +2 -2
  11. package/dist/{axisFormat-CzumxpCL.js.map → axisFormat-Sz4WIJfQ.js.map} +1 -1
  12. package/dist/{chartSyncBridge-DbWrwtyP.js → chartSyncBridge-D_rCtbFq.js} +12 -11
  13. package/dist/{chartSyncBridge-DbWrwtyP.js.map → chartSyncBridge-D_rCtbFq.js.map} +1 -1
  14. package/dist/core/ChartStatistics.d.ts +1 -1
  15. package/dist/core/chart/ChartCore.d.ts +12 -17
  16. package/dist/core/chart/ChartFeatureHooks.d.ts +7 -0
  17. package/dist/core/chart/chartExportPatch.d.ts +2 -0
  18. package/dist/core/chart/overlaySeriesRegistry.d.ts +7 -0
  19. package/dist/core/chart/series/SeriesActions.d.ts +1 -0
  20. package/dist/core/chart/series/SeriesBufferLite.d.ts +13 -0
  21. package/dist/core/chart/series/seriesOptionsRegistry.d.ts +8 -0
  22. package/dist/core/chart/series/seriesTypeRegistry.d.ts +5 -0
  23. package/dist/createStackedChart-DqcLCFGS.js +1338 -0
  24. package/dist/createStackedChart-DqcLCFGS.js.map +1 -0
  25. package/dist/{hooks-CYPCxoZx.js → hooks-DH-3bewj.js} +7 -7
  26. package/dist/{hooks-CYPCxoZx.js.map → hooks-DH-3bewj.js.map} +1 -1
  27. package/dist/{index-qunX30Xu.js → index-B7PTX94B.js} +2133 -2133
  28. package/dist/index-B7PTX94B.js.map +1 -0
  29. package/dist/{index-BMiZoKmm.js → index-BgrvqltV.js} +67 -67
  30. package/dist/index-BgrvqltV.js.map +1 -0
  31. package/dist/index-Cv6ZDLWf.js +521 -0
  32. package/dist/index-Cv6ZDLWf.js.map +1 -0
  33. package/dist/index-qhscKTDy.js.map +1 -1
  34. package/dist/index.core.d.ts +8 -6
  35. package/dist/index.d.ts +1 -14
  36. package/dist/plugins/3d.js +3 -1
  37. package/dist/plugins/3d.js.map +1 -1
  38. package/dist/plugins/analysis.js.map +1 -1
  39. package/dist/plugins/createPlugin.d.ts +8 -0
  40. package/dist/plugins/debug.js +32 -32
  41. package/dist/plugins/debug.js.map +1 -1
  42. package/dist/plugins/gpu.js +2033 -209
  43. package/dist/plugins/gpu.js.map +1 -1
  44. package/dist/plugins/i18n.js +286 -23
  45. package/dist/plugins/i18n.js.map +1 -1
  46. package/dist/plugins/latex.js +766 -207
  47. package/dist/plugins/latex.js.map +1 -1
  48. package/dist/plugins/loading/index.d.ts +1 -2
  49. package/dist/plugins/loading.js +3 -4
  50. package/dist/plugins/offscreen.js +11 -10
  51. package/dist/plugins/offscreen.js.map +1 -1
  52. package/dist/plugins/regression.js +254 -256
  53. package/dist/plugins/regression.js.map +1 -1
  54. package/dist/plugins/streaming.js +1 -1
  55. package/dist/plugins/tools.js +1 -1
  56. package/dist/react.js +55 -58
  57. package/dist/react.js.map +1 -1
  58. package/dist/renderer/NativeWebGLRenderer.d.ts +2 -1
  59. package/dist/renderer/native/NativeWebGLRenderer.d.ts +5 -1
  60. package/dist/renderer/native/draw.d.ts +2 -47
  61. package/dist/renderer/native/drawCore.d.ts +27 -0
  62. package/dist/renderer/native/drawExtended.d.ts +29 -0
  63. package/dist/renderer/native/frameRenderExtended.d.ts +1 -0
  64. package/dist/renderer/native/frameRenderRegistry.d.ts +27 -0
  65. package/dist/renderer/native/programFactoryCore.d.ts +6 -0
  66. package/dist/renderer/native/programFactoryExtended.d.ts +4 -0
  67. package/dist/renderer/native/utils.d.ts +3 -29
  68. package/dist/renderer/native/utilsCore.d.ts +14 -0
  69. package/dist/renderer/native/utilsExtended.d.ts +17 -0
  70. package/dist/renderer/overlaySeriesExtended.d.ts +1 -0
  71. package/dist/renderer/registerExtendedSeries.d.ts +1 -0
  72. package/dist/renderer/registerWebGPU.d.ts +2 -0
  73. package/dist/renderer/seriesBufferExtended.d.ts +4 -0
  74. package/dist/scientific/index.d.ts +1 -5
  75. package/dist/scientific/registerScientific.d.ts +1 -0
  76. package/dist/scientific.js +41 -41
  77. package/dist/solid.js +56 -59
  78. package/dist/solid.js.map +1 -1
  79. package/dist/svelte.js +26 -29
  80. package/dist/svelte.js.map +1 -1
  81. package/dist/trading/index.d.ts +1 -4
  82. package/dist/trading/registerTrading.d.ts +3 -0
  83. package/dist/trading.js +42 -42
  84. package/dist/types.d.ts +3 -3
  85. package/dist/velo-plot.full.js +2212 -1351
  86. package/dist/velo-plot.full.js.map +1 -1
  87. package/dist/velo-plot.js +33 -28
  88. package/dist/velo-plot.js.map +1 -1
  89. package/dist/vue/index.d.ts +2 -2
  90. package/dist/vue.js +17 -20
  91. package/dist/vue.js.map +1 -1
  92. package/package.json +9 -1
  93. package/dist/ChartCore-BpzRvN4Y.js +0 -8467
  94. package/dist/ChartCore-BpzRvN4Y.js.map +0 -1
  95. package/dist/createStackedChart-Dm-YqUT7.js +0 -756
  96. package/dist/createStackedChart-Dm-YqUT7.js.map +0 -1
  97. package/dist/gpuRenderer-BpaMYz-k.js +0 -1848
  98. package/dist/gpuRenderer-BpaMYz-k.js.map +0 -1
  99. package/dist/index-BMiZoKmm.js.map +0 -1
  100. package/dist/index-qunX30Xu.js.map +0 -1
  101. package/dist/index-x4stH3jD.js +0 -282
  102. package/dist/index-x4stH3jD.js.map +0 -1
  103. package/dist/index.core-BmZe2jRQ.js.map +0 -1
  104. package/dist/mockDatafeed-DHIDPcpX.js +0 -515
  105. package/dist/mockDatafeed-DHIDPcpX.js.map +0 -1
  106. package/dist/symbols-DT0eLlpW.js +0 -568
  107. package/dist/symbols-DT0eLlpW.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"latex.js","sources":["../../src/plugins/latex/parser.ts","../../src/plugins/latex/renderer.ts","../../src/plugins/latex/index.ts"],"sourcesContent":["/**\n * @fileoverview Simple LaTeX parser for mathematical expressions\n * @module plugins/latex/parser\n */\n\nimport { LaTeXNode } from './types';\nimport { getSymbol, isSymbol, BLACKBOARD, CALLIGRAPHIC, FRAKTUR } from './symbols';\n\n/** Delimiters for supported matrix environments. */\nconst MATRIX_DELIMITERS: Record<string, [string, string]> = {\n matrix: ['', ''],\n pmatrix: ['(', ')'],\n bmatrix: ['[', ']'],\n Bmatrix: ['{', '}'],\n vmatrix: ['|', '|'],\n Vmatrix: ['‖', '‖'],\n};\n\n/** Alphabet transforms for math font commands. */\nconst ALPHABET_MAPS: Record<string, Record<string, string>> = {\n mathbb: BLACKBOARD,\n mathcal: CALLIGRAPHIC,\n mathfrak: FRAKTUR,\n};\n\n/**\n * Parse LaTeX string into an abstract syntax tree\n */\nexport function parseLaTeX(latex: string): LaTeXNode[] {\n const tokens = tokenize(latex);\n return parseTokens(tokens);\n}\n\n/**\n * Extract text content from nodes recursively\n */\nfunction extractTextContent(nodes: LaTeXNode[]): string {\n let result = '';\n for (const node of nodes) {\n if (node.type === 'text' || node.type === 'textgroup') {\n result += node.content || '';\n } else if (node.type === 'symbol') {\n result += node.content || '';\n } else if (node.children) {\n result += extractTextContent(node.children);\n }\n }\n return result;\n}\n\n/**\n * Tokenize LaTeX string\n */\nfunction tokenize(latex: string): string[] {\n const tokens: string[] = [];\n let i = 0;\n\n while (i < latex.length) {\n const char = latex[i];\n\n // Backslash indicates a command\n if (char === '\\\\') {\n let command = '';\n i++;\n // Read command name (letters only)\n while (i < latex.length && /[a-zA-Z]/.test(latex[i])) {\n command += latex[i];\n i++;\n }\n if (command) {\n tokens.push('\\\\' + command);\n } else {\n // Single character command like \\{\n if (i < latex.length) {\n tokens.push('\\\\' + latex[i]);\n i++;\n }\n }\n }\n // Special characters that should be separate tokens\n else if (char === '{' || char === '}' || char === '^' || char === '_') {\n tokens.push(char);\n i++;\n }\n // Whitespace: preserve as single space token for text commands\n else if (/\\s/.test(char)) {\n tokens.push(' ');\n i++;\n // Skip additional whitespace\n while (i < latex.length && /\\s/.test(latex[i])) {\n i++;\n }\n }\n // Single characters: keep separate for proper subscript/superscript handling\n else {\n // Group text only if we're in a \"text\" context (not math/chemistry)\n // For chemistry formulas, keep each letter/digit separate\n tokens.push(char);\n i++;\n }\n }\n\n return tokens;\n}\n\n/**\n * Parse tokens into AST nodes\n */\nfunction parseTokens(tokens: string[]): LaTeXNode[] {\n const nodes: LaTeXNode[] = [];\n let i = 0;\n\n while (i < tokens.length) {\n const token = tokens[i];\n\n // Superscript\n if (token === '^') {\n i++;\n const content = parseGroup(tokens, i);\n nodes.push({\n type: 'superscript',\n children: content.nodes,\n });\n i = content.nextIndex;\n }\n // Subscript\n else if (token === '_') {\n i++;\n const content = parseGroup(tokens, i);\n nodes.push({\n type: 'subscript',\n children: content.nodes,\n });\n i = content.nextIndex;\n }\n // Commands\n else if (token.startsWith('\\\\')) {\n const command = token.substring(1);\n\n // Fraction\n if (command === 'frac') {\n i++;\n const numerator = parseGroup(tokens, i);\n i = numerator.nextIndex;\n const denominator = parseGroup(tokens, i);\n i = denominator.nextIndex;\n nodes.push({\n type: 'fraction',\n numerator: numerator.nodes,\n denominator: denominator.nodes,\n });\n }\n // Square root\n else if (command === 'sqrt') {\n i++;\n const content = parseGroup(tokens, i);\n nodes.push({\n type: 'sqrt',\n children: content.nodes,\n });\n i = content.nextIndex;\n }\n // Text command - render as a single grouped string for proper kerning\n else if (command === 'text' || command === 'mathrm' || command === 'mathbf' || command === 'mathit' || command === 'operatorname') {\n i++;\n const content = parseGroup(tokens, i);\n // Concatenate all text content from the group into a single string\n const textContent = extractTextContent(content.nodes);\n nodes.push({\n type: 'textgroup',\n content: textContent,\n });\n i = content.nextIndex;\n }\n // Math alphabets: map each letter to its Unicode variant\n else if (command in ALPHABET_MAPS) {\n i++;\n const content = parseGroup(tokens, i);\n i = content.nextIndex;\n const map = ALPHABET_MAPS[command];\n const raw = extractTextContent(content.nodes);\n let mapped = '';\n for (const ch of raw) mapped += map[ch] ?? ch;\n nodes.push({ type: 'text', content: mapped });\n }\n // Matrix environments: \\begin{pmatrix} a & b \\\\ c & d \\end{pmatrix}\n else if (command === 'begin') {\n i = parseMatrix(tokens, i, nodes);\n }\n // Symbol\n else if (isSymbol(command)) {\n nodes.push({\n type: 'symbol',\n content: getSymbol(command),\n });\n i++;\n }\n // Common operators that might be commands\n else if (command === 'times' || command === 'cdot' || command === 'pm' || command === 'mp') {\n nodes.push({\n type: 'symbol',\n content: getSymbol(command),\n });\n i++;\n }\n // Unknown command - treat as text\n else {\n nodes.push({\n type: 'text',\n content: token,\n });\n i++;\n }\n }\n // Group start\n else if (token === '{') {\n const content = parseGroup(tokens, i);\n nodes.push({\n type: 'group',\n children: content.nodes,\n });\n i = content.nextIndex;\n }\n // Regular text\n else {\n nodes.push({\n type: 'text',\n content: token,\n });\n i++;\n }\n }\n\n return nodes;\n}\n\n/**\n * Parse a matrix environment starting at the `\\begin` token.\n * Returns the index immediately after the matching `\\end{...}`.\n */\nfunction parseMatrix(tokens: string[], startIndex: number, nodes: LaTeXNode[]): number {\n let i = startIndex + 1; // skip \\begin\n\n // Read environment name inside the following {...}\n let envName = '';\n if (tokens[i] === '{') {\n i++;\n while (i < tokens.length && tokens[i] !== '}') {\n envName += tokens[i];\n i++;\n }\n if (tokens[i] === '}') i++;\n }\n\n // Collect tokens until the matching \\end (supporting nesting)\n const inner: string[] = [];\n let depth = 1;\n while (i < tokens.length && depth > 0) {\n const t = tokens[i];\n if (t === '\\\\begin') {\n depth++;\n inner.push(t);\n i++;\n } else if (t === '\\\\end') {\n depth--;\n if (depth === 0) {\n i++; // consume \\end\n if (tokens[i] === '{') {\n i++;\n while (i < tokens.length && tokens[i] !== '}') i++;\n if (tokens[i] === '}') i++;\n }\n } else {\n inner.push(t);\n i++;\n }\n } else {\n inner.push(t);\n i++;\n }\n }\n\n // Split inner tokens into rows (\\\\) and cells (&)\n const matrixRows: LaTeXNode[][][] = [];\n let rowCells: LaTeXNode[][] = [];\n let cellTokens: string[] = [];\n const flushCell = () => {\n rowCells.push(parseTokens(cellTokens));\n cellTokens = [];\n };\n const flushRow = () => {\n flushCell();\n matrixRows.push(rowCells);\n rowCells = [];\n };\n\n for (const t of inner) {\n if (t === '&') {\n flushCell();\n } else if (t === '\\\\\\\\') {\n flushRow();\n } else {\n cellTokens.push(t);\n }\n }\n if (cellTokens.length > 0 || rowCells.length > 0) {\n flushRow();\n }\n\n const delimiters = MATRIX_DELIMITERS[envName] ?? ['', ''];\n nodes.push({ type: 'matrix', rows: matrixRows, delimiters });\n\n return i;\n}\n\n/**\n * Parse a grouped expression (inside braces)\n */\nfunction parseGroup(\n tokens: string[],\n startIndex: number\n): { nodes: LaTeXNode[]; nextIndex: number } {\n // If next token is not a brace, treat single token as group\n if (tokens[startIndex] !== '{') {\n return {\n nodes: [\n {\n type: 'text',\n content: tokens[startIndex] || '',\n },\n ],\n nextIndex: startIndex + 1,\n };\n }\n\n // Skip opening brace\n let i = startIndex + 1;\n const groupTokens: string[] = [];\n let braceDepth = 1;\n\n // Collect tokens until matching closing brace\n while (i < tokens.length && braceDepth > 0) {\n const token = tokens[i];\n if (token === '{') {\n braceDepth++;\n groupTokens.push(token);\n } else if (token === '}') {\n braceDepth--;\n if (braceDepth > 0) {\n groupTokens.push(token);\n }\n } else {\n groupTokens.push(token);\n }\n i++;\n }\n\n return {\n nodes: parseTokens(groupTokens),\n nextIndex: i,\n };\n}\n","/**\n * @fileoverview LaTeX renderer using native Canvas API\n * @module plugins/latex/renderer\n */\n\nimport { LaTeXNode, LaTeXRenderContext, LaTeXDimensions } from './types';\n\n/**\n * Render a list of LaTeX nodes to canvas\n */\nexport function renderNodes(\n nodes: LaTeXNode[],\n ctx: LaTeXRenderContext\n): LaTeXDimensions {\n let currentX = ctx.x;\n let maxAscent = 0;\n let maxDescent = 0;\n\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n // Check if we have adjacent subscript and superscript (stacking)\n const isSub = node.type === 'subscript';\n const isSuper = node.type === 'superscript';\n const nextNode = nodes[i + 1];\n const isNextSub = nextNode?.type === 'subscript';\n const isNextSuper = nextNode?.type === 'superscript';\n\n if ((isSub && isNextSuper) || (isSuper && isNextSub)) {\n // Stack subscript and superscript at the same X coordinate\n const dims1 = renderNode(node, { ...ctx, x: currentX });\n const dims2 = renderNode(nextNode, { ...ctx, x: currentX });\n\n const width = Math.max(dims1.width, dims2.width);\n currentX += width + (ctx.fontSize * 0.15); // Scaled padding after scripts\n\n maxAscent = Math.max(maxAscent, dims1.baseline, dims2.baseline);\n maxDescent = Math.max(maxDescent, dims1.height - dims1.baseline, dims2.height - dims2.baseline);\n i++; // Skip next node\n } else {\n const dims = renderNode(node, { ...ctx, x: currentX });\n currentX += dims.width;\n\n // Add a small gap after scripts to prevent overlap with next character (Chemistry fix)\n if (isSub || isSuper) {\n currentX += ctx.fontSize * 0.12;\n }\n\n maxAscent = Math.max(maxAscent, dims.baseline);\n maxDescent = Math.max(maxDescent, dims.height - dims.baseline);\n }\n }\n\n return {\n width: currentX - ctx.x,\n height: maxAscent + maxDescent,\n baseline: maxAscent,\n };\n}\n\n/**\n * Render a single LaTeX node\n */\nfunction renderNode(node: LaTeXNode, ctx: LaTeXRenderContext): LaTeXDimensions {\n switch (node.type) {\n case 'text':\n return renderText(node.content || '', ctx);\n\n case 'textgroup':\n return renderText(node.content || '', ctx);\n\n case 'symbol':\n return renderSymbol(node.content || '', ctx);\n\n case 'superscript':\n return renderSuperscript(node.children || [], ctx);\n\n case 'subscript':\n return renderSubscript(node.children || [], ctx);\n\n case 'fraction':\n return renderFraction(\n node.numerator || [],\n node.denominator || [],\n ctx\n );\n\n case 'sqrt':\n return renderSqrt(node.children || [], ctx);\n\n case 'group':\n return renderNodes(node.children || [], ctx);\n\n case 'matrix':\n return renderMatrix(node.rows || [], node.delimiters || ['', ''], ctx);\n\n default:\n return { width: 0, height: 0, baseline: 0 };\n }\n}\n\n/**\n * Render a matrix environment (\\begin{pmatrix}...\\end{pmatrix}).\n * The matrix is vertically centered on the current baseline.\n */\nfunction renderMatrix(\n rows: LaTeXNode[][][],\n delimiters: [string, string],\n ctx: LaTeXRenderContext\n): LaTeXDimensions {\n const nRows = rows.length;\n const nCols = rows.reduce((m, r) => Math.max(m, r.length), 0);\n if (nRows === 0 || nCols === 0) {\n return { width: 0, height: 0, baseline: 0 };\n }\n\n const cellPadX = ctx.fontSize * 0.35;\n const cellPadY = ctx.fontSize * 0.25;\n const delimW = ctx.fontSize * 0.35;\n\n // Measure every cell\n const cellDims: LaTeXDimensions[][] = rows.map((r) => r.map((cell) => measureNodes(cell, ctx)));\n\n const colW = new Array(nCols).fill(0);\n const rowAsc = new Array(nRows).fill(0);\n const rowDesc = new Array(nRows).fill(0);\n\n for (let r = 0; r < nRows; r++) {\n for (let c = 0; c < rows[r].length; c++) {\n const d = cellDims[r][c];\n colW[c] = Math.max(colW[c], d.width);\n rowAsc[r] = Math.max(rowAsc[r], d.baseline);\n rowDesc[r] = Math.max(rowDesc[r], d.height - d.baseline);\n }\n }\n const rowH = rowAsc.map((a, i) => a + rowDesc[i]);\n\n const totalH = rowH.reduce((s, h) => s + h, 0) + cellPadY * 2 * nRows;\n const contentW = colW.reduce((s, w) => s + w, 0) + cellPadX * 2 * nCols;\n const totalW = contentW + delimW * 2;\n\n const top = ctx.y - totalH / 2;\n\n // Delimiters\n drawDelimiter(ctx, delimiters[0], ctx.x, top, totalH, delimW, 'left');\n drawDelimiter(ctx, delimiters[1], ctx.x + totalW - delimW, top, totalH, delimW, 'right');\n\n // Cells\n let cellTop = top + cellPadY;\n for (let r = 0; r < nRows; r++) {\n let cellX = ctx.x + delimW + cellPadX;\n for (let c = 0; c < nCols; c++) {\n const cell = rows[r][c];\n if (cell) {\n const d = cellDims[r][c];\n const x = cellX + (colW[c] - d.width) / 2;\n const baselineY = cellTop + rowAsc[r];\n renderNodes(cell, { ...ctx, x, y: baselineY });\n }\n cellX += colW[c] + cellPadX * 2;\n }\n cellTop += rowH[r] + cellPadY * 2;\n }\n\n return { width: totalW, height: totalH, baseline: totalH / 2 };\n}\n\n/**\n * Draw a stretchable matrix delimiter using geometric strokes.\n */\nfunction drawDelimiter(\n ctx: LaTeXRenderContext,\n ch: string,\n x: number,\n top: number,\n height: number,\n width: number,\n side: 'left' | 'right'\n): void {\n if (!ch) return;\n const c = ctx.ctx;\n c.save();\n c.strokeStyle = ctx.color;\n c.lineWidth = Math.max(1, ctx.fontSize * 0.05);\n c.lineCap = 'round';\n c.lineJoin = 'round';\n\n const bottom = top + height;\n const tipInset = width * 0.7;\n\n const drawParen = (open: boolean) => {\n c.beginPath();\n if (open) {\n c.moveTo(x + width, top);\n c.quadraticCurveTo(x, (top + bottom) / 2, x + width, bottom);\n } else {\n c.moveTo(x, top);\n c.quadraticCurveTo(x + width, (top + bottom) / 2, x, bottom);\n }\n c.stroke();\n };\n\n const drawBracket = (open: boolean) => {\n c.beginPath();\n if (open) {\n c.moveTo(x + tipInset, top);\n c.lineTo(x, top);\n c.lineTo(x, bottom);\n c.lineTo(x + tipInset, bottom);\n } else {\n c.moveTo(x + width - tipInset, top);\n c.lineTo(x + width, top);\n c.lineTo(x + width, bottom);\n c.lineTo(x + width - tipInset, bottom);\n }\n c.stroke();\n };\n\n const drawBar = (offset: number) => {\n c.beginPath();\n c.moveTo(x + offset, top);\n c.lineTo(x + offset, bottom);\n c.stroke();\n };\n\n const drawBrace = (open: boolean) => {\n const midY = (top + bottom) / 2;\n const bx = open ? x + width : x;\n const tx = open ? x : x + width;\n c.beginPath();\n c.moveTo(bx, top);\n c.quadraticCurveTo(tx, top + height * 0.25, (bx + tx) / 2, top + height * 0.4);\n c.quadraticCurveTo(tx, midY - 1, tx, midY);\n c.quadraticCurveTo(tx, midY + 1, (bx + tx) / 2, bottom - height * 0.4);\n c.quadraticCurveTo(tx, bottom - height * 0.25, bx, bottom);\n c.stroke();\n };\n\n switch (ch) {\n case '(':\n drawParen(true);\n break;\n case ')':\n drawParen(false);\n break;\n case '[':\n drawBracket(true);\n break;\n case ']':\n drawBracket(false);\n break;\n case '{':\n drawBrace(true);\n break;\n case '}':\n drawBrace(false);\n break;\n case '|':\n drawBar(side === 'left' ? width * 0.5 : width * 0.5);\n break;\n case '‖':\n drawBar(width * 0.3);\n drawBar(width * 0.7);\n break;\n default:\n break;\n }\n\n c.restore();\n}\n\n/**\n * Render plain text\n */\nfunction renderText(text: string, ctx: LaTeXRenderContext): LaTeXDimensions {\n ctx.ctx.save();\n ctx.ctx.font = `${ctx.fontSize}px ${ctx.fontFamily}`;\n ctx.ctx.fillStyle = ctx.color;\n ctx.ctx.textAlign = 'left';\n ctx.ctx.textBaseline = 'alphabetic';\n\n const metrics = ctx.ctx.measureText(text);\n ctx.ctx.fillText(text, ctx.x, ctx.y);\n\n ctx.ctx.restore();\n\n const height = ctx.fontSize;\n const baseline = height * 0.75; // Approximate baseline\n\n return {\n width: metrics.width,\n height,\n baseline,\n };\n}\n\n/**\n * Render mathematical symbol\n */\nfunction renderSymbol(symbol: string, ctx: LaTeXRenderContext): LaTeXDimensions {\n // Use larger font size for symbols\n ctx.ctx.save();\n ctx.ctx.font = `${ctx.fontSize * 1.1}px ${ctx.fontFamily}`;\n ctx.ctx.fillStyle = ctx.color;\n ctx.ctx.textAlign = 'left';\n ctx.ctx.textBaseline = 'alphabetic';\n\n const metrics = ctx.ctx.measureText(symbol);\n ctx.ctx.fillText(symbol, ctx.x, ctx.y);\n\n ctx.ctx.restore();\n\n const height = ctx.fontSize * 1.1;\n const baseline = height * 0.75;\n\n return {\n width: metrics.width,\n height,\n baseline,\n };\n}\n\n/**\n * Render superscript (exponent)\n */\nfunction renderSuperscript(\n nodes: LaTeXNode[],\n ctx: LaTeXRenderContext\n): LaTeXDimensions {\n const scaledFontSize = ctx.fontSize * 0.7;\n const yOffset = -ctx.fontSize * 0.4;\n\n const dims = renderNodes(nodes, {\n ...ctx,\n fontSize: scaledFontSize,\n y: ctx.y + yOffset,\n });\n\n const subAscent = dims.baseline;\n const subDescent = dims.height - dims.baseline;\n\n return {\n width: dims.width,\n height: (subAscent - yOffset) + (subDescent + yOffset),\n baseline: subAscent - yOffset,\n };\n}\n\n/**\n * Render subscript\n */\nfunction renderSubscript(\n nodes: LaTeXNode[],\n ctx: LaTeXRenderContext\n): LaTeXDimensions {\n const scaledFontSize = ctx.fontSize * 0.7;\n const yOffset = ctx.fontSize * 0.3;\n\n const dims = renderNodes(nodes, {\n ...ctx,\n fontSize: scaledFontSize,\n y: ctx.y + yOffset,\n });\n\n const subAscent = dims.baseline;\n const subDescent = dims.height - dims.baseline;\n\n return {\n width: dims.width,\n height: (subAscent - yOffset) + (subDescent + yOffset),\n baseline: subAscent - yOffset,\n };\n}\n\n/**\n * Render fraction\n */\nfunction renderFraction(\n numerator: LaTeXNode[],\n denominator: LaTeXNode[],\n ctx: LaTeXRenderContext\n): LaTeXDimensions {\n const scaledFontSize = ctx.fontSize * 0.85;\n const lineThickness = Math.max(1, ctx.fontSize * 0.05);\n const padding = ctx.fontSize * 0.1;\n\n // Measure both parts\n const numDims = measureNodes(numerator, {\n ...ctx,\n fontSize: scaledFontSize,\n });\n const denDims = measureNodes(denominator, {\n ...ctx,\n fontSize: scaledFontSize,\n });\n\n const maxWidth = Math.max(numDims.width, denDims.width);\n const totalHeight = numDims.height + denDims.height + padding * 2 + lineThickness;\n\n // Render numerator (centered)\n const numX = ctx.x + (maxWidth - numDims.width) / 2;\n const numY = ctx.y - padding - lineThickness / 2;\n renderNodes(numerator, {\n ...ctx,\n x: numX,\n y: numY,\n fontSize: scaledFontSize,\n });\n\n // Draw fraction line\n ctx.ctx.fillStyle = ctx.color;\n ctx.ctx.fillRect(\n ctx.x,\n ctx.y - lineThickness / 2,\n maxWidth,\n lineThickness\n );\n\n // Render denominator (centered)\n const denX = ctx.x + (maxWidth - denDims.width) / 2;\n const denY = ctx.y + denDims.baseline + padding + lineThickness / 2;\n renderNodes(denominator, {\n ...ctx,\n x: denX,\n y: denY,\n fontSize: scaledFontSize,\n });\n\n return {\n width: maxWidth,\n height: totalHeight,\n baseline: totalHeight / 2,\n };\n}\n\n/**\n * Render square root\n */\nfunction renderSqrt(nodes: LaTeXNode[], ctx: LaTeXRenderContext): LaTeXDimensions {\n const contentDims = renderNodes(nodes, {\n ...ctx,\n x: ctx.x + ctx.fontSize * 0.4,\n });\n\n const totalWidth = contentDims.width + ctx.fontSize * 0.5;\n const totalHeight = contentDims.height * 1.1;\n\n // Draw radical symbol\n ctx.ctx.save();\n ctx.ctx.strokeStyle = ctx.color;\n ctx.ctx.lineWidth = Math.max(1, ctx.fontSize * 0.05);\n ctx.ctx.lineCap = 'round';\n ctx.ctx.lineJoin = 'miter';\n\n ctx.ctx.beginPath();\n // Left tick\n ctx.ctx.moveTo(ctx.x, ctx.y - totalHeight * 0.3);\n ctx.ctx.lineTo(ctx.x + ctx.fontSize * 0.15, ctx.y);\n // Down stroke\n ctx.ctx.lineTo(ctx.x + ctx.fontSize * 0.3, ctx.y - totalHeight * 0.9);\n // Top bar\n ctx.ctx.lineTo(ctx.x + totalWidth, ctx.y - totalHeight * 0.9);\n ctx.ctx.stroke();\n\n ctx.ctx.restore();\n\n return {\n width: totalWidth,\n height: totalHeight,\n baseline: contentDims.baseline,\n };\n}\n\n/**\n * Measure nodes without rendering\n */\nfunction measureNodes(\n nodes: LaTeXNode[],\n ctx: LaTeXRenderContext\n): LaTeXDimensions {\n // Create an offscreen canvas for measurement\n const canvas = document.createElement('canvas');\n const measureCtx = canvas.getContext('2d');\n if (!measureCtx) {\n return { width: 0, height: 0, baseline: 0 };\n }\n\n return renderNodes(nodes, { ...ctx, ctx: measureCtx, x: 0, y: 0 });\n}\n","/**\n * @fileoverview LaTeX rendering plugin for Velo Plot\n * @module plugins/latex\n *\n * This plugin provides native LaTeX rendering without external dependencies.\n * It supports common mathematical notation including:\n * - Greek letters (\\alpha, \\beta, \\gamma, etc.)\n * - Superscripts and subscripts (x^2, H_2O)\n * - Fractions (\\frac{a}{b})\n * - Square roots (\\sqrt{x})\n * - Mathematical operators (\\sum, \\int, \\partial, etc.)\n *\n * @example\n * ```typescript\n * import { PluginLaTeX } from 'velo-plot/plugins';\n *\n * const latex = PluginLaTeX({\n * fontSize: 16,\n * fontFamily: 'serif',\n * color: '#000000'\n * });\n *\n * await chart.use(latex);\n *\n * // Use with axis labels\n * chart.xAxis.label = '\\\\Delta E = mc^2';\n * chart.yAxis.label = '\\\\frac{\\\\partial^2 y}{\\\\partial x^2}';\n *\n * // Use with annotations\n * chart.addAnnotation({\n * type: 'text',\n * text: '\\\\sum_{i=1}^{n} x_i',\n * latex: true\n * });\n * ```\n */\n\nimport type { ChartPlugin, PluginContext } from '../types';\nimport type {\n PluginLaTeXConfig,\n LaTeXPluginAPI,\n LaTeXDimensions,\n} from './types';\nimport { parseLaTeX } from './parser';\nimport { renderNodes } from './renderer';\n\n/**\n * LaTeX rendering plugin\n */\nexport function PluginLaTeX(config: PluginLaTeXConfig = {}): ChartPlugin<PluginLaTeXConfig> {\n const defaultConfig: Required<PluginLaTeXConfig> = {\n fontSize: 14,\n fontFamily: 'serif',\n color: '#000000',\n enableCache: true,\n customSymbols: {},\n };\n\n const finalConfig = { ...defaultConfig, ...config };\n\n // Bounded caches prevent unbounded memory growth when many distinct\n // expressions are rendered over the lifetime of a chart (task 3.11).\n const MAX_CACHE_ENTRIES = 1000;\n\n /** Evict the oldest entry once the cache exceeds its cap (FIFO). */\n function capCache<K, V>(cache: Map<K, V>): void {\n if (cache.size > MAX_CACHE_ENTRIES) {\n const oldest = cache.keys().next().value;\n if (oldest !== undefined) cache.delete(oldest);\n }\n }\n\n // Cache for parsed LaTeX\n const parseCache = new Map<string, ReturnType<typeof parseLaTeX>>();\n // Cache for measured dimensions\n const measureCache = new Map<string, LaTeXDimensions>();\n\n /**\n * Clear all caches\n */\n function clearCache(): void {\n parseCache.clear();\n measureCache.clear();\n }\n\n /**\n * Get parsed AST for LaTeX string (with caching)\n */\n function getParsed(latex: string): ReturnType<typeof parseLaTeX> {\n if (!finalConfig.enableCache) {\n return parseLaTeX(latex);\n }\n\n let parsed = parseCache.get(latex);\n if (!parsed) {\n parsed = parseLaTeX(latex);\n parseCache.set(latex, parsed);\n capCache(parseCache);\n }\n return parsed;\n }\n\n /**\n * Render LaTeX to canvas\n */\n function render(\n latex: string,\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n options: Partial<PluginLaTeXConfig> = {}\n ): LaTeXDimensions {\n const renderConfig = { ...finalConfig, ...options };\n const nodes = getParsed(latex);\n\n const dims = renderNodes(nodes, {\n ctx,\n x,\n y,\n fontSize: renderConfig.fontSize,\n fontFamily: renderConfig.fontFamily,\n color: renderConfig.color,\n scale: 1,\n });\n\n return dims;\n }\n\n /**\n * Measure LaTeX dimensions without rendering\n */\n function measure(\n latex: string,\n options: Partial<PluginLaTeXConfig> = {}\n ): LaTeXDimensions {\n const cacheKey = `${latex}:${options.fontSize || finalConfig.fontSize}`;\n\n if (finalConfig.enableCache && measureCache.has(cacheKey)) {\n return measureCache.get(cacheKey)!;\n }\n\n const renderConfig = { ...finalConfig, ...options };\n const nodes = getParsed(latex);\n\n // Create offscreen canvas for measurement\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return { width: 0, height: 0, baseline: 0 };\n }\n\n const dims = renderNodes(nodes, {\n ctx,\n x: 0,\n y: 0,\n fontSize: renderConfig.fontSize,\n fontFamily: renderConfig.fontFamily,\n color: renderConfig.color,\n scale: 1,\n });\n\n if (finalConfig.enableCache) {\n measureCache.set(cacheKey, dims);\n capCache(measureCache);\n }\n\n return dims;\n }\n\n /** Expose cache sizes for leak verification / diagnostics. */\n function getCacheStats(): { parseCache: number; measureCache: number; maxEntries: number } {\n return {\n parseCache: parseCache.size,\n measureCache: measureCache.size,\n maxEntries: MAX_CACHE_ENTRIES,\n };\n }\n\n // API exposed to chart\n const api: LaTeXPluginAPI = {\n render,\n measure,\n clearCache,\n getCacheStats,\n };\n\n return {\n manifest: {\n name: 'velo-plot-latex',\n version: '1.0.0',\n description: 'Native LaTeX rendering for mathematical expressions',\n provides: ['latex'],\n tags: ['latex', 'math', 'typography'],\n },\n\n onInit(ctx: PluginContext) {\n // API is accessed via plugin bridge, no need to set property on chart which has only a getter\n ctx.log.info('LaTeX plugin initialized');\n },\n\n onDestroy(ctx: PluginContext) {\n clearCache();\n ctx.log.info('LaTeX plugin destroyed');\n },\n\n api,\n };\n}\n\n// Type exports\nexport type { PluginLaTeXConfig, LaTeXPluginAPI, LaTeXDimensions };\n\n"],"names":["MATRIX_DELIMITERS","ALPHABET_MAPS","BLACKBOARD","CALLIGRAPHIC","FRAKTUR","parseLaTeX","latex","tokens","tokenize","parseTokens","extractTextContent","nodes","result","node","i","char","command","token","content","parseGroup","numerator","denominator","textContent","map","raw","mapped","ch","parseMatrix","isSymbol","getSymbol","startIndex","envName","inner","depth","t","matrixRows","rowCells","cellTokens","flushCell","flushRow","delimiters","groupTokens","braceDepth","renderNodes","ctx","currentX","maxAscent","maxDescent","isSub","isSuper","nextNode","isNextSub","isNextSuper","dims1","renderNode","dims2","width","dims","renderText","renderSymbol","renderSuperscript","renderSubscript","renderFraction","renderSqrt","renderMatrix","rows","nRows","nCols","m","r","cellPadX","cellPadY","delimW","cellDims","cell","measureNodes","colW","rowAsc","rowDesc","c","d","rowH","a","totalH","s","h","totalW","w","top","drawDelimiter","cellTop","cellX","x","baselineY","height","side","bottom","tipInset","drawParen","open","drawBracket","drawBar","offset","drawBrace","midY","bx","tx","text","metrics","baseline","symbol","scaledFontSize","yOffset","subAscent","subDescent","lineThickness","padding","numDims","denDims","maxWidth","totalHeight","numX","numY","denX","denY","contentDims","totalWidth","measureCtx","PluginLaTeX","config","finalConfig","MAX_CACHE_ENTRIES","capCache","cache","oldest","parseCache","measureCache","clearCache","getParsed","parsed","render","options","renderConfig","measure","cacheKey","getCacheStats"],"mappings":"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"}
1
+ {"version":3,"file":"latex.js","sources":["../../src/plugins/latex/symbols.ts","../../src/plugins/latex/parser.ts","../../src/plugins/latex/renderer.ts","../../src/plugins/latex/index.ts"],"sourcesContent":["/**\n * @fileoverview Greek letters and mathematical symbols for LaTeX rendering\n * @module plugins/latex/symbols\n */\n\n/**\n * Greek letters mapping (lowercase)\n */\nexport const GREEK_LOWERCASE: Record<string, string> = {\n alpha: 'α',\n beta: 'β',\n gamma: 'γ',\n delta: 'δ',\n epsilon: 'ε',\n zeta: 'ζ',\n eta: 'η',\n theta: 'θ',\n iota: 'ι',\n kappa: 'κ',\n lambda: 'λ',\n mu: 'μ',\n nu: 'ν',\n xi: 'ξ',\n omicron: 'ο',\n pi: 'π',\n rho: 'ρ',\n sigma: 'σ',\n tau: 'τ',\n upsilon: 'υ',\n phi: 'φ',\n chi: 'χ',\n psi: 'ψ',\n omega: 'ω',\n};\n\n/**\n * Greek letters mapping (uppercase)\n */\nexport const GREEK_UPPERCASE: Record<string, string> = {\n Alpha: 'Α',\n Beta: 'Β',\n Gamma: 'Γ',\n Delta: 'Δ',\n Epsilon: 'Ε',\n Zeta: 'Ζ',\n Eta: 'Η',\n Theta: 'Θ',\n Iota: 'Ι',\n Kappa: 'Κ',\n Lambda: 'Λ',\n Mu: 'Μ',\n Nu: 'Ν',\n Xi: 'Ξ',\n Omicron: 'Ο',\n Pi: 'Π',\n Rho: 'Ρ',\n Sigma: 'Σ',\n Tau: 'Τ',\n Upsilon: 'Υ',\n Phi: 'Φ',\n Chi: 'Χ',\n Psi: 'Ψ',\n Omega: 'Ω',\n};\n\n/**\n * Mathematical operators\n */\nexport const MATH_OPERATORS: Record<string, string> = {\n sum: '∑',\n prod: '∏',\n int: '∫',\n oint: '∮',\n partial: '∂',\n nabla: '∇',\n infty: '∞',\n hbar: 'ℏ',\n pm: '±',\n mp: '∓',\n times: '×',\n div: '÷',\n cdot: '·',\n ast: '∗',\n star: '⋆',\n circ: '∘',\n bullet: '•',\n cap: '∩',\n cup: '∪',\n vee: '∨',\n wedge: '∧',\n oplus: '⊕',\n otimes: '⊗',\n equiv: '≡',\n cong: '≅',\n approx: '≈',\n propto: '∝',\n neq: '≠',\n leq: '≤',\n geq: '≥',\n ll: '≪',\n gg: '≫',\n subset: '⊂',\n supset: '⊃',\n subseteq: '⊆',\n supseteq: '⊇',\n in: '∈',\n notin: '∉',\n ni: '∋',\n forall: '∀',\n exists: '∃',\n emptyset: '∅',\n neg: '¬',\n angle: '∠',\n perp: '⊥',\n parallel: '∥',\n rightarrow: '→',\n leftarrow: '←',\n leftrightarrow: '↔',\n Rightarrow: '⇒',\n Leftarrow: '⇐',\n Leftrightarrow: '⇔',\n mapsto: '↦',\n to: '→',\n langle: '⟨',\n rangle: '⟩',\n rightleftharpoons: '⇌',\n log: 'log',\n ln: 'ln',\n sin: 'sin',\n cos: 'cos',\n tan: 'tan',\n};\n\n/**\n * Greek letter variants\n */\nexport const GREEK_VARIANTS: Record<string, string> = {\n varepsilon: 'ϵ',\n vartheta: 'ϑ',\n varkappa: 'ϰ',\n varphi: 'φ',\n varpi: 'ϖ',\n varrho: 'ϱ',\n varsigma: 'ς',\n digamma: 'ϝ',\n varDelta: 'Δ',\n varGamma: 'Γ',\n varSigma: 'Σ',\n varOmega: 'Ω',\n varPhi: 'Φ',\n varPi: 'Π',\n varLambda: 'Λ',\n varTheta: 'Θ',\n varUpsilon: 'Υ',\n varXi: 'Ξ',\n varPsi: 'Ψ',\n};\n\n/**\n * Arrow symbols\n */\nexport const ARROWS: Record<string, string> = {\n uparrow: '↑',\n downarrow: '↓',\n updownarrow: '↕',\n Uparrow: '⇑',\n Downarrow: '⇓',\n Updownarrow: '⇕',\n nearrow: '↗',\n searrow: '↘',\n swarrow: '↙',\n nwarrow: '↖',\n longrightarrow: '⟶',\n longleftarrow: '⟵',\n longleftrightarrow: '⟷',\n Longrightarrow: '⟹',\n Longleftarrow: '⟸',\n Longleftrightarrow: '⟺',\n implies: '⟹',\n impliedby: '⟸',\n iff: '⟺',\n hookrightarrow: '↪',\n hookleftarrow: '↩',\n twoheadrightarrow: '↠',\n twoheadleftarrow: '↞',\n rightarrowtail: '↣',\n leftarrowtail: '↢',\n rightleftarrows: '⇄',\n leftrightarrows: '⇆',\n rightrightarrows: '⇉',\n leftleftarrows: '⇇',\n upuparrows: '⇈',\n downdownarrows: '⇊',\n leadsto: '⇝',\n rightsquigarrow: '⇝',\n leftrightsquigarrow: '↭',\n circlearrowleft: '↺',\n circlearrowright: '↻',\n curvearrowleft: '↶',\n curvearrowright: '↷',\n Rrightarrow: '⇛',\n Lleftarrow: '⇚',\n dashrightarrow: '⇢',\n dashleftarrow: '⇠',\n nrightarrow: '↛',\n nleftarrow: '↚',\n nLeftrightarrow: '⇎',\n nRightarrow: '⇏',\n nLeftarrow: '⇍',\n restriction: '↾',\n upharpoonright: '↾',\n upharpoonleft: '↿',\n downharpoonright: '⇂',\n downharpoonleft: '⇃',\n leftharpoonup: '↼',\n leftharpoondown: '↽',\n rightharpoonup: '⇀',\n rightharpoondown: '⇁',\n leftrightharpoons: '⇋',\n};\n\n/**\n * Relation symbols\n */\nexport const RELATIONS: Record<string, string> = {\n sim: '∼',\n simeq: '≃',\n asymp: '≍',\n approxeq: '≊',\n doteq: '≐',\n prec: '≺',\n succ: '≻',\n preceq: '⪯',\n succeq: '⪰',\n precsim: '≾',\n succsim: '≿',\n ll: '≪',\n gg: '≫',\n lll: '⋘',\n ggg: '⋙',\n models: '⊨',\n vdash: '⊢',\n dashv: '⊣',\n vDash: '⊨',\n Vdash: '⊩',\n Vvdash: '⊪',\n smile: '⌣',\n frown: '⌢',\n bowtie: '⋈',\n sqsubset: '⊏',\n sqsupset: '⊐',\n sqsubseteq: '⊑',\n sqsupseteq: '⊒',\n subsetneq: '⊊',\n supsetneq: '⊋',\n Subset: '⋐',\n Supset: '⋑',\n between: '≬',\n pitchfork: '⋔',\n therefore: '∴',\n because: '∵',\n eqcirc: '≖',\n circeq: '≗',\n triangleq: '≜',\n gtrless: '≷',\n lessgtr: '≶',\n lesssim: '≲',\n gtrsim: '≳',\n lessdot: '⋖',\n gtrdot: '⋗',\n ne: '≠',\n nless: '≮',\n ngtr: '≯',\n nleq: '≰',\n ngeq: '≱',\n nsim: '≁',\n nmid: '∤',\n nparallel: '∦',\n nsubseteq: '⊈',\n nsupseteq: '⊉',\n nsubset: '⊄',\n nsupset: '⊅',\n nvdash: '⊬',\n nvDash: '⊭',\n precnsim: '⋨',\n succnsim: '⋩',\n mid: '∣',\n shortmid: '∣',\n varpropto: '∝',\n backsim: '∽',\n eqsim: '≂',\n Doteq: '≑',\n fallingdotseq: '≒',\n risingdotseq: '≓',\n};\n\n/**\n * Binary operators\n */\nexport const BINARY_OPERATORS: Record<string, string> = {\n setminus: '∖',\n smallsetminus: '∖',\n wr: '≀',\n amalg: '⨿',\n uplus: '⊎',\n sqcap: '⊓',\n sqcup: '⊔',\n triangleleft: '◁',\n triangleright: '▷',\n bigtriangleup: '△',\n bigtriangledown: '▽',\n triangledown: '▿',\n diamond: '⋄',\n ominus: '⊖',\n oslash: '⊘',\n odot: '⊙',\n bigcirc: '◯',\n boxplus: '⊞',\n boxminus: '⊟',\n boxtimes: '⊠',\n boxdot: '⊡',\n ltimes: '⋉',\n rtimes: '⋊',\n divideontimes: '⋇',\n dagger: '†',\n ddagger: '‡',\n intercal: '⊺',\n curlyvee: '⋎',\n curlywedge: '⋏',\n barwedge: '⊼',\n veebar: '⊻',\n doublebarwedge: '⩞',\n circledast: '⊛',\n circledcirc: '⊚',\n circleddash: '⊝',\n lesseqgtr: '⋚',\n gtreqless: '⋛',\n dotplus: '∔',\n centerdot: '·',\n};\n\n/**\n * Large operators\n */\nexport const BIG_OPERATORS: Record<string, string> = {\n bigcup: '⋃',\n bigcap: '⋂',\n bigsqcup: '⨆',\n biguplus: '⨄',\n bigvee: '⋁',\n bigwedge: '⋀',\n bigoplus: '⨁',\n bigotimes: '⨂',\n bigodot: '⨀',\n coprod: '∐',\n iint: '∬',\n iiint: '∭',\n iiiint: '⨌',\n oiint: '∯',\n oiiint: '∰',\n};\n\n/**\n * Miscellaneous symbols\n */\nexport const MISC_SYMBOLS: Record<string, string> = {\n aleph: 'ℵ',\n beth: 'ℶ',\n gimel: 'ℷ',\n daleth: 'ℸ',\n ell: 'ℓ',\n wp: '℘',\n Re: 'ℜ',\n Im: 'ℑ',\n imath: 'ı',\n jmath: 'ȷ',\n hslash: 'ℏ',\n surd: '√',\n top: '⊤',\n bot: '⊥',\n measuredangle: '∡',\n sphericalangle: '∢',\n triangle: '△',\n blacktriangle: '▲',\n blacktriangledown: '▼',\n blacktriangleleft: '◀',\n blacktriangleright: '▶',\n square: '□',\n blacksquare: '■',\n lozenge: '◊',\n blacklozenge: '⧫',\n bigstar: '★',\n backslash: '\\\\',\n prime: '′',\n dprime: '″',\n backprime: '‵',\n varnothing: '∅',\n complement: '∁',\n degree: '°',\n flat: '♭',\n natural: '♮',\n sharp: '♯',\n clubsuit: '♣',\n diamondsuit: '♢',\n heartsuit: '♡',\n spadesuit: '♠',\n checkmark: '✓',\n maltese: '✠',\n copyright: '©',\n circledR: '®',\n circledS: 'Ⓢ',\n pounds: '£',\n yen: '¥',\n euro: '€',\n cent: '¢',\n S: '§',\n P: '¶',\n dag: '†',\n ddag: '‡',\n sun: '☉',\n mercury: '☿',\n venus: '♀',\n earth: '♁',\n mars: '♂',\n jupiter: '♃',\n saturn: '♄',\n partialdiff: '∂',\n Finv: 'Ⅎ',\n Game: '⅁',\n mho: '℧',\n eth: 'ð',\n hbar2: 'ℏ',\n nexists: '∄',\n angstrom: 'Å',\n micro: 'µ',\n ohm: 'Ω',\n perthousand: '‰',\n numero: '№',\n};\n\n/**\n * Dots and ellipses\n */\nexport const DOTS: Record<string, string> = {\n ldots: '…',\n cdots: '⋯',\n vdots: '⋮',\n ddots: '⋱',\n dots: '…',\n dotsc: '…',\n dotsb: '⋯',\n dotsm: '⋯',\n dotsi: '⋯',\n};\n\n/**\n * Delimiters\n */\nexport const DELIMITERS: Record<string, string> = {\n lfloor: '⌊',\n rfloor: '⌋',\n lceil: '⌈',\n rceil: '⌉',\n lbrace: '{',\n rbrace: '}',\n lbrack: '[',\n rbrack: ']',\n lvert: '|',\n rvert: '|',\n lVert: '‖',\n rVert: '‖',\n vert: '|',\n Vert: '‖',\n ulcorner: '⌜',\n urcorner: '⌝',\n llcorner: '⌞',\n lrcorner: '⌟',\n lgroup: '⟮',\n rgroup: '⟯',\n lmoustache: '⎰',\n rmoustache: '⎱',\n llbracket: '⟦',\n rrbracket: '⟧',\n};\n\n/**\n * Named functions (rendered as upright text)\n */\nexport const FUNCTIONS: Record<string, string> = {\n sec: 'sec',\n csc: 'csc',\n cot: 'cot',\n sinh: 'sinh',\n cosh: 'cosh',\n tanh: 'tanh',\n coth: 'coth',\n arcsin: 'arcsin',\n arccos: 'arccos',\n arctan: 'arctan',\n arcsec: 'arcsec',\n arccsc: 'arccsc',\n arccot: 'arccot',\n exp: 'exp',\n det: 'det',\n dim: 'dim',\n ker: 'ker',\n deg: 'deg',\n gcd: 'gcd',\n hom: 'hom',\n lim: 'lim',\n liminf: 'lim inf',\n limsup: 'lim sup',\n max: 'max',\n min: 'min',\n sup: 'sup',\n inf: 'inf',\n arg: 'arg',\n Pr: 'Pr',\n lg: 'lg',\n mod: 'mod',\n bmod: 'mod',\n};\n\n/**\n * All symbols combined\n */\nexport const ALL_SYMBOLS: Record<string, string> = {\n ...GREEK_LOWERCASE,\n ...GREEK_UPPERCASE,\n ...GREEK_VARIANTS,\n ...MATH_OPERATORS,\n ...ARROWS,\n ...RELATIONS,\n ...BINARY_OPERATORS,\n ...BIG_OPERATORS,\n ...MISC_SYMBOLS,\n ...DOTS,\n ...DELIMITERS,\n ...FUNCTIONS,\n};\n\n/**\n * Blackboard-bold (\\mathbb) letter map\n */\nexport const BLACKBOARD: Record<string, string> = {\n A: '𝔸', B: '𝔹', C: 'ℂ', D: '𝔻', E: '𝔼', F: '𝔽', G: '𝔾', H: 'ℍ',\n I: '𝕀', J: '𝕁', K: '𝕂', L: '𝕃', M: '𝕄', N: 'ℕ', O: '𝕆', P: 'ℙ',\n Q: 'ℚ', R: 'ℝ', S: '𝕊', T: '𝕋', U: '𝕌', V: '𝕍', W: '𝕎', X: '𝕏',\n Y: '𝕐', Z: 'ℤ',\n};\n\n/**\n * Calligraphic (\\mathcal) letter map\n */\nexport const CALLIGRAPHIC: Record<string, string> = {\n A: '𝒜', B: 'ℬ', C: '𝒞', D: '𝒟', E: 'ℰ', F: 'ℱ', G: '𝒢', H: 'ℋ',\n I: 'ℐ', J: '𝒥', K: '𝒦', L: 'ℒ', M: 'ℳ', N: '𝒩', O: '𝒪', P: '𝒫',\n Q: '𝒬', R: 'ℛ', S: '𝒮', T: '𝒯', U: '𝒰', V: '𝒱', W: '𝒲', X: '𝒳',\n Y: '𝒴', Z: '𝒵',\n};\n\n/**\n * Fraktur (\\mathfrak) letter map\n */\nexport const FRAKTUR: Record<string, string> = {\n A: '𝔄', B: '𝔅', C: 'ℭ', D: '𝔇', E: '𝔈', F: '𝔉', G: '𝔊', H: 'ℌ',\n I: 'ℑ', J: '𝔍', K: '𝔎', L: '𝔏', M: '𝔐', N: '𝔑', O: '𝔒', P: '𝔓',\n Q: '𝔔', R: 'ℜ', S: '𝔖', T: '𝔗', U: '𝔘', V: '𝔙', W: '𝔚', X: '𝔛',\n Y: '𝔜', Z: 'ℨ',\n};\n\n/** Total number of directly-mapped LaTeX commands (excludes alphabet maps). */\nexport const SYMBOL_COUNT = Object.keys(ALL_SYMBOLS).length;\n\n/**\n * Get Unicode symbol for a LaTeX command\n */\nexport function getSymbol(command: string): string | undefined {\n return ALL_SYMBOLS[command];\n}\n\n/**\n * Check if a command is a known symbol\n */\nexport function isSymbol(command: string): boolean {\n return command in ALL_SYMBOLS;\n}\n","/**\n * @fileoverview Simple LaTeX parser for mathematical expressions\n * @module plugins/latex/parser\n */\n\nimport { LaTeXNode } from './types';\nimport { getSymbol, isSymbol, BLACKBOARD, CALLIGRAPHIC, FRAKTUR } from './symbols';\n\n/** Delimiters for supported matrix environments. */\nconst MATRIX_DELIMITERS: Record<string, [string, string]> = {\n matrix: ['', ''],\n pmatrix: ['(', ')'],\n bmatrix: ['[', ']'],\n Bmatrix: ['{', '}'],\n vmatrix: ['|', '|'],\n Vmatrix: ['‖', '‖'],\n};\n\n/** Alphabet transforms for math font commands. */\nconst ALPHABET_MAPS: Record<string, Record<string, string>> = {\n mathbb: BLACKBOARD,\n mathcal: CALLIGRAPHIC,\n mathfrak: FRAKTUR,\n};\n\n/**\n * Parse LaTeX string into an abstract syntax tree\n */\nexport function parseLaTeX(latex: string): LaTeXNode[] {\n const tokens = tokenize(latex);\n return parseTokens(tokens);\n}\n\n/**\n * Extract text content from nodes recursively\n */\nfunction extractTextContent(nodes: LaTeXNode[]): string {\n let result = '';\n for (const node of nodes) {\n if (node.type === 'text' || node.type === 'textgroup') {\n result += node.content || '';\n } else if (node.type === 'symbol') {\n result += node.content || '';\n } else if (node.children) {\n result += extractTextContent(node.children);\n }\n }\n return result;\n}\n\n/**\n * Tokenize LaTeX string\n */\nfunction tokenize(latex: string): string[] {\n const tokens: string[] = [];\n let i = 0;\n\n while (i < latex.length) {\n const char = latex[i];\n\n // Backslash indicates a command\n if (char === '\\\\') {\n let command = '';\n i++;\n // Read command name (letters only)\n while (i < latex.length && /[a-zA-Z]/.test(latex[i])) {\n command += latex[i];\n i++;\n }\n if (command) {\n tokens.push('\\\\' + command);\n } else {\n // Single character command like \\{\n if (i < latex.length) {\n tokens.push('\\\\' + latex[i]);\n i++;\n }\n }\n }\n // Special characters that should be separate tokens\n else if (char === '{' || char === '}' || char === '^' || char === '_') {\n tokens.push(char);\n i++;\n }\n // Whitespace: preserve as single space token for text commands\n else if (/\\s/.test(char)) {\n tokens.push(' ');\n i++;\n // Skip additional whitespace\n while (i < latex.length && /\\s/.test(latex[i])) {\n i++;\n }\n }\n // Single characters: keep separate for proper subscript/superscript handling\n else {\n // Group text only if we're in a \"text\" context (not math/chemistry)\n // For chemistry formulas, keep each letter/digit separate\n tokens.push(char);\n i++;\n }\n }\n\n return tokens;\n}\n\n/**\n * Parse tokens into AST nodes\n */\nfunction parseTokens(tokens: string[]): LaTeXNode[] {\n const nodes: LaTeXNode[] = [];\n let i = 0;\n\n while (i < tokens.length) {\n const token = tokens[i];\n\n // Superscript\n if (token === '^') {\n i++;\n const content = parseGroup(tokens, i);\n nodes.push({\n type: 'superscript',\n children: content.nodes,\n });\n i = content.nextIndex;\n }\n // Subscript\n else if (token === '_') {\n i++;\n const content = parseGroup(tokens, i);\n nodes.push({\n type: 'subscript',\n children: content.nodes,\n });\n i = content.nextIndex;\n }\n // Commands\n else if (token.startsWith('\\\\')) {\n const command = token.substring(1);\n\n // Fraction\n if (command === 'frac') {\n i++;\n const numerator = parseGroup(tokens, i);\n i = numerator.nextIndex;\n const denominator = parseGroup(tokens, i);\n i = denominator.nextIndex;\n nodes.push({\n type: 'fraction',\n numerator: numerator.nodes,\n denominator: denominator.nodes,\n });\n }\n // Square root\n else if (command === 'sqrt') {\n i++;\n const content = parseGroup(tokens, i);\n nodes.push({\n type: 'sqrt',\n children: content.nodes,\n });\n i = content.nextIndex;\n }\n // Text command - render as a single grouped string for proper kerning\n else if (command === 'text' || command === 'mathrm' || command === 'mathbf' || command === 'mathit' || command === 'operatorname') {\n i++;\n const content = parseGroup(tokens, i);\n // Concatenate all text content from the group into a single string\n const textContent = extractTextContent(content.nodes);\n nodes.push({\n type: 'textgroup',\n content: textContent,\n });\n i = content.nextIndex;\n }\n // Math alphabets: map each letter to its Unicode variant\n else if (command in ALPHABET_MAPS) {\n i++;\n const content = parseGroup(tokens, i);\n i = content.nextIndex;\n const map = ALPHABET_MAPS[command];\n const raw = extractTextContent(content.nodes);\n let mapped = '';\n for (const ch of raw) mapped += map[ch] ?? ch;\n nodes.push({ type: 'text', content: mapped });\n }\n // Matrix environments: \\begin{pmatrix} a & b \\\\ c & d \\end{pmatrix}\n else if (command === 'begin') {\n i = parseMatrix(tokens, i, nodes);\n }\n // Symbol\n else if (isSymbol(command)) {\n nodes.push({\n type: 'symbol',\n content: getSymbol(command),\n });\n i++;\n }\n // Common operators that might be commands\n else if (command === 'times' || command === 'cdot' || command === 'pm' || command === 'mp') {\n nodes.push({\n type: 'symbol',\n content: getSymbol(command),\n });\n i++;\n }\n // Unknown command - treat as text\n else {\n nodes.push({\n type: 'text',\n content: token,\n });\n i++;\n }\n }\n // Group start\n else if (token === '{') {\n const content = parseGroup(tokens, i);\n nodes.push({\n type: 'group',\n children: content.nodes,\n });\n i = content.nextIndex;\n }\n // Regular text\n else {\n nodes.push({\n type: 'text',\n content: token,\n });\n i++;\n }\n }\n\n return nodes;\n}\n\n/**\n * Parse a matrix environment starting at the `\\begin` token.\n * Returns the index immediately after the matching `\\end{...}`.\n */\nfunction parseMatrix(tokens: string[], startIndex: number, nodes: LaTeXNode[]): number {\n let i = startIndex + 1; // skip \\begin\n\n // Read environment name inside the following {...}\n let envName = '';\n if (tokens[i] === '{') {\n i++;\n while (i < tokens.length && tokens[i] !== '}') {\n envName += tokens[i];\n i++;\n }\n if (tokens[i] === '}') i++;\n }\n\n // Collect tokens until the matching \\end (supporting nesting)\n const inner: string[] = [];\n let depth = 1;\n while (i < tokens.length && depth > 0) {\n const t = tokens[i];\n if (t === '\\\\begin') {\n depth++;\n inner.push(t);\n i++;\n } else if (t === '\\\\end') {\n depth--;\n if (depth === 0) {\n i++; // consume \\end\n if (tokens[i] === '{') {\n i++;\n while (i < tokens.length && tokens[i] !== '}') i++;\n if (tokens[i] === '}') i++;\n }\n } else {\n inner.push(t);\n i++;\n }\n } else {\n inner.push(t);\n i++;\n }\n }\n\n // Split inner tokens into rows (\\\\) and cells (&)\n const matrixRows: LaTeXNode[][][] = [];\n let rowCells: LaTeXNode[][] = [];\n let cellTokens: string[] = [];\n const flushCell = () => {\n rowCells.push(parseTokens(cellTokens));\n cellTokens = [];\n };\n const flushRow = () => {\n flushCell();\n matrixRows.push(rowCells);\n rowCells = [];\n };\n\n for (const t of inner) {\n if (t === '&') {\n flushCell();\n } else if (t === '\\\\\\\\') {\n flushRow();\n } else {\n cellTokens.push(t);\n }\n }\n if (cellTokens.length > 0 || rowCells.length > 0) {\n flushRow();\n }\n\n const delimiters = MATRIX_DELIMITERS[envName] ?? ['', ''];\n nodes.push({ type: 'matrix', rows: matrixRows, delimiters });\n\n return i;\n}\n\n/**\n * Parse a grouped expression (inside braces)\n */\nfunction parseGroup(\n tokens: string[],\n startIndex: number\n): { nodes: LaTeXNode[]; nextIndex: number } {\n // If next token is not a brace, treat single token as group\n if (tokens[startIndex] !== '{') {\n return {\n nodes: [\n {\n type: 'text',\n content: tokens[startIndex] || '',\n },\n ],\n nextIndex: startIndex + 1,\n };\n }\n\n // Skip opening brace\n let i = startIndex + 1;\n const groupTokens: string[] = [];\n let braceDepth = 1;\n\n // Collect tokens until matching closing brace\n while (i < tokens.length && braceDepth > 0) {\n const token = tokens[i];\n if (token === '{') {\n braceDepth++;\n groupTokens.push(token);\n } else if (token === '}') {\n braceDepth--;\n if (braceDepth > 0) {\n groupTokens.push(token);\n }\n } else {\n groupTokens.push(token);\n }\n i++;\n }\n\n return {\n nodes: parseTokens(groupTokens),\n nextIndex: i,\n };\n}\n","/**\n * @fileoverview LaTeX renderer using native Canvas API\n * @module plugins/latex/renderer\n */\n\nimport { LaTeXNode, LaTeXRenderContext, LaTeXDimensions } from './types';\n\n/**\n * Render a list of LaTeX nodes to canvas\n */\nexport function renderNodes(\n nodes: LaTeXNode[],\n ctx: LaTeXRenderContext\n): LaTeXDimensions {\n let currentX = ctx.x;\n let maxAscent = 0;\n let maxDescent = 0;\n\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n // Check if we have adjacent subscript and superscript (stacking)\n const isSub = node.type === 'subscript';\n const isSuper = node.type === 'superscript';\n const nextNode = nodes[i + 1];\n const isNextSub = nextNode?.type === 'subscript';\n const isNextSuper = nextNode?.type === 'superscript';\n\n if ((isSub && isNextSuper) || (isSuper && isNextSub)) {\n // Stack subscript and superscript at the same X coordinate\n const dims1 = renderNode(node, { ...ctx, x: currentX });\n const dims2 = renderNode(nextNode, { ...ctx, x: currentX });\n\n const width = Math.max(dims1.width, dims2.width);\n currentX += width + (ctx.fontSize * 0.15); // Scaled padding after scripts\n\n maxAscent = Math.max(maxAscent, dims1.baseline, dims2.baseline);\n maxDescent = Math.max(maxDescent, dims1.height - dims1.baseline, dims2.height - dims2.baseline);\n i++; // Skip next node\n } else {\n const dims = renderNode(node, { ...ctx, x: currentX });\n currentX += dims.width;\n\n // Add a small gap after scripts to prevent overlap with next character (Chemistry fix)\n if (isSub || isSuper) {\n currentX += ctx.fontSize * 0.12;\n }\n\n maxAscent = Math.max(maxAscent, dims.baseline);\n maxDescent = Math.max(maxDescent, dims.height - dims.baseline);\n }\n }\n\n return {\n width: currentX - ctx.x,\n height: maxAscent + maxDescent,\n baseline: maxAscent,\n };\n}\n\n/**\n * Render a single LaTeX node\n */\nfunction renderNode(node: LaTeXNode, ctx: LaTeXRenderContext): LaTeXDimensions {\n switch (node.type) {\n case 'text':\n return renderText(node.content || '', ctx);\n\n case 'textgroup':\n return renderText(node.content || '', ctx);\n\n case 'symbol':\n return renderSymbol(node.content || '', ctx);\n\n case 'superscript':\n return renderSuperscript(node.children || [], ctx);\n\n case 'subscript':\n return renderSubscript(node.children || [], ctx);\n\n case 'fraction':\n return renderFraction(\n node.numerator || [],\n node.denominator || [],\n ctx\n );\n\n case 'sqrt':\n return renderSqrt(node.children || [], ctx);\n\n case 'group':\n return renderNodes(node.children || [], ctx);\n\n case 'matrix':\n return renderMatrix(node.rows || [], node.delimiters || ['', ''], ctx);\n\n default:\n return { width: 0, height: 0, baseline: 0 };\n }\n}\n\n/**\n * Render a matrix environment (\\begin{pmatrix}...\\end{pmatrix}).\n * The matrix is vertically centered on the current baseline.\n */\nfunction renderMatrix(\n rows: LaTeXNode[][][],\n delimiters: [string, string],\n ctx: LaTeXRenderContext\n): LaTeXDimensions {\n const nRows = rows.length;\n const nCols = rows.reduce((m, r) => Math.max(m, r.length), 0);\n if (nRows === 0 || nCols === 0) {\n return { width: 0, height: 0, baseline: 0 };\n }\n\n const cellPadX = ctx.fontSize * 0.35;\n const cellPadY = ctx.fontSize * 0.25;\n const delimW = ctx.fontSize * 0.35;\n\n // Measure every cell\n const cellDims: LaTeXDimensions[][] = rows.map((r) => r.map((cell) => measureNodes(cell, ctx)));\n\n const colW = new Array(nCols).fill(0);\n const rowAsc = new Array(nRows).fill(0);\n const rowDesc = new Array(nRows).fill(0);\n\n for (let r = 0; r < nRows; r++) {\n for (let c = 0; c < rows[r].length; c++) {\n const d = cellDims[r][c];\n colW[c] = Math.max(colW[c], d.width);\n rowAsc[r] = Math.max(rowAsc[r], d.baseline);\n rowDesc[r] = Math.max(rowDesc[r], d.height - d.baseline);\n }\n }\n const rowH = rowAsc.map((a, i) => a + rowDesc[i]);\n\n const totalH = rowH.reduce((s, h) => s + h, 0) + cellPadY * 2 * nRows;\n const contentW = colW.reduce((s, w) => s + w, 0) + cellPadX * 2 * nCols;\n const totalW = contentW + delimW * 2;\n\n const top = ctx.y - totalH / 2;\n\n // Delimiters\n drawDelimiter(ctx, delimiters[0], ctx.x, top, totalH, delimW, 'left');\n drawDelimiter(ctx, delimiters[1], ctx.x + totalW - delimW, top, totalH, delimW, 'right');\n\n // Cells\n let cellTop = top + cellPadY;\n for (let r = 0; r < nRows; r++) {\n let cellX = ctx.x + delimW + cellPadX;\n for (let c = 0; c < nCols; c++) {\n const cell = rows[r][c];\n if (cell) {\n const d = cellDims[r][c];\n const x = cellX + (colW[c] - d.width) / 2;\n const baselineY = cellTop + rowAsc[r];\n renderNodes(cell, { ...ctx, x, y: baselineY });\n }\n cellX += colW[c] + cellPadX * 2;\n }\n cellTop += rowH[r] + cellPadY * 2;\n }\n\n return { width: totalW, height: totalH, baseline: totalH / 2 };\n}\n\n/**\n * Draw a stretchable matrix delimiter using geometric strokes.\n */\nfunction drawDelimiter(\n ctx: LaTeXRenderContext,\n ch: string,\n x: number,\n top: number,\n height: number,\n width: number,\n side: 'left' | 'right'\n): void {\n if (!ch) return;\n const c = ctx.ctx;\n c.save();\n c.strokeStyle = ctx.color;\n c.lineWidth = Math.max(1, ctx.fontSize * 0.05);\n c.lineCap = 'round';\n c.lineJoin = 'round';\n\n const bottom = top + height;\n const tipInset = width * 0.7;\n\n const drawParen = (open: boolean) => {\n c.beginPath();\n if (open) {\n c.moveTo(x + width, top);\n c.quadraticCurveTo(x, (top + bottom) / 2, x + width, bottom);\n } else {\n c.moveTo(x, top);\n c.quadraticCurveTo(x + width, (top + bottom) / 2, x, bottom);\n }\n c.stroke();\n };\n\n const drawBracket = (open: boolean) => {\n c.beginPath();\n if (open) {\n c.moveTo(x + tipInset, top);\n c.lineTo(x, top);\n c.lineTo(x, bottom);\n c.lineTo(x + tipInset, bottom);\n } else {\n c.moveTo(x + width - tipInset, top);\n c.lineTo(x + width, top);\n c.lineTo(x + width, bottom);\n c.lineTo(x + width - tipInset, bottom);\n }\n c.stroke();\n };\n\n const drawBar = (offset: number) => {\n c.beginPath();\n c.moveTo(x + offset, top);\n c.lineTo(x + offset, bottom);\n c.stroke();\n };\n\n const drawBrace = (open: boolean) => {\n const midY = (top + bottom) / 2;\n const bx = open ? x + width : x;\n const tx = open ? x : x + width;\n c.beginPath();\n c.moveTo(bx, top);\n c.quadraticCurveTo(tx, top + height * 0.25, (bx + tx) / 2, top + height * 0.4);\n c.quadraticCurveTo(tx, midY - 1, tx, midY);\n c.quadraticCurveTo(tx, midY + 1, (bx + tx) / 2, bottom - height * 0.4);\n c.quadraticCurveTo(tx, bottom - height * 0.25, bx, bottom);\n c.stroke();\n };\n\n switch (ch) {\n case '(':\n drawParen(true);\n break;\n case ')':\n drawParen(false);\n break;\n case '[':\n drawBracket(true);\n break;\n case ']':\n drawBracket(false);\n break;\n case '{':\n drawBrace(true);\n break;\n case '}':\n drawBrace(false);\n break;\n case '|':\n drawBar(side === 'left' ? width * 0.5 : width * 0.5);\n break;\n case '‖':\n drawBar(width * 0.3);\n drawBar(width * 0.7);\n break;\n default:\n break;\n }\n\n c.restore();\n}\n\n/**\n * Render plain text\n */\nfunction renderText(text: string, ctx: LaTeXRenderContext): LaTeXDimensions {\n ctx.ctx.save();\n ctx.ctx.font = `${ctx.fontSize}px ${ctx.fontFamily}`;\n ctx.ctx.fillStyle = ctx.color;\n ctx.ctx.textAlign = 'left';\n ctx.ctx.textBaseline = 'alphabetic';\n\n const metrics = ctx.ctx.measureText(text);\n ctx.ctx.fillText(text, ctx.x, ctx.y);\n\n ctx.ctx.restore();\n\n const height = ctx.fontSize;\n const baseline = height * 0.75; // Approximate baseline\n\n return {\n width: metrics.width,\n height,\n baseline,\n };\n}\n\n/**\n * Render mathematical symbol\n */\nfunction renderSymbol(symbol: string, ctx: LaTeXRenderContext): LaTeXDimensions {\n // Use larger font size for symbols\n ctx.ctx.save();\n ctx.ctx.font = `${ctx.fontSize * 1.1}px ${ctx.fontFamily}`;\n ctx.ctx.fillStyle = ctx.color;\n ctx.ctx.textAlign = 'left';\n ctx.ctx.textBaseline = 'alphabetic';\n\n const metrics = ctx.ctx.measureText(symbol);\n ctx.ctx.fillText(symbol, ctx.x, ctx.y);\n\n ctx.ctx.restore();\n\n const height = ctx.fontSize * 1.1;\n const baseline = height * 0.75;\n\n return {\n width: metrics.width,\n height,\n baseline,\n };\n}\n\n/**\n * Render superscript (exponent)\n */\nfunction renderSuperscript(\n nodes: LaTeXNode[],\n ctx: LaTeXRenderContext\n): LaTeXDimensions {\n const scaledFontSize = ctx.fontSize * 0.7;\n const yOffset = -ctx.fontSize * 0.4;\n\n const dims = renderNodes(nodes, {\n ...ctx,\n fontSize: scaledFontSize,\n y: ctx.y + yOffset,\n });\n\n const subAscent = dims.baseline;\n const subDescent = dims.height - dims.baseline;\n\n return {\n width: dims.width,\n height: (subAscent - yOffset) + (subDescent + yOffset),\n baseline: subAscent - yOffset,\n };\n}\n\n/**\n * Render subscript\n */\nfunction renderSubscript(\n nodes: LaTeXNode[],\n ctx: LaTeXRenderContext\n): LaTeXDimensions {\n const scaledFontSize = ctx.fontSize * 0.7;\n const yOffset = ctx.fontSize * 0.3;\n\n const dims = renderNodes(nodes, {\n ...ctx,\n fontSize: scaledFontSize,\n y: ctx.y + yOffset,\n });\n\n const subAscent = dims.baseline;\n const subDescent = dims.height - dims.baseline;\n\n return {\n width: dims.width,\n height: (subAscent - yOffset) + (subDescent + yOffset),\n baseline: subAscent - yOffset,\n };\n}\n\n/**\n * Render fraction\n */\nfunction renderFraction(\n numerator: LaTeXNode[],\n denominator: LaTeXNode[],\n ctx: LaTeXRenderContext\n): LaTeXDimensions {\n const scaledFontSize = ctx.fontSize * 0.85;\n const lineThickness = Math.max(1, ctx.fontSize * 0.05);\n const padding = ctx.fontSize * 0.1;\n\n // Measure both parts\n const numDims = measureNodes(numerator, {\n ...ctx,\n fontSize: scaledFontSize,\n });\n const denDims = measureNodes(denominator, {\n ...ctx,\n fontSize: scaledFontSize,\n });\n\n const maxWidth = Math.max(numDims.width, denDims.width);\n const totalHeight = numDims.height + denDims.height + padding * 2 + lineThickness;\n\n // Render numerator (centered)\n const numX = ctx.x + (maxWidth - numDims.width) / 2;\n const numY = ctx.y - padding - lineThickness / 2;\n renderNodes(numerator, {\n ...ctx,\n x: numX,\n y: numY,\n fontSize: scaledFontSize,\n });\n\n // Draw fraction line\n ctx.ctx.fillStyle = ctx.color;\n ctx.ctx.fillRect(\n ctx.x,\n ctx.y - lineThickness / 2,\n maxWidth,\n lineThickness\n );\n\n // Render denominator (centered)\n const denX = ctx.x + (maxWidth - denDims.width) / 2;\n const denY = ctx.y + denDims.baseline + padding + lineThickness / 2;\n renderNodes(denominator, {\n ...ctx,\n x: denX,\n y: denY,\n fontSize: scaledFontSize,\n });\n\n return {\n width: maxWidth,\n height: totalHeight,\n baseline: totalHeight / 2,\n };\n}\n\n/**\n * Render square root\n */\nfunction renderSqrt(nodes: LaTeXNode[], ctx: LaTeXRenderContext): LaTeXDimensions {\n const contentDims = renderNodes(nodes, {\n ...ctx,\n x: ctx.x + ctx.fontSize * 0.4,\n });\n\n const totalWidth = contentDims.width + ctx.fontSize * 0.5;\n const totalHeight = contentDims.height * 1.1;\n\n // Draw radical symbol\n ctx.ctx.save();\n ctx.ctx.strokeStyle = ctx.color;\n ctx.ctx.lineWidth = Math.max(1, ctx.fontSize * 0.05);\n ctx.ctx.lineCap = 'round';\n ctx.ctx.lineJoin = 'miter';\n\n ctx.ctx.beginPath();\n // Left tick\n ctx.ctx.moveTo(ctx.x, ctx.y - totalHeight * 0.3);\n ctx.ctx.lineTo(ctx.x + ctx.fontSize * 0.15, ctx.y);\n // Down stroke\n ctx.ctx.lineTo(ctx.x + ctx.fontSize * 0.3, ctx.y - totalHeight * 0.9);\n // Top bar\n ctx.ctx.lineTo(ctx.x + totalWidth, ctx.y - totalHeight * 0.9);\n ctx.ctx.stroke();\n\n ctx.ctx.restore();\n\n return {\n width: totalWidth,\n height: totalHeight,\n baseline: contentDims.baseline,\n };\n}\n\n/**\n * Measure nodes without rendering\n */\nfunction measureNodes(\n nodes: LaTeXNode[],\n ctx: LaTeXRenderContext\n): LaTeXDimensions {\n // Create an offscreen canvas for measurement\n const canvas = document.createElement('canvas');\n const measureCtx = canvas.getContext('2d');\n if (!measureCtx) {\n return { width: 0, height: 0, baseline: 0 };\n }\n\n return renderNodes(nodes, { ...ctx, ctx: measureCtx, x: 0, y: 0 });\n}\n","/**\n * @fileoverview LaTeX rendering plugin for Velo Plot\n * @module plugins/latex\n *\n * This plugin provides native LaTeX rendering without external dependencies.\n * It supports common mathematical notation including:\n * - Greek letters (\\alpha, \\beta, \\gamma, etc.)\n * - Superscripts and subscripts (x^2, H_2O)\n * - Fractions (\\frac{a}{b})\n * - Square roots (\\sqrt{x})\n * - Mathematical operators (\\sum, \\int, \\partial, etc.)\n *\n * @example\n * ```typescript\n * import { PluginLaTeX } from 'velo-plot/plugins';\n *\n * const latex = PluginLaTeX({\n * fontSize: 16,\n * fontFamily: 'serif',\n * color: '#000000'\n * });\n *\n * await chart.use(latex);\n *\n * // Use with axis labels\n * chart.xAxis.label = '\\\\Delta E = mc^2';\n * chart.yAxis.label = '\\\\frac{\\\\partial^2 y}{\\\\partial x^2}';\n *\n * // Use with annotations\n * chart.addAnnotation({\n * type: 'text',\n * text: '\\\\sum_{i=1}^{n} x_i',\n * latex: true\n * });\n * ```\n */\n\nimport type { ChartPlugin, PluginContext } from '../types';\nimport type {\n PluginLaTeXConfig,\n LaTeXPluginAPI,\n LaTeXDimensions,\n} from './types';\nimport { parseLaTeX } from './parser';\nimport { renderNodes } from './renderer';\n\n/**\n * LaTeX rendering plugin\n */\nexport function PluginLaTeX(config: PluginLaTeXConfig = {}): ChartPlugin<PluginLaTeXConfig> {\n const defaultConfig: Required<PluginLaTeXConfig> = {\n fontSize: 14,\n fontFamily: 'serif',\n color: '#000000',\n enableCache: true,\n customSymbols: {},\n };\n\n const finalConfig = { ...defaultConfig, ...config };\n\n // Bounded caches prevent unbounded memory growth when many distinct\n // expressions are rendered over the lifetime of a chart (task 3.11).\n const MAX_CACHE_ENTRIES = 1000;\n\n /** Evict the oldest entry once the cache exceeds its cap (FIFO). */\n function capCache<K, V>(cache: Map<K, V>): void {\n if (cache.size > MAX_CACHE_ENTRIES) {\n const oldest = cache.keys().next().value;\n if (oldest !== undefined) cache.delete(oldest);\n }\n }\n\n // Cache for parsed LaTeX\n const parseCache = new Map<string, ReturnType<typeof parseLaTeX>>();\n // Cache for measured dimensions\n const measureCache = new Map<string, LaTeXDimensions>();\n\n /**\n * Clear all caches\n */\n function clearCache(): void {\n parseCache.clear();\n measureCache.clear();\n }\n\n /**\n * Get parsed AST for LaTeX string (with caching)\n */\n function getParsed(latex: string): ReturnType<typeof parseLaTeX> {\n if (!finalConfig.enableCache) {\n return parseLaTeX(latex);\n }\n\n let parsed = parseCache.get(latex);\n if (!parsed) {\n parsed = parseLaTeX(latex);\n parseCache.set(latex, parsed);\n capCache(parseCache);\n }\n return parsed;\n }\n\n /**\n * Render LaTeX to canvas\n */\n function render(\n latex: string,\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n options: Partial<PluginLaTeXConfig> = {}\n ): LaTeXDimensions {\n const renderConfig = { ...finalConfig, ...options };\n const nodes = getParsed(latex);\n\n const dims = renderNodes(nodes, {\n ctx,\n x,\n y,\n fontSize: renderConfig.fontSize,\n fontFamily: renderConfig.fontFamily,\n color: renderConfig.color,\n scale: 1,\n });\n\n return dims;\n }\n\n /**\n * Measure LaTeX dimensions without rendering\n */\n function measure(\n latex: string,\n options: Partial<PluginLaTeXConfig> = {}\n ): LaTeXDimensions {\n const cacheKey = `${latex}:${options.fontSize || finalConfig.fontSize}`;\n\n if (finalConfig.enableCache && measureCache.has(cacheKey)) {\n return measureCache.get(cacheKey)!;\n }\n\n const renderConfig = { ...finalConfig, ...options };\n const nodes = getParsed(latex);\n\n // Create offscreen canvas for measurement\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return { width: 0, height: 0, baseline: 0 };\n }\n\n const dims = renderNodes(nodes, {\n ctx,\n x: 0,\n y: 0,\n fontSize: renderConfig.fontSize,\n fontFamily: renderConfig.fontFamily,\n color: renderConfig.color,\n scale: 1,\n });\n\n if (finalConfig.enableCache) {\n measureCache.set(cacheKey, dims);\n capCache(measureCache);\n }\n\n return dims;\n }\n\n /** Expose cache sizes for leak verification / diagnostics. */\n function getCacheStats(): { parseCache: number; measureCache: number; maxEntries: number } {\n return {\n parseCache: parseCache.size,\n measureCache: measureCache.size,\n maxEntries: MAX_CACHE_ENTRIES,\n };\n }\n\n // API exposed to chart\n const api: LaTeXPluginAPI = {\n render,\n measure,\n clearCache,\n getCacheStats,\n };\n\n return {\n manifest: {\n name: 'velo-plot-latex',\n version: '1.0.0',\n description: 'Native LaTeX rendering for mathematical expressions',\n provides: ['latex'],\n tags: ['latex', 'math', 'typography'],\n },\n\n onInit(ctx: PluginContext) {\n // API is accessed via plugin bridge, no need to set property on chart which has only a getter\n ctx.log.info('LaTeX plugin initialized');\n },\n\n onDestroy(ctx: PluginContext) {\n clearCache();\n ctx.log.info('LaTeX plugin destroyed');\n },\n\n api,\n };\n}\n\n// Type exports\nexport type { PluginLaTeXConfig, LaTeXPluginAPI, LaTeXDimensions };\n\n"],"names":["GREEK_LOWERCASE","GREEK_UPPERCASE","MATH_OPERATORS","GREEK_VARIANTS","ARROWS","RELATIONS","BINARY_OPERATORS","BIG_OPERATORS","MISC_SYMBOLS","DOTS","DELIMITERS","FUNCTIONS","ALL_SYMBOLS","BLACKBOARD","CALLIGRAPHIC","FRAKTUR","getSymbol","command","isSymbol","MATRIX_DELIMITERS","ALPHABET_MAPS","parseLaTeX","latex","tokens","tokenize","parseTokens","extractTextContent","nodes","result","node","i","char","token","content","parseGroup","numerator","denominator","textContent","map","raw","mapped","ch","parseMatrix","startIndex","envName","inner","depth","t","matrixRows","rowCells","cellTokens","flushCell","flushRow","delimiters","groupTokens","braceDepth","renderNodes","ctx","currentX","maxAscent","maxDescent","isSub","isSuper","nextNode","isNextSub","isNextSuper","dims1","renderNode","dims2","width","dims","renderText","renderSymbol","renderSuperscript","renderSubscript","renderFraction","renderSqrt","renderMatrix","rows","nRows","nCols","m","r","cellPadX","cellPadY","delimW","cellDims","cell","measureNodes","colW","rowAsc","rowDesc","c","d","rowH","a","totalH","s","h","totalW","w","top","drawDelimiter","cellTop","cellX","x","baselineY","height","side","bottom","tipInset","drawParen","open","drawBracket","drawBar","offset","drawBrace","midY","bx","tx","text","metrics","baseline","symbol","scaledFontSize","yOffset","subAscent","subDescent","lineThickness","padding","numDims","denDims","maxWidth","totalHeight","numX","numY","denX","denY","contentDims","totalWidth","measureCtx","PluginLaTeX","config","finalConfig","MAX_CACHE_ENTRIES","capCache","cache","oldest","parseCache","measureCache","clearCache","getParsed","parsed","render","y","options","renderConfig","measure","cacheKey","getCacheStats"],"mappings":"AAQO,MAAMA,IAA0C;AAAA,EACrD,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,SAAS;AAAA,EACT,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO;AACT,GAKaC,IAA0C;AAAA,EACrD,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,SAAS;AAAA,EACT,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO;AACT,GAKaC,IAAyC;AAAA,EACpD,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP,GAKaC,IAAyC;AAAA,EACpD,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AACV,GAKaC,IAAiC;AAAA,EAC5C,SAAS;AAAA,EACT,WAAW;AAAA,EACX,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,EACX,aAAa;AAAA,EACb,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,KAAK;AAAA,EACL,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,mBAAmB;AACrB,GAKaC,IAAoC;AAAA,EAC/C,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,KAAK;AAAA,EACL,UAAU;AAAA,EACV,WAAW;AAAA,EACX,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,eAAe;AAAA,EACf,cAAc;AAChB,GAKaC,IAA2C;AAAA,EACtD,UAAU;AAAA,EACV,eAAe;AAAA,EACf,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,cAAc;AAAA,EACd,eAAe;AAAA,EACf,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AACb,GAKaC,IAAwC;AAAA,EACnD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AACV,GAKaC,IAAuC;AAAA,EAClD,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,SAAS;AAAA,EACT,cAAc;AAAA,EACd,SAAS;AAAA,EACT,WAAW;AAAA,EACX,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,UAAU;AAAA,EACV,aAAa;AAAA,EACb,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,GAAG;AAAA,EACH,GAAG;AAAA,EACH,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,KAAK;AAAA,EACL,aAAa;AAAA,EACb,QAAQ;AACV,GAKaC,IAA+B;AAAA,EAC1C,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AACT,GAKaC,IAAqC;AAAA,EAChD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AACb,GAKaC,IAAoC;AAAA,EAC/C,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,MAAM;AACR,GAKaC,IAAsC;AAAA,EACjD,GAAGZ;AAAA,EACH,GAAGC;AAAA,EACH,GAAGE;AAAA,EACH,GAAGD;AAAA,EACH,GAAGE;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AAAA,EACH,GAAGC;AACL,GAKaE,IAAqC;AAAA,EAChD,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAK,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EACjE,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAK,GAAG;AAAA,EAAM,GAAG;AAAA,EACjE,GAAG;AAAA,EAAK,GAAG;AAAA,EAAK,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAChE,GAAG;AAAA,EAAM,GAAG;AACd,GAKaC,IAAuC;AAAA,EAClD,GAAG;AAAA,EAAM,GAAG;AAAA,EAAK,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAK,GAAG;AAAA,EAAK,GAAG;AAAA,EAAM,GAAG;AAAA,EAC/D,GAAG;AAAA,EAAK,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAK,GAAG;AAAA,EAAK,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAC/D,GAAG;AAAA,EAAM,GAAG;AAAA,EAAK,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EACjE,GAAG;AAAA,EAAM,GAAG;AACd,GAKaC,IAAkC;AAAA,EAC7C,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAK,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EACjE,GAAG;AAAA,EAAK,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EACjE,GAAG;AAAA,EAAM,GAAG;AAAA,EAAK,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EAAM,GAAG;AAAA,EACjE,GAAG;AAAA,EAAM,GAAG;AACd;AAG4B,OAAO,KAAKH,CAAW,EAAE;AAK9C,SAASI,EAAUC,GAAqC;AAC7D,SAAOL,EAAYK,CAAO;AAC5B;AAKO,SAASC,EAASD,GAA0B;AACjD,SAAOA,KAAWL;AACpB;ACjkBA,MAAMO,IAAsD;AAAA,EAC1D,QAAQ,CAAC,IAAI,EAAE;AAAA,EACf,SAAS,CAAC,KAAK,GAAG;AAAA,EAClB,SAAS,CAAC,KAAK,GAAG;AAAA,EAClB,SAAS,CAAC,KAAK,GAAG;AAAA,EAClB,SAAS,CAAC,KAAK,GAAG;AAAA,EAClB,SAAS,CAAC,KAAK,GAAG;AACpB,GAGMC,IAAwD;AAAA,EAC5D,QAAQP;AAAA,EACR,SAASC;AAAA,EACT,UAAUC;AACZ;AAKO,SAASM,EAAWC,GAA4B;AACrD,QAAMC,IAASC,GAASF,CAAK;AAC7B,SAAOG,EAAYF,CAAM;AAC3B;AAKA,SAASG,EAAmBC,GAA4B;AACtD,MAAIC,IAAS;AACb,aAAWC,KAAQF;AACjB,IAAIE,EAAK,SAAS,UAAUA,EAAK,SAAS,eAE/BA,EAAK,SAAS,WADvBD,KAAUC,EAAK,WAAW,KAGjBA,EAAK,aACdD,KAAUF,EAAmBG,EAAK,QAAQ;AAG9C,SAAOD;AACT;AAKA,SAASJ,GAASF,GAAyB;AACzC,QAAMC,IAAmB,CAAA;AACzB,MAAIO,IAAI;AAER,SAAOA,IAAIR,EAAM,UAAQ;AACvB,UAAMS,IAAOT,EAAMQ,CAAC;AAGpB,QAAIC,MAAS,MAAM;AACjB,UAAId,IAAU;AAGd,WAFAa,KAEOA,IAAIR,EAAM,UAAU,WAAW,KAAKA,EAAMQ,CAAC,CAAC;AACjD,QAAAb,KAAWK,EAAMQ,CAAC,GAClBA;AAEF,MAAIb,IACFM,EAAO,KAAK,OAAON,CAAO,IAGtBa,IAAIR,EAAM,WACZC,EAAO,KAAK,OAAOD,EAAMQ,CAAC,CAAC,GAC3BA;AAAA,IAGN,WAESC,MAAS,OAAOA,MAAS,OAAOA,MAAS,OAAOA,MAAS;AAChE,MAAAR,EAAO,KAAKQ,CAAI,GAChBD;AAAA,aAGO,KAAK,KAAKC,CAAI;AAIrB,WAHAR,EAAO,KAAK,GAAG,GACfO,KAEOA,IAAIR,EAAM,UAAU,KAAK,KAAKA,EAAMQ,CAAC,CAAC;AAC3C,QAAAA;AAAA;AAOF,MAAAP,EAAO,KAAKQ,CAAI,GAChBD;AAAA,EAEJ;AAEA,SAAOP;AACT;AAKA,SAASE,EAAYF,GAA+B;AAClD,QAAMI,IAAqB,CAAA;AAC3B,MAAIG,IAAI;AAER,SAAOA,IAAIP,EAAO,UAAQ;AACxB,UAAMS,IAAQT,EAAOO,CAAC;AAGtB,QAAIE,MAAU,KAAK;AACjB,MAAAF;AACA,YAAMG,IAAUC,EAAWX,GAAQO,CAAC;AACpC,MAAAH,EAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,UAAUM,EAAQ;AAAA,MAAA,CACnB,GACDH,IAAIG,EAAQ;AAAA,IACd,WAESD,MAAU,KAAK;AACtB,MAAAF;AACA,YAAMG,IAAUC,EAAWX,GAAQO,CAAC;AACpC,MAAAH,EAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,UAAUM,EAAQ;AAAA,MAAA,CACnB,GACDH,IAAIG,EAAQ;AAAA,IACd,WAESD,EAAM,WAAW,IAAI,GAAG;AAC/B,YAAMf,IAAUe,EAAM,UAAU,CAAC;AAGjC,UAAIf,MAAY,QAAQ;AACtB,QAAAa;AACA,cAAMK,IAAYD,EAAWX,GAAQO,CAAC;AACtC,QAAAA,IAAIK,EAAU;AACd,cAAMC,IAAcF,EAAWX,GAAQO,CAAC;AACxC,QAAAA,IAAIM,EAAY,WAChBT,EAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,WAAWQ,EAAU;AAAA,UACrB,aAAaC,EAAY;AAAA,QAAA,CAC1B;AAAA,MACH,WAESnB,MAAY,QAAQ;AAC3B,QAAAa;AACA,cAAMG,IAAUC,EAAWX,GAAQO,CAAC;AACpC,QAAAH,EAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,UAAUM,EAAQ;AAAA,QAAA,CACnB,GACDH,IAAIG,EAAQ;AAAA,MACd,WAEShB,MAAY,UAAUA,MAAY,YAAYA,MAAY,YAAYA,MAAY,YAAYA,MAAY,gBAAgB;AACjI,QAAAa;AACA,cAAMG,IAAUC,EAAWX,GAAQO,CAAC,GAE9BO,IAAcX,EAAmBO,EAAQ,KAAK;AACpD,QAAAN,EAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,SAASU;AAAA,QAAA,CACV,GACDP,IAAIG,EAAQ;AAAA,MACd,WAEShB,KAAWG,GAAe;AACjC,QAAAU;AACA,cAAMG,IAAUC,EAAWX,GAAQO,CAAC;AACpC,QAAAA,IAAIG,EAAQ;AACZ,cAAMK,IAAMlB,EAAcH,CAAO,GAC3BsB,IAAMb,EAAmBO,EAAQ,KAAK;AAC5C,YAAIO,IAAS;AACb,mBAAWC,KAAMF,EAAK,CAAAC,KAAUF,EAAIG,CAAE,KAAKA;AAC3C,QAAAd,EAAM,KAAK,EAAE,MAAM,QAAQ,SAASa,GAAQ;AAAA,MAC9C,MAAA,CAESvB,MAAY,UACnBa,IAAIY,GAAYnB,GAAQO,GAAGH,CAAK,IAGzBT,EAASD,CAAO,KACvBU,EAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,SAASX,EAAUC,CAAO;AAAA,MAAA,CAC3B,GACDa,OAGOb,MAAY,WAAWA,MAAY,UAAUA,MAAY,QAAQA,MAAY,QACpFU,EAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,SAASX,EAAUC,CAAO;AAAA,MAAA,CAC3B,GACDa,QAIAH,EAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,SAASK;AAAA,MAAA,CACV,GACDF;AAAA,IAEJ,WAESE,MAAU,KAAK;AACtB,YAAMC,IAAUC,EAAWX,GAAQO,CAAC;AACpC,MAAAH,EAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,UAAUM,EAAQ;AAAA,MAAA,CACnB,GACDH,IAAIG,EAAQ;AAAA,IACd;AAGE,MAAAN,EAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,SAASK;AAAA,MAAA,CACV,GACDF;AAAA,EAEJ;AAEA,SAAOH;AACT;AAMA,SAASe,GAAYnB,GAAkBoB,GAAoBhB,GAA4B;AACrF,MAAIG,IAAIa,IAAa,GAGjBC,IAAU;AACd,MAAIrB,EAAOO,CAAC,MAAM,KAAK;AAErB,SADAA,KACOA,IAAIP,EAAO,UAAUA,EAAOO,CAAC,MAAM;AACxC,MAAAc,KAAWrB,EAAOO,CAAC,GACnBA;AAEF,IAAIP,EAAOO,CAAC,MAAM,OAAKA;AAAA,EACzB;AAGA,QAAMe,IAAkB,CAAA;AACxB,MAAIC,IAAQ;AACZ,SAAOhB,IAAIP,EAAO,UAAUuB,IAAQ,KAAG;AACrC,UAAMC,IAAIxB,EAAOO,CAAC;AAClB,QAAIiB,MAAM;AACR,MAAAD,KACAD,EAAM,KAAKE,CAAC,GACZjB;AAAA,aACSiB,MAAM;AAEf,UADAD,KACIA,MAAU;AAEZ,YADAhB,KACIP,EAAOO,CAAC,MAAM,KAAK;AAErB,eADAA,KACOA,IAAIP,EAAO,UAAUA,EAAOO,CAAC,MAAM,MAAK,CAAAA;AAC/C,UAAIP,EAAOO,CAAC,MAAM,OAAKA;AAAA,QACzB;AAAA;AAEA,QAAAe,EAAM,KAAKE,CAAC,GACZjB;AAAA;AAGF,MAAAe,EAAM,KAAKE,CAAC,GACZjB;AAAA,EAEJ;AAGA,QAAMkB,IAA8B,CAAA;AACpC,MAAIC,IAA0B,CAAA,GAC1BC,IAAuB,CAAA;AAC3B,QAAMC,IAAY,MAAM;AACtB,IAAAF,EAAS,KAAKxB,EAAYyB,CAAU,CAAC,GACrCA,IAAa,CAAA;AAAA,EACf,GACME,IAAW,MAAM;AACrB,IAAAD,EAAA,GACAH,EAAW,KAAKC,CAAQ,GACxBA,IAAW,CAAA;AAAA,EACb;AAEA,aAAWF,KAAKF;AACd,IAAIE,MAAM,MACRI,EAAA,IACSJ,MAAM,SACfK,EAAA,IAEAF,EAAW,KAAKH,CAAC;AAGrB,GAAIG,EAAW,SAAS,KAAKD,EAAS,SAAS,MAC7CG,EAAA;AAGF,QAAMC,IAAalC,EAAkByB,CAAO,KAAK,CAAC,IAAI,EAAE;AACxD,SAAAjB,EAAM,KAAK,EAAE,MAAM,UAAU,MAAMqB,GAAY,YAAAK,GAAY,GAEpDvB;AACT;AAKA,SAASI,EACPX,GACAoB,GAC2C;AAE3C,MAAIpB,EAAOoB,CAAU,MAAM;AACzB,WAAO;AAAA,MACL,OAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,SAASpB,EAAOoB,CAAU,KAAK;AAAA,QAAA;AAAA,MACjC;AAAA,MAEF,WAAWA,IAAa;AAAA,IAAA;AAK5B,MAAIb,IAAIa,IAAa;AACrB,QAAMW,IAAwB,CAAA;AAC9B,MAAIC,IAAa;AAGjB,SAAOzB,IAAIP,EAAO,UAAUgC,IAAa,KAAG;AAC1C,UAAMvB,IAAQT,EAAOO,CAAC;AACtB,IAAIE,MAAU,OACZuB,KACAD,EAAY,KAAKtB,CAAK,KACbA,MAAU,OACnBuB,KACIA,IAAa,KACfD,EAAY,KAAKtB,CAAK,KAGxBsB,EAAY,KAAKtB,CAAK,GAExBF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAOL,EAAY6B,CAAW;AAAA,IAC9B,WAAWxB;AAAA,EAAA;AAEf;AC/VO,SAAS0B,EACd7B,GACA8B,GACiB;AACjB,MAAIC,IAAWD,EAAI,GACfE,IAAY,GACZC,IAAa;AAEjB,WAAS9B,IAAI,GAAGA,IAAIH,EAAM,QAAQG,KAAK;AACrC,UAAMD,IAAOF,EAAMG,CAAC,GAGd+B,IAAQhC,EAAK,SAAS,aACtBiC,IAAUjC,EAAK,SAAS,eACxBkC,IAAWpC,EAAMG,IAAI,CAAC,GACtBkC,KAAYD,KAAA,gBAAAA,EAAU,UAAS,aAC/BE,KAAcF,KAAA,gBAAAA,EAAU,UAAS;AAEvC,QAAKF,KAASI,KAAiBH,KAAWE,GAAY;AAEpD,YAAME,IAAQC,EAAWtC,GAAM,EAAE,GAAG4B,GAAK,GAAGC,GAAU,GAChDU,IAAQD,EAAWJ,GAAU,EAAE,GAAGN,GAAK,GAAGC,GAAU,GAEpDW,IAAQ,KAAK,IAAIH,EAAM,OAAOE,EAAM,KAAK;AAC/C,MAAAV,KAAYW,IAASZ,EAAI,WAAW,MAEpCE,IAAY,KAAK,IAAIA,GAAWO,EAAM,UAAUE,EAAM,QAAQ,GAC9DR,IAAa,KAAK,IAAIA,GAAYM,EAAM,SAASA,EAAM,UAAUE,EAAM,SAASA,EAAM,QAAQ,GAC9FtC;AAAA,IACF,OAAO;AACL,YAAMwC,IAAOH,EAAWtC,GAAM,EAAE,GAAG4B,GAAK,GAAGC,GAAU;AACrD,MAAAA,KAAYY,EAAK,QAGbT,KAASC,OACXJ,KAAYD,EAAI,WAAW,OAG7BE,IAAY,KAAK,IAAIA,GAAWW,EAAK,QAAQ,GAC7CV,IAAa,KAAK,IAAIA,GAAYU,EAAK,SAASA,EAAK,QAAQ;AAAA,IAC/D;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAOZ,IAAWD,EAAI;AAAA,IACtB,QAAQE,IAAYC;AAAA,IACpB,UAAUD;AAAA,EAAA;AAEd;AAKA,SAASQ,EAAWtC,GAAiB4B,GAA0C;AAC7E,UAAQ5B,EAAK,MAAA;AAAA,IACX,KAAK;AACH,aAAO0C,EAAW1C,EAAK,WAAW,IAAI4B,CAAG;AAAA,IAE3C,KAAK;AACH,aAAOc,EAAW1C,EAAK,WAAW,IAAI4B,CAAG;AAAA,IAE3C,KAAK;AACH,aAAOe,GAAa3C,EAAK,WAAW,IAAI4B,CAAG;AAAA,IAE7C,KAAK;AACH,aAAOgB,GAAkB5C,EAAK,YAAY,CAAA,GAAI4B,CAAG;AAAA,IAEnD,KAAK;AACH,aAAOiB,GAAgB7C,EAAK,YAAY,CAAA,GAAI4B,CAAG;AAAA,IAEjD,KAAK;AACH,aAAOkB;AAAA,QACL9C,EAAK,aAAa,CAAA;AAAA,QAClBA,EAAK,eAAe,CAAA;AAAA,QACpB4B;AAAA,MAAA;AAAA,IAGJ,KAAK;AACH,aAAOmB,GAAW/C,EAAK,YAAY,CAAA,GAAI4B,CAAG;AAAA,IAE5C,KAAK;AACH,aAAOD,EAAY3B,EAAK,YAAY,CAAA,GAAI4B,CAAG;AAAA,IAE7C,KAAK;AACH,aAAOoB,GAAahD,EAAK,QAAQ,IAAIA,EAAK,cAAc,CAAC,IAAI,EAAE,GAAG4B,CAAG;AAAA,IAEvE;AACE,aAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,EAAA;AAAA,EAAE;AAEhD;AAMA,SAASoB,GACPC,GACAzB,GACAI,GACiB;AACjB,QAAMsB,IAAQD,EAAK,QACbE,IAAQF,EAAK,OAAO,CAACG,GAAGC,MAAM,KAAK,IAAID,GAAGC,EAAE,MAAM,GAAG,CAAC;AAC5D,MAAIH,MAAU,KAAKC,MAAU;AAC3B,WAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,EAAA;AAG1C,QAAMG,IAAW1B,EAAI,WAAW,MAC1B2B,IAAW3B,EAAI,WAAW,MAC1B4B,IAAS5B,EAAI,WAAW,MAGxB6B,IAAgCR,EAAK,IAAI,CAACI,MAAMA,EAAE,IAAI,CAACK,MAASC,EAAaD,GAAM9B,CAAG,CAAC,CAAC,GAExFgC,IAAO,IAAI,MAAMT,CAAK,EAAE,KAAK,CAAC,GAC9BU,IAAS,IAAI,MAAMX,CAAK,EAAE,KAAK,CAAC,GAChCY,IAAU,IAAI,MAAMZ,CAAK,EAAE,KAAK,CAAC;AAEvC,WAASG,IAAI,GAAGA,IAAIH,GAAOG;AACzB,aAASU,IAAI,GAAGA,IAAId,EAAKI,CAAC,EAAE,QAAQU,KAAK;AACvC,YAAMC,IAAIP,EAASJ,CAAC,EAAEU,CAAC;AACvB,MAAAH,EAAKG,CAAC,IAAI,KAAK,IAAIH,EAAKG,CAAC,GAAGC,EAAE,KAAK,GACnCH,EAAOR,CAAC,IAAI,KAAK,IAAIQ,EAAOR,CAAC,GAAGW,EAAE,QAAQ,GAC1CF,EAAQT,CAAC,IAAI,KAAK,IAAIS,EAAQT,CAAC,GAAGW,EAAE,SAASA,EAAE,QAAQ;AAAA,IACzD;AAEF,QAAMC,IAAOJ,EAAO,IAAI,CAACK,GAAGjE,MAAMiE,IAAIJ,EAAQ7D,CAAC,CAAC,GAE1CkE,IAASF,EAAK,OAAO,CAACG,GAAGC,MAAMD,IAAIC,GAAG,CAAC,IAAId,IAAW,IAAIL,GAE1DoB,IADWV,EAAK,OAAO,CAACQ,GAAGG,MAAMH,IAAIG,GAAG,CAAC,IAAIjB,IAAW,IAAIH,IACxCK,IAAS,GAE7BgB,IAAM5C,EAAI,IAAIuC,IAAS;AAG7B,EAAAM,EAAc7C,GAAKJ,EAAW,CAAC,GAAGI,EAAI,GAAG4C,GAAKL,GAAQX,GAAQ,MAAM,GACpEiB,EAAc7C,GAAKJ,EAAW,CAAC,GAAGI,EAAI,IAAI0C,IAASd,GAAQgB,GAAKL,GAAQX,GAAQ,OAAO;AAGvF,MAAIkB,IAAUF,IAAMjB;AACpB,WAASF,IAAI,GAAGA,IAAIH,GAAOG,KAAK;AAC9B,QAAIsB,IAAQ/C,EAAI,IAAI4B,IAASF;AAC7B,aAASS,IAAI,GAAGA,IAAIZ,GAAOY,KAAK;AAC9B,YAAML,IAAOT,EAAKI,CAAC,EAAEU,CAAC;AACtB,UAAIL,GAAM;AACR,cAAMM,IAAIP,EAASJ,CAAC,EAAEU,CAAC,GACjBa,IAAID,KAASf,EAAKG,CAAC,IAAIC,EAAE,SAAS,GAClCa,IAAYH,IAAUb,EAAOR,CAAC;AACpC,QAAA1B,EAAY+B,GAAM,EAAE,GAAG9B,GAAK,GAAAgD,GAAG,GAAGC,GAAW;AAAA,MAC/C;AACA,MAAAF,KAASf,EAAKG,CAAC,IAAIT,IAAW;AAAA,IAChC;AACA,IAAAoB,KAAWT,EAAKZ,CAAC,IAAIE,IAAW;AAAA,EAClC;AAEA,SAAO,EAAE,OAAOe,GAAQ,QAAQH,GAAQ,UAAUA,IAAS,EAAA;AAC7D;AAKA,SAASM,EACP7C,GACAhB,GACAgE,GACAJ,GACAM,GACAtC,GACAuC,GACM;AACN,MAAI,CAACnE,EAAI;AACT,QAAMmD,IAAInC,EAAI;AACd,EAAAmC,EAAE,KAAA,GACFA,EAAE,cAAcnC,EAAI,OACpBmC,EAAE,YAAY,KAAK,IAAI,GAAGnC,EAAI,WAAW,IAAI,GAC7CmC,EAAE,UAAU,SACZA,EAAE,WAAW;AAEb,QAAMiB,IAASR,IAAMM,GACfG,IAAWzC,IAAQ,KAEnB0C,IAAY,CAACC,MAAkB;AACnC,IAAApB,EAAE,UAAA,GACEoB,KACFpB,EAAE,OAAOa,IAAIpC,GAAOgC,CAAG,GACvBT,EAAE,iBAAiBa,IAAIJ,IAAMQ,KAAU,GAAGJ,IAAIpC,GAAOwC,CAAM,MAE3DjB,EAAE,OAAOa,GAAGJ,CAAG,GACfT,EAAE,iBAAiBa,IAAIpC,IAAQgC,IAAMQ,KAAU,GAAGJ,GAAGI,CAAM,IAE7DjB,EAAE,OAAA;AAAA,EACJ,GAEMqB,IAAc,CAACD,MAAkB;AACrC,IAAApB,EAAE,UAAA,GACEoB,KACFpB,EAAE,OAAOa,IAAIK,GAAUT,CAAG,GAC1BT,EAAE,OAAOa,GAAGJ,CAAG,GACfT,EAAE,OAAOa,GAAGI,CAAM,GAClBjB,EAAE,OAAOa,IAAIK,GAAUD,CAAM,MAE7BjB,EAAE,OAAOa,IAAIpC,IAAQyC,GAAUT,CAAG,GAClCT,EAAE,OAAOa,IAAIpC,GAAOgC,CAAG,GACvBT,EAAE,OAAOa,IAAIpC,GAAOwC,CAAM,GAC1BjB,EAAE,OAAOa,IAAIpC,IAAQyC,GAAUD,CAAM,IAEvCjB,EAAE,OAAA;AAAA,EACJ,GAEMsB,IAAU,CAACC,MAAmB;AAClC,IAAAvB,EAAE,UAAA,GACFA,EAAE,OAAOa,IAAIU,GAAQd,CAAG,GACxBT,EAAE,OAAOa,IAAIU,GAAQN,CAAM,GAC3BjB,EAAE,OAAA;AAAA,EACJ,GAEMwB,IAAY,CAACJ,MAAkB;AACnC,UAAMK,KAAQhB,IAAMQ,KAAU,GACxBS,IAAKN,IAAOP,IAAIpC,IAAQoC,GACxBc,IAAKP,IAAOP,IAAIA,IAAIpC;AAC1B,IAAAuB,EAAE,UAAA,GACFA,EAAE,OAAO0B,GAAIjB,CAAG,GAChBT,EAAE,iBAAiB2B,GAAIlB,IAAMM,IAAS,OAAOW,IAAKC,KAAM,GAAGlB,IAAMM,IAAS,GAAG,GAC7Ef,EAAE,iBAAiB2B,GAAIF,IAAO,GAAGE,GAAIF,CAAI,GACzCzB,EAAE,iBAAiB2B,GAAIF,IAAO,IAAIC,IAAKC,KAAM,GAAGV,IAASF,IAAS,GAAG,GACrEf,EAAE,iBAAiB2B,GAAIV,IAASF,IAAS,MAAMW,GAAIT,CAAM,GACzDjB,EAAE,OAAA;AAAA,EACJ;AAEA,UAAQnD,GAAA;AAAA,IACN,KAAK;AACH,MAAAsE,EAAU,EAAI;AACd;AAAA,IACF,KAAK;AACH,MAAAA,EAAU,EAAK;AACf;AAAA,IACF,KAAK;AACH,MAAAE,EAAY,EAAI;AAChB;AAAA,IACF,KAAK;AACH,MAAAA,EAAY,EAAK;AACjB;AAAA,IACF,KAAK;AACH,MAAAG,EAAU,EAAI;AACd;AAAA,IACF,KAAK;AACH,MAAAA,EAAU,EAAK;AACf;AAAA,IACF,KAAK;AACH,MAAAF,EAA0B7C,IAAQ,GAAiB;AACnD;AAAA,IACF,KAAK;AACH,MAAA6C,EAAQ7C,IAAQ,GAAG,GACnB6C,EAAQ7C,IAAQ,GAAG;AACnB;AAAA,EAEA;AAGJ,EAAAuB,EAAE,QAAA;AACJ;AAKA,SAASrB,EAAWiD,GAAc/D,GAA0C;AAC1E,EAAAA,EAAI,IAAI,KAAA,GACRA,EAAI,IAAI,OAAO,GAAGA,EAAI,QAAQ,MAAMA,EAAI,UAAU,IAClDA,EAAI,IAAI,YAAYA,EAAI,OACxBA,EAAI,IAAI,YAAY,QACpBA,EAAI,IAAI,eAAe;AAEvB,QAAMgE,IAAUhE,EAAI,IAAI,YAAY+D,CAAI;AACxC,EAAA/D,EAAI,IAAI,SAAS+D,GAAM/D,EAAI,GAAGA,EAAI,CAAC,GAEnCA,EAAI,IAAI,QAAA;AAER,QAAMkD,IAASlD,EAAI,UACbiE,IAAWf,IAAS;AAE1B,SAAO;AAAA,IACL,OAAOc,EAAQ;AAAA,IACf,QAAAd;AAAA,IACA,UAAAe;AAAA,EAAA;AAEJ;AAKA,SAASlD,GAAamD,GAAgBlE,GAA0C;AAE9E,EAAAA,EAAI,IAAI,KAAA,GACRA,EAAI,IAAI,OAAO,GAAGA,EAAI,WAAW,GAAG,MAAMA,EAAI,UAAU,IACxDA,EAAI,IAAI,YAAYA,EAAI,OACxBA,EAAI,IAAI,YAAY,QACpBA,EAAI,IAAI,eAAe;AAEvB,QAAMgE,IAAUhE,EAAI,IAAI,YAAYkE,CAAM;AAC1C,EAAAlE,EAAI,IAAI,SAASkE,GAAQlE,EAAI,GAAGA,EAAI,CAAC,GAErCA,EAAI,IAAI,QAAA;AAER,QAAMkD,IAASlD,EAAI,WAAW,KACxBiE,IAAWf,IAAS;AAE1B,SAAO;AAAA,IACL,OAAOc,EAAQ;AAAA,IACf,QAAAd;AAAA,IACA,UAAAe;AAAA,EAAA;AAEJ;AAKA,SAASjD,GACP9C,GACA8B,GACiB;AACjB,QAAMmE,IAAiBnE,EAAI,WAAW,KAChCoE,IAAU,CAACpE,EAAI,WAAW,KAE1Ba,IAAOd,EAAY7B,GAAO;AAAA,IAC9B,GAAG8B;AAAA,IACH,UAAUmE;AAAA,IACV,GAAGnE,EAAI,IAAIoE;AAAA,EAAA,CACZ,GAEKC,IAAYxD,EAAK,UACjByD,IAAazD,EAAK,SAASA,EAAK;AAEtC,SAAO;AAAA,IACL,OAAOA,EAAK;AAAA,IACZ,QAASwD,IAAYD,KAAYE,IAAaF;AAAA,IAC9C,UAAUC,IAAYD;AAAA,EAAA;AAE1B;AAKA,SAASnD,GACP/C,GACA8B,GACiB;AACjB,QAAMmE,IAAiBnE,EAAI,WAAW,KAChCoE,IAAUpE,EAAI,WAAW,KAEzBa,IAAOd,EAAY7B,GAAO;AAAA,IAC9B,GAAG8B;AAAA,IACH,UAAUmE;AAAA,IACV,GAAGnE,EAAI,IAAIoE;AAAA,EAAA,CACZ,GAEKC,IAAYxD,EAAK,UACjByD,IAAazD,EAAK,SAASA,EAAK;AAEtC,SAAO;AAAA,IACL,OAAOA,EAAK;AAAA,IACZ,QAASwD,IAAYD,KAAYE,IAAaF;AAAA,IAC9C,UAAUC,IAAYD;AAAA,EAAA;AAE1B;AAKA,SAASlD,GACPxC,GACAC,GACAqB,GACiB;AACjB,QAAMmE,IAAiBnE,EAAI,WAAW,MAChCuE,IAAgB,KAAK,IAAI,GAAGvE,EAAI,WAAW,IAAI,GAC/CwE,IAAUxE,EAAI,WAAW,KAGzByE,IAAU1C,EAAarD,GAAW;AAAA,IACtC,GAAGsB;AAAA,IACH,UAAUmE;AAAA,EAAA,CACX,GACKO,IAAU3C,EAAapD,GAAa;AAAA,IACxC,GAAGqB;AAAA,IACH,UAAUmE;AAAA,EAAA,CACX,GAEKQ,IAAW,KAAK,IAAIF,EAAQ,OAAOC,EAAQ,KAAK,GAChDE,IAAcH,EAAQ,SAASC,EAAQ,SAASF,IAAU,IAAID,GAG9DM,IAAO7E,EAAI,KAAK2E,IAAWF,EAAQ,SAAS,GAC5CK,IAAO9E,EAAI,IAAIwE,IAAUD,IAAgB;AAC/C,EAAAxE,EAAYrB,GAAW;AAAA,IACrB,GAAGsB;AAAA,IACH,GAAG6E;AAAA,IACH,GAAGC;AAAA,IACH,UAAUX;AAAA,EAAA,CACX,GAGDnE,EAAI,IAAI,YAAYA,EAAI,OACxBA,EAAI,IAAI;AAAA,IACNA,EAAI;AAAA,IACJA,EAAI,IAAIuE,IAAgB;AAAA,IACxBI;AAAA,IACAJ;AAAA,EAAA;AAIF,QAAMQ,IAAO/E,EAAI,KAAK2E,IAAWD,EAAQ,SAAS,GAC5CM,IAAOhF,EAAI,IAAI0E,EAAQ,WAAWF,IAAUD,IAAgB;AAClE,SAAAxE,EAAYpB,GAAa;AAAA,IACvB,GAAGqB;AAAA,IACH,GAAG+E;AAAA,IACH,GAAGC;AAAA,IACH,UAAUb;AAAA,EAAA,CACX,GAEM;AAAA,IACL,OAAOQ;AAAA,IACP,QAAQC;AAAA,IACR,UAAUA,IAAc;AAAA,EAAA;AAE5B;AAKA,SAASzD,GAAWjD,GAAoB8B,GAA0C;AAChF,QAAMiF,IAAclF,EAAY7B,GAAO;AAAA,IACrC,GAAG8B;AAAA,IACH,GAAGA,EAAI,IAAIA,EAAI,WAAW;AAAA,EAAA,CAC3B,GAEKkF,IAAaD,EAAY,QAAQjF,EAAI,WAAW,KAChD4E,IAAcK,EAAY,SAAS;AAGzC,SAAAjF,EAAI,IAAI,KAAA,GACRA,EAAI,IAAI,cAAcA,EAAI,OAC1BA,EAAI,IAAI,YAAY,KAAK,IAAI,GAAGA,EAAI,WAAW,IAAI,GACnDA,EAAI,IAAI,UAAU,SAClBA,EAAI,IAAI,WAAW,SAEnBA,EAAI,IAAI,UAAA,GAERA,EAAI,IAAI,OAAOA,EAAI,GAAGA,EAAI,IAAI4E,IAAc,GAAG,GAC/C5E,EAAI,IAAI,OAAOA,EAAI,IAAIA,EAAI,WAAW,MAAMA,EAAI,CAAC,GAEjDA,EAAI,IAAI,OAAOA,EAAI,IAAIA,EAAI,WAAW,KAAKA,EAAI,IAAI4E,IAAc,GAAG,GAEpE5E,EAAI,IAAI,OAAOA,EAAI,IAAIkF,GAAYlF,EAAI,IAAI4E,IAAc,GAAG,GAC5D5E,EAAI,IAAI,OAAA,GAERA,EAAI,IAAI,QAAA,GAED;AAAA,IACL,OAAOkF;AAAA,IACP,QAAQN;AAAA,IACR,UAAUK,EAAY;AAAA,EAAA;AAE1B;AAKA,SAASlD,EACP7D,GACA8B,GACiB;AAGjB,QAAMmF,IADS,SAAS,cAAc,QAAQ,EACpB,WAAW,IAAI;AACzC,SAAKA,IAIEpF,EAAY7B,GAAO,EAAE,GAAG8B,GAAK,KAAKmF,GAAY,GAAG,GAAG,GAAG,EAAA,CAAG,IAHxD,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,EAAA;AAI5C;ACvbO,SAASC,GAAYC,IAA4B,IAAoC;AAS1F,QAAMC,IAAc,EAAE,GAR6B;AAAA,IACjD,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,eAAe,CAAA;AAAA,EAAC,GAGsB,GAAGD,EAAA,GAIrCE,IAAoB;AAG1B,WAASC,EAAeC,GAAwB;AAC9C,QAAIA,EAAM,OAAOF,GAAmB;AAClC,YAAMG,IAASD,EAAM,KAAA,EAAO,OAAO;AACnC,MAAIC,MAAW,UAAWD,EAAM,OAAOC,CAAM;AAAA,IAC/C;AAAA,EACF;AAGA,QAAMC,wBAAiB,IAAA,GAEjBC,wBAAmB,IAAA;AAKzB,WAASC,IAAmB;AAC1B,IAAAF,EAAW,MAAA,GACXC,EAAa,MAAA;AAAA,EACf;AAKA,WAASE,EAAUjI,GAA8C;AAC/D,QAAI,CAACyH,EAAY;AACf,aAAO1H,EAAWC,CAAK;AAGzB,QAAIkI,IAASJ,EAAW,IAAI9H,CAAK;AACjC,WAAKkI,MACHA,IAASnI,EAAWC,CAAK,GACzB8H,EAAW,IAAI9H,GAAOkI,CAAM,GAC5BP,EAASG,CAAU,IAEdI;AAAA,EACT;AAKA,WAASC,EACPnI,GACAmC,GACAgD,GACAiD,GACAC,IAAsC,IACrB;AACjB,UAAMC,IAAe,EAAE,GAAGb,GAAa,GAAGY,EAAA,GACpChI,IAAQ4H,EAAUjI,CAAK;AAY7B,WAVakC,EAAY7B,GAAO;AAAA,MAC9B,KAAA8B;AAAA,MACA,GAAAgD;AAAA,MACA,GAAAiD;AAAA,MACA,UAAUE,EAAa;AAAA,MACvB,YAAYA,EAAa;AAAA,MACzB,OAAOA,EAAa;AAAA,MACpB,OAAO;AAAA,IAAA,CACR;AAAA,EAGH;AAKA,WAASC,EACPvI,GACAqI,IAAsC,IACrB;AACjB,UAAMG,IAAW,GAAGxI,CAAK,IAAIqI,EAAQ,YAAYZ,EAAY,QAAQ;AAErE,QAAIA,EAAY,eAAeM,EAAa,IAAIS,CAAQ;AACtD,aAAOT,EAAa,IAAIS,CAAQ;AAGlC,UAAMF,IAAe,EAAE,GAAGb,GAAa,GAAGY,EAAA,GACpChI,IAAQ4H,EAAUjI,CAAK,GAIvBmC,IADS,SAAS,cAAc,QAAQ,EAC3B,WAAW,IAAI;AAClC,QAAI,CAACA;AACH,aAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,EAAA;AAG1C,UAAMa,IAAOd,EAAY7B,GAAO;AAAA,MAC9B,KAAA8B;AAAA,MACA,GAAG;AAAA,MACH,GAAG;AAAA,MACH,UAAUmG,EAAa;AAAA,MACvB,YAAYA,EAAa;AAAA,MACzB,OAAOA,EAAa;AAAA,MACpB,OAAO;AAAA,IAAA,CACR;AAED,WAAIb,EAAY,gBACdM,EAAa,IAAIS,GAAUxF,CAAI,GAC/B2E,EAASI,CAAY,IAGhB/E;AAAA,EACT;AAGA,WAASyF,IAAkF;AACzF,WAAO;AAAA,MACL,YAAYX,EAAW;AAAA,MACvB,cAAcC,EAAa;AAAA,MAC3B,YAAYL;AAAA,IAAA;AAAA,EAEhB;AAUA,SAAO;AAAA,IACL,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU,CAAC,OAAO;AAAA,MAClB,MAAM,CAAC,SAAS,QAAQ,YAAY;AAAA,IAAA;AAAA,IAGtC,OAAOvF,GAAoB;AAEzB,MAAAA,EAAI,IAAI,KAAK,0BAA0B;AAAA,IACzC;AAAA,IAEA,UAAUA,GAAoB;AAC5B,MAAA6F,EAAA,GACA7F,EAAI,IAAI,KAAK,wBAAwB;AAAA,IACvC;AAAA,IAEA,KA1B0B;AAAA,MAC1B,QAAAgG;AAAA,MACA,SAAAI;AAAA,MACA,YAAAP;AAAA,MACA,eAAAS;AAAA,IAAA;AAAA,EAsBA;AAEJ;"}
@@ -1,4 +1,4 @@
1
- import { LoadingIndicator, LoadingIndicatorOptions } from '../../core/loading';
1
+ import { LoadingIndicatorOptions } from '../../core/loading';
2
2
  import { ChartPlugin } from '../types';
3
3
 
4
4
  export interface PluginLoadingConfig extends Partial<LoadingIndicatorOptions> {
@@ -11,5 +11,4 @@ export interface PluginLoadingConfig extends Partial<LoadingIndicatorOptions> {
11
11
  * Adds sleek loading indicators and progress trackers to the chart.
12
12
  */
13
13
  export declare function PluginLoading(_config?: PluginLoadingConfig): ChartPlugin<PluginLoadingConfig>;
14
- export { LoadingIndicator };
15
14
  export default PluginLoading;
@@ -1,7 +1,6 @@
1
- import { L as d, P as i, P as n } from "../index-qhscKTDy.js";
1
+ import { P, P as d } from "../index-qhscKTDy.js";
2
2
  export {
3
- d as LoadingIndicator,
4
- i as PluginLoading,
5
- n as default
3
+ P as PluginLoading,
4
+ d as default
6
5
  };
7
6
  //# sourceMappingURL=loading.js.map
@@ -1,13 +1,13 @@
1
1
  var p = Object.defineProperty;
2
2
  var m = (o, e, r) => e in o ? p(o, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : o[e] = r;
3
- var f = (o, e, r) => m(o, typeof e != "symbol" ? e + "" : e, r);
3
+ var c = (o, e, r) => m(o, typeof e != "symbol" ? e + "" : e, r);
4
4
  class g {
5
5
  // taskId => workerIndex
6
6
  constructor(e) {
7
- f(this, "workers", []);
8
- f(this, "availableWorkers", /* @__PURE__ */ new Set());
9
- f(this, "taskQueue", []);
10
- f(this, "activeJobs", /* @__PURE__ */ new Map());
7
+ c(this, "workers", []);
8
+ c(this, "availableWorkers", /* @__PURE__ */ new Set());
9
+ c(this, "taskQueue", []);
10
+ c(this, "activeJobs", /* @__PURE__ */ new Map());
11
11
  this.size = e, this.initialize();
12
12
  }
13
13
  initialize() {
@@ -104,14 +104,15 @@ const w = {
104
104
  };
105
105
  function y(o = {}) {
106
106
  const e = { ...v, ...o };
107
- let r = null, t = null, s = {
107
+ let r = null, t = null;
108
+ const s = {
108
109
  enabled: e.enabled,
109
110
  frames: 0,
110
111
  lastFrameTime: 0,
111
112
  lastFrameTimestamp: 0
112
113
  };
113
- function i(a, ...c) {
114
- e.debug && r && r.log.info(`[Offscreen] ${a}`, ...c);
114
+ function i(a, ...f) {
115
+ e.debug && r && r.log.info(`[Offscreen] ${a}`, ...f);
115
116
  }
116
117
  function n() {
117
118
  return typeof globalThis.OffscreenCanvas < "u";
@@ -156,8 +157,8 @@ function y(o = {}) {
156
157
  onDestroy(a) {
157
158
  d(), delete a.chart.offscreen, r = null;
158
159
  },
159
- onAfterRender(a, c) {
160
- s.frames += 1, s.lastFrameTime = c.renderTime, s.lastFrameTimestamp = c.timestamp, e.enabled;
160
+ onAfterRender(a, f) {
161
+ s.frames += 1, s.lastFrameTime = f.renderTime, s.lastFrameTimestamp = f.timestamp, e.enabled;
161
162
  },
162
163
  api: u
163
164
  };
@@ -1 +1 @@
1
- {"version":3,"file":"offscreen.js","sources":["../../src/plugins/offscreen/pool.ts","../../src/plugins/offscreen/index.ts"],"sourcesContent":["/**\n * @fileoverview Worker Pool Manager for Offscreen Rendering\n * @module plugins/offscreen/pool\n */\n\nexport interface WorkerTask {\n id: string;\n priority: number;\n timestamp: number;\n resolve: (value: ImageBitmap) => void;\n reject: (error: Error) => void;\n}\n\nexport class WorkerPool {\n private workers: Worker[] = [];\n private availableWorkers: Set<number> = new Set();\n private taskQueue: WorkerTask[] = [];\n private activeJobs: Map<string, number> = new Map(); // taskId => workerIndex\n\n constructor(private size: number) {\n this.initialize();\n }\n\n private initialize(): void {\n const workerCode = `\n // Simple offscreen worker\n self.onmessage = (e) => {\n const { type, width, height, dpr } = e.data;\n \n if (type === 'render') {\n // Echo back - actual rendering logic would go here\n self.postMessage({ type: 'response', taskId: e.data.taskId });\n }\n };\n `;\n\n const blob = new Blob([workerCode], { type: 'application/javascript' });\n const workerUrl = URL.createObjectURL(blob);\n\n for (let i = 0; i < this.size; i++) {\n try {\n const worker = new Worker(workerUrl);\n worker.onmessage = (e) => this.handleWorkerMessage(i, e);\n worker.onerror = (e) => this.handleWorkerError(i, e);\n this.workers.push(worker);\n this.availableWorkers.add(i);\n } catch (error) {\n console.error(`Failed to create worker ${i}:`, error);\n }\n }\n\n URL.revokeObjectURL(workerUrl);\n }\n\n private handleWorkerMessage(workerIndex: number, event: MessageEvent): void {\n const { type, taskId, imageData, error } = event.data;\n\n if (type === 'response') {\n const task = this.findTask(taskId);\n if (task) {\n if (error) {\n task.reject(new Error(error));\n } else if (imageData) {\n task.resolve(imageData);\n }\n this.activeJobs.delete(taskId);\n this.availableWorkers.add(workerIndex);\n this.processQueue();\n }\n }\n }\n\n private handleWorkerError(workerIndex: number, error: ErrorEvent): void {\n console.error(`Worker ${workerIndex} error:`, error);\n // Find and reject any active task for this worker\n for (const [taskId, wIndex] of this.activeJobs.entries()) {\n if (wIndex === workerIndex) {\n const task = this.findTask(taskId);\n if (task) {\n task.reject(new Error(`Worker error: ${error.message}`));\n this.activeJobs.delete(taskId);\n }\n }\n }\n this.availableWorkers.add(workerIndex);\n this.processQueue();\n }\n\n private findTask(taskId: string): WorkerTask | undefined {\n return this.taskQueue.find(t => t.id === taskId);\n }\n\n private processQueue(): void {\n while (this.availableWorkers.size > 0 && this.taskQueue.length > 0) {\n // Sort by priority and timestamp\n this.taskQueue.sort((a, b) => {\n if (a.priority !== b.priority) return b.priority - a.priority;\n return a.timestamp - b.timestamp;\n });\n\n const task = this.taskQueue.shift();\n if (!task) break;\n\n const workerIndex = Array.from(this.availableWorkers)[0];\n this.availableWorkers.delete(workerIndex);\n this.activeJobs.set(task.id, workerIndex);\n\n // Send task to worker\n this.workers[workerIndex].postMessage({\n type: 'render',\n taskId: task.id,\n });\n }\n }\n\n public submit(priority: number = 0): Promise<ImageBitmap> {\n return new Promise((resolve, reject) => {\n const task: WorkerTask = {\n id: Math.random().toString(36).substring(7),\n priority,\n timestamp: Date.now(),\n resolve,\n reject,\n };\n\n this.taskQueue.push(task);\n this.processQueue();\n });\n }\n\n public getStats() {\n return {\n total: this.workers.length,\n active: this.activeJobs.size,\n idle: this.availableWorkers.size,\n queued: this.taskQueue.length,\n };\n }\n\n public destroy(): void {\n for (const worker of this.workers) {\n worker.terminate();\n }\n this.workers = [];\n this.availableWorkers.clear();\n this.taskQueue = [];\n this.activeJobs.clear();\n }\n}\n","/**\n * @fileoverview Offscreen rendering plugin (skeleton with stats + feature detection)\n * @module plugins/offscreen\n */\n\nimport type {\n PluginOffscreenConfig,\n OffscreenAPI,\n OffscreenStats,\n} from \"./types\";\nimport type { ChartPlugin, PluginContext, PluginManifest } from \"../types\";\n\nconst manifest: PluginManifest = {\n name: \"velo-plot-offscreen\",\n version: \"1.0.0\",\n description: \"Offscreen rendering support with worker-ready scaffolding\",\n provides: [\"performance\", \"offscreen\"],\n tags: [\"performance\", \"offscreen\", \"worker\"],\n};\n\nconst DEFAULT_CONFIG: Required<PluginOffscreenConfig> = {\n enabled: false,\n mode: \"auto\",\n workerPool: 1,\n transfer: \"offscreen\",\n fallback: \"main-thread\",\n debug: false,\n};\n\nimport { WorkerPool } from \"./pool\";\n\nexport function PluginOffscreen(\n userConfig: Partial<PluginOffscreenConfig> = {}\n): ChartPlugin<PluginOffscreenConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n let pool: WorkerPool | null = null;\n let stats: OffscreenStats = {\n enabled: config.enabled,\n frames: 0,\n lastFrameTime: 0,\n lastFrameTimestamp: 0,\n };\n\n function log(message: string, ...args: unknown[]) {\n if (config.debug && ctx) {\n ctx.log.info(`[Offscreen] ${message}`, ...args);\n }\n }\n\n function isSupported(): boolean {\n return typeof (globalThis as any).OffscreenCanvas !== \"undefined\";\n }\n\n function enable(): void {\n if (!isSupported()) {\n log(\"OffscreenCanvas not supported. Falling back to main thread.\");\n if (config.fallback === \"disable\") {\n stats.enabled = false;\n return;\n }\n }\n \n if (!pool) {\n pool = new WorkerPool(config.workerPool || 1);\n }\n \n stats.enabled = true;\n config.enabled = true;\n }\n\n function disable(): void {\n if (pool) {\n pool.destroy();\n pool = null;\n }\n stats.enabled = false;\n config.enabled = false;\n }\n\n function updateConfig(newConfig: Partial<PluginOffscreenConfig>): void {\n Object.assign(config, newConfig);\n if (config.enabled) enable();\n else disable();\n stats.enabled = !!config.enabled;\n }\n\n function getStats(): OffscreenStats {\n const poolStats = pool?.getStats();\n return { \n ...stats,\n activeWorkers: poolStats?.active || 0,\n queuedTasks: poolStats?.queued || 0\n } as any;\n }\n\n function flush(): void {\n ctx?.requestRender();\n }\n\n const api: OffscreenAPI & Record<string, unknown> = {\n enable,\n disable,\n isEnabled: () => stats.enabled,\n updateConfig,\n getStats,\n flush,\n };\n\n return {\n manifest,\n onInit(pluginCtx: PluginContext) {\n ctx = pluginCtx;\n (ctx.chart as any).offscreen = api;\n if (config.enabled) enable();\n log(`Initialized (pool=${config.workerPool})`);\n },\n onDestroy(pluginCtx: PluginContext) {\n disable();\n delete (pluginCtx.chart as any).offscreen;\n ctx = null;\n },\n onAfterRender(_ctx, event) {\n stats.frames += 1;\n stats.lastFrameTime = event.renderTime;\n stats.lastFrameTimestamp = event.timestamp;\n \n if (config.enabled && pool) {\n // In a real implementation, we would offload the next render piece here\n // For now, we just track that we could have used the pool\n }\n },\n api,\n };\n}\n\nexport default PluginOffscreen;\n\n// Type exports\nexport type {\n PluginOffscreenConfig,\n OffscreenAPI,\n OffscreenStats,\n OffscreenMode,\n OffscreenTransferMode,\n OffscreenFallbackMode,\n} from \"./types\";\n"],"names":["WorkerPool","size","__publicField","workerCode","blob","workerUrl","i","worker","e","error","workerIndex","event","type","taskId","imageData","task","wIndex","t","a","b","priority","resolve","reject","manifest","DEFAULT_CONFIG","PluginOffscreen","userConfig","config","ctx","pool","stats","log","message","args","isSupported","enable","disable","updateConfig","newConfig","getStats","poolStats","flush","api","pluginCtx","_ctx"],"mappings":"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"}
1
+ {"version":3,"file":"offscreen.js","sources":["../../src/plugins/offscreen/pool.ts","../../src/plugins/offscreen/index.ts"],"sourcesContent":["/**\n * @fileoverview Worker Pool Manager for Offscreen Rendering\n * @module plugins/offscreen/pool\n */\n\nexport interface WorkerTask {\n id: string;\n priority: number;\n timestamp: number;\n resolve: (value: ImageBitmap) => void;\n reject: (error: Error) => void;\n}\n\nexport class WorkerPool {\n private workers: Worker[] = [];\n private availableWorkers: Set<number> = new Set();\n private taskQueue: WorkerTask[] = [];\n private activeJobs: Map<string, number> = new Map(); // taskId => workerIndex\n\n constructor(private size: number) {\n this.initialize();\n }\n\n private initialize(): void {\n const workerCode = `\n // Simple offscreen worker\n self.onmessage = (e) => {\n const { type, width, height, dpr } = e.data;\n \n if (type === 'render') {\n // Echo back - actual rendering logic would go here\n self.postMessage({ type: 'response', taskId: e.data.taskId });\n }\n };\n `;\n\n const blob = new Blob([workerCode], { type: 'application/javascript' });\n const workerUrl = URL.createObjectURL(blob);\n\n for (let i = 0; i < this.size; i++) {\n try {\n const worker = new Worker(workerUrl);\n worker.onmessage = (e) => this.handleWorkerMessage(i, e);\n worker.onerror = (e) => this.handleWorkerError(i, e);\n this.workers.push(worker);\n this.availableWorkers.add(i);\n } catch (error) {\n console.error(`Failed to create worker ${i}:`, error);\n }\n }\n\n URL.revokeObjectURL(workerUrl);\n }\n\n private handleWorkerMessage(workerIndex: number, event: MessageEvent): void {\n const { type, taskId, imageData, error } = event.data;\n\n if (type === 'response') {\n const task = this.findTask(taskId);\n if (task) {\n if (error) {\n task.reject(new Error(error));\n } else if (imageData) {\n task.resolve(imageData);\n }\n this.activeJobs.delete(taskId);\n this.availableWorkers.add(workerIndex);\n this.processQueue();\n }\n }\n }\n\n private handleWorkerError(workerIndex: number, error: ErrorEvent): void {\n console.error(`Worker ${workerIndex} error:`, error);\n // Find and reject any active task for this worker\n for (const [taskId, wIndex] of this.activeJobs.entries()) {\n if (wIndex === workerIndex) {\n const task = this.findTask(taskId);\n if (task) {\n task.reject(new Error(`Worker error: ${error.message}`));\n this.activeJobs.delete(taskId);\n }\n }\n }\n this.availableWorkers.add(workerIndex);\n this.processQueue();\n }\n\n private findTask(taskId: string): WorkerTask | undefined {\n return this.taskQueue.find(t => t.id === taskId);\n }\n\n private processQueue(): void {\n while (this.availableWorkers.size > 0 && this.taskQueue.length > 0) {\n // Sort by priority and timestamp\n this.taskQueue.sort((a, b) => {\n if (a.priority !== b.priority) return b.priority - a.priority;\n return a.timestamp - b.timestamp;\n });\n\n const task = this.taskQueue.shift();\n if (!task) break;\n\n const workerIndex = Array.from(this.availableWorkers)[0];\n this.availableWorkers.delete(workerIndex);\n this.activeJobs.set(task.id, workerIndex);\n\n // Send task to worker\n this.workers[workerIndex].postMessage({\n type: 'render',\n taskId: task.id,\n });\n }\n }\n\n public submit(priority: number = 0): Promise<ImageBitmap> {\n return new Promise((resolve, reject) => {\n const task: WorkerTask = {\n id: Math.random().toString(36).substring(7),\n priority,\n timestamp: Date.now(),\n resolve,\n reject,\n };\n\n this.taskQueue.push(task);\n this.processQueue();\n });\n }\n\n public getStats() {\n return {\n total: this.workers.length,\n active: this.activeJobs.size,\n idle: this.availableWorkers.size,\n queued: this.taskQueue.length,\n };\n }\n\n public destroy(): void {\n for (const worker of this.workers) {\n worker.terminate();\n }\n this.workers = [];\n this.availableWorkers.clear();\n this.taskQueue = [];\n this.activeJobs.clear();\n }\n}\n","/**\n * @fileoverview Offscreen rendering plugin (skeleton with stats + feature detection)\n * @module plugins/offscreen\n */\n\nimport type {\n PluginOffscreenConfig,\n OffscreenAPI,\n OffscreenStats,\n} from \"./types\";\nimport type { ChartPlugin, PluginContext, PluginManifest } from \"../types\";\n\nconst manifest: PluginManifest = {\n name: \"velo-plot-offscreen\",\n version: \"1.0.0\",\n description: \"Offscreen rendering support with worker-ready scaffolding\",\n provides: [\"performance\", \"offscreen\"],\n tags: [\"performance\", \"offscreen\", \"worker\"],\n};\n\nconst DEFAULT_CONFIG: Required<PluginOffscreenConfig> = {\n enabled: false,\n mode: \"auto\",\n workerPool: 1,\n transfer: \"offscreen\",\n fallback: \"main-thread\",\n debug: false,\n};\n\nimport { WorkerPool } from \"./pool\";\n\nexport function PluginOffscreen(\n userConfig: Partial<PluginOffscreenConfig> = {}\n): ChartPlugin<PluginOffscreenConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n let pool: WorkerPool | null = null;\n const stats: OffscreenStats = {\n enabled: config.enabled,\n frames: 0,\n lastFrameTime: 0,\n lastFrameTimestamp: 0,\n };\n\n function log(message: string, ...args: unknown[]) {\n if (config.debug && ctx) {\n ctx.log.info(`[Offscreen] ${message}`, ...args);\n }\n }\n\n function isSupported(): boolean {\n return typeof (globalThis as any).OffscreenCanvas !== \"undefined\";\n }\n\n function enable(): void {\n if (!isSupported()) {\n log(\"OffscreenCanvas not supported. Falling back to main thread.\");\n if (config.fallback === \"disable\") {\n stats.enabled = false;\n return;\n }\n }\n \n if (!pool) {\n pool = new WorkerPool(config.workerPool || 1);\n }\n \n stats.enabled = true;\n config.enabled = true;\n }\n\n function disable(): void {\n if (pool) {\n pool.destroy();\n pool = null;\n }\n stats.enabled = false;\n config.enabled = false;\n }\n\n function updateConfig(newConfig: Partial<PluginOffscreenConfig>): void {\n Object.assign(config, newConfig);\n if (config.enabled) enable();\n else disable();\n stats.enabled = !!config.enabled;\n }\n\n function getStats(): OffscreenStats {\n const poolStats = pool?.getStats();\n return { \n ...stats,\n activeWorkers: poolStats?.active || 0,\n queuedTasks: poolStats?.queued || 0\n } as any;\n }\n\n function flush(): void {\n ctx?.requestRender();\n }\n\n const api: OffscreenAPI & Record<string, unknown> = {\n enable,\n disable,\n isEnabled: () => stats.enabled,\n updateConfig,\n getStats,\n flush,\n };\n\n return {\n manifest,\n onInit(pluginCtx: PluginContext) {\n ctx = pluginCtx;\n (ctx.chart as any).offscreen = api;\n if (config.enabled) enable();\n log(`Initialized (pool=${config.workerPool})`);\n },\n onDestroy(pluginCtx: PluginContext) {\n disable();\n delete (pluginCtx.chart as any).offscreen;\n ctx = null;\n },\n onAfterRender(_ctx, event) {\n stats.frames += 1;\n stats.lastFrameTime = event.renderTime;\n stats.lastFrameTimestamp = event.timestamp;\n \n if (config.enabled && pool) {\n // In a real implementation, we would offload the next render piece here\n // For now, we just track that we could have used the pool\n }\n },\n api,\n };\n}\n\nexport default PluginOffscreen;\n\n// Type exports\nexport type {\n PluginOffscreenConfig,\n OffscreenAPI,\n OffscreenStats,\n OffscreenMode,\n OffscreenTransferMode,\n OffscreenFallbackMode,\n} from \"./types\";\n"],"names":["WorkerPool","size","__publicField","workerCode","blob","workerUrl","i","worker","e","error","workerIndex","event","type","taskId","imageData","task","wIndex","t","a","b","priority","resolve","reject","manifest","DEFAULT_CONFIG","PluginOffscreen","userConfig","config","ctx","pool","stats","log","message","args","isSupported","enable","disable","updateConfig","newConfig","getStats","poolStats","flush","api","pluginCtx","_ctx"],"mappings":"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"}