velo-plot 2.20.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 (287) hide show
  1. package/README.md +26 -12
  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-COREBDNq.js → PluginRegistry-CzMHebYP.js} +24 -38
  7. package/dist/PluginRegistry-CzMHebYP.js.map +1 -0
  8. package/dist/a11y-Bw6urYpr.js +105 -0
  9. package/dist/a11y-Bw6urYpr.js.map +1 -0
  10. package/dist/angular/hooks-entry.d.ts +1 -0
  11. package/dist/angular/hooks.d.ts +26 -0
  12. package/dist/angular/index.d.ts +8 -0
  13. package/dist/angular/velo-plot.component.d.ts +46 -0
  14. package/dist/angular-hooks.d.ts +1 -0
  15. package/dist/angular-hooks.js +9 -0
  16. package/dist/angular-hooks.js.map +1 -0
  17. package/dist/angular.d.ts +1 -0
  18. package/dist/angular.js +166 -0
  19. package/dist/angular.js.map +1 -0
  20. package/dist/assets/indicator.worker-bv0zC4EX.js.map +1 -1
  21. package/dist/astro/StackedPlot.astro +19 -0
  22. package/dist/astro/VeloPlot.astro +23 -0
  23. package/dist/{axisFormat-CzumxpCL.js → axisFormat-Sz4WIJfQ.js} +2 -2
  24. package/dist/{axisFormat-CzumxpCL.js.map → axisFormat-Sz4WIJfQ.js.map} +1 -1
  25. package/dist/bindings/shared/a11y.d.ts +26 -0
  26. package/dist/bindings/shared/chartLifecycle.d.ts +16 -0
  27. package/dist/bindings/shared/chartSyncBridge.d.ts +8 -0
  28. package/dist/bindings/shared/dimensions.d.ts +1 -0
  29. package/dist/bindings/shared/index.d.ts +9 -0
  30. package/dist/bindings/shared/indicatorBridge.d.ts +11 -0
  31. package/dist/bindings/shared/optionsSync.d.ts +7 -0
  32. package/dist/bindings/shared/seriesDiff.d.ts +8 -0
  33. package/dist/bindings/shared/stackedSync.d.ts +9 -0
  34. package/dist/bindings/shared/types.d.ts +46 -0
  35. package/dist/bindings/test-utils/index.d.ts +35 -0
  36. package/dist/bindings/test-utils/mockLifecycle.d.ts +120 -0
  37. package/dist/bindings/test-utils/vitestSveltePlugin.d.ts +3 -0
  38. package/dist/chartSyncBridge-D_rCtbFq.js +58 -0
  39. package/dist/chartSyncBridge-D_rCtbFq.js.map +1 -0
  40. package/dist/core/Chart.d.ts +1 -1
  41. package/dist/core/ChartStatistics.d.ts +1 -1
  42. package/dist/core/InteractionManager.d.ts +7 -1
  43. package/dist/core/OverlayRenderer.d.ts +5 -0
  44. package/dist/core/annotations/types.d.ts +1 -1
  45. package/dist/core/chart/ChartCore.d.ts +14 -19
  46. package/dist/core/chart/ChartFeatureHooks.d.ts +7 -0
  47. package/dist/core/chart/chartExportPatch.d.ts +2 -0
  48. package/dist/core/chart/overlaySeriesRegistry.d.ts +7 -0
  49. package/dist/core/chart/series/SeriesActions.d.ts +1 -0
  50. package/dist/core/chart/series/SeriesBufferLite.d.ts +13 -0
  51. package/dist/core/chart/series/seriesOptionsRegistry.d.ts +8 -0
  52. package/dist/core/chart/series/seriesTypeRegistry.d.ts +5 -0
  53. package/dist/core/chart/types.d.ts +1 -1
  54. package/dist/core/clipboard/index.d.ts +1 -1
  55. package/dist/core/debug/index.d.ts +1 -1
  56. package/dist/core/keybindings/index.d.ts +1 -1
  57. package/dist/core/loading/index.d.ts +1 -1
  58. package/dist/core/locale/index.d.ts +1 -1
  59. package/dist/core/stacked/paneResize.d.ts +3 -0
  60. package/dist/core/stacked/types.d.ts +10 -0
  61. package/dist/core/theme-editor/index.d.ts +1 -1
  62. package/dist/createStackedChart-DqcLCFGS.js +1338 -0
  63. package/dist/createStackedChart-DqcLCFGS.js.map +1 -0
  64. package/dist/examples/PluginDemonstration.d.ts +1 -1
  65. package/dist/hooks-DH-3bewj.js +69 -0
  66. package/dist/hooks-DH-3bewj.js.map +1 -0
  67. package/dist/{index-BBpJwOct.js → index-0InEyj0q.js} +119 -121
  68. package/dist/index-0InEyj0q.js.map +1 -0
  69. package/dist/{index-qunX30Xu.js → index-B7PTX94B.js} +2133 -2133
  70. package/dist/index-B7PTX94B.js.map +1 -0
  71. package/dist/{index-BMiZoKmm.js → index-BgrvqltV.js} +67 -67
  72. package/dist/index-BgrvqltV.js.map +1 -0
  73. package/dist/{index-DoYxf1cV.js → index-CWxIHdwX.js} +38 -98
  74. package/dist/index-CWxIHdwX.js.map +1 -0
  75. package/dist/index-CaXWSOTk.js.map +1 -1
  76. package/dist/{mockDatafeed-927foCM4.js → index-Cv6ZDLWf.js} +227 -217
  77. package/dist/index-Cv6ZDLWf.js.map +1 -0
  78. package/dist/index-Dag88bW4.js.map +1 -1
  79. package/dist/index-qhscKTDy.js.map +1 -1
  80. package/dist/index.core.d.ts +9 -7
  81. package/dist/index.d.ts +2 -15
  82. package/dist/indicators--eJGmVox.js.map +1 -1
  83. package/dist/optionsSync-QUiN4Inw.js +119 -0
  84. package/dist/optionsSync-QUiN4Inw.js.map +1 -0
  85. package/dist/plugins/3d/index.d.ts +2 -2
  86. package/dist/plugins/3d.d.ts +2 -2
  87. package/dist/plugins/3d.js +3 -1
  88. package/dist/plugins/3d.js.map +1 -1
  89. package/dist/plugins/analysis/index.d.ts +1 -1
  90. package/dist/plugins/analysis/indicators.d.ts +1 -1
  91. package/dist/plugins/analysis.d.ts +2 -2
  92. package/dist/plugins/analysis.js +2 -2
  93. package/dist/plugins/analysis.js.map +1 -1
  94. package/dist/plugins/annotations/index.d.ts +1 -1
  95. package/dist/plugins/annotations.d.ts +2 -2
  96. package/dist/plugins/annotations.js.map +1 -1
  97. package/dist/plugins/anomaly-detection.js +1 -1
  98. package/dist/plugins/anomaly-detection.js.map +1 -1
  99. package/dist/plugins/broken-axis.d.ts +2 -2
  100. package/dist/plugins/builtins/crosshair/CrosshairPlugin.d.ts +1 -1
  101. package/dist/plugins/builtins/index.d.ts +1 -1
  102. package/dist/plugins/caching.d.ts +2 -2
  103. package/dist/plugins/clipboard/index.d.ts +2 -2
  104. package/dist/plugins/clipboard.d.ts +2 -2
  105. package/dist/plugins/clipboard.js.map +1 -1
  106. package/dist/plugins/context-menu/index.d.ts +1 -1
  107. package/dist/plugins/context-menu.d.ts +2 -2
  108. package/dist/plugins/context-menu.js +1 -1
  109. package/dist/plugins/context-menu.js.map +1 -1
  110. package/dist/plugins/createPlugin.d.ts +8 -0
  111. package/dist/plugins/data-export/index.d.ts +1 -1
  112. package/dist/plugins/data-export.d.ts +2 -2
  113. package/dist/plugins/data-export.js +2 -2
  114. package/dist/plugins/data-export.js.map +1 -1
  115. package/dist/plugins/data-transform.d.ts +2 -2
  116. package/dist/plugins/data-transform.js +19 -19
  117. package/dist/plugins/data-transform.js.map +1 -1
  118. package/dist/plugins/debug/index.d.ts +2 -2
  119. package/dist/plugins/debug.d.ts +2 -2
  120. package/dist/plugins/debug.js +33 -33
  121. package/dist/plugins/debug.js.map +1 -1
  122. package/dist/plugins/forecasting/index.d.ts +1 -1
  123. package/dist/plugins/forecasting.js.map +1 -1
  124. package/dist/plugins/gpu/index.d.ts +2 -2
  125. package/dist/plugins/gpu.d.ts +2 -2
  126. package/dist/plugins/gpu.js +2033 -209
  127. package/dist/plugins/gpu.js.map +1 -1
  128. package/dist/plugins/i18n/index.d.ts +2 -2
  129. package/dist/plugins/i18n.d.ts +2 -2
  130. package/dist/plugins/i18n.js +286 -23
  131. package/dist/plugins/i18n.js.map +1 -1
  132. package/dist/plugins/index.d.ts +1 -1
  133. package/dist/plugins/keyboard.d.ts +2 -2
  134. package/dist/plugins/keyboard.js +65 -5
  135. package/dist/plugins/keyboard.js.map +1 -1
  136. package/dist/plugins/latex.js +766 -207
  137. package/dist/plugins/latex.js.map +1 -1
  138. package/dist/plugins/lazy-load.d.ts +2 -2
  139. package/dist/plugins/loading/index.d.ts +2 -3
  140. package/dist/plugins/loading.d.ts +2 -2
  141. package/dist/plugins/loading.js +3 -4
  142. package/dist/plugins/ml-integration.d.ts +2 -2
  143. package/dist/plugins/ml-integration.js +5 -5
  144. package/dist/plugins/ml-integration.js.map +1 -1
  145. package/dist/plugins/offscreen.d.ts +2 -2
  146. package/dist/plugins/offscreen.js +11 -10
  147. package/dist/plugins/offscreen.js.map +1 -1
  148. package/dist/plugins/pattern-recognition.d.ts +2 -2
  149. package/dist/plugins/pattern-recognition.js +1 -1
  150. package/dist/plugins/pattern-recognition.js.map +1 -1
  151. package/dist/plugins/radar.d.ts +2 -2
  152. package/dist/plugins/regression.d.ts +2 -2
  153. package/dist/plugins/regression.js +255 -257
  154. package/dist/plugins/regression.js.map +1 -1
  155. package/dist/plugins/roi.js +9 -9
  156. package/dist/plugins/roi.js.map +1 -1
  157. package/dist/plugins/snapshot/index.d.ts +1 -1
  158. package/dist/plugins/snapshot/types.d.ts +1 -1
  159. package/dist/plugins/snapshot.d.ts +2 -2
  160. package/dist/plugins/snapshot.js.map +1 -1
  161. package/dist/plugins/streaming/index.d.ts +2 -2
  162. package/dist/plugins/streaming.d.ts +2 -2
  163. package/dist/plugins/streaming.js +1 -1
  164. package/dist/plugins/sync/index.d.ts +3 -2
  165. package/dist/plugins/sync.d.ts +2 -2
  166. package/dist/plugins/sync.js.map +1 -1
  167. package/dist/plugins/theme-editor/index.d.ts +1 -1
  168. package/dist/plugins/theme-editor.d.ts +2 -2
  169. package/dist/plugins/tools/index.d.ts +1 -1
  170. package/dist/plugins/tools/tooltip/index.d.ts +1 -1
  171. package/dist/plugins/tools.d.ts +2 -2
  172. package/dist/plugins/tools.js +1 -1
  173. package/dist/plugins/types.d.ts +1 -1
  174. package/dist/plugins/video-recorder.d.ts +2 -2
  175. package/dist/plugins/virtualization.d.ts +2 -2
  176. package/dist/plugins/virtualization.js +1 -1
  177. package/dist/pool-DZ8shSqv.js +109 -0
  178. package/dist/pool-DZ8shSqv.js.map +1 -0
  179. package/dist/react/StackedPlot.d.ts +31 -0
  180. package/dist/react/VeloPlot.d.ts +29 -0
  181. package/dist/react/index.d.ts +25 -3
  182. package/dist/react/useChartSync.d.ts +8 -0
  183. package/dist/react/useIndicator.d.ts +12 -0
  184. package/dist/react/useVeloPlot.d.ts +19 -0
  185. package/dist/react.js +325 -24
  186. package/dist/react.js.map +1 -1
  187. package/dist/renderer/NativeWebGLRenderer.d.ts +2 -1
  188. package/dist/renderer/native/NativeWebGLRenderer.d.ts +5 -1
  189. package/dist/renderer/native/draw.d.ts +2 -47
  190. package/dist/renderer/native/drawCore.d.ts +27 -0
  191. package/dist/renderer/native/drawExtended.d.ts +29 -0
  192. package/dist/renderer/native/frameRenderExtended.d.ts +1 -0
  193. package/dist/renderer/native/frameRenderRegistry.d.ts +27 -0
  194. package/dist/renderer/native/programFactoryCore.d.ts +6 -0
  195. package/dist/renderer/native/programFactoryExtended.d.ts +4 -0
  196. package/dist/renderer/native/utils.d.ts +3 -29
  197. package/dist/renderer/native/utilsCore.d.ts +14 -0
  198. package/dist/renderer/native/utilsExtended.d.ts +17 -0
  199. package/dist/renderer/overlaySeriesExtended.d.ts +1 -0
  200. package/dist/renderer/registerExtendedSeries.d.ts +1 -0
  201. package/dist/renderer/registerWebGPU.d.ts +2 -0
  202. package/dist/renderer/seriesBufferExtended.d.ts +4 -0
  203. package/dist/scientific/index.d.ts +44 -0
  204. package/dist/scientific/registerScientific.d.ts +1 -0
  205. package/dist/scientific.d.ts +1 -0
  206. package/dist/scientific.js +91 -0
  207. package/dist/scientific.js.map +1 -0
  208. package/dist/solid/VeloPlot.d.ts +16 -0
  209. package/dist/solid/index.d.ts +13 -0
  210. package/dist/solid/useChartSync.d.ts +6 -0
  211. package/dist/solid/useIndicator.d.ts +11 -0
  212. package/dist/solid/useStackedPlot.d.ts +14 -0
  213. package/dist/solid/useVeloPlot.d.ts +18 -0
  214. package/dist/solid.d.ts +1 -0
  215. package/dist/solid.js +169 -0
  216. package/dist/solid.js.map +1 -0
  217. package/dist/stackedSync-tnrunZMt.js +100 -0
  218. package/dist/stackedSync-tnrunZMt.js.map +1 -0
  219. package/dist/svelte/StackedPlot.svelte +29 -0
  220. package/dist/svelte/StackedPlot.test.ts +114 -0
  221. package/dist/svelte/VeloPlot.svelte +44 -0
  222. package/dist/svelte/VeloPlot.test.ts +105 -0
  223. package/dist/svelte/index.d.ts +11 -0
  224. package/dist/svelte/index.test.ts +20 -0
  225. package/dist/svelte/index.ts +15 -0
  226. package/dist/svelte/useChartSync.d.ts +8 -0
  227. package/dist/svelte/useChartSync.test.ts +49 -0
  228. package/dist/svelte/useChartSync.ts +29 -0
  229. package/dist/svelte/useIndicator.d.ts +13 -0
  230. package/dist/svelte/useIndicator.test.ts +67 -0
  231. package/dist/svelte/useIndicator.ts +43 -0
  232. package/dist/svelte/useStackedPlot.d.ts +16 -0
  233. package/dist/svelte/useStackedPlot.test.ts +76 -0
  234. package/dist/svelte/useStackedPlot.ts +54 -0
  235. package/dist/svelte/useVeloPlot.d.ts +21 -0
  236. package/dist/svelte/useVeloPlot.test.ts +100 -0
  237. package/dist/svelte/useVeloPlot.ts +81 -0
  238. package/dist/svelte.d.ts +1 -0
  239. package/dist/svelte.js +140 -0
  240. package/dist/svelte.js.map +1 -0
  241. package/dist/testing/index.d.ts +1 -1
  242. package/dist/theme/index.d.ts +2 -1
  243. package/dist/trading/index.d.ts +1 -4
  244. package/dist/trading/registerTrading.d.ts +3 -0
  245. package/dist/trading.js +42 -42
  246. package/dist/types.d.ts +4 -4
  247. package/dist/{utils-BK5UUXxj.js → utils-Dx0h0bgQ.js} +9 -9
  248. package/dist/{utils-BK5UUXxj.js.map → utils-Dx0h0bgQ.js.map} +1 -1
  249. package/dist/velo-plot.full.js +2216 -1346
  250. package/dist/velo-plot.full.js.map +1 -1
  251. package/dist/velo-plot.js +33 -28
  252. package/dist/velo-plot.js.map +1 -1
  253. package/dist/vue/StackedPlot.vue.d.ts +48 -0
  254. package/dist/vue/VeloPlot.vue.d.ts +64 -0
  255. package/dist/vue/index.d.ts +250 -0
  256. package/dist/vue/useChartSync.d.ts +52 -0
  257. package/dist/vue/useIndicator.d.ts +23 -0
  258. package/dist/vue/useStackedPlot.d.ts +15 -0
  259. package/dist/vue/useVeloPlot.d.ts +20 -0
  260. package/dist/vue.d.ts +1 -0
  261. package/dist/vue.js +309 -0
  262. package/dist/vue.js.map +1 -0
  263. package/dist/workers/indicatorsAsync.d.ts +2 -0
  264. package/dist/workers/pool.d.ts +9 -0
  265. package/package.json +96 -10
  266. package/dist/ChartCore-ivzLqxVb.js +0 -8350
  267. package/dist/ChartCore-ivzLqxVb.js.map +0 -1
  268. package/dist/SciPlot-CEU4ApgD.js +0 -463
  269. package/dist/SciPlot-CEU4ApgD.js.map +0 -1
  270. package/dist/createStackedChart-DxNW0VkF.js +0 -705
  271. package/dist/createStackedChart-DxNW0VkF.js.map +0 -1
  272. package/dist/gpuRenderer-BpaMYz-k.js +0 -1848
  273. package/dist/gpuRenderer-BpaMYz-k.js.map +0 -1
  274. package/dist/index-BBpJwOct.js.map +0 -1
  275. package/dist/index-BMiZoKmm.js.map +0 -1
  276. package/dist/index-DoYxf1cV.js.map +0 -1
  277. package/dist/index-qunX30Xu.js.map +0 -1
  278. package/dist/index-x4stH3jD.js +0 -282
  279. package/dist/index-x4stH3jD.js.map +0 -1
  280. package/dist/index.core-COREBDNq.js.map +0 -1
  281. package/dist/mockDatafeed-927foCM4.js.map +0 -1
  282. package/dist/pool-15HMCNv8.js +0 -88
  283. package/dist/pool-15HMCNv8.js.map +0 -1
  284. package/dist/react/SciPlot.d.ts +0 -60
  285. package/dist/react/useSciPlot.d.ts +0 -56
  286. package/dist/symbols-DT0eLlpW.js +0 -568
  287. package/dist/symbols-DT0eLlpW.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"gpuRenderer-BpaMYz-k.js","sources":["../src/gpu/backends/webgpu/pipelines/triangleShader.ts","../src/gpu/backends/webgpu/pipelines/trianglePipeline.ts","../src/gpu/backends/webgpu/shaders/line.wgsl.ts","../src/gpu/backends/webgpu/pipelines/linePipeline.ts","../src/gpu/backends/webgpu/shaders/point.wgsl.ts","../src/gpu/backends/webgpu/pipelines/pointPipeline.ts","../src/gpu/backends/webgpu/pipelines/bandPipeline.ts","../src/gpu/backends/webgpu/shaders/heatmap.wgsl.ts","../src/gpu/backends/webgpu/pipelines/heatmapPipeline.ts","../src/gpu/backends/webgpu/WebGPUBackend.ts","../src/gpu/backends/webgl/shaders.ts","../src/gpu/backends/webgl/programFactory.ts","../src/gpu/backends/webgl/WebGLBackend.ts","../src/gpu/adapter/seriesAdapter.ts","../src/gpu/adapter/gpuRenderer.ts"],"sourcesContent":["export const TRIANGLE_SHADER_WGSL = `\nstruct VSOut {\n @builtin(position) pos: vec4<f32>,\n @location(0) color: vec4<f32>,\n};\n\n@vertex\nfn vs_main(\n @location(0) position: vec2<f32>,\n @location(1) color: vec4<f32>\n) -> VSOut {\n var out: VSOut;\n out.pos = vec4<f32>(position, 0.0, 1.0);\n out.color = color;\n return out;\n}\n\n@fragment\nfn fs_main(in: VSOut) -> @location(0) vec4<f32> {\n return in.color;\n}\n`;\n","import { TRIANGLE_SHADER_WGSL } from \"./triangleShader\";\n\nexport interface TrianglePipelineBundle {\n pipeline: any;\n vertexStride: number;\n}\n\nexport function createTrianglePipeline(\n device: any,\n format: string\n): TrianglePipelineBundle {\n const module = device.createShaderModule({ code: TRIANGLE_SHADER_WGSL });\n\n const vertexStride = 6 * 4;\n\n const pipeline = device.createRenderPipeline({\n layout: \"auto\",\n vertex: {\n module,\n entryPoint: \"vs_main\",\n buffers: [\n {\n arrayStride: vertexStride,\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 2 * 4, format: \"float32x4\" },\n ],\n },\n ],\n },\n fragment: {\n module,\n entryPoint: \"fs_main\",\n targets: [{ format }],\n },\n primitive: {\n topology: \"triangle-list\",\n cullMode: \"none\",\n },\n });\n\n return { pipeline, vertexStride };\n}\n","/**\n * Line Shader - WGSL for WebGPU\n * \n * Renders simple line strips with uniform color.\n * Uses uniform buffer for transform (scale + translate).\n */\n\nexport const LINE_SHADER_WGSL = `\n// Uniform buffer for transforms and color\nstruct Uniforms {\n scale: vec2<f32>,\n translate: vec2<f32>,\n color: vec4<f32>,\n};\n\n@group(0) @binding(0)\nvar<uniform> uniforms: Uniforms;\n\nstruct VSInput {\n @location(0) position: vec2<f32>,\n};\n\nstruct VSOutput {\n @builtin(position) pos: vec4<f32>,\n};\n\n@vertex\nfn vs_main(in: VSInput) -> VSOutput {\n var out: VSOutput;\n let transformed = in.position * uniforms.scale + uniforms.translate;\n out.pos = vec4<f32>(transformed, 0.0, 1.0);\n return out;\n}\n\n@fragment\nfn fs_main(in: VSOutput) -> @location(0) vec4<f32> {\n return uniforms.color;\n}\n`;\n\nexport const LINE_VERTEX_STRIDE = 2 * 4; // 2 floats (x, y)\n","/**\n * Line Pipeline - WebGPU pipeline for rendering lines with uniform buffer\n * \n * Uses `any` types for WebGPU objects to avoid requiring @webgpu/types\n * (following the pattern of the original WebGPUBackend.ts)\n */\n\nimport { LINE_SHADER_WGSL, LINE_VERTEX_STRIDE } from \"../shaders/line.wgsl\";\n\nexport interface LinePipelineBundle {\n pipeline: any; // GPURenderPipeline\n bindGroupLayout: any; // GPUBindGroupLayout\n uniformBuffer: any; // GPUBuffer\n bindGroup: any; // GPUBindGroup\n vertexStride: number;\n}\n\nexport interface LineUniforms {\n scale: [number, number];\n translate: [number, number];\n color: [number, number, number, number];\n}\n\n// Uniform buffer layout: scale(2) + translate(2) + color(4) = 8 floats = 32 bytes\nconst UNIFORM_BUFFER_SIZE = 32;\n\nexport function createLinePipeline(\n device: any, // GPUDevice\n format: string // GPUTextureFormat\n): LinePipelineBundle {\n const module = device.createShaderModule({ code: LINE_SHADER_WGSL });\n\n const GPUShaderStageAny = (globalThis as any).GPUShaderStage;\n const GPUBufferUsageAny = (globalThis as any).GPUBufferUsage;\n\n // Create bind group layout explicitly\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: GPUShaderStageAny.VERTEX | GPUShaderStageAny.FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n\n // Create uniform buffer\n const uniformBuffer = device.createBuffer({\n size: UNIFORM_BUFFER_SIZE,\n usage: GPUBufferUsageAny.UNIFORM | GPUBufferUsageAny.COPY_DST,\n });\n\n // Create bind group\n const bindGroup = device.createBindGroup({\n layout: bindGroupLayout,\n entries: [\n {\n binding: 0,\n resource: { buffer: uniformBuffer },\n },\n ],\n });\n\n // Create pipeline layout\n const pipelineLayout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n\n const pipeline = device.createRenderPipeline({\n layout: pipelineLayout,\n vertex: {\n module,\n entryPoint: \"vs_main\",\n buffers: [\n {\n arrayStride: LINE_VERTEX_STRIDE,\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n ],\n },\n ],\n },\n fragment: {\n module,\n entryPoint: \"fs_main\",\n targets: [\n {\n format,\n blend: {\n color: {\n srcFactor: \"src-alpha\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n },\n },\n ],\n },\n primitive: {\n topology: \"line-strip\",\n stripIndexFormat: undefined,\n },\n });\n\n return {\n pipeline,\n bindGroupLayout,\n uniformBuffer,\n bindGroup,\n vertexStride: LINE_VERTEX_STRIDE,\n };\n}\n\nexport function updateLineUniforms(\n device: any, // GPUDevice\n uniformBuffer: any, // GPUBuffer\n uniforms: LineUniforms\n): void {\n const data = new Float32Array([\n uniforms.scale[0],\n uniforms.scale[1],\n uniforms.translate[0],\n uniforms.translate[1],\n uniforms.color[0],\n uniforms.color[1],\n uniforms.color[2],\n uniforms.color[3],\n ]);\n device.queue.writeBuffer(uniformBuffer, 0, data);\n}\n","/**\n * Point Shader - WGSL for WebGPU\n * \n * Renders scatter points with SDF-based symbols.\n * Supports: circle, square, diamond, triangle, triangleDown, cross, x, star\n */\n\nexport const POINT_SHADER_WGSL = `\n// Uniform buffer for transforms, color, point properties\nstruct Uniforms {\n scale: vec2<f32>,\n translate: vec2<f32>,\n color: vec4<f32>,\n pointSize: f32,\n symbol: i32, // 0=circle, 1=square, 2=diamond, 3=triangle, 4=triangleDown, 5=cross, 6=x, 7=star\n _padding: vec2<f32>,\n};\n\n@group(0) @binding(0)\nvar<uniform> uniforms: Uniforms;\n\nstruct VSInput {\n @location(0) position: vec2<f32>,\n};\n\nstruct VSOutput {\n @builtin(position) pos: vec4<f32>,\n @location(0) @interpolate(flat) pointSize: f32,\n @location(1) @interpolate(flat) symbol: i32,\n};\n\n@vertex\nfn vs_main(in: VSInput, @builtin(vertex_index) vertexIndex: u32) -> VSOutput {\n var out: VSOutput;\n let transformed = in.position * uniforms.scale + uniforms.translate;\n out.pos = vec4<f32>(transformed, 0.0, 1.0);\n out.pointSize = uniforms.pointSize;\n out.symbol = uniforms.symbol;\n return out;\n}\n\n// SDF functions for symbols\nfn sdCircle(p: vec2<f32>, r: f32) -> f32 {\n return length(p) - r;\n}\n\nfn sdBox(p: vec2<f32>, b: vec2<f32>) -> f32 {\n let d = abs(p) - b;\n return length(max(d, vec2<f32>(0.0))) + min(max(d.x, d.y), 0.0);\n}\n\nfn sdDiamond(p: vec2<f32>, r: f32) -> f32 {\n return (abs(p.x) + abs(p.y)) - r;\n}\n\nfn sdTriangle(p_in: vec2<f32>, r: f32) -> f32 {\n let k = sqrt(3.0);\n var p = p_in;\n p.x = abs(p.x) - r;\n p.y = p.y + r / k;\n if (p.x + k * p.y > 0.0) {\n p = vec2<f32>(p.x - k * p.y, -k * p.x - p.y) / 2.0;\n }\n p.x = p.x - clamp(p.x, -2.0 * r, 0.0);\n return -length(p) * sign(p.y);\n}\n\nfn sdCross(p: vec2<f32>, r: f32, thickness: f32) -> f32 {\n let d = abs(p);\n let s1 = sdBox(d, vec2<f32>(r, thickness));\n let s2 = sdBox(d, vec2<f32>(thickness, r));\n return min(s1, s2);\n}\n\nfn sdX(p: vec2<f32>, r: f32, thickness: f32) -> f32 {\n let c = cos(0.785398);\n let s = sin(0.785398);\n let m = mat2x2<f32>(c, -s, s, c);\n return sdCross(m * p, r, thickness);\n}\n\nfn sdStar(p_in: vec2<f32>, r: f32, rf: f32) -> f32 {\n let k1 = vec2<f32>(0.80901699, -0.58778525);\n let k2 = vec2<f32>(-k1.x, k1.y);\n var p = p_in;\n p.x = abs(p.x);\n p = p - 2.0 * max(dot(k1, p), 0.0) * k1;\n p = p - 2.0 * max(dot(k2, p), 0.0) * k2;\n p.x = abs(p.x);\n p.y = p.y - r;\n let ba = rf * vec2<f32>(-k1.y, k1.x) - vec2<f32>(0.0, 1.0);\n let h = clamp(dot(p, ba) / dot(ba, ba), 0.0, r);\n return length(p - ba * h) * sign(p.y * ba.x - p.x * ba.y);\n}\n\n@fragment\nfn fs_main(in: VSOutput) -> @location(0) vec4<f32> {\n // Note: WebGPU doesn't have gl_PointCoord directly\n // Points in WebGPU require rendering quads instead\n // This shader needs instanced rendering with quads for proper point rendering\n // For now, return the color directly\n return uniforms.color;\n}\n`;\n\n// For proper point rendering we need quad instances\n// Each point becomes 6 vertices (2 triangles forming a quad)\nexport const POINT_QUAD_SHADER_WGSL = `\n// Uniform buffer for transforms, color, point properties\nstruct Uniforms {\n scale: vec2<f32>,\n translate: vec2<f32>,\n color: vec4<f32>,\n pointSize: f32,\n symbol: i32,\n viewport: vec2<f32>, // viewport dimensions for proper sizing\n};\n\n@group(0) @binding(0)\nvar<uniform> uniforms: Uniforms;\n\nstruct VSInput {\n @location(0) position: vec2<f32>, // point center position\n @location(1) quadOffset: vec2<f32>, // quad vertex offset (-1 to 1)\n};\n\nstruct VSOutput {\n @builtin(position) pos: vec4<f32>,\n @location(0) uv: vec2<f32>, // -0.5 to 0.5 for SDF\n};\n\n@vertex\nfn vs_main(in: VSInput) -> VSOutput {\n var out: VSOutput;\n \n // Transform point position to NDC\n let transformed = in.position * uniforms.scale + uniforms.translate;\n \n // Calculate point size in NDC\n let pointSizeNDC = vec2<f32>(\n uniforms.pointSize / uniforms.viewport.x * 2.0,\n uniforms.pointSize / uniforms.viewport.y * 2.0\n );\n \n // Apply quad offset\n let offset = in.quadOffset * pointSizeNDC * 0.5;\n \n out.pos = vec4<f32>(transformed + offset, 0.0, 1.0);\n out.uv = in.quadOffset * 0.5; // -0.5 to 0.5\n \n return out;\n}\n\n// SDF functions\nfn sdCircle(p: vec2<f32>, r: f32) -> f32 {\n return length(p) - r;\n}\n\nfn sdBox(p: vec2<f32>, b: vec2<f32>) -> f32 {\n let d = abs(p) - b;\n return length(max(d, vec2<f32>(0.0))) + min(max(d.x, d.y), 0.0);\n}\n\nfn sdDiamond(p: vec2<f32>, r: f32) -> f32 {\n return (abs(p.x) + abs(p.y)) - r;\n}\n\nfn sdTriangle(p_in: vec2<f32>, r: f32) -> f32 {\n let k = sqrt(3.0);\n var p = p_in;\n p.x = abs(p.x) - r;\n p.y = p.y + r / k;\n if (p.x + k * p.y > 0.0) {\n p = vec2<f32>(p.x - k * p.y, -k * p.x - p.y) / 2.0;\n }\n p.x = p.x - clamp(p.x, -2.0 * r, 0.0);\n return -length(p) * sign(p.y);\n}\n\nfn sdCross(p: vec2<f32>, r: f32, thickness: f32) -> f32 {\n let d = abs(p);\n let s1 = sdBox(d, vec2<f32>(r, thickness));\n let s2 = sdBox(d, vec2<f32>(thickness, r));\n return min(s1, s2);\n}\n\nfn sdX(p: vec2<f32>, r: f32, thickness: f32) -> f32 {\n let c = cos(0.785398);\n let s = sin(0.785398);\n let m = mat2x2<f32>(c, -s, s, c);\n return sdCross(m * p, r, thickness);\n}\n\nfn sdStar(p_in: vec2<f32>, r: f32, rf: f32) -> f32 {\n let k1 = vec2<f32>(0.80901699, -0.58778525);\n let k2 = vec2<f32>(-k1.x, k1.y);\n var p = p_in;\n p.x = abs(p.x);\n p = p - 2.0 * max(dot(k1, p), 0.0) * k1;\n p = p - 2.0 * max(dot(k2, p), 0.0) * k2;\n p.x = abs(p.x);\n p.y = p.y - r;\n let ba = rf * vec2<f32>(-k1.y, k1.x) - vec2<f32>(0.0, 1.0);\n let h = clamp(dot(p, ba) / dot(ba, ba), 0.0, r);\n return length(p - ba * h) * sign(p.y * ba.x - p.x * ba.y);\n}\n\n@fragment\nfn fs_main(in: VSOutput) -> @location(0) vec4<f32> {\n var d: f32 = 0.0;\n \n if (uniforms.symbol == 0) {\n d = sdCircle(in.uv, 0.45);\n } else if (uniforms.symbol == 1) {\n d = sdBox(in.uv, vec2<f32>(0.35));\n } else if (uniforms.symbol == 2) {\n d = sdDiamond(in.uv, 0.45);\n } else if (uniforms.symbol == 3) {\n d = sdTriangle(vec2<f32>(in.uv.x, in.uv.y + 0.1), 0.4);\n } else if (uniforms.symbol == 4) {\n d = sdTriangle(vec2<f32>(in.uv.x, -in.uv.y + 0.1), 0.4);\n } else if (uniforms.symbol == 5) {\n d = sdCross(in.uv, 0.45, 0.15);\n } else if (uniforms.symbol == 6) {\n d = sdX(in.uv, 0.45, 0.15);\n } else if (uniforms.symbol == 7) {\n d = sdStar(in.uv, 0.45, 0.4);\n }\n \n if (d > 0.02) {\n discard;\n }\n \n let alpha = 1.0 - smoothstep(0.0, 0.02, d);\n return vec4<f32>(uniforms.color.rgb, uniforms.color.a * alpha);\n}\n`;\n\nexport const POINT_VERTEX_STRIDE = 2 * 4; // 2 floats (x, y)\n","/**\n * Point Pipeline - WebGPU pipeline for rendering scatter points with SDF symbols\n * \n * Uses instanced rendering where each point is rendered as a quad (2 triangles).\n * Uses `any` types for WebGPU objects to avoid requiring @webgpu/types.\n */\n\nimport { POINT_QUAD_SHADER_WGSL, POINT_VERTEX_STRIDE } from \"../shaders/point.wgsl\";\n\nexport interface PointPipelineBundle {\n pipeline: any; // GPURenderPipeline\n bindGroupLayout: any; // GPUBindGroupLayout\n uniformBuffer: any; // GPUBuffer\n bindGroup: any; // GPUBindGroup\n quadBuffer: any; // GPUBuffer - Pre-generated quad vertices\n vertexStride: number;\n}\n\nexport interface PointUniforms {\n scale: [number, number];\n translate: [number, number];\n color: [number, number, number, number];\n pointSize: number;\n symbol: number; // 0=circle, 1=square, 2=diamond, 3=triangle, 4=triangleDown, 5=cross, 6=x, 7=star\n viewport: [number, number];\n}\n\n// Uniform buffer layout:\n// scale(2) + translate(2) + color(4) + pointSize(1) + symbol(1) + viewport(2) = 12 floats = 48 bytes\nconst UNIFORM_BUFFER_SIZE = 48;\n\n// Quad vertex offsets (6 vertices for 2 triangles)\nconst QUAD_VERTICES = new Float32Array([\n -1, -1, // bottom-left\n 1, -1, // bottom-right\n -1, 1, // top-left\n -1, 1, // top-left\n 1, -1, // bottom-right\n 1, 1, // top-right\n]);\n\nexport function createPointPipeline(\n device: any, // GPUDevice\n format: string // GPUTextureFormat\n): PointPipelineBundle {\n const module = device.createShaderModule({ code: POINT_QUAD_SHADER_WGSL });\n\n const GPUShaderStageAny = (globalThis as any).GPUShaderStage;\n const GPUBufferUsageAny = (globalThis as any).GPUBufferUsage;\n\n // Create bind group layout\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: GPUShaderStageAny.VERTEX | GPUShaderStageAny.FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n\n // Create uniform buffer\n const uniformBuffer = device.createBuffer({\n size: UNIFORM_BUFFER_SIZE,\n usage: GPUBufferUsageAny.UNIFORM | GPUBufferUsageAny.COPY_DST,\n });\n\n // Create quad vertex buffer\n const quadBuffer = device.createBuffer({\n size: QUAD_VERTICES.byteLength,\n usage: GPUBufferUsageAny.VERTEX | GPUBufferUsageAny.COPY_DST,\n mappedAtCreation: true,\n });\n new Float32Array(quadBuffer.getMappedRange()).set(QUAD_VERTICES);\n quadBuffer.unmap();\n\n // Create bind group\n const bindGroup = device.createBindGroup({\n layout: bindGroupLayout,\n entries: [\n {\n binding: 0,\n resource: { buffer: uniformBuffer },\n },\n ],\n });\n\n // Create pipeline layout\n const pipelineLayout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n\n const pipeline = device.createRenderPipeline({\n layout: pipelineLayout,\n vertex: {\n module,\n entryPoint: \"vs_main\",\n buffers: [\n // Point positions (instanced)\n {\n arrayStride: POINT_VERTEX_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n ],\n },\n // Quad vertex offsets (per-vertex)\n {\n arrayStride: 8, // 2 floats\n stepMode: \"vertex\",\n attributes: [\n { shaderLocation: 1, offset: 0, format: \"float32x2\" },\n ],\n },\n ],\n },\n fragment: {\n module,\n entryPoint: \"fs_main\",\n targets: [\n {\n format,\n blend: {\n color: {\n srcFactor: \"src-alpha\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n },\n },\n ],\n },\n primitive: {\n topology: \"triangle-list\",\n cullMode: \"none\",\n },\n });\n\n return {\n pipeline,\n bindGroupLayout,\n uniformBuffer,\n bindGroup,\n quadBuffer,\n vertexStride: POINT_VERTEX_STRIDE,\n };\n}\n\nexport function updatePointUniforms(\n device: any, // GPUDevice\n uniformBuffer: any, // GPUBuffer\n uniforms: PointUniforms\n): void {\n // Pack data: scale(2) + translate(2) + color(4) + pointSize(1) + symbol(1 as float) + viewport(2)\n const data = new Float32Array([\n uniforms.scale[0],\n uniforms.scale[1],\n uniforms.translate[0],\n uniforms.translate[1],\n uniforms.color[0],\n uniforms.color[1],\n uniforms.color[2],\n uniforms.color[3],\n uniforms.pointSize,\n uniforms.symbol, // Will be cast to i32 in shader via bitcast\n uniforms.viewport[0],\n uniforms.viewport[1],\n ]);\n device.queue.writeBuffer(uniformBuffer, 0, data);\n}\n\nexport const SYMBOL_MAP: Record<string, number> = {\n circle: 0,\n square: 1,\n diamond: 2,\n triangle: 3,\n triangleDown: 4,\n cross: 5,\n x: 6,\n star: 7,\n};\n","/**\n * Band Pipeline - WebGPU pipeline for rendering band/area fills\n * \n * Uses triangle-strip topology for efficient area rendering.\n * Reuses the line shader with different primitive topology.\n * Uses `any` types for WebGPU objects to avoid requiring @webgpu/types.\n */\n\nimport { LINE_SHADER_WGSL, LINE_VERTEX_STRIDE } from \"../shaders/line.wgsl\";\n\nexport interface BandPipelineBundle {\n pipeline: any; // GPURenderPipeline\n bindGroupLayout: any; // GPUBindGroupLayout\n uniformBuffer: any; // GPUBuffer\n bindGroup: any; // GPUBindGroup\n vertexStride: number;\n}\n\nexport interface BandUniforms {\n scale: [number, number];\n translate: [number, number];\n color: [number, number, number, number];\n}\n\n// Same as line uniforms\nconst UNIFORM_BUFFER_SIZE = 32;\n\nexport function createBandPipeline(\n device: any, // GPUDevice\n format: string // GPUTextureFormat\n): BandPipelineBundle {\n const module = device.createShaderModule({ code: LINE_SHADER_WGSL });\n\n const GPUShaderStageAny = (globalThis as any).GPUShaderStage;\n const GPUBufferUsageAny = (globalThis as any).GPUBufferUsage;\n\n // Create bind group layout\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: GPUShaderStageAny.VERTEX | GPUShaderStageAny.FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n\n // Create uniform buffer\n const uniformBuffer = device.createBuffer({\n size: UNIFORM_BUFFER_SIZE,\n usage: GPUBufferUsageAny.UNIFORM | GPUBufferUsageAny.COPY_DST,\n });\n\n // Create bind group\n const bindGroup = device.createBindGroup({\n layout: bindGroupLayout,\n entries: [\n {\n binding: 0,\n resource: { buffer: uniformBuffer },\n },\n ],\n });\n\n // Create pipeline layout\n const pipelineLayout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n\n const pipeline = device.createRenderPipeline({\n layout: pipelineLayout,\n vertex: {\n module,\n entryPoint: \"vs_main\",\n buffers: [\n {\n arrayStride: LINE_VERTEX_STRIDE,\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n ],\n },\n ],\n },\n fragment: {\n module,\n entryPoint: \"fs_main\",\n targets: [\n {\n format,\n blend: {\n color: {\n srcFactor: \"src-alpha\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n },\n },\n ],\n },\n primitive: {\n topology: \"triangle-strip\", // Key difference from line pipeline\n stripIndexFormat: undefined,\n },\n });\n\n return {\n pipeline,\n bindGroupLayout,\n uniformBuffer,\n bindGroup,\n vertexStride: LINE_VERTEX_STRIDE,\n };\n}\n\nexport function updateBandUniforms(\n device: any, // GPUDevice\n uniformBuffer: any, // GPUBuffer\n uniforms: BandUniforms\n): void {\n const data = new Float32Array([\n uniforms.scale[0],\n uniforms.scale[1],\n uniforms.translate[0],\n uniforms.translate[1],\n uniforms.color[0],\n uniforms.color[1],\n uniforms.color[2],\n uniforms.color[3],\n ]);\n device.queue.writeBuffer(uniformBuffer, 0, data);\n}\n","/**\n * Heatmap Shader - WGSL for WebGPU\n * \n * Renders heatmap cells with colormap texture lookup.\n * Each vertex has position (x, y) and value (z) for color mapping.\n */\n\nexport const HEATMAP_SHADER_WGSL = `\n// Uniform buffer for transforms and value range\nstruct Uniforms {\n scale: vec2<f32>,\n translate: vec2<f32>,\n minValue: f32,\n maxValue: f32,\n _padding: vec2<f32>,\n};\n\n@group(0) @binding(0)\nvar<uniform> uniforms: Uniforms;\n\n@group(0) @binding(1)\nvar colormapSampler: sampler;\n\n@group(0) @binding(2)\nvar colormapTexture: texture_1d<f32>;\n\nstruct VSInput {\n @location(0) position: vec2<f32>,\n @location(1) value: f32,\n};\n\nstruct VSOutput {\n @builtin(position) pos: vec4<f32>,\n @location(0) value: f32,\n};\n\n@vertex\nfn vs_main(in: VSInput) -> VSOutput {\n var out: VSOutput;\n let transformed = in.position * uniforms.scale + uniforms.translate;\n out.pos = vec4<f32>(transformed, 0.0, 1.0);\n out.value = in.value;\n return out;\n}\n\n@fragment\nfn fs_main(in: VSOutput) -> @location(0) vec4<f32> {\n let range = uniforms.maxValue - uniforms.minValue;\n var t: f32;\n if (range != 0.0) {\n t = (in.value - uniforms.minValue) / range;\n } else {\n t = 0.0;\n }\n t = clamp(t, 0.0, 1.0);\n \n return textureSample(colormapTexture, colormapSampler, t);\n}\n`;\n\n// Heatmap vertex: position (2 floats) + value (1 float) = 12 bytes\nexport const HEATMAP_VERTEX_STRIDE = 3 * 4; // 12 bytes\n","/**\n * Heatmap Pipeline - WebGPU pipeline for rendering heatmaps with colormap textures\n * \n * Uses `any` types for WebGPU objects to avoid requiring @webgpu/types.\n */\n\nimport { HEATMAP_SHADER_WGSL, HEATMAP_VERTEX_STRIDE } from \"../shaders/heatmap.wgsl\";\n\nexport interface HeatmapPipelineBundle {\n pipeline: any; // GPURenderPipeline\n bindGroupLayout: any; // GPUBindGroupLayout\n uniformBuffer: any; // GPUBuffer\n sampler: any; // GPUSampler\n vertexStride: number;\n}\n\nexport interface HeatmapUniforms {\n scale: [number, number];\n translate: [number, number];\n minValue: number;\n maxValue: number;\n}\n\n// Uniform buffer layout: scale(2) + translate(2) + minValue(1) + maxValue(1) + padding(2) = 8 floats = 32 bytes\nconst UNIFORM_BUFFER_SIZE = 32;\n\nexport function createHeatmapPipeline(\n device: any, // GPUDevice\n format: string // GPUTextureFormat\n): HeatmapPipelineBundle {\n const module = device.createShaderModule({ code: HEATMAP_SHADER_WGSL });\n\n const GPUShaderStageAny = (globalThis as any).GPUShaderStage;\n const GPUBufferUsageAny = (globalThis as any).GPUBufferUsage;\n\n // Create bind group layout\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: GPUShaderStageAny.VERTEX | GPUShaderStageAny.FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n {\n binding: 1,\n visibility: GPUShaderStageAny.FRAGMENT,\n sampler: {},\n },\n {\n binding: 2,\n visibility: GPUShaderStageAny.FRAGMENT,\n texture: { \n sampleType: \"float\",\n viewDimension: \"1d\",\n },\n },\n ],\n });\n\n // Create uniform buffer\n const uniformBuffer = device.createBuffer({\n size: UNIFORM_BUFFER_SIZE,\n usage: GPUBufferUsageAny.UNIFORM | GPUBufferUsageAny.COPY_DST,\n });\n\n // Create sampler\n const sampler = device.createSampler({\n magFilter: \"linear\",\n minFilter: \"linear\",\n addressModeU: \"clamp-to-edge\",\n });\n\n // Create pipeline layout\n const pipelineLayout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n\n const pipeline = device.createRenderPipeline({\n layout: pipelineLayout,\n vertex: {\n module,\n entryPoint: \"vs_main\",\n buffers: [\n {\n arrayStride: HEATMAP_VERTEX_STRIDE,\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" }, // position\n { shaderLocation: 1, offset: 8, format: \"float32\" }, // value\n ],\n },\n ],\n },\n fragment: {\n module,\n entryPoint: \"fs_main\",\n targets: [\n {\n format,\n blend: {\n color: {\n srcFactor: \"src-alpha\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n },\n },\n ],\n },\n primitive: {\n topology: \"triangle-list\",\n cullMode: \"none\",\n },\n });\n\n return {\n pipeline,\n bindGroupLayout,\n uniformBuffer,\n sampler,\n vertexStride: HEATMAP_VERTEX_STRIDE,\n };\n}\n\nexport function createHeatmapBindGroup(\n device: any, // GPUDevice\n layout: any, // GPUBindGroupLayout\n uniformBuffer: any, // GPUBuffer\n sampler: any, // GPUSampler\n colormapTexture: any // GPUTexture\n): any { // GPUBindGroup\n return device.createBindGroup({\n layout,\n entries: [\n { binding: 0, resource: { buffer: uniformBuffer } },\n { binding: 1, resource: sampler },\n { binding: 2, resource: colormapTexture.createView() },\n ],\n });\n}\n\nexport function updateHeatmapUniforms(\n device: any, // GPUDevice\n uniformBuffer: any, // GPUBuffer\n uniforms: HeatmapUniforms\n): void {\n const data = new Float32Array([\n uniforms.scale[0],\n uniforms.scale[1],\n uniforms.translate[0],\n uniforms.translate[1],\n uniforms.minValue,\n uniforms.maxValue,\n 0, // padding\n 0, // padding\n ]);\n device.queue.writeBuffer(uniformBuffer, 0, data);\n}\n","import type {\n BufferDescriptor,\n BufferId,\n GpuBackend,\n GpuBackendInfo,\n GpuViewport,\n Texture1DDescriptor,\n TextureId,\n} from \"../../types\";\nimport type { DrawCall, DrawList, PointStyle, HeatmapStyle } from \"../../drawList\";\nimport type { FrameUniforms } from \"../../frame\";\nimport {\n createTrianglePipeline,\n type TrianglePipelineBundle,\n} from \"./pipelines/trianglePipeline\";\nimport {\n createLinePipeline,\n updateLineUniforms,\n type LinePipelineBundle,\n} from \"./pipelines/linePipeline\";\nimport {\n createPointPipeline,\n updatePointUniforms,\n SYMBOL_MAP,\n type PointPipelineBundle,\n} from \"./pipelines/pointPipeline\";\nimport {\n createBandPipeline,\n updateBandUniforms,\n type BandPipelineBundle,\n} from \"./pipelines/bandPipeline\";\nimport {\n createHeatmapPipeline,\n createHeatmapBindGroup,\n updateHeatmapUniforms,\n type HeatmapPipelineBundle,\n} from \"./pipelines/heatmapPipeline\";\n\nexport interface WebGPUBackendOptions {\n powerPreference?: \"low-power\" | \"high-performance\";\n preferredFormat?: string;\n}\n\n/**\n * Calculate transform uniforms from bounds\n */\nfunction calculateUniforms(bounds: {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n}): { scale: [number, number]; translate: [number, number] } {\n const dataWidth = bounds.xMax - bounds.xMin;\n const dataHeight = bounds.yMax - bounds.yMin;\n\n const scaleX = dataWidth > 0 ? 2 / dataWidth : 1;\n const scaleY = dataHeight > 0 ? 2 / dataHeight : 1;\n\n const translateX = -1 - bounds.xMin * scaleX;\n const translateY = -1 - bounds.yMin * scaleY;\n\n return {\n scale: [scaleX, scaleY],\n translate: [translateX, translateY],\n };\n}\n\n/**\n * Parse color from style, returning RGBA values 0-1\n */\nfunction getColorFromStyle(style: any): [number, number, number, number] {\n const color = style?.color ?? [1, 0, 0.3, 1];\n const opacity = style?.opacity ?? 1;\n \n // If color is already RGBA tuple\n if (Array.isArray(color)) {\n return [color[0], color[1], color[2], (color[3] ?? 1) * opacity];\n }\n \n return [1, 0, 0.3, opacity]; // Default magenta\n}\n\nexport class WebGPUBackend implements GpuBackend {\n public readonly info: GpuBackendInfo;\n\n private canvas: HTMLCanvasElement;\n private opts: WebGPUBackendOptions;\n\n private viewport: GpuViewport | null = null;\n\n private adapter: any;\n private device: any;\n private context: any;\n private format: string | null = null;\n\n private buffers = new Map<string, any>();\n private textures = new Map<string, any>();\n\n // Pipelines for different draw types\n private trianglePipeline: TrianglePipelineBundle | null = null;\n private linePipeline: LinePipelineBundle | null = null;\n private pointPipeline: PointPipelineBundle | null = null;\n private bandPipeline: BandPipelineBundle | null = null;\n private heatmapPipeline: HeatmapPipelineBundle | null = null;\n\n // Heatmap bind groups (per texture)\n private heatmapBindGroups = new Map<string, any>();\n\n constructor(canvas: HTMLCanvasElement, opts: WebGPUBackendOptions = {}) {\n this.canvas = canvas;\n this.opts = opts;\n this.info = {\n type: \"webgpu\",\n available: WebGPUBackend.isSupported(),\n };\n }\n\n static isSupported(): boolean {\n return (\n typeof (globalThis as any).navigator !== \"undefined\" &&\n typeof (globalThis as any).navigator.gpu !== \"undefined\"\n );\n }\n\n async init(): Promise<void> {\n if (!this.info.available) {\n throw new Error(\"[gpu] WebGPU not supported\");\n }\n\n const gpu = (globalThis as any).navigator.gpu;\n\n this.adapter = await gpu.requestAdapter({\n powerPreference: this.opts.powerPreference ?? \"high-performance\",\n });\n\n if (!this.adapter) {\n throw new Error(\"[gpu] Failed to request WebGPU adapter\");\n }\n\n this.device = await this.adapter.requestDevice();\n\n const ctx = (this.canvas as any).getContext(\"webgpu\");\n if (!ctx) {\n throw new Error(\"[gpu] Failed to get WebGPU canvas context\");\n }\n\n this.context = ctx;\n\n const format =\n this.opts.preferredFormat ??\n (gpu.getPreferredCanvasFormat\n ? gpu.getPreferredCanvasFormat()\n : \"bgra8unorm\");\n\n this.format = format;\n\n this.context.configure({\n device: this.device,\n format,\n alphaMode: \"premultiplied\",\n });\n }\n\n setViewport(viewport: GpuViewport): void {\n this.viewport = viewport;\n const w = Math.max(1, Math.floor(viewport.width * viewport.dpr));\n const h = Math.max(1, Math.floor(viewport.height * viewport.dpr));\n if (this.canvas.width !== w) this.canvas.width = w;\n if (this.canvas.height !== h) this.canvas.height = h;\n }\n\n createOrUpdateBuffer(\n id: BufferId,\n data: ArrayBufferView,\n desc?: Partial<BufferDescriptor>\n ): void {\n if (!this.device) {\n throw new Error(\"[gpu] WebGPUBackend not initialized\");\n }\n\n const usage = desc?.usage ?? \"vertex\";\n const GPUBufferUsageAny = (globalThis as any).GPUBufferUsage;\n if (!GPUBufferUsageAny) {\n throw new Error(\n \"[gpu] GPUBufferUsage not available (missing WebGPU runtime)\"\n );\n }\n\n const usageFlags =\n usage === \"index\"\n ? GPUBufferUsageAny.INDEX | GPUBufferUsageAny.COPY_DST\n : usage === \"uniform\"\n ? GPUBufferUsageAny.UNIFORM | GPUBufferUsageAny.COPY_DST\n : GPUBufferUsageAny.VERTEX | GPUBufferUsageAny.COPY_DST;\n\n const byteLength = data.byteLength;\n\n let buf = this.buffers.get(id);\n if (!buf || buf.size < byteLength) {\n if (buf) {\n try {\n buf.destroy();\n } catch {}\n }\n buf = this.device.createBuffer({\n size: Math.max(4, byteLength),\n usage: usageFlags,\n });\n this.buffers.set(id, buf);\n }\n\n this.device.queue.writeBuffer(\n buf,\n 0,\n data.buffer,\n data.byteOffset,\n data.byteLength\n );\n }\n\n deleteBuffer(id: BufferId): void {\n const buf = this.buffers.get(id);\n if (buf) {\n try {\n buf.destroy();\n } catch {}\n this.buffers.delete(id);\n }\n }\n\n createOrUpdateTexture1D(\n id: TextureId,\n data: Uint8Array,\n desc?: Partial<Texture1DDescriptor>\n ): void {\n if (!this.device) {\n throw new Error(\"[gpu] WebGPUBackend not initialized\");\n }\n\n const width = desc?.width ?? Math.floor(data.length / 4);\n const format = desc?.format ?? \"rgba8unorm\";\n\n const GPUTextureUsageAny = (globalThis as any).GPUTextureUsage;\n if (!GPUTextureUsageAny) {\n throw new Error(\n \"[gpu] GPUTextureUsage not available (missing WebGPU runtime)\"\n );\n }\n\n let tex = this.textures.get(id);\n if (!tex) {\n tex = this.device.createTexture({\n size: { width, height: 1, depthOrArrayLayers: 1 },\n format,\n dimension: \"1d\",\n usage: GPUTextureUsageAny.TEXTURE_BINDING | GPUTextureUsageAny.COPY_DST,\n });\n this.textures.set(id, tex);\n \n // Invalidate heatmap bind group for this texture\n this.heatmapBindGroups.delete(id);\n }\n\n this.device.queue.writeTexture(\n { texture: tex },\n data,\n { bytesPerRow: width * 4 },\n { width, height: 1, depthOrArrayLayers: 1 }\n );\n }\n\n deleteTexture(id: TextureId): void {\n const tex = this.textures.get(id);\n if (tex) {\n try {\n tex.destroy();\n } catch {}\n this.textures.delete(id);\n this.heatmapBindGroups.delete(id);\n }\n }\n\n /**\n * Initialize all pipelines lazily\n */\n private ensurePipelines(): void {\n if (!this.trianglePipeline) {\n this.trianglePipeline = createTrianglePipeline(this.device, this.format!);\n }\n if (!this.linePipeline) {\n this.linePipeline = createLinePipeline(this.device, this.format!);\n }\n if (!this.pointPipeline) {\n this.pointPipeline = createPointPipeline(this.device, this.format!);\n }\n if (!this.bandPipeline) {\n this.bandPipeline = createBandPipeline(this.device, this.format!);\n }\n if (!this.heatmapPipeline) {\n this.heatmapPipeline = createHeatmapPipeline(this.device, this.format!);\n }\n }\n\n render(drawList: DrawList, frame: FrameUniforms): void {\n if (!this.device || !this.context || !this.format) {\n throw new Error(\"[gpu] WebGPUBackend not initialized\");\n }\n\n if (!this.viewport) {\n this.setViewport(frame.viewport);\n }\n\n this.ensurePipelines();\n\n const encoder = this.device.createCommandEncoder();\n const view = this.context.getCurrentTexture().createView();\n\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view,\n clearValue: {\n r: frame.clearColor[0],\n g: frame.clearColor[1],\n b: frame.clearColor[2],\n a: frame.clearColor[3],\n },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n\n // Default bounds (NDC if not specified)\n const defaultBounds = { xMin: -1, xMax: 1, yMin: -1, yMax: 1 };\n\n for (const item of drawList.items) {\n if (!item.visible) continue;\n\n const buf = this.buffers.get(item.bufferId);\n if (!buf) continue;\n\n this.renderDrawCall(pass, item, buf, defaultBounds);\n }\n\n pass.end();\n this.device.queue.submit([encoder.finish()]);\n }\n\n /**\n * Render with explicit bounds (for integration with chart system)\n */\n renderWithBounds(\n drawList: DrawList,\n frame: FrameUniforms,\n bounds: { xMin: number; xMax: number; yMin: number; yMax: number }\n ): void {\n if (!this.device || !this.context || !this.format) {\n throw new Error(\"[gpu] WebGPUBackend not initialized\");\n }\n\n if (!this.viewport) {\n this.setViewport(frame.viewport);\n }\n\n this.ensurePipelines();\n\n const encoder = this.device.createCommandEncoder();\n const view = this.context.getCurrentTexture().createView();\n\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view,\n clearValue: {\n r: frame.clearColor[0],\n g: frame.clearColor[1],\n b: frame.clearColor[2],\n a: frame.clearColor[3],\n },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n\n for (const item of drawList.items) {\n if (!item.visible) continue;\n\n const buf = this.buffers.get(item.bufferId);\n if (!buf) continue;\n\n // Use item's yBounds if specified, otherwise use global bounds\n const itemBounds = item.yBounds\n ? { ...bounds, yMin: item.yBounds.min, yMax: item.yBounds.max }\n : bounds;\n\n this.renderDrawCall(pass, item, buf, itemBounds);\n }\n\n pass.end();\n this.device.queue.submit([encoder.finish()]);\n }\n\n /**\n * Render a single draw call\n */\n private renderDrawCall(\n pass: any,\n item: DrawCall,\n buf: any,\n bounds: { xMin: number; xMax: number; yMin: number; yMax: number }\n ): void {\n const uniforms = calculateUniforms(bounds);\n const color = getColorFromStyle(item.style);\n\n switch (item.kind) {\n case \"triangles\":\n case \"bar\":\n this.renderSolidTriangles(pass, buf, item.count, uniforms, color);\n break;\n\n case \"line\":\n this.renderLine(pass, buf, item.count, uniforms, color);\n break;\n\n case \"scatter\":\n case \"points\":\n this.renderPoints(pass, buf, item.count, uniforms, color, item.style as PointStyle);\n break;\n\n case \"line+scatter\":\n this.renderLine(pass, buf, item.count, uniforms, color);\n this.renderPoints(pass, buf, item.count, uniforms, color, item.style as PointStyle);\n break;\n\n case \"step\":\n // Use step buffer if available\n if (item.stepBufferId && item.stepCount) {\n const stepBuf = this.buffers.get(item.stepBufferId);\n if (stepBuf) {\n this.renderLine(pass, stepBuf, item.stepCount, uniforms, color);\n }\n } else {\n this.renderLine(pass, buf, item.count, uniforms, color);\n }\n break;\n\n case \"step+scatter\":\n if (item.stepBufferId && item.stepCount) {\n const stepBuf = this.buffers.get(item.stepBufferId);\n if (stepBuf) {\n this.renderLine(pass, stepBuf, item.stepCount, uniforms, color);\n }\n } else {\n this.renderLine(pass, buf, item.count, uniforms, color);\n }\n this.renderPoints(pass, buf, item.count, uniforms, color, item.style as PointStyle);\n break;\n\n case \"band\":\n // Band uses semi-transparent color\n const bandColor: [number, number, number, number] = [\n color[0],\n color[1],\n color[2],\n color[3] * 0.4,\n ];\n this.renderBand(pass, buf, item.count, uniforms, bandColor);\n break;\n\n case \"heatmap\":\n this.renderHeatmap(pass, buf, item.count, uniforms, item.style as HeatmapStyle, item.textureId);\n break;\n }\n }\n\n /** Triangle list with line-pipeline uniforms (xy vertices, uniform color). */\n private renderSolidTriangles(\n pass: any,\n buf: any,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number],\n ): void {\n updateLineUniforms(this.device, this.linePipeline!.uniformBuffer, {\n scale: uniforms.scale,\n translate: uniforms.translate,\n color,\n });\n pass.setPipeline(this.linePipeline!.pipeline);\n pass.setBindGroup(0, this.linePipeline!.bindGroup);\n pass.setVertexBuffer(0, buf);\n pass.draw(count);\n }\n\n private renderLine(\n pass: any,\n buf: any,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n ): void {\n updateLineUniforms(this.device, this.linePipeline!.uniformBuffer, {\n scale: uniforms.scale,\n translate: uniforms.translate,\n color,\n });\n pass.setPipeline(this.linePipeline!.pipeline);\n pass.setBindGroup(0, this.linePipeline!.bindGroup);\n pass.setVertexBuffer(0, buf);\n pass.draw(count);\n }\n\n private renderPoints(\n pass: any,\n buf: any,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number],\n style?: PointStyle\n ): void {\n const pointSize = (style?.pointSize ?? 4) * (this.viewport?.dpr ?? 1);\n const symbol = SYMBOL_MAP[style?.symbol ?? \"circle\"] ?? 0;\n const viewport: [number, number] = [\n this.canvas.width,\n this.canvas.height,\n ];\n\n updatePointUniforms(this.device, this.pointPipeline!.uniformBuffer, {\n scale: uniforms.scale,\n translate: uniforms.translate,\n color,\n pointSize,\n symbol,\n viewport,\n });\n\n pass.setPipeline(this.pointPipeline!.pipeline);\n pass.setBindGroup(0, this.pointPipeline!.bindGroup);\n pass.setVertexBuffer(0, buf); // Point positions (instanced)\n pass.setVertexBuffer(1, this.pointPipeline!.quadBuffer); // Quad vertices\n pass.draw(6, count); // 6 vertices per quad, count instances\n }\n\n private renderBand(\n pass: any,\n buf: any,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n ): void {\n updateBandUniforms(this.device, this.bandPipeline!.uniformBuffer, {\n scale: uniforms.scale,\n translate: uniforms.translate,\n color,\n });\n pass.setPipeline(this.bandPipeline!.pipeline);\n pass.setBindGroup(0, this.bandPipeline!.bindGroup);\n pass.setVertexBuffer(0, buf);\n pass.draw(count);\n }\n\n private renderHeatmap(\n pass: any,\n buf: any,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n style?: HeatmapStyle,\n textureId?: string\n ): void {\n if (!textureId) return;\n \n const tex = this.textures.get(textureId);\n if (!tex) return;\n\n const zBounds = style?.zBounds ?? { min: 0, max: 1 };\n\n updateHeatmapUniforms(this.device, this.heatmapPipeline!.uniformBuffer, {\n scale: uniforms.scale,\n translate: uniforms.translate,\n minValue: zBounds.min,\n maxValue: zBounds.max,\n });\n\n // Get or create bind group for this texture\n let bindGroup = this.heatmapBindGroups.get(textureId);\n if (!bindGroup) {\n bindGroup = createHeatmapBindGroup(\n this.device,\n this.heatmapPipeline!.bindGroupLayout,\n this.heatmapPipeline!.uniformBuffer,\n this.heatmapPipeline!.sampler,\n tex\n );\n this.heatmapBindGroups.set(textureId, bindGroup);\n }\n\n pass.setPipeline(this.heatmapPipeline!.pipeline);\n pass.setBindGroup(0, bindGroup);\n pass.setVertexBuffer(0, buf);\n pass.draw(count);\n }\n\n destroy(): void {\n for (const id of Array.from(this.buffers.keys())) {\n this.deleteBuffer(id);\n }\n for (const id of Array.from(this.textures.keys())) {\n this.deleteTexture(id);\n }\n\n this.trianglePipeline = null;\n this.linePipeline = null;\n this.pointPipeline = null;\n this.bandPipeline = null;\n this.heatmapPipeline = null;\n this.heatmapBindGroups.clear();\n\n this.device = undefined;\n this.adapter = undefined;\n this.context = undefined;\n this.format = null;\n }\n}\n","/**\n * WebGL Shader Sources\n * \n * GLSL shaders for the WebGL backend.\n * These match the functionality of the WebGPU WGSL shaders.\n */\n\n// ============================================\n// Line Shader\n// ============================================\n\nexport const LINE_VERT_GLSL = `\nprecision highp float;\nattribute vec2 aPosition;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\n\nvoid main() {\n vec2 pos = aPosition * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n}\n`;\n\nexport const LINE_FRAG_GLSL = `\nprecision highp float;\nuniform vec4 uColor;\n\nvoid main() {\n gl_FragColor = uColor;\n}\n`;\n\n// ============================================\n// Point Shader (with SDF symbols)\n// ============================================\n\nexport const POINT_VERT_GLSL = `\nprecision highp float;\nattribute vec2 aPosition;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\nuniform float uPointSize;\n\nvoid main() {\n vec2 pos = aPosition * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n gl_PointSize = uPointSize;\n}\n`;\n\nexport const POINT_FRAG_GLSL = `\nprecision highp float;\nuniform vec4 uColor;\nuniform int uSymbol;\n\nfloat sdCircle(vec2 p, float r) {\n return length(p) - r;\n}\n\nfloat sdBox(vec2 p, vec2 b) {\n vec2 d = abs(p) - b;\n return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);\n}\n\nfloat sdTriangle(vec2 p, float r) {\n const float k = sqrt(3.0);\n p.x = abs(p.x) - r;\n p.y = p.y + r / k;\n if (p.x + k * p.y > 0.0) p = vec2(p.x - k * p.y, -k * p.x - p.y) / 2.0;\n p.x -= clamp(p.x, -2.0 * r, 0.0);\n return -length(p) * sign(p.y);\n}\n\nfloat sdDiamond(vec2 p, float r) {\n return (abs(p.x) + abs(p.y)) - r;\n}\n\nfloat sdCross(vec2 p, float r, float thickness) {\n vec2 d = abs(p);\n float s1 = sdBox(d, vec2(r, thickness));\n float s2 = sdBox(d, vec2(thickness, r));\n return min(s1, s2);\n}\n\nfloat sdX(vec2 p, float r, float thickness) {\n float c = cos(0.785398);\n float s = sin(0.785398);\n mat2 m = mat2(c, -s, s, c);\n return sdCross(m * p, r, thickness);\n}\n\nfloat sdStar(vec2 p, float r, float rf) {\n const vec2 k1 = vec2(0.80901699, -0.58778525);\n const vec2 k2 = vec2(-k1.x, k1.y);\n p.x = abs(p.x);\n p -= 2.0 * max(dot(k1, p), 0.0) * k1;\n p -= 2.0 * max(dot(k2, p), 0.0) * k2;\n p.x = abs(p.x);\n p.y -= r;\n vec2 ba = rf * vec2(-k1.y, k1.x) - vec2(0, 1);\n float h = clamp(dot(p, ba) / dot(ba, ba), 0.0, r);\n return length(p - ba * h) * sign(p.y * ba.x - p.x * ba.y);\n}\n\nvoid main() {\n vec2 p = gl_PointCoord - vec2(0.5);\n float d = 0.0;\n\n if (uSymbol == 0) {\n d = sdCircle(p, 0.45);\n } else if (uSymbol == 1) {\n d = sdBox(p, vec2(0.35));\n } else if (uSymbol == 2) {\n d = sdDiamond(p, 0.45);\n } else if (uSymbol == 3) {\n d = sdTriangle(vec2(p.x, p.y + 0.1), 0.4);\n } else if (uSymbol == 4) {\n d = sdTriangle(vec2(p.x, -p.y + 0.1), 0.4);\n } else if (uSymbol == 5) {\n d = sdCross(p, 0.45, 0.15);\n } else if (uSymbol == 6) {\n d = sdX(p, 0.45, 0.15);\n } else if (uSymbol == 7) {\n d = sdStar(p, 0.45, 0.4);\n }\n\n if (d > 0.02) discard;\n\n float alpha = 1.0 - smoothstep(0.0, 0.02, d);\n gl_FragColor = vec4(uColor.rgb, uColor.a * alpha);\n}\n`;\n\n// ============================================\n// Heatmap Shader\n// ============================================\n\nexport const HEATMAP_VERT_GLSL = `\nprecision highp float;\nattribute vec2 aPosition;\nattribute float aValue;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\nvarying float vValue;\n\nvoid main() {\n gl_Position = vec4(aPosition * uScale + uTranslate, 0.0, 1.0);\n vValue = aValue;\n}\n`;\n\nexport const HEATMAP_FRAG_GLSL = `\nprecision highp float;\nvarying float vValue;\nuniform float uMinValue;\nuniform float uMaxValue;\nuniform sampler2D uColormap;\n\nvoid main() {\n float range = uMaxValue - uMinValue;\n float t = (vValue - uMinValue) / (range != 0.0 ? range : 1.0);\n t = clamp(t, 0.0, 1.0);\n gl_FragColor = texture2D(uColormap, vec2(t, 0.5));\n}\n`;\n\n// ============================================\n// Triangle Shader (for bands and bars)\n// ============================================\n\nexport const TRIANGLE_VERT_GLSL = `\nprecision highp float;\nattribute vec2 aPosition;\nattribute vec4 aColor;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\nvarying vec4 vColor;\n\nvoid main() {\n vec2 pos = aPosition * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n vColor = aColor;\n}\n`;\n\nexport const TRIANGLE_FRAG_GLSL = `\nprecision highp float;\nvarying vec4 vColor;\n\nvoid main() {\n gl_FragColor = vColor;\n}\n`;\n","/**\n * WebGL Program Factory\n * \n * Utilities for compiling and linking WebGL shader programs.\n */\n\nimport {\n LINE_VERT_GLSL,\n LINE_FRAG_GLSL,\n POINT_VERT_GLSL,\n POINT_FRAG_GLSL,\n HEATMAP_VERT_GLSL,\n HEATMAP_FRAG_GLSL,\n} from \"./shaders\";\n\nexport interface ShaderProgram {\n program: WebGLProgram;\n attributes: Record<string, number>;\n uniforms: Record<string, WebGLUniformLocation | null>;\n}\n\n/**\n * Compile a shader\n */\nfunction compileShader(\n gl: WebGLRenderingContext,\n type: number,\n source: string\n): WebGLShader {\n const shader = gl.createShader(type);\n if (!shader) {\n throw new Error(\"[WebGL] Failed to create shader\");\n }\n\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const info = gl.getShaderInfoLog(shader);\n gl.deleteShader(shader);\n throw new Error(`[WebGL] Shader compilation error: ${info}`);\n }\n\n return shader;\n}\n\n/**\n * Link a shader program\n */\nfunction linkProgram(\n gl: WebGLRenderingContext,\n vertShader: WebGLShader,\n fragShader: WebGLShader\n): WebGLProgram {\n const program = gl.createProgram();\n if (!program) {\n throw new Error(\"[WebGL] Failed to create program\");\n }\n\n gl.attachShader(program, vertShader);\n gl.attachShader(program, fragShader);\n gl.linkProgram(program);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const info = gl.getProgramInfoLog(program);\n gl.deleteProgram(program);\n throw new Error(`[WebGL] Program link error: ${info}`);\n }\n\n return program;\n}\n\n/**\n * Create a shader program from source\n */\nexport function createProgram(\n gl: WebGLRenderingContext,\n vertSource: string,\n fragSource: string,\n attributeNames: string[],\n uniformNames: string[]\n): ShaderProgram {\n const vertShader = compileShader(gl, gl.VERTEX_SHADER, vertSource);\n const fragShader = compileShader(gl, gl.FRAGMENT_SHADER, fragSource);\n const program = linkProgram(gl, vertShader, fragShader);\n\n // Clean up individual shaders (they're linked now)\n gl.deleteShader(vertShader);\n gl.deleteShader(fragShader);\n\n // Get attribute locations\n const attributes: Record<string, number> = {};\n for (const name of attributeNames) {\n attributes[name] = gl.getAttribLocation(program, name);\n }\n\n // Get uniform locations\n const uniforms: Record<string, WebGLUniformLocation | null> = {};\n for (const name of uniformNames) {\n uniforms[name] = gl.getUniformLocation(program, name);\n }\n\n return { program, attributes, uniforms };\n}\n\n/**\n * All programs used by the WebGL backend\n */\nexport interface ProgramBundle {\n line: ShaderProgram;\n point: ShaderProgram;\n heatmap: ShaderProgram;\n}\n\n/**\n * Create all shader programs\n */\nexport function createAllPrograms(gl: WebGLRenderingContext): ProgramBundle {\n const line = createProgram(\n gl,\n LINE_VERT_GLSL,\n LINE_FRAG_GLSL,\n [\"aPosition\"],\n [\"uScale\", \"uTranslate\", \"uColor\"]\n );\n\n const point = createProgram(\n gl,\n POINT_VERT_GLSL,\n POINT_FRAG_GLSL,\n [\"aPosition\"],\n [\"uScale\", \"uTranslate\", \"uColor\", \"uPointSize\", \"uSymbol\"]\n );\n\n const heatmap = createProgram(\n gl,\n HEATMAP_VERT_GLSL,\n HEATMAP_FRAG_GLSL,\n [\"aPosition\", \"aValue\"],\n [\"uScale\", \"uTranslate\", \"uMinValue\", \"uMaxValue\", \"uColormap\"]\n );\n\n return { line, point, heatmap };\n}\n\n/**\n * Destroy all programs\n */\nexport function destroyPrograms(gl: WebGLRenderingContext, bundle: ProgramBundle): void {\n gl.deleteProgram(bundle.line.program);\n gl.deleteProgram(bundle.point.program);\n gl.deleteProgram(bundle.heatmap.program);\n}\n","/**\n * WebGL Backend - GPU abstraction layer implementation for WebGL\n * \n * Provides the same interface as WebGPUBackend for compatibility.\n * This serves as a fallback for browsers without WebGPU support.\n */\n\nimport type {\n BufferDescriptor,\n BufferId,\n GpuBackend,\n GpuBackendInfo,\n GpuViewport,\n Texture1DDescriptor,\n TextureId,\n} from \"../../types\";\nimport type { DrawCall, DrawList, PointStyle, HeatmapStyle } from \"../../drawList\";\nimport type { FrameUniforms } from \"../../frame\";\nimport { createAllPrograms, destroyPrograms, type ProgramBundle } from \"./programFactory\";\n\nexport interface WebGLBackendOptions {\n antialias?: boolean;\n preserveDrawingBuffer?: boolean;\n powerPreference?: \"default\" | \"low-power\" | \"high-performance\";\n}\n\n/**\n * Symbol name to number mapping\n */\nconst SYMBOL_MAP: Record<string, number> = {\n circle: 0,\n square: 1,\n diamond: 2,\n triangle: 3,\n triangleDown: 4,\n cross: 5,\n x: 6,\n star: 7,\n};\n\n/**\n * Calculate transform uniforms from bounds\n */\nfunction calculateUniforms(bounds: {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n}): { scale: [number, number]; translate: [number, number] } {\n const dataWidth = bounds.xMax - bounds.xMin;\n const dataHeight = bounds.yMax - bounds.yMin;\n\n const scaleX = dataWidth > 0 ? 2 / dataWidth : 1;\n const scaleY = dataHeight > 0 ? 2 / dataHeight : 1;\n\n const translateX = -1 - bounds.xMin * scaleX;\n const translateY = -1 - bounds.yMin * scaleY;\n\n return {\n scale: [scaleX, scaleY],\n translate: [translateX, translateY],\n };\n}\n\n/**\n * Get color from style\n */\nfunction getColorFromStyle(style: any): [number, number, number, number] {\n const color = style?.color ?? [1, 0, 0.3, 1];\n const opacity = style?.opacity ?? 1;\n \n if (Array.isArray(color)) {\n return [color[0], color[1], color[2], (color[3] ?? 1) * opacity];\n }\n \n return [1, 0, 0.3, opacity];\n}\n\nexport class WebGLBackend implements GpuBackend {\n public readonly info: GpuBackendInfo;\n\n private canvas: HTMLCanvasElement;\n private opts: WebGLBackendOptions;\n private gl: WebGLRenderingContext | null = null;\n \n private viewport: GpuViewport | null = null;\n private dpr: number = 1;\n\n private programs: ProgramBundle | null = null;\n private buffers = new Map<string, WebGLBuffer>();\n private textures = new Map<string, WebGLTexture>();\n\n constructor(canvas: HTMLCanvasElement, opts: WebGLBackendOptions = {}) {\n this.canvas = canvas;\n this.opts = opts;\n this.info = {\n type: \"webgl\",\n available: WebGLBackend.isSupported(),\n };\n }\n\n static isSupported(): boolean {\n if (typeof document === \"undefined\") return false;\n \n try {\n const canvas = document.createElement(\"canvas\");\n const gl = canvas.getContext(\"webgl\") || canvas.getContext(\"experimental-webgl\");\n return !!gl;\n } catch {\n return false;\n }\n }\n\n async init(): Promise<void> {\n if (!this.info.available) {\n throw new Error(\"[gpu] WebGL not supported\");\n }\n\n const gl = this.canvas.getContext(\"webgl\", {\n alpha: true,\n antialias: this.opts.antialias ?? true,\n preserveDrawingBuffer: this.opts.preserveDrawingBuffer ?? true,\n powerPreference: this.opts.powerPreference ?? \"high-performance\",\n });\n\n if (!gl) {\n throw new Error(\"[gpu] Failed to get WebGL context\");\n }\n\n this.gl = gl;\n\n // Enable blending\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // Create shader programs\n this.programs = createAllPrograms(gl);\n }\n\n setViewport(viewport: GpuViewport): void {\n this.viewport = viewport;\n this.dpr = viewport.dpr;\n \n const w = Math.max(1, Math.floor(viewport.width * viewport.dpr));\n const h = Math.max(1, Math.floor(viewport.height * viewport.dpr));\n \n if (this.canvas.width !== w) this.canvas.width = w;\n if (this.canvas.height !== h) this.canvas.height = h;\n \n if (this.gl) {\n this.gl.viewport(0, 0, w, h);\n }\n }\n\n createOrUpdateBuffer(\n id: BufferId,\n data: ArrayBufferView,\n desc?: Partial<BufferDescriptor>\n ): void {\n if (!this.gl) {\n throw new Error(\"[gpu] WebGLBackend not initialized\");\n }\n\n const gl = this.gl;\n \n let buffer = this.buffers.get(id);\n if (!buffer) {\n buffer = gl.createBuffer()!;\n this.buffers.set(id, buffer);\n }\n\n const target = desc?.usage === \"index\" ? gl.ELEMENT_ARRAY_BUFFER : gl.ARRAY_BUFFER;\n \n gl.bindBuffer(target, buffer);\n gl.bufferData(target, data, gl.DYNAMIC_DRAW);\n gl.bindBuffer(target, null);\n }\n\n deleteBuffer(id: BufferId): void {\n if (!this.gl) return;\n \n const buffer = this.buffers.get(id);\n if (buffer) {\n this.gl.deleteBuffer(buffer);\n this.buffers.delete(id);\n }\n }\n\n createOrUpdateTexture1D(\n id: TextureId,\n data: Uint8Array,\n desc?: Partial<Texture1DDescriptor>\n ): void {\n if (!this.gl) {\n throw new Error(\"[gpu] WebGLBackend not initialized\");\n }\n\n const gl = this.gl;\n const width = desc?.width ?? Math.floor(data.length / 4);\n\n let texture = this.textures.get(id);\n if (!texture) {\n texture = gl.createTexture()!;\n this.textures.set(id, texture);\n }\n\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n\n deleteTexture(id: TextureId): void {\n if (!this.gl) return;\n \n const texture = this.textures.get(id);\n if (texture) {\n this.gl.deleteTexture(texture);\n this.textures.delete(id);\n }\n }\n\n render(drawList: DrawList, frame: FrameUniforms): void {\n this.renderWithBounds(drawList, frame, { xMin: -1, xMax: 1, yMin: -1, yMax: 1 });\n }\n\n renderWithBounds(\n drawList: DrawList,\n frame: FrameUniforms,\n bounds: { xMin: number; xMax: number; yMin: number; yMax: number }\n ): void {\n if (!this.gl || !this.programs) {\n throw new Error(\"[gpu] WebGLBackend not initialized\");\n }\n\n const gl = this.gl;\n\n if (!this.viewport) {\n this.setViewport(frame.viewport);\n }\n\n // Clear\n gl.clearColor(\n frame.clearColor[0],\n frame.clearColor[1],\n frame.clearColor[2],\n frame.clearColor[3]\n );\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n // Render each draw call\n for (const item of drawList.items) {\n if (!item.visible) continue;\n\n const buffer = this.buffers.get(item.bufferId);\n if (!buffer) continue;\n\n // Use item's yBounds if specified\n const itemBounds = item.yBounds\n ? { ...bounds, yMin: item.yBounds.min, yMax: item.yBounds.max }\n : bounds;\n\n this.renderDrawCall(item, buffer, itemBounds);\n }\n }\n\n private renderDrawCall(\n item: DrawCall,\n buffer: WebGLBuffer,\n bounds: { xMin: number; xMax: number; yMin: number; yMax: number }\n ): void {\n const uniforms = calculateUniforms(bounds);\n const color = getColorFromStyle(item.style);\n\n switch (item.kind) {\n case \"line\":\n case \"step\":\n this.renderLine(buffer, item.count, uniforms, color);\n break;\n\n case \"scatter\":\n case \"points\":\n this.renderPoints(buffer, item.count, uniforms, color, item.style as PointStyle);\n break;\n\n case \"line+scatter\":\n this.renderLine(buffer, item.count, uniforms, color);\n this.renderPoints(buffer, item.count, uniforms, color, item.style as PointStyle);\n break;\n\n case \"step+scatter\":\n if (item.stepBufferId && item.stepCount) {\n const stepBuffer = this.buffers.get(item.stepBufferId);\n if (stepBuffer) {\n this.renderLine(stepBuffer, item.stepCount, uniforms, color);\n }\n } else {\n this.renderLine(buffer, item.count, uniforms, color);\n }\n this.renderPoints(buffer, item.count, uniforms, color, item.style as PointStyle);\n break;\n\n case \"band\":\n const bandColor: [number, number, number, number] = [\n color[0], color[1], color[2], color[3] * 0.4\n ];\n this.renderBand(buffer, item.count, uniforms, bandColor);\n break;\n\n case \"triangles\":\n case \"bar\":\n this.renderTriangles(buffer, item.count, uniforms, color);\n break;\n\n case \"heatmap\":\n this.renderHeatmap(buffer, item.count, uniforms, item.style as HeatmapStyle, item.textureId);\n break;\n }\n }\n\n private renderLine(\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n ): void {\n const gl = this.gl!;\n const prog = this.programs!.line;\n\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\n gl.enableVertexAttribArray(prog.attributes.aPosition);\n gl.vertexAttribPointer(prog.attributes.aPosition, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale!, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(prog.uniforms.uTranslate!, uniforms.translate[0], uniforms.translate[1]);\n gl.uniform4f(prog.uniforms.uColor!, color[0], color[1], color[2], color[3]);\n\n gl.drawArrays(gl.LINE_STRIP, 0, count);\n gl.disableVertexAttribArray(prog.attributes.aPosition);\n }\n\n private renderPoints(\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number],\n style?: PointStyle\n ): void {\n const gl = this.gl!;\n const prog = this.programs!.point;\n\n const pointSize = (style?.pointSize ?? 4) * this.dpr;\n const symbol = SYMBOL_MAP[style?.symbol ?? \"circle\"] ?? 0;\n\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\n gl.enableVertexAttribArray(prog.attributes.aPosition);\n gl.vertexAttribPointer(prog.attributes.aPosition, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale!, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(prog.uniforms.uTranslate!, uniforms.translate[0], uniforms.translate[1]);\n gl.uniform4f(prog.uniforms.uColor!, color[0], color[1], color[2], color[3]);\n gl.uniform1f(prog.uniforms.uPointSize!, pointSize);\n gl.uniform1i(prog.uniforms.uSymbol!, symbol);\n\n gl.drawArrays(gl.POINTS, 0, count);\n gl.disableVertexAttribArray(prog.attributes.aPosition);\n }\n\n private renderBand(\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n ): void {\n const gl = this.gl!;\n const prog = this.programs!.line;\n\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\n gl.enableVertexAttribArray(prog.attributes.aPosition);\n gl.vertexAttribPointer(prog.attributes.aPosition, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale!, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(prog.uniforms.uTranslate!, uniforms.translate[0], uniforms.translate[1]);\n gl.uniform4f(prog.uniforms.uColor!, color[0], color[1], color[2], color[3]);\n\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, count);\n gl.disableVertexAttribArray(prog.attributes.aPosition);\n }\n\n private renderTriangles(\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n ): void {\n const gl = this.gl!;\n const prog = this.programs!.line;\n\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\n gl.enableVertexAttribArray(prog.attributes.aPosition);\n gl.vertexAttribPointer(prog.attributes.aPosition, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale!, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(prog.uniforms.uTranslate!, uniforms.translate[0], uniforms.translate[1]);\n gl.uniform4f(prog.uniforms.uColor!, color[0], color[1], color[2], color[3]);\n\n gl.drawArrays(gl.TRIANGLES, 0, count);\n gl.disableVertexAttribArray(prog.attributes.aPosition);\n }\n\n private renderHeatmap(\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n style?: HeatmapStyle,\n textureId?: string\n ): void {\n if (!textureId) return;\n \n const texture = this.textures.get(textureId);\n if (!texture) return;\n\n const gl = this.gl!;\n const prog = this.programs!.heatmap;\n\n const zBounds = style?.zBounds ?? { min: 0, max: 1 };\n\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n\n gl.enableVertexAttribArray(prog.attributes.aPosition);\n gl.vertexAttribPointer(prog.attributes.aPosition, 2, gl.FLOAT, false, 12, 0);\n\n if (prog.attributes.aValue !== -1) {\n gl.enableVertexAttribArray(prog.attributes.aValue);\n gl.vertexAttribPointer(prog.attributes.aValue, 1, gl.FLOAT, false, 12, 8);\n }\n\n gl.uniform2f(prog.uniforms.uScale!, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(prog.uniforms.uTranslate!, uniforms.translate[0], uniforms.translate[1]);\n gl.uniform1f(prog.uniforms.uMinValue!, zBounds.min);\n gl.uniform1f(prog.uniforms.uMaxValue!, zBounds.max);\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.uniform1i(prog.uniforms.uColormap!, 0);\n\n gl.drawArrays(gl.TRIANGLES, 0, count);\n\n gl.disableVertexAttribArray(prog.attributes.aPosition);\n if (prog.attributes.aValue !== -1) {\n gl.disableVertexAttribArray(prog.attributes.aValue);\n }\n }\n\n destroy(): void {\n if (!this.gl) return;\n\n const gl = this.gl;\n\n // Delete all buffers\n for (const buffer of this.buffers.values()) {\n gl.deleteBuffer(buffer);\n }\n this.buffers.clear();\n\n // Delete all textures\n for (const texture of this.textures.values()) {\n gl.deleteTexture(texture);\n }\n this.textures.clear();\n\n // Delete programs\n if (this.programs) {\n destroyPrograms(gl, this.programs);\n this.programs = null;\n }\n\n this.gl = null;\n }\n}\n","/**\n * Series Adapter - Converts SciPlot series data to GPU DrawCalls\n * \n * This adapter bridges the gap between the existing SciPlot series system\n * and the new backend-agnostic GPU abstraction layer.\n */\n\nimport type { \n DrawCall, \n DrawList, \n DrawKind, \n PointStyle,\n HeatmapStyle,\n} from \"../drawList\";\nimport type { GpuBackend, BufferId, TextureId, RGBA } from \"../types\";\n\n/**\n * Series style from the original renderer\n */\nexport interface SeriesStyle {\n color?: string | RGBA;\n opacity?: number;\n lineWidth?: number;\n pointSize?: number;\n symbol?: string;\n}\n\n/**\n * Series render data from the chart system\n */\nexport interface SeriesData {\n id: string;\n type: \"line\" | \"scatter\" | \"line+scatter\" | \"step\" | \"step+scatter\" | \"band\" | \"bar\" | \"heatmap\";\n visible: boolean;\n \n /** Main vertex data */\n data: Float32Array;\n \n /** Style properties */\n style: SeriesStyle;\n \n /** For step charts */\n stepData?: Float32Array;\n \n /** Y-axis bounds for multi-axis support */\n yBounds?: { min: number; max: number };\n \n /** For heatmaps */\n zBounds?: { min: number; max: number };\n colormapData?: Uint8Array;\n colormap?: string;\n}\n\n/**\n * Mutable color tuple for internal use\n */\ntype MutableRGBA = [number, number, number, number];\n\n/**\n * Parse color from various formats to RGBA\n */\nexport function parseColorToRGBA(color: string | RGBA | undefined): MutableRGBA {\n if (!color) {\n return [1, 0, 0.3, 1]; // Default magenta\n }\n \n // If already an RGBA tuple, return a copy\n if (Array.isArray(color)) {\n return [color[0], color[1], color[2], color[3] ?? 1];\n }\n \n // At this point, color must be a string\n const colorStr = color as string;\n \n // Parse hex color\n if (colorStr.startsWith(\"#\")) {\n const hex = colorStr.slice(1);\n if (hex.length === 3) {\n const r = parseInt(hex[0] + hex[0], 16) / 255;\n const g = parseInt(hex[1] + hex[1], 16) / 255;\n const b = parseInt(hex[2] + hex[2], 16) / 255;\n return [r, g, b, 1];\n }\n if (hex.length === 6) {\n const r = parseInt(hex.slice(0, 2), 16) / 255;\n const g = parseInt(hex.slice(2, 4), 16) / 255;\n const b = parseInt(hex.slice(4, 6), 16) / 255;\n return [r, g, b, 1];\n }\n if (hex.length === 8) {\n const r = parseInt(hex.slice(0, 2), 16) / 255;\n const g = parseInt(hex.slice(2, 4), 16) / 255;\n const b = parseInt(hex.slice(4, 6), 16) / 255;\n const a = parseInt(hex.slice(6, 8), 16) / 255;\n return [r, g, b, a];\n }\n }\n \n // Parse rgb/rgba\n const rgbaMatch = colorStr.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?\\)/);\n if (rgbaMatch) {\n const r = parseInt(rgbaMatch[1]) / 255;\n const g = parseInt(rgbaMatch[2]) / 255;\n const b = parseInt(rgbaMatch[3]) / 255;\n const a = rgbaMatch[4] ? parseFloat(rgbaMatch[4]) : 1;\n return [r, g, b, a];\n }\n \n return [1, 0, 0.3, 1]; // Fallback\n}\n\n/**\n * Map series type to draw kind\n */\nfunction mapSeriesTypeToDrawKind(type: SeriesData[\"type\"]): DrawKind {\n return type as DrawKind;\n}\n\n/**\n * Convert SeriesStyle to GPU styles\n */\nfunction convertStyle(style: SeriesStyle, type: SeriesData[\"type\"]): DrawCall[\"style\"] {\n const baseColor = parseColorToRGBA(style.color);\n const opacity = style.opacity ?? 1;\n const color: MutableRGBA = [baseColor[0], baseColor[1], baseColor[2], baseColor[3] * opacity];\n \n if (type === \"scatter\" || type === \"line+scatter\" || type === \"step+scatter\") {\n return {\n color: color as RGBA,\n opacity,\n pointSize: style.pointSize ?? 4,\n symbol: (style.symbol ?? \"circle\") as PointStyle[\"symbol\"],\n } as PointStyle;\n }\n \n return {\n color: color as RGBA,\n opacity,\n lineWidth: style.lineWidth ?? 1,\n };\n}\n\n/**\n * Series Adapter class\n * \n * Manages the conversion of chart series to GPU resources and draw calls.\n */\nexport class SeriesAdapter {\n private backend: GpuBackend;\n private seriesBufferMap = new Map<string, BufferId>();\n private seriesStepBufferMap = new Map<string, BufferId>();\n private seriesTextureMap = new Map<string, TextureId>();\n \n constructor(backend: GpuBackend) {\n this.backend = backend;\n }\n \n /**\n * Get buffer ID for a series\n */\n private getBufferId(seriesId: string): BufferId {\n if (!this.seriesBufferMap.has(seriesId)) {\n this.seriesBufferMap.set(seriesId, `series:${seriesId}`);\n }\n return this.seriesBufferMap.get(seriesId)!;\n }\n \n /**\n * Get step buffer ID for a series\n */\n private getStepBufferId(seriesId: string): BufferId {\n if (!this.seriesStepBufferMap.has(seriesId)) {\n this.seriesStepBufferMap.set(seriesId, `series:${seriesId}:step`);\n }\n return this.seriesStepBufferMap.get(seriesId)!;\n }\n \n /**\n * Get texture ID for a series\n */\n private getTextureId(seriesId: string): TextureId {\n if (!this.seriesTextureMap.has(seriesId)) {\n this.seriesTextureMap.set(seriesId, `texture:${seriesId}`);\n }\n return this.seriesTextureMap.get(seriesId)!;\n }\n \n /**\n * Update series data in GPU buffers\n */\n updateSeries(series: SeriesData): void {\n const bufferId = this.getBufferId(series.id);\n \n // Update main buffer\n this.backend.createOrUpdateBuffer(bufferId, series.data, { usage: \"vertex\" });\n \n // Update step buffer if present\n if (series.stepData && (series.type === \"step\" || series.type === \"step+scatter\")) {\n const stepBufferId = this.getStepBufferId(series.id);\n this.backend.createOrUpdateBuffer(stepBufferId, series.stepData, { usage: \"vertex\" });\n }\n \n // Update colormap texture if present\n if (series.type === \"heatmap\" && series.colormapData) {\n const textureId = this.getTextureId(series.id);\n this.backend.createOrUpdateTexture1D(textureId, series.colormapData, {\n width: series.colormapData.length / 4,\n });\n }\n }\n \n /**\n * Remove a series from GPU resources\n */\n removeSeries(seriesId: string): void {\n const bufferId = this.seriesBufferMap.get(seriesId);\n if (bufferId) {\n this.backend.deleteBuffer(bufferId);\n this.seriesBufferMap.delete(seriesId);\n }\n \n const stepBufferId = this.seriesStepBufferMap.get(seriesId);\n if (stepBufferId) {\n this.backend.deleteBuffer(stepBufferId);\n this.seriesStepBufferMap.delete(seriesId);\n }\n \n const textureId = this.seriesTextureMap.get(seriesId);\n if (textureId) {\n this.backend.deleteTexture(textureId);\n this.seriesTextureMap.delete(seriesId);\n }\n }\n \n /**\n * Build draw list from series array\n */\n buildDrawList(seriesArray: SeriesData[]): DrawList {\n const items: DrawCall[] = [];\n \n for (const series of seriesArray) {\n // Update GPU resources\n this.updateSeries(series);\n \n const bufferId = this.getBufferId(series.id);\n const pointCount = series.data.length / 2; // Assuming x,y pairs\n \n const drawCall: DrawCall = {\n id: series.id,\n kind: mapSeriesTypeToDrawKind(series.type),\n bufferId,\n count: series.type === \"heatmap\" ? series.data.length / 3 : pointCount,\n visible: series.visible,\n style: convertStyle(series.style, series.type),\n yBounds: series.yBounds,\n };\n \n // Step buffer\n if (series.stepData && (series.type === \"step\" || series.type === \"step+scatter\")) {\n drawCall.stepBufferId = this.getStepBufferId(series.id);\n drawCall.stepCount = series.stepData.length / 2;\n }\n \n // Heatmap texture\n if (series.type === \"heatmap\") {\n drawCall.textureId = this.getTextureId(series.id);\n (drawCall.style as HeatmapStyle) = {\n zBounds: series.zBounds,\n colormap: series.colormap,\n };\n }\n \n items.push(drawCall);\n }\n \n return { items };\n }\n \n /**\n * Cleanup all resources\n */\n destroy(): void {\n for (const bufferId of this.seriesBufferMap.values()) {\n this.backend.deleteBuffer(bufferId);\n }\n for (const stepBufferId of this.seriesStepBufferMap.values()) {\n this.backend.deleteBuffer(stepBufferId);\n }\n for (const textureId of this.seriesTextureMap.values()) {\n this.backend.deleteTexture(textureId);\n }\n \n this.seriesBufferMap.clear();\n this.seriesStepBufferMap.clear();\n this.seriesTextureMap.clear();\n }\n}\n","/**\n * GPU Renderer Facade - Drop-in replacement for NativeWebGLRenderer\n * \n * Provides the same interface as NativeWebGLRenderer but uses the\n * backend-agnostic GPU abstraction layer. Supports both WebGPU and WebGL.\n */\n\nimport type { GpuBackend, RGBA } from \"../types\";\nimport type { DrawList, DrawCall, PointStyle } from \"../drawList\";\nimport type { FrameUniforms } from \"../frame\";\nimport { WebGPUBackend } from \"../backends/webgpu/WebGPUBackend\";\nimport { WebGLBackend } from \"../backends/webgl/WebGLBackend\";\nimport { SeriesAdapter, parseColorToRGBA } from \"./seriesAdapter\";\nimport type { SeriesStyle } from \"./seriesAdapter\";\nimport type { NativeSeriesRenderData } from \"../../renderer/native/types\";\n\n/**\n * Bounds interface matching the original\n */\nexport interface Bounds {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n}\n\n/**\n * Series render data matching NativeSeriesRenderData\n */\nexport interface GpuSeriesRenderData {\n id: string;\n type: \"line\" | \"scatter\" | \"line+scatter\" | \"step\" | \"step+scatter\" | \"band\" | \"bar\" | \"heatmap\";\n visible: boolean;\n style: SeriesStyle;\n \n /** Y-bounds for multi-axis support */\n yBounds?: { min: number; max: number };\n \n /** Heatmap specific */\n zBounds?: { min: number; max: number };\n colormap?: string;\n}\n\n/**\n * Render options matching NativeRenderOptions\n */\nexport interface GpuRenderOptions {\n bounds: Bounds;\n backgroundColor?: [number, number, number, number];\n plotArea?: { x: number; y: number; width: number; height: number };\n}\n\nexport interface GpuNativeRenderOptions extends GpuRenderOptions {\n invertX?: boolean;\n plotAreaBackground?: [number, number, number, number];\n dpr?: number;\n}\n\n/**\n * Backend preference\n */\nexport type BackendPreference = \"webgpu\" | \"webgl\" | \"auto\";\n\n/**\n * GPU Renderer options\n */\nexport interface GpuRendererOptions {\n backend?: BackendPreference;\n powerPreference?: \"low-power\" | \"high-performance\";\n}\n\n/**\n * GPU Renderer - Unified renderer using the GPU abstraction layer\n */\nexport class GpuRenderer {\n private canvas: HTMLCanvasElement;\n private options: GpuRendererOptions;\n private backend: GpuBackend | null = null;\n private adapter: SeriesAdapter | null = null;\n \n private dpr: number;\n private isInitialized = false;\n private backendType: \"webgpu\" | \"webgl\" | null = null;\n \n // Buffer management\n private bufferDataMap = new Map<string, Float32Array>();\n private stepBufferDataMap = new Map<string, Float32Array>();\n private colormapDataMap = new Map<string, Uint8Array>();\n \n constructor(canvas: HTMLCanvasElement, options: GpuRendererOptions = {}) {\n this.canvas = canvas;\n this.options = options;\n this.dpr = window.devicePixelRatio || 1;\n }\n \n /**\n * Initialize the renderer\n */\n async init(): Promise<boolean> {\n const preference = this.options.backend ?? \"auto\";\n \n // Try WebGPU first if preferred or auto\n if (preference === \"webgpu\" || preference === \"auto\") {\n if (WebGPUBackend.isSupported()) {\n try {\n const backend = new WebGPUBackend(this.canvas, {\n powerPreference: this.options.powerPreference ?? \"high-performance\",\n });\n await backend.init();\n \n this.backend = backend;\n this.backendType = \"webgpu\";\n this.adapter = new SeriesAdapter(backend);\n this.isInitialized = true;\n \n this.resize();\n return true;\n } catch (e) {\n console.warn(\"[GpuRenderer] WebGPU init failed:\", e);\n }\n }\n }\n \n // Fallback to WebGL\n if (preference === \"webgl\" || preference === \"auto\") {\n if (WebGLBackend.isSupported()) {\n try {\n const backend = new WebGLBackend(this.canvas, {\n powerPreference: this.options.powerPreference ?? \"high-performance\",\n });\n await backend.init();\n \n this.backend = backend;\n this.backendType = \"webgl\";\n this.adapter = new SeriesAdapter(backend);\n this.isInitialized = true;\n \n this.resize();\n console.info(\"[GpuRenderer] Using WebGL backend (WebGPU not available)\");\n return true;\n } catch (e) {\n console.warn(\"[GpuRenderer] WebGL init failed:\", e);\n }\n }\n }\n \n return false;\n }\n \n /**\n * Check if renderer is available\n */\n get available(): boolean {\n return this.isInitialized;\n }\n \n /**\n * Get the active backend type\n */\n get activeBackend(): \"webgpu\" | \"webgl\" | null {\n return this.backendType;\n }\n \n /**\n * Set device pixel ratio\n */\n setDPR(dpr: number): void {\n this.dpr = dpr;\n this.resize();\n }\n \n /**\n * Check if vertex data exists for a buffer id\n */\n hasBuffer(id: string): boolean {\n return this.bufferDataMap.has(id) || this.stepBufferDataMap.has(id);\n }\n\n hasColormap(id: string): boolean {\n return this.colormapDataMap.has(id);\n }\n\n /**\n * Render from NativeWebGLRenderer-compatible series descriptors (chart integration path).\n */\n renderNativeSeries(\n series: NativeSeriesRenderData[],\n options: GpuNativeRenderOptions,\n ): void {\n if (!this.isInitialized || !this.backend) return;\n\n const items: DrawCall[] = [];\n\n for (const s of series) {\n if (!s.visible) continue;\n\n if (s.type === \"boxplot\") {\n this.appendBoxplotDraws(s, items);\n continue;\n }\n if (s.type === \"waterfall\") {\n this.appendWaterfallDraws(s, items);\n continue;\n }\n\n if (s.count === 0) continue;\n\n const data = this.bufferDataMap.get(s.id);\n if (!data) continue;\n\n this.backend.createOrUpdateBuffer(s.id, data, { usage: \"vertex\" });\n\n const baseColor = parseColorToRGBA(\n typeof s.style?.color === \"string\" ? s.style.color : \"#00f2ff\",\n );\n const opacity = s.style?.opacity ?? 1;\n const color: [number, number, number, number] = [\n baseColor[0],\n baseColor[1],\n baseColor[2],\n baseColor[3] * opacity,\n ];\n\n const kind = this.mapNativeDrawKind(s.type);\n const drawCall: DrawCall = {\n id: s.id,\n kind,\n bufferId: s.id,\n count: s.count,\n visible: true,\n yBounds: s.yBounds,\n };\n\n if (\n kind === \"scatter\" ||\n kind === \"line+scatter\" ||\n kind === \"step+scatter\" ||\n kind === \"points\"\n ) {\n drawCall.style = {\n color: color as RGBA,\n opacity,\n pointSize: s.style?.pointSize ?? 4,\n symbol: (s.style?.symbol ?? \"circle\") as PointStyle[\"symbol\"],\n };\n } else if (kind === \"heatmap\") {\n drawCall.textureId = `${s.id}_colormap`;\n drawCall.style = {\n zBounds: s.zBounds,\n colormap: s.colormap,\n };\n const colormapData = this.colormapDataMap.get(`${s.id}_colormap`);\n if (colormapData) {\n this.backend.createOrUpdateTexture1D(drawCall.textureId, colormapData, {\n width: colormapData.length / 4,\n });\n }\n } else {\n drawCall.style = {\n color: color as RGBA,\n opacity,\n lineWidth: s.style?.width ?? s.style?.lineWidth ?? 1,\n };\n }\n\n if ((kind === \"step\" || kind === \"step+scatter\") && s.stepBuffer && s.stepCount) {\n const stepId = `${s.id}_step`;\n const stepData = this.stepBufferDataMap.get(stepId);\n if (stepData) {\n this.backend.createOrUpdateBuffer(stepId, stepData, { usage: \"vertex\" });\n drawCall.stepBufferId = stepId;\n drawCall.stepCount = s.stepCount;\n }\n }\n\n items.push(drawCall);\n }\n\n const dpr = options.dpr ?? this.dpr;\n const frame: FrameUniforms = {\n viewport: {\n width: this.canvas.clientWidth,\n height: this.canvas.clientHeight,\n dpr,\n },\n clearColor: (options.backgroundColor ?? [0.1, 0.1, 0.18, 1]) as RGBA,\n bounds: options.bounds,\n plotArea: options.plotArea,\n };\n\n if (\"renderWithBounds\" in this.backend) {\n (this.backend as GpuBackend & {\n renderWithBounds: (\n drawList: DrawList,\n frame: FrameUniforms,\n bounds: GpuRenderOptions[\"bounds\"],\n ) => void;\n }).renderWithBounds({ items }, frame, options.bounds);\n } else {\n this.backend.render({ items }, frame);\n }\n }\n\n private appendBoxplotDraws(s: NativeSeriesRenderData, items: DrawCall[]): void {\n const color = this.seriesColor(s.style);\n const lineStyle = { color, opacity: s.style?.opacity ?? 1, lineWidth: s.style?.width ?? 1 };\n const fillStyle = { color, opacity: (s.style?.opacity ?? 1) * 0.85, lineWidth: 1 };\n\n this.pushDraw(items, `${s.id}_box_faces`, \"bar\", s.boxCount ?? 0, fillStyle, s.yBounds);\n this.pushDraw(items, `${s.id}_box_lines`, \"line\", s.boxLinesCount ?? 0, lineStyle, s.yBounds);\n }\n\n private appendWaterfallDraws(s: NativeSeriesRenderData, items: DrawCall[]): void {\n const style = s.style ?? {};\n const positive = this.colorFromHex(style.positiveColor ?? \"#22c55e\", 0.9);\n const negative = this.colorFromHex(style.negativeColor ?? \"#ef4444\", 0.9);\n const subtotal = this.colorFromHex(style.subtotalColor ?? \"#3b82f6\", 0.9);\n const connector = this.colorFromHex(style.connectorColor ?? \"#64748b\", 0.6);\n\n this.pushDraw(items, `${s.id}_wf_positive`, \"bar\", s.wfPositiveCount ?? 0, { color: positive, opacity: 0.9, lineWidth: 1 }, s.yBounds);\n this.pushDraw(items, `${s.id}_wf_negative`, \"bar\", s.wfNegativeCount ?? 0, { color: negative, opacity: 0.9, lineWidth: 1 }, s.yBounds);\n this.pushDraw(items, `${s.id}_wf_subtotal`, \"bar\", s.wfSubtotalCount ?? 0, { color: subtotal, opacity: 0.9, lineWidth: 1 }, s.yBounds);\n if (style.showConnectors !== false) {\n this.pushDraw(items, `${s.id}_wf_connectors`, \"line\", s.wfConnectorCount ?? 0, { color: connector, opacity: 0.6, lineWidth: 1 }, s.yBounds);\n }\n }\n\n private pushDraw(\n items: DrawCall[],\n bufferId: string,\n kind: DrawCall[\"kind\"],\n count: number,\n style: DrawCall[\"style\"],\n yBounds?: { min: number; max: number },\n ): void {\n if (count <= 0) return;\n const data = this.bufferDataMap.get(bufferId);\n if (!data || !this.backend) return;\n this.backend.createOrUpdateBuffer(bufferId, data, { usage: \"vertex\" });\n items.push({\n id: bufferId,\n kind,\n bufferId,\n count,\n visible: true,\n style,\n yBounds,\n });\n }\n\n private seriesColor(style: NativeSeriesRenderData[\"style\"]): [number, number, number, number] {\n const base = parseColorToRGBA(typeof style?.color === \"string\" ? style.color : \"#00f2ff\");\n const opacity = style?.opacity ?? 1;\n return [base[0], base[1], base[2], base[3] * opacity];\n }\n\n private colorFromHex(hex: string, opacity: number): [number, number, number, number] {\n const c = parseColorToRGBA(hex);\n return [c[0], c[1], c[2], c[3] * opacity];\n }\n\n private mapNativeDrawKind(\n type: NativeSeriesRenderData[\"type\"],\n ): DrawCall[\"kind\"] {\n switch (type) {\n case \"scatter\":\n return \"scatter\";\n case \"line+scatter\":\n return \"line+scatter\";\n case \"step\":\n return \"step\";\n case \"step+scatter\":\n return \"step+scatter\";\n case \"band\":\n return \"band\";\n case \"bar\":\n return \"bar\";\n case \"heatmap\":\n return \"heatmap\";\n default:\n return \"line\";\n }\n }\n\n /**\n * Create or update a buffer\n */\n createBuffer(id: string, data: Float32Array): void {\n this.bufferDataMap.set(id, data);\n }\n \n /**\n * Update a buffer partially\n */\n updateBuffer(id: string, data: Float32Array, offsetInBytes: number): boolean {\n const existing = this.bufferDataMap.get(id);\n if (!existing) return false;\n \n const offsetFloats = offsetInBytes / 4;\n existing.set(data, offsetFloats);\n return true;\n }\n \n /**\n * Get a buffer's data\n */\n getBuffer(id: string): Float32Array | undefined {\n return this.bufferDataMap.get(id);\n }\n \n /**\n * Delete a buffer\n */\n deleteBuffer(id: string): void {\n this.bufferDataMap.delete(id);\n if (this.backend) {\n this.backend.deleteBuffer(id);\n }\n }\n \n /**\n * Create or update a step buffer\n */\n createStepBuffer(id: string, data: Float32Array): void {\n this.stepBufferDataMap.set(id, data);\n }\n \n /**\n * Create colormap texture\n */\n createColormapTexture(id: string, data: Uint8Array): void {\n this.colormapDataMap.set(id, data);\n if (this.backend) {\n this.backend.createOrUpdateTexture1D(id, data, {\n width: data.length / 4,\n });\n }\n }\n \n /**\n * Render a frame\n */\n render(series: GpuSeriesRenderData[], options: GpuRenderOptions): void {\n if (!this.isInitialized || !this.backend) return;\n \n // Build draw list\n const drawList = this.buildDrawList(series);\n \n // Create frame uniforms\n const frame: FrameUniforms = {\n viewport: {\n width: this.canvas.clientWidth,\n height: this.canvas.clientHeight,\n dpr: this.dpr,\n },\n clearColor: (options.backgroundColor ?? [0.1, 0.1, 0.18, 1]) as RGBA,\n bounds: options.bounds,\n plotArea: options.plotArea,\n };\n \n // Render using the backend\n if (\"renderWithBounds\" in this.backend) {\n (this.backend as any).renderWithBounds(drawList, frame, options.bounds);\n } else {\n this.backend.render(drawList, frame);\n }\n }\n \n /**\n * Build draw list from series data\n */\n private buildDrawList(series: GpuSeriesRenderData[]): DrawList {\n const items: DrawCall[] = [];\n \n for (const s of series) {\n const bufferData = this.bufferDataMap.get(s.id);\n if (!bufferData) continue;\n \n // Upload buffer to GPU\n this.backend!.createOrUpdateBuffer(s.id, bufferData, { usage: \"vertex\" });\n \n const pointCount = s.type === \"heatmap\" \n ? bufferData.length / 3 \n : bufferData.length / 2;\n \n const baseColor = parseColorToRGBA(s.style.color);\n const opacity = s.style.opacity ?? 1;\n const color: [number, number, number, number] = [\n baseColor[0], \n baseColor[1], \n baseColor[2], \n baseColor[3] * opacity\n ];\n \n const drawCall: DrawCall = {\n id: s.id,\n kind: s.type,\n bufferId: s.id,\n count: pointCount,\n visible: s.visible,\n yBounds: s.yBounds,\n };\n \n // Set style based on type\n if (s.type === \"scatter\" || s.type === \"line+scatter\" || s.type === \"step+scatter\") {\n drawCall.style = {\n color: color as RGBA,\n opacity,\n pointSize: s.style.pointSize ?? 4,\n symbol: (s.style.symbol ?? \"circle\") as PointStyle[\"symbol\"],\n };\n } else if (s.type === \"heatmap\") {\n drawCall.textureId = `colormap:${s.id}`;\n drawCall.style = {\n zBounds: s.zBounds,\n colormap: s.colormap,\n };\n \n // Upload colormap if available\n const colormapData = this.colormapDataMap.get(s.id);\n if (colormapData) {\n this.backend!.createOrUpdateTexture1D(drawCall.textureId, colormapData, {\n width: colormapData.length / 4,\n });\n }\n } else {\n drawCall.style = {\n color: color as RGBA,\n opacity,\n lineWidth: s.style.lineWidth ?? 1,\n };\n }\n \n // Handle step buffer\n if ((s.type === \"step\" || s.type === \"step+scatter\") && this.stepBufferDataMap.has(s.id)) {\n const stepData = this.stepBufferDataMap.get(s.id)!;\n const stepBufferId = `${s.id}:step`;\n this.backend!.createOrUpdateBuffer(stepBufferId, stepData, { usage: \"vertex\" });\n drawCall.stepBufferId = stepBufferId;\n drawCall.stepCount = stepData.length / 2;\n }\n \n items.push(drawCall);\n }\n \n return { items };\n }\n \n /**\n * Handle canvas resize\n */\n resize(): void {\n if (!this.backend) return;\n \n const rect = this.canvas.getBoundingClientRect();\n this.backend.setViewport({\n width: rect.width,\n height: rect.height,\n dpr: this.dpr,\n });\n }\n \n /**\n * Get renderer limits\n */\n getLimits(): Record<string, unknown> {\n return {\n backend: this.backendType,\n available: this.isInitialized,\n };\n }\n \n /**\n * Destroy the renderer\n */\n destroy(): void {\n this.adapter?.destroy();\n this.backend?.destroy();\n \n this.bufferDataMap.clear();\n this.stepBufferDataMap.clear();\n this.colormapDataMap.clear();\n \n this.adapter = null;\n this.backend = null;\n this.isInitialized = false;\n this.backendType = null;\n }\n}\n\n/**\n * Create a GPU renderer (async)\n */\nexport async function createGpuRenderer(\n canvas: HTMLCanvasElement,\n options?: GpuRendererOptions\n): Promise<GpuRenderer | null> {\n const renderer = new GpuRenderer(canvas, options);\n const success = await renderer.init();\n return success ? renderer : null;\n}\n"],"names":["TRIANGLE_SHADER_WGSL","createTrianglePipeline","device","format","module","vertexStride","LINE_SHADER_WGSL","LINE_VERTEX_STRIDE","UNIFORM_BUFFER_SIZE","createLinePipeline","GPUShaderStageAny","GPUBufferUsageAny","bindGroupLayout","uniformBuffer","bindGroup","pipelineLayout","updateLineUniforms","uniforms","data","POINT_QUAD_SHADER_WGSL","POINT_VERTEX_STRIDE","QUAD_VERTICES","createPointPipeline","quadBuffer","updatePointUniforms","SYMBOL_MAP","createBandPipeline","updateBandUniforms","HEATMAP_SHADER_WGSL","HEATMAP_VERTEX_STRIDE","createHeatmapPipeline","sampler","createHeatmapBindGroup","layout","colormapTexture","updateHeatmapUniforms","calculateUniforms","bounds","dataWidth","dataHeight","scaleX","scaleY","translateX","translateY","getColorFromStyle","style","color","opacity","WebGPUBackend","canvas","opts","__publicField","gpu","ctx","viewport","w","h","id","desc","usage","usageFlags","byteLength","buf","width","GPUTextureUsageAny","tex","drawList","frame","encoder","view","pass","defaultBounds","item","itemBounds","stepBuf","bandColor","count","_a","pointSize","symbol","textureId","zBounds","LINE_VERT_GLSL","LINE_FRAG_GLSL","POINT_VERT_GLSL","POINT_FRAG_GLSL","HEATMAP_VERT_GLSL","HEATMAP_FRAG_GLSL","compileShader","gl","type","source","shader","info","linkProgram","vertShader","fragShader","program","createProgram","vertSource","fragSource","attributeNames","uniformNames","attributes","name","createAllPrograms","line","point","heatmap","destroyPrograms","bundle","WebGLBackend","buffer","target","texture","stepBuffer","prog","parseColorToRGBA","colorStr","hex","r","g","b","a","rgbaMatch","convertStyle","baseColor","SeriesAdapter","backend","seriesId","series","bufferId","stepBufferId","seriesArray","items","pointCount","drawCall","GpuRenderer","options","preference","e","dpr","_b","_c","_d","_e","_f","s","kind","colormapData","stepId","stepData","lineStyle","fillStyle","positive","negative","subtotal","connector","yBounds","base","c","offsetInBytes","existing","offsetFloats","bufferData","rect","createGpuRenderer","renderer"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-BBpJwOct.js","sources":["../src/workers/downsample.ts","../src/workers/downsampleAsync.ts","../src/plugins/virtualization/index.ts"],"sourcesContent":["/**\n * LTTB (Largest-Triangle-Three-Buckets) Downsampling Algorithm\n *\n * This algorithm downsamples time-series data while preserving visual features.\n * It's much better than naive sampling for preserving peaks and valleys.\n *\n * Reference: https://skemman.is/bitstream/1946/15343/3/SS_MSthesis.pdf\n */\n\nexport interface DownsampleResult {\n x: Float32Array;\n y: Float32Array;\n /** Original indices of selected points */\n indices: Uint32Array;\n}\n\n/**\n * Downsample data using LTTB algorithm\n *\n * @param x - X values (e.g., potential)\n * @param y - Y values (e.g., current)\n * @param targetPoints - Number of output points\n * @returns Downsampled data\n */\nexport function lttbDownsample(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n targetPoints: number\n): DownsampleResult {\n const length = x.length;\n\n // No need to downsample\n if (targetPoints >= length || targetPoints <= 2) {\n return {\n x: new Float32Array(x),\n y: new Float32Array(y),\n indices: new Uint32Array(Array.from({ length }, (_, i) => i)),\n };\n }\n\n const outX = new Float32Array(targetPoints);\n const outY = new Float32Array(targetPoints);\n const outIndices = new Uint32Array(targetPoints);\n\n // Always include first point\n outX[0] = x[0];\n outY[0] = y[0];\n outIndices[0] = 0;\n\n // Bucket size\n const bucketSize = (length - 2) / (targetPoints - 2);\n\n let a = 0; // Previous selected point index\n let outIdx = 1;\n\n for (let i = 0; i < targetPoints - 2; i++) {\n // Calculate bucket boundaries\n const bucketStart = Math.floor((i + 1) * bucketSize) + 1;\n const bucketEnd = Math.floor((i + 2) * bucketSize) + 1;\n\n // Calculate average point of next bucket\n const nextBucketStart = Math.min(bucketEnd, length - 1);\n const nextBucketEnd = Math.min(\n Math.floor((i + 3) * bucketSize) + 1,\n length\n );\n\n let avgX = 0;\n let avgY = 0;\n let avgCount = 0;\n\n for (let j = nextBucketStart; j < nextBucketEnd; j++) {\n avgX += x[j];\n avgY += y[j];\n avgCount++;\n }\n\n if (avgCount > 0) {\n avgX /= avgCount;\n avgY /= avgCount;\n }\n\n // Find point in current bucket with largest triangle area\n let maxArea = -1;\n let maxIndex = bucketStart;\n\n const aX = x[a];\n const aY = y[a];\n\n for (let j = bucketStart; j < bucketEnd && j < length; j++) {\n // Calculate triangle area (simplified: |x1(y2-y3) + x2(y3-y1) + x3(y1-y2)| / 2)\n const area = Math.abs(\n (aX - avgX) * (y[j] - aY) - (aX - x[j]) * (avgY - aY)\n );\n\n if (area > maxArea) {\n maxArea = area;\n maxIndex = j;\n }\n }\n\n // Store selected point\n outX[outIdx] = x[maxIndex];\n outY[outIdx] = y[maxIndex];\n outIndices[outIdx] = maxIndex;\n\n a = maxIndex;\n outIdx++;\n }\n\n // Always include last point\n outX[targetPoints - 1] = x[length - 1];\n outY[targetPoints - 1] = y[length - 1];\n outIndices[targetPoints - 1] = length - 1;\n\n return { x: outX, y: outY, indices: outIndices };\n}\n\n/**\n * Min-Max per bucket downsampling\n *\n * Simpler alternative to LTTB that preserves extremes in each bucket.\n * Uses 2 points per bucket (min and max), so output is ~2x target.\n */\nexport function minMaxDownsample(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n bucketCount: number\n): DownsampleResult {\n const length = x.length;\n\n if (bucketCount >= length / 2) {\n return {\n x: new Float32Array(x),\n y: new Float32Array(y),\n indices: new Uint32Array(Array.from({ length }, (_, i) => i)),\n };\n }\n\n const bucketSize = length / bucketCount;\n const outX: number[] = [];\n const outY: number[] = [];\n const outIndices: number[] = [];\n\n for (let b = 0; b < bucketCount; b++) {\n const start = Math.floor(b * bucketSize);\n const end = Math.floor((b + 1) * bucketSize);\n\n let minY = Infinity;\n let maxY = -Infinity;\n let minIdx = start;\n let maxIdx = start;\n\n for (let i = start; i < end && i < length; i++) {\n if (y[i] < minY) {\n minY = y[i];\n minIdx = i;\n }\n if (y[i] > maxY) {\n maxY = y[i];\n maxIdx = i;\n }\n }\n\n // Add points in order (min first if it comes before max)\n if (minIdx <= maxIdx) {\n outX.push(x[minIdx], x[maxIdx]);\n outY.push(y[minIdx], y[maxIdx]);\n outIndices.push(minIdx, maxIdx);\n } else {\n outX.push(x[maxIdx], x[minIdx]);\n outY.push(y[maxIdx], y[minIdx]);\n outIndices.push(maxIdx, minIdx);\n }\n }\n\n return {\n x: new Float32Array(outX),\n y: new Float32Array(outY),\n indices: new Uint32Array(outIndices),\n };\n}\n\n/**\n * Calculate optimal target points based on canvas width\n */\nexport function calculateTargetPoints(\n dataLength: number,\n canvasWidth: number,\n pointsPerPixel = 2\n): number {\n // Never draw more than pointsPerPixel per pixel\n const maxPoints = canvasWidth * pointsPerPixel;\n return Math.min(dataLength, maxPoints);\n}\n\nexport interface OhlcDownsampleResult {\n x: Float32Array;\n open: Float32Array;\n high: Float32Array;\n low: Float32Array;\n close: Float32Array;\n indices: Uint32Array;\n}\n\n/**\n * Aggregate OHLC bars into fewer buckets while preserving extremes.\n * Each bucket: open=first open, close=last close, high=max high, low=min low, x=last x.\n */\nexport function ohlcMinMaxDownsample(\n x: Float32Array | Float64Array,\n open: Float32Array | Float64Array,\n high: Float32Array | Float64Array,\n low: Float32Array | Float64Array,\n close: Float32Array | Float64Array,\n targetBars: number,\n): OhlcDownsampleResult {\n const length = x.length;\n if (targetBars >= length || targetBars <= 1 || length === 0) {\n return {\n x: new Float32Array(x),\n open: new Float32Array(open),\n high: new Float32Array(high),\n low: new Float32Array(low),\n close: new Float32Array(close),\n indices: new Uint32Array(Array.from({ length }, (_, i) => i)),\n };\n }\n\n const bucketSize = length / targetBars;\n const outX: number[] = [];\n const outOpen: number[] = [];\n const outHigh: number[] = [];\n const outLow: number[] = [];\n const outClose: number[] = [];\n const outIndices: number[] = [];\n\n for (let b = 0; b < targetBars; b++) {\n const start = Math.floor(b * bucketSize);\n const end = Math.min(length, Math.floor((b + 1) * bucketSize));\n if (start >= end) continue;\n\n let hi = -Infinity;\n let lo = Infinity;\n let lastIdx = start;\n\n for (let i = start; i < end; i++) {\n if (high[i] > hi) hi = high[i];\n if (low[i] < lo) lo = low[i];\n lastIdx = i;\n }\n\n outOpen.push(open[start]);\n outHigh.push(hi);\n outLow.push(lo);\n outClose.push(close[lastIdx]);\n outX.push(x[lastIdx]);\n outIndices.push(lastIdx);\n }\n\n return {\n x: new Float32Array(outX),\n open: new Float32Array(outOpen),\n high: new Float32Array(outHigh),\n low: new Float32Array(outLow),\n close: new Float32Array(outClose),\n indices: new Uint32Array(outIndices),\n };\n}\n\n/** Binary search lower bound: first index where x[i] >= value */\nexport function lowerBoundX(\n x: Float32Array | Float64Array,\n value: number,\n): number {\n let lo = 0;\n let hi = x.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (x[mid] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\n/** Binary search upper bound: first index where x[i] > value */\nexport function upperBoundX(\n x: Float32Array | Float64Array,\n value: number,\n): number {\n let lo = 0;\n let hi = x.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (x[mid] <= value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\nexport interface ViewportSlice {\n x: Float32Array;\n y?: Float32Array;\n open?: Float32Array;\n high?: Float32Array;\n low?: Float32Array;\n close?: Float32Array;\n start: number;\n end: number;\n}\n\n/**\n * Slice sorted x-series to visible range plus buffer (fraction of visible width).\n */\nexport function sliceSeriesToViewport(\n source: {\n x: Float32Array | Float64Array;\n y?: Float32Array | Float64Array;\n open?: Float32Array | Float64Array;\n high?: Float32Array | Float64Array;\n low?: Float32Array | Float64Array;\n close?: Float32Array | Float64Array;\n },\n xMin: number,\n xMax: number,\n bufferRatio = 0.5,\n): ViewportSlice {\n const length = source.x.length;\n if (length === 0) {\n return { x: new Float32Array(0), start: 0, end: 0 };\n }\n\n const range = Math.max(xMax - xMin, 1e-12);\n const paddedMin = xMin - range * bufferRatio;\n const paddedMax = xMax + range * bufferRatio;\n\n let start = lowerBoundX(source.x, paddedMin);\n let end = upperBoundX(source.x, paddedMax);\n start = Math.max(0, start);\n end = Math.min(length, Math.max(end, start + 1));\n\n const slice = <T extends Float32Array | Float64Array>(arr: T | undefined): Float32Array | undefined => {\n if (!arr) return undefined;\n return new Float32Array(arr.subarray(start, end));\n };\n\n return {\n x: new Float32Array(source.x.subarray(start, end)),\n y: slice(source.y),\n open: slice(source.open),\n high: slice(source.high),\n low: slice(source.low),\n close: slice(source.close),\n start,\n end,\n };\n}\n","/**\n * Async downsampling via shared worker pool (main-thread fallback in Node/tests).\n * @module workers/downsampleAsync\n */\n\nimport {\n lttbDownsample,\n minMaxDownsample,\n ohlcMinMaxDownsample,\n type OhlcDownsampleResult,\n type DownsampleResult,\n} from \"./downsample\";\nimport { WorkerPool, nextTaskId } from \"./pool\";\n\ntype DownsampleTask = {\n id: string;\n type: \"downsample\";\n x: Float32Array;\n y: Float32Array;\n targetPoints: number;\n algorithm: \"lttb\" | \"minmax\";\n};\n\ntype OhlcDownsampleTask = {\n id: string;\n type: \"ohlc-downsample\";\n x: Float32Array;\n open: Float32Array;\n high: Float32Array;\n low: Float32Array;\n close: Float32Array;\n targetBars: number;\n};\n\ntype DownsampleWorkerResult =\n | {\n id: string;\n type: \"downsample-result\";\n x: Float32Array;\n y: Float32Array;\n }\n | {\n id: string;\n type: \"ohlc-downsample-result\";\n x: Float32Array;\n open: Float32Array;\n high: Float32Array;\n low: Float32Array;\n close: Float32Array;\n }\n | { id: string; type: \"error\"; error: string };\n\nlet pool: WorkerPool<DownsampleTask | OhlcDownsampleTask, DownsampleWorkerResult> | null = null;\n\nfunction getPool() {\n if (pool) return pool;\n\n pool = new WorkerPool<DownsampleTask | OhlcDownsampleTask, DownsampleWorkerResult>(\n () => new Worker(new URL(\"./downsample.worker.ts\", import.meta.url), { type: \"module\" }),\n {\n poolSize: 2,\n syncFallback: true,\n syncHandler: (task) => {\n if (task.type === \"downsample\") {\n const result =\n task.algorithm === \"minmax\"\n ? minMaxDownsample(task.x, task.y, Math.ceil(task.targetPoints / 2))\n : lttbDownsample(task.x, task.y, task.targetPoints);\n return { id: task.id, type: \"downsample-result\", x: result.x, y: result.y };\n }\n\n const result = ohlcMinMaxDownsample(\n task.x,\n task.open,\n task.high,\n task.low,\n task.close,\n task.targetBars,\n );\n return {\n id: task.id,\n type: \"ohlc-downsample-result\",\n x: result.x,\n open: result.open,\n high: result.high,\n low: result.low,\n close: result.close,\n };\n },\n },\n );\n\n return pool;\n}\n\nexport async function downsampleAsync(\n x: Float32Array,\n y: Float32Array,\n targetPoints: number,\n algorithm: \"lttb\" | \"minmax\" = \"lttb\",\n): Promise<DownsampleResult> {\n const id = nextTaskId(\"downsample\");\n const result = await getPool().run({\n id,\n type: \"downsample\",\n x,\n y,\n targetPoints,\n algorithm,\n });\n\n // Worker/pool failures surface as a rejected run() promise (sync fallback or\n // reject), so a resolved value is always a success payload; we only guard the\n // shape here.\n if (result.type !== \"downsample-result\") {\n throw new Error(\"Unexpected downsample worker response\");\n }\n\n return {\n x: result.x,\n y: result.y,\n indices: new Uint32Array(result.x.length),\n };\n}\n\nexport async function ohlcDownsampleAsync(\n x: Float32Array,\n open: Float32Array,\n high: Float32Array,\n low: Float32Array,\n close: Float32Array,\n targetBars: number,\n): Promise<OhlcDownsampleResult> {\n const id = nextTaskId(\"ohlc-downsample\");\n const result = await getPool().run({\n id,\n type: \"ohlc-downsample\",\n x,\n open,\n high,\n low,\n close,\n targetBars,\n });\n\n if (result.type !== \"ohlc-downsample-result\") {\n throw new Error(\"Unexpected OHLC downsample worker response\");\n }\n\n return {\n x: result.x,\n open: result.open,\n high: result.high,\n low: result.low,\n close: result.close,\n indices: new Uint32Array(result.x.length),\n };\n}\n\nexport function destroyDownsamplePool(): void {\n pool?.destroy();\n pool = null;\n}\n\nexport function getDownsamplePoolSize(): number {\n return pool?.size() ?? 0;\n}\n","/**\n * @fileoverview Data virtualization plugin (LOD/min-max)\n * @module plugins/virtualization\n */\n\nimport type {\n PluginVirtualizationConfig,\n VirtualizationAPI,\n VirtualizationStats,\n VirtualizationMode,\n VirtualizationStrategy,\n} from \"./types\";\nimport type { ChartPlugin, PluginContext, PluginManifest } from \"../types\";\nimport type { Series } from \"../../core/Series\";\nimport type { SeriesUpdateData } from \"../../types\";\nimport {\n lttbDownsample,\n minMaxDownsample,\n ohlcMinMaxDownsample,\n calculateTargetPoints,\n sliceSeriesToViewport,\n} from \"../../workers/downsample\";\nimport { downsampleAsync, ohlcDownsampleAsync } from \"../../workers/downsampleAsync\";\n\nconst manifest: PluginManifest = {\n name: \"velo-plot-virtualization\",\n version: \"1.0.0\",\n description: \"Viewport-aware data virtualization with LOD strategies\",\n provides: [\"performance\", \"data-virtualization\"],\n tags: [\"performance\", \"lod\", \"virtualization\"],\n};\n\nconst DEFAULT_CONFIG: Required<PluginVirtualizationConfig> = {\n enabled: true,\n precision: \"lod\",\n mode: \"lod\",\n targetPoints: \"auto\",\n pointsPerPixel: 2,\n lodLevels: [1, 4, 8, 16],\n strategy: \"lttb\",\n reuseOriginalData: true,\n syncWithLazyLoad: true,\n includeSeries: [],\n excludeSeries: [],\n debug: false,\n viewportBuffer: 0.5,\n useWorker: true,\n workerThreshold: 250_000,\n};\n\ntype SeriesCache = {\n x: Float32Array | Float64Array;\n y?: Float32Array | Float64Array;\n open?: Float32Array | Float64Array;\n high?: Float32Array | Float64Array;\n low?: Float32Array | Float64Array;\n close?: Float32Array | Float64Array;\n};\n\nexport function PluginVirtualization(\n userConfig: Partial<PluginVirtualizationConfig> = {}\n): ChartPlugin<PluginVirtualizationConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n let isInternalUpdate = false;\n\n const originalData = new Map<string, SeriesCache>();\n const stats = new Map<string, VirtualizationStats>();\n\n let originalUpdateSeries: ((id: string, data: SeriesUpdateData) => void) | null = null;\n let originalAppendData: ((id: string, x: number[] | Float32Array, y: number[] | Float32Array) => void) | null = null;\n let refreshRaf = 0;\n const applyGeneration = new Map<string, number>();\n let lastViewKey = \"\";\n\n function log(message: string, ...args: unknown[]) {\n if (config.debug && ctx) {\n ctx.log.info(`[Virtualization] ${message}`, ...args);\n }\n }\n\n function shouldVirtualize(series: Series): boolean {\n if (!config.enabled) return false;\n if (config.precision === \"full\") return false;\n if (config.includeSeries.length > 0 && !config.includeSeries.includes(series.getId())) return false;\n if (config.excludeSeries.includes(series.getId())) return false;\n\n const type = series.getType();\n return (\n type === \"line\" ||\n type === \"scatter\" ||\n type === \"line+scatter\" ||\n type === \"step\" ||\n type === \"step+scatter\" ||\n type === \"candlestick\" ||\n type === \"bar\"\n );\n }\n\n function isOhlcSeries(series: Series): boolean {\n return series.getType() === \"candlestick\";\n }\n\n function buildUpdatePayload(cache: SeriesCache): SeriesUpdateData {\n if (cache.open && cache.high && cache.low && cache.close) {\n return {\n x: cache.x,\n open: cache.open,\n high: cache.high,\n low: cache.low,\n close: cache.close,\n };\n }\n return { x: cache.x, y: cache.y! };\n }\n\n function getTargetPoints(dataLength: number): number {\n if (!ctx) return dataLength;\n if (config.targetPoints !== \"auto\") return Math.max(2, config.targetPoints);\n const width = ctx.render.canvasSize.width / ctx.render.pixelRatio;\n return calculateTargetPoints(dataLength, width, config.pointsPerPixel);\n }\n\n function downsampleData(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n targetPoints: number,\n strategy: VirtualizationStrategy\n ): { x: Float32Array; y: Float32Array } {\n if (targetPoints >= x.length || x.length <= 2) {\n return { x: new Float32Array(x), y: new Float32Array(y) };\n }\n\n if (strategy === \"minmax\") {\n const bucketCount = Math.ceil(targetPoints / 2);\n const result = minMaxDownsample(x, y, bucketCount);\n return { x: result.x, y: result.y };\n }\n\n const result = lttbDownsample(x, y, targetPoints);\n return { x: result.x, y: result.y };\n }\n\n function cacheOriginal(seriesId: string, data: SeriesCache): void {\n if (!config.reuseOriginalData) return;\n if (originalData.has(seriesId)) return;\n originalData.set(seriesId, { ...data });\n }\n\n function restoreOriginal(seriesId: string): SeriesCache | null {\n return originalData.get(seriesId) ?? null;\n }\n\n function updateStats(\n seriesId: string,\n originalPoints: number,\n renderedPoints: number,\n targetPoints: number,\n mode: VirtualizationMode,\n strategy: VirtualizationStrategy,\n ): void {\n stats.set(seriesId, {\n seriesId,\n originalPoints,\n renderedPoints,\n targetPoints,\n lastUpdated: Date.now(),\n mode,\n strategy,\n });\n }\n\n function captureOriginalFromSeries(series: Series): SeriesCache | null {\n const live = series.getData();\n if (!live?.x?.length) return null;\n\n if (isOhlcSeries(series)) {\n if (!live.open || !live.high || !live.low || !live.close) return null;\n const cache: SeriesCache = {\n x: live.x,\n open: live.open,\n high: live.high,\n low: live.low,\n close: live.close,\n };\n cacheOriginal(series.getId(), cache);\n return cache;\n }\n\n if (!live.y) return null;\n const cache: SeriesCache = { x: live.x, y: live.y };\n cacheOriginal(series.getId(), cache);\n return cache;\n }\n\n function getSourceData(series: Series): SeriesCache | null {\n return restoreOriginal(series.getId()) ?? captureOriginalFromSeries(series);\n }\n\n function getViewportSource(source: SeriesCache): SeriesCache {\n if (!ctx) return source;\n const bounds = ctx.data.getViewBounds?.();\n if (!bounds) return source;\n\n const sliced = sliceSeriesToViewport(\n source,\n bounds.xMin,\n bounds.xMax,\n config.viewportBuffer,\n );\n if (sliced.end - sliced.start >= source.x.length) return source;\n\n return {\n x: sliced.x,\n y: sliced.y,\n open: sliced.open,\n high: sliced.high,\n low: sliced.low,\n close: sliced.close,\n };\n }\n\n function commitDownsampled(seriesId: string, payload: SeriesUpdateData): void {\n if (!originalUpdateSeries) return;\n isInternalUpdate = true;\n originalUpdateSeries(seriesId, payload);\n isInternalUpdate = false;\n }\n\n async function runDownsample(\n source: SeriesCache,\n targetPoints: number,\n strategy: VirtualizationStrategy,\n ): Promise<{ x: Float32Array; y: Float32Array }> {\n const x = new Float32Array(source.x);\n const y = new Float32Array(source.y!);\n\n if (config.useWorker && x.length >= config.workerThreshold) {\n const algorithm = strategy === \"minmax\" ? \"minmax\" : \"lttb\";\n const result = await downsampleAsync(x, y, targetPoints, algorithm);\n return { x: result.x, y: result.y };\n }\n\n return downsampleData(x, y, targetPoints, strategy);\n }\n\n async function applyVirtualization(series: Series): Promise<void> {\n if (!ctx || !originalUpdateSeries) return;\n const seriesId = series.getId();\n\n if (!shouldVirtualize(series)) {\n const original = restoreOriginal(seriesId);\n if (original && config.reuseOriginalData) {\n commitDownsampled(seriesId, buildUpdatePayload(original));\n }\n return;\n }\n\n const source = getSourceData(series);\n if (!source?.x?.length) return;\n\n const viewportSource = getViewportSource(source);\n const gen = (applyGeneration.get(seriesId) ?? 0) + 1;\n applyGeneration.set(seriesId, gen);\n\n if (isOhlcSeries(series)) {\n if (!viewportSource.open || !viewportSource.high || !viewportSource.low || !viewportSource.close) {\n return;\n }\n\n const targetBars = getTargetPoints(viewportSource.x.length);\n const x = new Float32Array(viewportSource.x);\n const open = new Float32Array(viewportSource.open);\n const high = new Float32Array(viewportSource.high);\n const low = new Float32Array(viewportSource.low);\n const close = new Float32Array(viewportSource.close);\n\n const downsampled =\n config.useWorker && x.length >= config.workerThreshold\n ? await ohlcDownsampleAsync(x, open, high, low, close, targetBars)\n : ohlcMinMaxDownsample(x, open, high, low, close, targetBars);\n\n if (applyGeneration.get(seriesId) !== gen) return;\n\n commitDownsampled(seriesId, {\n x: downsampled.x,\n open: downsampled.open,\n high: downsampled.high,\n low: downsampled.low,\n close: downsampled.close,\n });\n\n updateStats(seriesId, source.x.length, downsampled.x.length, targetBars, config.mode, \"minmax\");\n return;\n }\n\n if (!viewportSource.y) return;\n\n const targetPoints = getTargetPoints(viewportSource.x.length);\n const strategy = series.getType() === \"bar\" ? \"minmax\" : config.strategy;\n const downsampled = await runDownsample(viewportSource, targetPoints, strategy);\n\n if (applyGeneration.get(seriesId) !== gen) return;\n\n commitDownsampled(seriesId, { x: downsampled.x, y: downsampled.y });\n updateStats(seriesId, source.x.length, downsampled.x.length, targetPoints, config.mode, strategy);\n }\n\n function refreshAll(): void {\n if (!ctx) return;\n ctx.data.getAllSeries().forEach((series) => {\n void applyVirtualization(series);\n });\n }\n\n function scheduleRefreshAll(): void {\n if (!ctx) return;\n const bounds = ctx.data.getViewBounds?.();\n if (bounds) {\n const key = `${bounds.xMin}:${bounds.xMax}:${bounds.yMin}:${bounds.yMax}:${ctx.render.canvasSize.width}`;\n if (key === lastViewKey) return;\n lastViewKey = key;\n }\n\n if (refreshRaf) return;\n refreshRaf = requestAnimationFrame(() => {\n refreshRaf = 0;\n refreshAll();\n });\n }\n\n function handleUpdateSeries(id: string, data: SeriesUpdateData): void {\n if (!ctx || !originalUpdateSeries) return;\n if (!config.enabled || isInternalUpdate) {\n originalUpdateSeries(id, data);\n return;\n }\n\n const series = ctx.chart.getSeries?.(id) as Series | undefined;\n if (!series) {\n originalUpdateSeries(id, data);\n return;\n }\n\n const original = restoreOriginal(id);\n if (original && config.reuseOriginalData) {\n isInternalUpdate = true;\n originalUpdateSeries(id, buildUpdatePayload(original));\n isInternalUpdate = false;\n }\n\n originalUpdateSeries(id, data);\n\n const updatedSeries = ctx.chart.getSeries?.(id) as Series | undefined;\n if (updatedSeries) {\n originalData.delete(id);\n captureOriginalFromSeries(updatedSeries);\n void applyVirtualization(updatedSeries);\n }\n }\n\n function handleAppendData(\n id: string,\n x: number[] | Float32Array,\n y: number[] | Float32Array\n ): void {\n if (!ctx || !originalAppendData || !originalUpdateSeries) return;\n\n if (!config.enabled || isInternalUpdate) {\n originalAppendData(id, x, y);\n return;\n }\n\n const series = ctx.chart.getSeries?.(id) as Series | undefined;\n if (!series) {\n originalAppendData(id, x, y);\n return;\n }\n\n const original = restoreOriginal(id);\n if (original && config.reuseOriginalData) {\n isInternalUpdate = true;\n originalUpdateSeries(id, buildUpdatePayload(original));\n isInternalUpdate = false;\n }\n\n originalAppendData(id, x, y);\n\n const updatedSeries = ctx.chart.getSeries?.(id) as Series | undefined;\n if (updatedSeries) {\n const cached = restoreOriginal(id);\n if (cached?.y && config.reuseOriginalData) {\n // Replace (not cacheOriginal, which no-ops on an existing entry) so the\n // full-resolution cache grows with the appended points.\n originalData.set(id, {\n x: appendTyped(cached.x, x),\n y: appendTyped(cached.y, y),\n });\n } else {\n originalData.delete(id);\n captureOriginalFromSeries(updatedSeries);\n }\n void applyVirtualization(updatedSeries);\n }\n }\n\n function appendTyped(\n existing: Float32Array | Float64Array,\n incoming: number[] | Float32Array,\n ): Float32Array {\n const next = incoming instanceof Float32Array ? incoming : Float32Array.from(incoming);\n const merged = new Float32Array(existing.length + next.length);\n merged.set(existing);\n merged.set(next, existing.length);\n return merged;\n }\n\n const api: VirtualizationAPI & Record<string, unknown> = {\n enable() {\n config.enabled = true;\n refreshAll();\n },\n disable() {\n config.enabled = false;\n if (!ctx || !originalUpdateSeries) return;\n const updater = originalUpdateSeries;\n ctx.data.getAllSeries().forEach((series) => {\n const original = restoreOriginal(series.getId());\n if (original) {\n isInternalUpdate = true;\n updater(series.getId(), buildUpdatePayload(original));\n isInternalUpdate = false;\n }\n });\n },\n isEnabled() {\n return config.enabled;\n },\n updateConfig(newConfig) {\n Object.assign(config, newConfig);\n refreshAll();\n },\n invalidate(seriesId) {\n if (!ctx) return;\n if (seriesId) {\n const series = ctx.chart.getSeries?.(seriesId) as Series | undefined;\n if (series) applyVirtualization(series);\n return;\n }\n refreshAll();\n },\n getStats(seriesId) {\n return stats.get(seriesId) ?? null;\n },\n getAllStats() {\n return Array.from(stats.values());\n },\n };\n\n return {\n manifest,\n onInit(pluginCtx: PluginContext) {\n ctx = pluginCtx;\n // API is exposed via plugin.api / chart.virtualization getter (ChartPluginBridge)\n\n const chart = ctx.chart as any;\n originalUpdateSeries = chart.updateSeries?.bind(chart) ?? null;\n originalAppendData = chart.appendData?.bind(chart) ?? null;\n\n if (originalUpdateSeries) {\n chart.updateSeries = (id: string, data: SeriesUpdateData) => handleUpdateSeries(id, data);\n }\n\n if (originalAppendData) {\n chart.appendData = (id: string, x: number[] | Float32Array, y: number[] | Float32Array) =>\n handleAppendData(id, x, y);\n }\n\n ctx.events.on(\"zoom\", () => scheduleRefreshAll());\n ctx.events.on(\"pan\", () => scheduleRefreshAll());\n ctx.events.on(\"resize\", () => {\n lastViewKey = \"\";\n scheduleRefreshAll();\n });\n\n refreshAll();\n log(\"Initialized\");\n },\n onDestroy(pluginCtx: PluginContext) {\n if (refreshRaf) cancelAnimationFrame(refreshRaf);\n refreshRaf = 0;\n applyGeneration.clear();\n if (originalUpdateSeries) {\n (pluginCtx.chart as any).updateSeries = originalUpdateSeries;\n }\n if (originalAppendData) {\n (pluginCtx.chart as any).appendData = originalAppendData;\n }\n ctx = null;\n originalData.clear();\n stats.clear();\n },\n api,\n };\n}\n\nexport default PluginVirtualization;\n\n// Type exports\nexport type {\n PluginVirtualizationConfig,\n VirtualizationAPI,\n VirtualizationStats,\n VirtualizationMode,\n VirtualizationStrategy,\n} from \"./types\";\n"],"names":["lttbDownsample","x","y","targetPoints","length","_","i","outX","outY","outIndices","bucketSize","a","outIdx","bucketStart","bucketEnd","nextBucketStart","nextBucketEnd","avgX","avgY","avgCount","j","maxArea","maxIndex","aX","aY","area","minMaxDownsample","bucketCount","b","start","end","minY","maxY","minIdx","maxIdx","calculateTargetPoints","dataLength","canvasWidth","pointsPerPixel","maxPoints","ohlcMinMaxDownsample","open","high","low","close","targetBars","outOpen","outHigh","outLow","outClose","hi","lo","lastIdx","lowerBoundX","value","mid","upperBoundX","sliceSeriesToViewport","source","xMin","xMax","bufferRatio","range","paddedMin","paddedMax","slice","arr","pool","getPool","WorkerPool","task","result","downsampleAsync","algorithm","id","nextTaskId","ohlcDownsampleAsync","destroyDownsamplePool","getDownsamplePoolSize","manifest","DEFAULT_CONFIG","PluginVirtualization","userConfig","config","ctx","isInternalUpdate","originalData","stats","originalUpdateSeries","originalAppendData","refreshRaf","applyGeneration","lastViewKey","log","message","args","shouldVirtualize","series","type","isOhlcSeries","buildUpdatePayload","cache","getTargetPoints","width","downsampleData","strategy","cacheOriginal","seriesId","data","restoreOriginal","updateStats","originalPoints","renderedPoints","mode","captureOriginalFromSeries","live","_a","getSourceData","getViewportSource","bounds","_b","sliced","commitDownsampled","payload","runDownsample","applyVirtualization","original","viewportSource","gen","downsampled","refreshAll","scheduleRefreshAll","key","handleUpdateSeries","updatedSeries","_d","_c","handleAppendData","cached","appendTyped","existing","incoming","next","merged","pluginCtx","chart","updater","newConfig"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-BMiZoKmm.js","sources":["../src/streaming/utils.ts","../src/streaming/websocket.ts","../src/streaming/backpressure.ts","../src/streaming/mock.ts","../src/plugins/streaming/index.ts"],"sourcesContent":["/**\n * WebSocket Streaming Utilities\n */\nimport { DataPoint, WebSocketStream } from \"./types\";\n\n/**\n * Default message parser - expects { x, y, seriesId? } or array of same\n */\nexport function defaultParser(data: unknown): DataPoint | DataPoint[] | null {\n if (!data || typeof data !== 'object') return null;\n \n // Array of points\n if (Array.isArray(data)) {\n return data\n .filter((item): item is DataPoint => \n typeof item === 'object' && \n item !== null && \n typeof item.x === 'number' && \n typeof item.y === 'number'\n );\n }\n \n // Single point\n const point = data as Record<string, unknown>;\n if (typeof point.x === 'number' && typeof point.y === 'number') {\n return {\n x: point.x,\n y: point.y,\n seriesId: typeof point.seriesId === 'string' ? point.seriesId : undefined,\n };\n }\n \n return null;\n}\n\n/**\n * Helper to create a parser for custom message formats\n */\nexport function createMessageParser<T>(\n transform: (message: T) => DataPoint | DataPoint[] | null\n): (data: unknown) => DataPoint | DataPoint[] | null {\n return (data: unknown) => {\n try {\n return transform(data as T);\n } catch {\n return null;\n }\n };\n}\n\n/**\n * Helper to connect a WebSocket stream to a chart\n */\nexport function connectStreamToChart(\n stream: WebSocketStream,\n chart: { appendData: (seriesId: string, data: { x: Float32Array; y: Float32Array }) => void },\n seriesIds: string[] = ['default']\n): () => void {\n const unsubscribers: (() => void)[] = [];\n\n for (const seriesId of seriesIds) {\n const unsubscribe = stream.subscribe(seriesId, (points) => {\n if (points.length === 0) return;\n \n const x = new Float32Array(points.map(p => p.x));\n const y = new Float32Array(points.map(p => p.y));\n \n chart.appendData(seriesId, { x, y });\n });\n \n unsubscribers.push(unsubscribe);\n }\n\n // Return cleanup function\n return () => {\n for (const unsubscribe of unsubscribers) {\n unsubscribe();\n }\n };\n}\n","/**\n * WebSocket Stream Implementation\n */\nimport { \n WebSocketStreamConfig, \n DataPoint, \n WebSocketStream, \n StreamStats, \n WebSocketState \n} from \"./types\";\nimport { defaultParser } from \"./utils\";\n\n/**\n * Create a WebSocket stream for real-time chart data\n */\nexport function createWebSocketStream(config: WebSocketStreamConfig): WebSocketStream {\n const {\n url,\n maxReconnectAttempts = 5,\n reconnectDelay = 1000,\n bufferSize = 10,\n throttleMs = 16,\n parseMessage = defaultParser,\n onConnect,\n onDisconnect,\n onError,\n onReconnect,\n } = config;\n\n let ws: WebSocket | null = null;\n let state: WebSocketState = 'disconnected';\n let reconnectAttempts = 0;\n let reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n let connectionStartTime: number | null = null;\n\n const buffers = new Map<string, DataPoint[]>();\n const subscribers = new Map<string, Set<(points: DataPoint[]) => void>>();\n \n const stats: StreamStats = {\n messagesReceived: 0,\n pointsProcessed: 0,\n reconnectCount: 0,\n lastMessageTime: null,\n connectionUptime: 0,\n bufferSize: 0,\n };\n\n let lastFlushTime = 0;\n let flushScheduled = false;\n\n function connect(): void {\n if (ws && (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING)) {\n return;\n }\n state = 'connecting';\n try {\n ws = new WebSocket(url);\n ws.onopen = () => {\n state = 'connected';\n reconnectAttempts = 0;\n connectionStartTime = Date.now();\n onConnect?.();\n };\n ws.onmessage = (event) => handleMessage(event.data);\n ws.onclose = (event) => {\n state = 'disconnected';\n connectionStartTime = null;\n onDisconnect?.(event);\n if (!event.wasClean && reconnectAttempts < maxReconnectAttempts) scheduleReconnect();\n };\n ws.onerror = (error) => {\n state = 'error';\n onError?.(error);\n };\n } catch (error) {\n state = 'error';\n onError?.(error as Event);\n }\n }\n\n function disconnect(): void {\n if (reconnectTimeout) { clearTimeout(reconnectTimeout); reconnectTimeout = null; }\n if (ws) { ws.close(1000, 'Client disconnect'); ws = null; }\n state = 'disconnected';\n reconnectAttempts = 0;\n buffers.clear();\n }\n\n function scheduleReconnect(): void {\n if (reconnectTimeout) return;\n state = 'reconnecting';\n reconnectAttempts++;\n stats.reconnectCount++;\n onReconnect?.(reconnectAttempts);\n reconnectTimeout = setTimeout(() => {\n reconnectTimeout = null;\n connect();\n }, reconnectDelay * reconnectAttempts);\n }\n\n function handleMessage(data: unknown): void {\n stats.messagesReceived++;\n stats.lastMessageTime = Date.now();\n try {\n const parsed = typeof data === 'string' ? JSON.parse(data) : data;\n const points = parseMessage(parsed);\n if (!points) return;\n const pointArray = Array.isArray(points) ? points : [points];\n for (const point of pointArray) {\n const seriesId = point.seriesId || 'default';\n if (!buffers.has(seriesId)) buffers.set(seriesId, []);\n buffers.get(seriesId)!.push(point);\n stats.pointsProcessed++;\n }\n stats.bufferSize = Array.from(buffers.values()).reduce((sum, b) => sum + b.length, 0);\n scheduleFlush();\n } catch {}\n }\n\n function scheduleFlush(): void {\n if (flushScheduled) return;\n const now = performance.now();\n const timeSinceLastFlush = now - lastFlushTime;\n if (timeSinceLastFlush >= throttleMs) {\n flush();\n } else {\n flushScheduled = true;\n setTimeout(() => { flushScheduled = false; flush(); }, throttleMs - timeSinceLastFlush);\n }\n }\n\n function flush(): void {\n lastFlushTime = performance.now();\n for (const [seriesId, buffer] of buffers.entries()) {\n if (buffer.length === 0) continue;\n if (buffer.length >= bufferSize || performance.now() - lastFlushTime > throttleMs * 2) {\n const callbacks = subscribers.get(seriesId);\n if (callbacks) {\n const points = buffer.splice(0, buffer.length);\n for (const callback of callbacks) callback(points);\n } else {\n buffer.length = 0;\n }\n }\n }\n stats.bufferSize = Array.from(buffers.values()).reduce((sum, b) => sum + b.length, 0);\n }\n\n return {\n connect,\n disconnect,\n isConnected: () => ws !== null && ws.readyState === WebSocket.OPEN,\n getState: () => state,\n subscribe: (seriesId, callback) => {\n if (!subscribers.has(seriesId)) subscribers.set(seriesId, new Set());\n subscribers.get(seriesId)!.add(callback);\n return () => {\n const callbacks = subscribers.get(seriesId);\n if (callbacks) {\n callbacks.delete(callback);\n if (callbacks.size === 0) subscribers.delete(seriesId);\n }\n };\n },\n unsubscribeAll: () => { subscribers.clear(); buffers.clear(); },\n send: (message) => {\n if (ws && ws.readyState === WebSocket.OPEN) {\n ws.send(typeof message === 'string' ? message : JSON.stringify(message));\n }\n },\n getStats: () => ({ ...stats, connectionUptime: connectionStartTime ? Date.now() - connectionStartTime : 0 }),\n };\n}\n","/**\n * Sci Plot - Backpressure Management Module\n * \n * Provides advanced backpressure handling for streaming data:\n * - Configurable buffer limits\n * - Multiple overflow strategies (drop-oldest, pause, sample)\n * - Health monitoring and metrics\n * - Automatic flow control\n * \n * @module backpressure\n */\n\nimport type { DataPoint } from \"./types\";\n\n// ============================================\n// Types\n// ============================================\n\nexport type OverflowStrategy = 'drop-oldest' | 'drop-newest' | 'pause' | 'sample' | 'block';\n\nexport interface BackpressureConfig {\n /** Maximum buffer size before triggering backpressure (default: 10000) */\n maxBuffer: number;\n /** Warning threshold as fraction of maxBuffer (default: 0.7) */\n warningThreshold?: number;\n /** Critical threshold as fraction of maxBuffer (default: 0.9) */\n criticalThreshold?: number;\n /** Overflow handling strategy (default: 'drop-oldest') */\n strategy: OverflowStrategy;\n /** For 'sample' strategy: keep every Nth point (default: 2) */\n sampleRate?: number;\n /** Callback when pressure level changes */\n onPressure?: (stats: PressureStats) => void;\n /** Callback when buffer overflows */\n onOverflow?: (droppedCount: number) => void;\n /** Callback when back to normal */\n onRecovery?: () => void;\n}\n\nexport interface PressureStats {\n /** Current buffer fill level (0-1) */\n fillLevel: number;\n /** Pressure state */\n state: 'normal' | 'warning' | 'critical' | 'overflow';\n /** Current buffer size */\n bufferSize: number;\n /** Maximum buffer size */\n maxBuffer: number;\n /** Points dropped due to overflow */\n droppedCount: number;\n /** Points sampled/skipped */\n sampledCount: number;\n /** Incoming rate (points per second) */\n incomingRate: number;\n /** Outgoing rate (points per second) */\n outgoingRate: number;\n /** Whether stream is paused due to backpressure */\n isPaused: boolean;\n}\n\nexport interface BufferHealth {\n /** Overall health score (0-100) */\n score: number;\n /** Health status */\n status: 'healthy' | 'degraded' | 'critical';\n /** Recommendations */\n recommendations: string[];\n}\n\n// ============================================\n// Circular Buffer Implementation\n// ============================================\n\nexport class CircularBuffer<T> {\n private buffer: T[];\n private head: number = 0;\n private tail: number = 0;\n private count: number = 0;\n private readonly capacity: number;\n\n constructor(capacity: number) {\n this.capacity = capacity;\n this.buffer = new Array(capacity);\n }\n\n /**\n * Add item to buffer\n * @returns true if item was added, false if buffer was full\n */\n push(item: T): boolean {\n if (this.count === this.capacity) {\n return false;\n }\n this.buffer[this.tail] = item;\n this.tail = (this.tail + 1) % this.capacity;\n this.count++;\n return true;\n }\n\n /**\n * Add item, overwriting oldest if full\n * @returns the overwritten item, or undefined\n */\n pushOverwrite(item: T): T | undefined {\n let overwritten: T | undefined;\n if (this.count === this.capacity) {\n overwritten = this.buffer[this.head];\n this.head = (this.head + 1) % this.capacity;\n this.count--;\n }\n this.buffer[this.tail] = item;\n this.tail = (this.tail + 1) % this.capacity;\n this.count++;\n return overwritten;\n }\n\n /**\n * Remove and return oldest item\n */\n shift(): T | undefined {\n if (this.count === 0) {\n return undefined;\n }\n const item = this.buffer[this.head];\n this.head = (this.head + 1) % this.capacity;\n this.count--;\n return item;\n }\n\n /**\n * Remove and return multiple items\n */\n shiftMany(n: number): T[] {\n const result: T[] = [];\n const toRemove = Math.min(n, this.count);\n for (let i = 0; i < toRemove; i++) {\n result.push(this.buffer[this.head]);\n this.head = (this.head + 1) % this.capacity;\n }\n this.count -= toRemove;\n return result;\n }\n\n /**\n * Peek at oldest item without removing\n */\n peek(): T | undefined {\n return this.count > 0 ? this.buffer[this.head] : undefined;\n }\n\n /**\n * Get all items as array\n */\n toArray(): T[] {\n const result: T[] = [];\n let current = this.head;\n for (let i = 0; i < this.count; i++) {\n result.push(this.buffer[current]);\n current = (current + 1) % this.capacity;\n }\n return result;\n }\n\n /**\n * Clear the buffer\n */\n clear(): void {\n this.head = 0;\n this.tail = 0;\n this.count = 0;\n }\n\n /**\n * Get current size\n */\n size(): number {\n return this.count;\n }\n\n /**\n * Check if buffer is full\n */\n isFull(): boolean {\n return this.count === this.capacity;\n }\n\n /**\n * Check if buffer is empty\n */\n isEmpty(): boolean {\n return this.count === 0;\n }\n\n /**\n * Get fill level (0-1)\n */\n fillLevel(): number {\n return this.count / this.capacity;\n }\n\n /**\n * Get capacity\n */\n getCapacity(): number {\n return this.capacity;\n }\n}\n\n// ============================================\n// Backpressure Manager\n// ============================================\n\nexport class BackpressureManager {\n private config: Required<BackpressureConfig>;\n private buffers: Map<string, CircularBuffer<DataPoint>> = new Map();\n private stats: Map<string, { dropped: number; sampled: number; lastIncoming: number; lastOutgoing: number }> = new Map();\n private paused: boolean = false;\n private sampleCounter: number = 0;\n\n // Rate tracking\n private incomingHistory: number[] = [];\n private outgoingHistory: number[] = [];\n private lastRateUpdate: number = 0;\n private currentIncoming: number = 0;\n private currentOutgoing: number = 0;\n\n constructor(config: BackpressureConfig) {\n this.config = {\n warningThreshold: 0.7,\n criticalThreshold: 0.9,\n sampleRate: 2,\n onPressure: undefined,\n onOverflow: undefined,\n onRecovery: undefined,\n ...config,\n } as Required<BackpressureConfig>;\n }\n\n /**\n * Add points to the buffer with backpressure handling\n */\n push(seriesId: string, points: DataPoint[]): number {\n if (!this.buffers.has(seriesId)) {\n this.buffers.set(seriesId, new CircularBuffer(this.config.maxBuffer));\n this.stats.set(seriesId, { dropped: 0, sampled: 0, lastIncoming: 0, lastOutgoing: 0 });\n }\n\n const buffer = this.buffers.get(seriesId)!;\n const stats = this.stats.get(seriesId)!;\n let added = 0;\n let dropped = 0;\n\n for (const point of points) {\n this.currentIncoming++;\n stats.lastIncoming = Date.now();\n\n // Handle based on strategy when buffer is under pressure\n if (buffer.fillLevel() >= this.config.criticalThreshold) {\n switch (this.config.strategy) {\n case 'drop-oldest':\n // Overwrite oldest points\n const overwritten = buffer.pushOverwrite(point);\n if (overwritten) {\n dropped++;\n stats.dropped++;\n }\n added++;\n break;\n\n case 'drop-newest':\n // Skip new points\n dropped++;\n stats.dropped++;\n continue;\n\n case 'pause':\n // Signal pause (external handling required)\n this.paused = true;\n return added;\n\n case 'sample':\n // Keep every Nth point\n this.sampleCounter++;\n if (this.sampleCounter >= this.config.sampleRate) {\n this.sampleCounter = 0;\n buffer.pushOverwrite(point);\n added++;\n } else {\n stats.sampled++;\n }\n break;\n\n case 'block':\n // Block until buffer has space\n if (!buffer.isFull()) {\n buffer.push(point);\n added++;\n }\n break;\n }\n } else {\n // Normal operation\n if (buffer.push(point)) {\n added++;\n } else {\n // Shouldn't happen in normal operation\n buffer.pushOverwrite(point);\n added++;\n dropped++;\n stats.dropped++;\n }\n }\n }\n\n // Track drops\n if (dropped > 0) {\n this.config.onOverflow?.(dropped);\n }\n\n // Check and report pressure state\n this.checkPressure(seriesId);\n this.updateRates();\n\n return added;\n }\n\n /**\n * Consume points from buffer\n */\n consume(seriesId: string, count?: number): DataPoint[] {\n const buffer = this.buffers.get(seriesId);\n if (!buffer) return [];\n\n const stats = this.stats.get(seriesId)!;\n const toConsume = count ?? buffer.size();\n const points = buffer.shiftMany(toConsume);\n\n this.currentOutgoing += points.length;\n stats.lastOutgoing = Date.now();\n\n // Check for recovery from paused state\n if (this.paused && buffer.fillLevel() < this.config.warningThreshold) {\n this.paused = false;\n this.config.onRecovery?.();\n }\n\n this.updateRates();\n return points;\n }\n\n /**\n * Consume all points from buffer\n */\n consumeAll(seriesId: string): DataPoint[] {\n return this.consume(seriesId);\n }\n\n /**\n * Get current pressure stats for a series\n */\n getPressureStats(seriesId: string): PressureStats {\n const buffer = this.buffers.get(seriesId);\n const stats = this.stats.get(seriesId);\n\n if (!buffer || !stats) {\n return {\n fillLevel: 0,\n state: 'normal',\n bufferSize: 0,\n maxBuffer: this.config.maxBuffer,\n droppedCount: 0,\n sampledCount: 0,\n incomingRate: 0,\n outgoingRate: 0,\n isPaused: false,\n };\n }\n\n const fillLevel = buffer.fillLevel();\n let state: PressureStats['state'] = 'normal';\n if (fillLevel >= this.config.criticalThreshold) {\n state = buffer.isFull() ? 'overflow' : 'critical';\n } else if (fillLevel >= this.config.warningThreshold) {\n state = 'warning';\n }\n\n return {\n fillLevel,\n state,\n bufferSize: buffer.size(),\n maxBuffer: this.config.maxBuffer,\n droppedCount: stats.dropped,\n sampledCount: stats.sampled,\n incomingRate: this.getAverageRate(this.incomingHistory),\n outgoingRate: this.getAverageRate(this.outgoingHistory),\n isPaused: this.paused,\n };\n }\n\n /**\n * Get aggregate stats for all series\n */\n getGlobalStats(): PressureStats {\n let totalSize = 0;\n let totalDropped = 0;\n let totalSampled = 0;\n\n for (const [seriesId] of this.buffers) {\n const buffer = this.buffers.get(seriesId)!;\n const stats = this.stats.get(seriesId)!;\n totalSize += buffer.size();\n totalDropped += stats.dropped;\n totalSampled += stats.sampled;\n }\n\n const maxTotal = this.config.maxBuffer * this.buffers.size;\n const fillLevel = maxTotal > 0 ? totalSize / maxTotal : 0;\n\n let state: PressureStats['state'] = 'normal';\n if (fillLevel >= this.config.criticalThreshold) {\n state = 'critical';\n } else if (fillLevel >= this.config.warningThreshold) {\n state = 'warning';\n }\n\n return {\n fillLevel,\n state,\n bufferSize: totalSize,\n maxBuffer: maxTotal,\n droppedCount: totalDropped,\n sampledCount: totalSampled,\n incomingRate: this.getAverageRate(this.incomingHistory),\n outgoingRate: this.getAverageRate(this.outgoingHistory),\n isPaused: this.paused,\n };\n }\n\n /**\n * Get buffer health assessment\n */\n getHealth(): BufferHealth {\n const stats = this.getGlobalStats();\n const recommendations: string[] = [];\n let score = 100;\n\n // Deduct for fill level\n if (stats.fillLevel > 0.9) {\n score -= 40;\n recommendations.push('Buffer critically full - reduce data rate or increase buffer size');\n } else if (stats.fillLevel > 0.7) {\n score -= 20;\n recommendations.push('Buffer filling up - consider increasing consumption rate');\n }\n\n // Deduct for drops\n if (stats.droppedCount > 0) {\n const dropRate = stats.droppedCount / (stats.droppedCount + stats.bufferSize + 1);\n score -= Math.min(30, dropRate * 100);\n recommendations.push(`Data being dropped (${stats.droppedCount} points) - buffer overflow`);\n }\n\n // Deduct for rate imbalance\n if (stats.incomingRate > stats.outgoingRate * 1.5) {\n score -= 15;\n recommendations.push('Incoming rate exceeds processing rate - consider sampling or throttling');\n }\n\n // Deduct for pause state\n if (stats.isPaused) {\n score -= 25;\n recommendations.push('Stream paused due to backpressure');\n }\n\n let status: BufferHealth['status'] = 'healthy';\n if (score < 50) {\n status = 'critical';\n } else if (score < 75) {\n status = 'degraded';\n }\n\n return {\n score: Math.max(0, score),\n status,\n recommendations,\n };\n }\n\n /**\n * Check if paused due to backpressure\n */\n isPaused(): boolean {\n return this.paused;\n }\n\n /**\n * Resume if paused\n */\n resume(): void {\n this.paused = false;\n }\n\n /**\n * Clear all buffers\n */\n clear(seriesId?: string): void {\n if (seriesId) {\n this.buffers.get(seriesId)?.clear();\n const stats = this.stats.get(seriesId);\n if (stats) {\n stats.dropped = 0;\n stats.sampled = 0;\n }\n } else {\n for (const buffer of this.buffers.values()) {\n buffer.clear();\n }\n for (const stats of this.stats.values()) {\n stats.dropped = 0;\n stats.sampled = 0;\n }\n }\n this.paused = false;\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<BackpressureConfig>): void {\n Object.assign(this.config, config);\n }\n\n /**\n * Get current configuration\n */\n getConfig(): BackpressureConfig {\n return { ...this.config };\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private checkPressure(seriesId: string): void {\n const stats = this.getPressureStats(seriesId);\n this.config.onPressure?.(stats);\n }\n\n private updateRates(): void {\n const now = Date.now();\n const elapsed = now - this.lastRateUpdate;\n\n // Update every second\n if (elapsed >= 1000) {\n this.incomingHistory.push(this.currentIncoming);\n this.outgoingHistory.push(this.currentOutgoing);\n\n // Keep last 10 seconds\n if (this.incomingHistory.length > 10) this.incomingHistory.shift();\n if (this.outgoingHistory.length > 10) this.outgoingHistory.shift();\n\n this.currentIncoming = 0;\n this.currentOutgoing = 0;\n this.lastRateUpdate = now;\n }\n }\n\n private getAverageRate(history: number[]): number {\n if (history.length === 0) return 0;\n return history.reduce((a, b) => a + b, 0) / history.length;\n }\n}\n\n// ============================================\n// Convenience Functions\n// ============================================\n\n/**\n * Create a backpressure manager with default settings\n */\nexport function createBackpressureManager(\n maxBuffer: number = 10000,\n strategy: OverflowStrategy = 'drop-oldest'\n): BackpressureManager {\n return new BackpressureManager({ maxBuffer, strategy });\n}\n\n/**\n * Create a high-performance backpressure manager optimized for real-time\n */\nexport function createRealtimeBackpressure(\n maxBuffer: number = 50000\n): BackpressureManager {\n return new BackpressureManager({\n maxBuffer,\n strategy: 'drop-oldest',\n warningThreshold: 0.8,\n criticalThreshold: 0.95,\n });\n}\n\n/**\n * Create a lossless backpressure manager (for when data loss is unacceptable)\n */\nexport function createLosslessBackpressure(\n maxBuffer: number = 100000\n): BackpressureManager {\n return new BackpressureManager({\n maxBuffer,\n strategy: 'pause',\n warningThreshold: 0.6,\n criticalThreshold: 0.8,\n });\n}\n","/**\n * Mock WebSocket Stream for Testing\n */\nimport { DataPoint, WebSocketStream, StreamStats } from \"./types\";\n\n/**\n * Mock WebSocket stream for testing\n */\nexport function createMockStream(config: {\n interval?: number;\n generatePoint?: () => DataPoint;\n}): WebSocketStream & { start: () => void; stop: () => void } {\n const { interval = 100, generatePoint = defaultGenerator } = config;\n \n let intervalId: ReturnType<typeof setInterval> | null = null;\n let connected = false;\n const subscribers = new Map<string, Set<(points: DataPoint[]) => void>>();\n \n const stats: StreamStats = {\n messagesReceived: 0,\n pointsProcessed: 0,\n reconnectCount: 0,\n lastMessageTime: null,\n connectionUptime: 0,\n bufferSize: 0,\n };\n\n let startTime: number | null = null;\n\n function start(): void {\n if (intervalId) return;\n \n startTime = Date.now();\n intervalId = setInterval(() => {\n const point = generatePoint();\n stats.messagesReceived++;\n stats.pointsProcessed++;\n stats.lastMessageTime = Date.now();\n \n const seriesId = point.seriesId || 'default';\n const callbacks = subscribers.get(seriesId);\n \n if (callbacks) {\n for (const callback of callbacks) {\n callback([point]);\n }\n }\n }, interval);\n }\n\n function stop(): void {\n if (intervalId) {\n clearInterval(intervalId);\n intervalId = null;\n }\n startTime = null;\n }\n\n return {\n connect: () => { connected = true; start(); },\n disconnect: () => { connected = false; stop(); },\n isConnected: () => connected,\n getState: () => connected ? 'connected' : 'disconnected',\n subscribe: (seriesId, callback) => {\n if (!subscribers.has(seriesId)) {\n subscribers.set(seriesId, new Set());\n }\n subscribers.get(seriesId)!.add(callback);\n return () => {\n subscribers.get(seriesId)?.delete(callback);\n };\n },\n unsubscribeAll: () => subscribers.clear(),\n send: () => {},\n getStats: () => ({\n ...stats,\n connectionUptime: startTime ? Date.now() - startTime : 0,\n }),\n start,\n stop,\n };\n}\n\nlet mockX = 0;\nfunction defaultGenerator(): DataPoint {\n return {\n x: mockX++,\n y: Math.sin(mockX * 0.1) + Math.random() * 0.2,\n };\n}\n","/**\n * Sci Plot - Streaming Plugin\n * \n * Provides real-time data streaming capabilities including:\n * - WebSocket connections\n * - Backpressure management\n * - Mock data streaming for testing\n * \n * @module plugins/streaming\n */\n\nexport {\n createWebSocketStream,\n} from \"../../streaming/websocket\";\n\nexport {\n connectStreamToChart,\n createMessageParser,\n} from \"../../streaming/utils\";\n\nexport {\n BackpressureManager,\n CircularBuffer,\n createBackpressureManager,\n} from \"../../streaming/backpressure\";\n\nexport { createMockStream } from \"../../streaming/mock\";\n\nexport * from \"../../streaming/types\";\n\nimport type { PluginManifest, ChartPlugin, PluginContext } from \"../types\";\n\nexport interface PluginStreamingConfig {\n /** Default WebSocket URL */\n url?: string;\n /** Backpressure strategy */\n backpressure?: {\n maxBufferSize?: number;\n overflowStrategy?: \"drop-oldest\" | \"drop-newest\" | \"error\";\n };\n}\n\nconst manifestStreaming: PluginManifest = {\n name: \"velo-plot-streaming\",\n version: \"1.0.0\",\n description: \"Real-time data streaming support for velo-plot\",\n provides: [\"data-source\"],\n tags: [\"websocket\", \"real-time\", \"streaming\", \"backpressure\"],\n};\n\n/**\n * SciPlot Streaming Plugin\n * \n * Enables seamless integration with real-time data sources.\n */\nexport function PluginStreaming(_config: PluginStreamingConfig = {}): ChartPlugin<PluginStreamingConfig> {\n return {\n manifest: manifestStreaming,\n\n onInit(_ctx: PluginContext) {\n },\n\n onDestroy(_ctx: PluginContext) {\n }\n };\n}\n\nexport default PluginStreaming;\n"],"names":["defaultParser","data","item","point","createMessageParser","transform","connectStreamToChart","stream","chart","seriesIds","unsubscribers","seriesId","unsubscribe","points","x","p","y","createWebSocketStream","config","url","maxReconnectAttempts","reconnectDelay","bufferSize","throttleMs","parseMessage","onConnect","onDisconnect","onError","onReconnect","ws","state","reconnectAttempts","reconnectTimeout","connectionStartTime","buffers","subscribers","stats","lastFlushTime","flushScheduled","connect","event","handleMessage","scheduleReconnect","error","disconnect","parsed","pointArray","sum","b","scheduleFlush","timeSinceLastFlush","flush","buffer","callbacks","callback","message","CircularBuffer","capacity","__publicField","overwritten","n","result","toRemove","i","current","BackpressureManager","_a","_b","added","dropped","count","toConsume","fillLevel","totalSize","totalDropped","totalSampled","maxTotal","recommendations","score","dropRate","status","now","history","a","createBackpressureManager","maxBuffer","strategy","createRealtimeBackpressure","createLosslessBackpressure","createMockStream","interval","generatePoint","defaultGenerator","intervalId","connected","startTime","start","stop","mockX","manifestStreaming","PluginStreaming","_config","_ctx"],"mappings":"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"}