velo-plot 2.20.0 → 3.0.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 (236) hide show
  1. package/README.md +15 -8
  2. package/dist/{ChartCore-ivzLqxVb.js → ChartCore-BpzRvN4Y.js} +978 -861
  3. package/dist/ChartCore-BpzRvN4Y.js.map +1 -0
  4. package/dist/a11y-Bw6urYpr.js +105 -0
  5. package/dist/a11y-Bw6urYpr.js.map +1 -0
  6. package/dist/angular/hooks-entry.d.ts +1 -0
  7. package/dist/angular/hooks.d.ts +26 -0
  8. package/dist/angular/index.d.ts +8 -0
  9. package/dist/angular/velo-plot.component.d.ts +46 -0
  10. package/dist/angular-hooks.d.ts +1 -0
  11. package/dist/angular-hooks.js +9 -0
  12. package/dist/angular-hooks.js.map +1 -0
  13. package/dist/angular.d.ts +1 -0
  14. package/dist/angular.js +166 -0
  15. package/dist/angular.js.map +1 -0
  16. package/dist/assets/indicator.worker-bv0zC4EX.js.map +1 -1
  17. package/dist/astro/StackedPlot.astro +19 -0
  18. package/dist/astro/VeloPlot.astro +23 -0
  19. package/dist/bindings/shared/a11y.d.ts +26 -0
  20. package/dist/bindings/shared/chartLifecycle.d.ts +16 -0
  21. package/dist/bindings/shared/chartSyncBridge.d.ts +8 -0
  22. package/dist/bindings/shared/dimensions.d.ts +1 -0
  23. package/dist/bindings/shared/index.d.ts +9 -0
  24. package/dist/bindings/shared/indicatorBridge.d.ts +11 -0
  25. package/dist/bindings/shared/optionsSync.d.ts +7 -0
  26. package/dist/bindings/shared/seriesDiff.d.ts +8 -0
  27. package/dist/bindings/shared/stackedSync.d.ts +9 -0
  28. package/dist/bindings/shared/types.d.ts +46 -0
  29. package/dist/bindings/test-utils/index.d.ts +35 -0
  30. package/dist/bindings/test-utils/mockLifecycle.d.ts +120 -0
  31. package/dist/bindings/test-utils/vitestSveltePlugin.d.ts +3 -0
  32. package/dist/chartSyncBridge-DbWrwtyP.js +57 -0
  33. package/dist/chartSyncBridge-DbWrwtyP.js.map +1 -0
  34. package/dist/core/Chart.d.ts +1 -1
  35. package/dist/core/InteractionManager.d.ts +7 -1
  36. package/dist/core/OverlayRenderer.d.ts +5 -0
  37. package/dist/core/annotations/types.d.ts +1 -1
  38. package/dist/core/chart/ChartCore.d.ts +2 -2
  39. package/dist/core/chart/types.d.ts +1 -1
  40. package/dist/core/clipboard/index.d.ts +1 -1
  41. package/dist/core/debug/index.d.ts +1 -1
  42. package/dist/core/keybindings/index.d.ts +1 -1
  43. package/dist/core/loading/index.d.ts +1 -1
  44. package/dist/core/locale/index.d.ts +1 -1
  45. package/dist/core/stacked/paneResize.d.ts +3 -0
  46. package/dist/core/stacked/types.d.ts +10 -0
  47. package/dist/core/theme-editor/index.d.ts +1 -1
  48. package/dist/createStackedChart-Dm-YqUT7.js +756 -0
  49. package/dist/createStackedChart-Dm-YqUT7.js.map +1 -0
  50. package/dist/examples/PluginDemonstration.d.ts +1 -1
  51. package/dist/gpuRenderer-BpaMYz-k.js.map +1 -1
  52. package/dist/hooks-CYPCxoZx.js +69 -0
  53. package/dist/hooks-CYPCxoZx.js.map +1 -0
  54. package/dist/{index-BBpJwOct.js → index-0InEyj0q.js} +119 -121
  55. package/dist/index-0InEyj0q.js.map +1 -0
  56. package/dist/index-BMiZoKmm.js.map +1 -1
  57. package/dist/{index-DoYxf1cV.js → index-CWxIHdwX.js} +38 -98
  58. package/dist/index-CWxIHdwX.js.map +1 -0
  59. package/dist/index-CaXWSOTk.js.map +1 -1
  60. package/dist/index-Dag88bW4.js.map +1 -1
  61. package/dist/index-qhscKTDy.js.map +1 -1
  62. package/dist/index-qunX30Xu.js.map +1 -1
  63. package/dist/index-x4stH3jD.js.map +1 -1
  64. package/dist/{index.core-COREBDNq.js → index.core-BmZe2jRQ.js} +9 -9
  65. package/dist/index.core-BmZe2jRQ.js.map +1 -0
  66. package/dist/index.core.d.ts +1 -1
  67. package/dist/index.d.ts +2 -2
  68. package/dist/indicators--eJGmVox.js.map +1 -1
  69. package/dist/{mockDatafeed-927foCM4.js → mockDatafeed-DHIDPcpX.js} +150 -146
  70. package/dist/mockDatafeed-DHIDPcpX.js.map +1 -0
  71. package/dist/optionsSync-QUiN4Inw.js +119 -0
  72. package/dist/optionsSync-QUiN4Inw.js.map +1 -0
  73. package/dist/plugins/3d/index.d.ts +2 -2
  74. package/dist/plugins/3d.d.ts +2 -2
  75. package/dist/plugins/3d.js.map +1 -1
  76. package/dist/plugins/analysis/index.d.ts +1 -1
  77. package/dist/plugins/analysis/indicators.d.ts +1 -1
  78. package/dist/plugins/analysis.d.ts +2 -2
  79. package/dist/plugins/analysis.js +2 -2
  80. package/dist/plugins/analysis.js.map +1 -1
  81. package/dist/plugins/annotations/index.d.ts +1 -1
  82. package/dist/plugins/annotations.d.ts +2 -2
  83. package/dist/plugins/annotations.js.map +1 -1
  84. package/dist/plugins/anomaly-detection.js +1 -1
  85. package/dist/plugins/anomaly-detection.js.map +1 -1
  86. package/dist/plugins/broken-axis.d.ts +2 -2
  87. package/dist/plugins/builtins/crosshair/CrosshairPlugin.d.ts +1 -1
  88. package/dist/plugins/builtins/index.d.ts +1 -1
  89. package/dist/plugins/caching.d.ts +2 -2
  90. package/dist/plugins/clipboard/index.d.ts +2 -2
  91. package/dist/plugins/clipboard.d.ts +2 -2
  92. package/dist/plugins/clipboard.js.map +1 -1
  93. package/dist/plugins/context-menu/index.d.ts +1 -1
  94. package/dist/plugins/context-menu.d.ts +2 -2
  95. package/dist/plugins/context-menu.js +1 -1
  96. package/dist/plugins/context-menu.js.map +1 -1
  97. package/dist/plugins/data-export/index.d.ts +1 -1
  98. package/dist/plugins/data-export.d.ts +2 -2
  99. package/dist/plugins/data-export.js +2 -2
  100. package/dist/plugins/data-export.js.map +1 -1
  101. package/dist/plugins/data-transform.d.ts +2 -2
  102. package/dist/plugins/data-transform.js +19 -19
  103. package/dist/plugins/data-transform.js.map +1 -1
  104. package/dist/plugins/debug/index.d.ts +2 -2
  105. package/dist/plugins/debug.d.ts +2 -2
  106. package/dist/plugins/debug.js +2 -2
  107. package/dist/plugins/debug.js.map +1 -1
  108. package/dist/plugins/forecasting/index.d.ts +1 -1
  109. package/dist/plugins/forecasting.js.map +1 -1
  110. package/dist/plugins/gpu/index.d.ts +2 -2
  111. package/dist/plugins/gpu.d.ts +2 -2
  112. package/dist/plugins/gpu.js.map +1 -1
  113. package/dist/plugins/i18n/index.d.ts +2 -2
  114. package/dist/plugins/i18n.d.ts +2 -2
  115. package/dist/plugins/i18n.js.map +1 -1
  116. package/dist/plugins/index.d.ts +1 -1
  117. package/dist/plugins/keyboard.d.ts +2 -2
  118. package/dist/plugins/keyboard.js +65 -5
  119. package/dist/plugins/keyboard.js.map +1 -1
  120. package/dist/plugins/latex.js.map +1 -1
  121. package/dist/plugins/lazy-load.d.ts +2 -2
  122. package/dist/plugins/loading/index.d.ts +1 -1
  123. package/dist/plugins/loading.d.ts +2 -2
  124. package/dist/plugins/ml-integration.d.ts +2 -2
  125. package/dist/plugins/ml-integration.js +5 -5
  126. package/dist/plugins/ml-integration.js.map +1 -1
  127. package/dist/plugins/offscreen.d.ts +2 -2
  128. package/dist/plugins/pattern-recognition.d.ts +2 -2
  129. package/dist/plugins/pattern-recognition.js +1 -1
  130. package/dist/plugins/pattern-recognition.js.map +1 -1
  131. package/dist/plugins/radar.d.ts +2 -2
  132. package/dist/plugins/regression.d.ts +2 -2
  133. package/dist/plugins/regression.js +1 -1
  134. package/dist/plugins/regression.js.map +1 -1
  135. package/dist/plugins/roi.js +9 -9
  136. package/dist/plugins/roi.js.map +1 -1
  137. package/dist/plugins/snapshot/index.d.ts +1 -1
  138. package/dist/plugins/snapshot/types.d.ts +1 -1
  139. package/dist/plugins/snapshot.d.ts +2 -2
  140. package/dist/plugins/snapshot.js.map +1 -1
  141. package/dist/plugins/streaming/index.d.ts +2 -2
  142. package/dist/plugins/streaming.d.ts +2 -2
  143. package/dist/plugins/sync/index.d.ts +3 -2
  144. package/dist/plugins/sync.d.ts +2 -2
  145. package/dist/plugins/sync.js.map +1 -1
  146. package/dist/plugins/theme-editor/index.d.ts +1 -1
  147. package/dist/plugins/theme-editor.d.ts +2 -2
  148. package/dist/plugins/tools/index.d.ts +1 -1
  149. package/dist/plugins/tools/tooltip/index.d.ts +1 -1
  150. package/dist/plugins/tools.d.ts +2 -2
  151. package/dist/plugins/types.d.ts +1 -1
  152. package/dist/plugins/video-recorder.d.ts +2 -2
  153. package/dist/plugins/virtualization.d.ts +2 -2
  154. package/dist/plugins/virtualization.js +1 -1
  155. package/dist/pool-DZ8shSqv.js +109 -0
  156. package/dist/pool-DZ8shSqv.js.map +1 -0
  157. package/dist/react/StackedPlot.d.ts +31 -0
  158. package/dist/react/VeloPlot.d.ts +29 -0
  159. package/dist/react/index.d.ts +25 -3
  160. package/dist/react/useChartSync.d.ts +8 -0
  161. package/dist/react/useIndicator.d.ts +12 -0
  162. package/dist/react/useVeloPlot.d.ts +19 -0
  163. package/dist/react.js +328 -24
  164. package/dist/react.js.map +1 -1
  165. package/dist/scientific/index.d.ts +48 -0
  166. package/dist/scientific.d.ts +1 -0
  167. package/dist/scientific.js +91 -0
  168. package/dist/scientific.js.map +1 -0
  169. package/dist/solid/VeloPlot.d.ts +16 -0
  170. package/dist/solid/index.d.ts +13 -0
  171. package/dist/solid/useChartSync.d.ts +6 -0
  172. package/dist/solid/useIndicator.d.ts +11 -0
  173. package/dist/solid/useStackedPlot.d.ts +14 -0
  174. package/dist/solid/useVeloPlot.d.ts +18 -0
  175. package/dist/solid.d.ts +1 -0
  176. package/dist/solid.js +172 -0
  177. package/dist/solid.js.map +1 -0
  178. package/dist/stackedSync-tnrunZMt.js +100 -0
  179. package/dist/stackedSync-tnrunZMt.js.map +1 -0
  180. package/dist/svelte/StackedPlot.svelte +29 -0
  181. package/dist/svelte/StackedPlot.test.ts +114 -0
  182. package/dist/svelte/VeloPlot.svelte +44 -0
  183. package/dist/svelte/VeloPlot.test.ts +105 -0
  184. package/dist/svelte/index.d.ts +11 -0
  185. package/dist/svelte/index.test.ts +20 -0
  186. package/dist/svelte/index.ts +15 -0
  187. package/dist/svelte/useChartSync.d.ts +8 -0
  188. package/dist/svelte/useChartSync.test.ts +49 -0
  189. package/dist/svelte/useChartSync.ts +29 -0
  190. package/dist/svelte/useIndicator.d.ts +13 -0
  191. package/dist/svelte/useIndicator.test.ts +67 -0
  192. package/dist/svelte/useIndicator.ts +43 -0
  193. package/dist/svelte/useStackedPlot.d.ts +16 -0
  194. package/dist/svelte/useStackedPlot.test.ts +76 -0
  195. package/dist/svelte/useStackedPlot.ts +54 -0
  196. package/dist/svelte/useVeloPlot.d.ts +21 -0
  197. package/dist/svelte/useVeloPlot.test.ts +100 -0
  198. package/dist/svelte/useVeloPlot.ts +81 -0
  199. package/dist/svelte.d.ts +1 -0
  200. package/dist/svelte.js +143 -0
  201. package/dist/svelte.js.map +1 -0
  202. package/dist/testing/index.d.ts +1 -1
  203. package/dist/theme/index.d.ts +2 -1
  204. package/dist/trading.js +6 -6
  205. package/dist/types.d.ts +1 -1
  206. package/dist/{utils-BK5UUXxj.js → utils-Dx0h0bgQ.js} +9 -9
  207. package/dist/{utils-BK5UUXxj.js.map → utils-Dx0h0bgQ.js.map} +1 -1
  208. package/dist/velo-plot.full.js +452 -443
  209. package/dist/velo-plot.full.js.map +1 -1
  210. package/dist/velo-plot.js +15 -15
  211. package/dist/vue/StackedPlot.vue.d.ts +48 -0
  212. package/dist/vue/VeloPlot.vue.d.ts +64 -0
  213. package/dist/vue/index.d.ts +250 -0
  214. package/dist/vue/useChartSync.d.ts +52 -0
  215. package/dist/vue/useIndicator.d.ts +23 -0
  216. package/dist/vue/useStackedPlot.d.ts +15 -0
  217. package/dist/vue/useVeloPlot.d.ts +20 -0
  218. package/dist/vue.d.ts +1 -0
  219. package/dist/vue.js +312 -0
  220. package/dist/vue.js.map +1 -0
  221. package/dist/workers/indicatorsAsync.d.ts +2 -0
  222. package/dist/workers/pool.d.ts +9 -0
  223. package/package.json +88 -10
  224. package/dist/ChartCore-ivzLqxVb.js.map +0 -1
  225. package/dist/SciPlot-CEU4ApgD.js +0 -463
  226. package/dist/SciPlot-CEU4ApgD.js.map +0 -1
  227. package/dist/createStackedChart-DxNW0VkF.js +0 -705
  228. package/dist/createStackedChart-DxNW0VkF.js.map +0 -1
  229. package/dist/index-BBpJwOct.js.map +0 -1
  230. package/dist/index-DoYxf1cV.js.map +0 -1
  231. package/dist/index.core-COREBDNq.js.map +0 -1
  232. package/dist/mockDatafeed-927foCM4.js.map +0 -1
  233. package/dist/pool-15HMCNv8.js +0 -88
  234. package/dist/pool-15HMCNv8.js.map +0 -1
  235. package/dist/react/SciPlot.d.ts +0 -60
  236. package/dist/react/useSciPlot.d.ts +0 -56
@@ -1 +1 @@
1
- {"version":3,"file":"gpu.js","sources":["../../src/gpu/resources/bufferStore.ts","../../src/gpu/resources/textureStore.ts","../../src/gpu/resources/pipelineCache.ts","../../src/gpu/benchmark/benchmark.ts","../../src/gpu/compute/shaders.ts","../../src/gpu/compute/gpuCompute.ts","../../src/plugins/gpu/index.ts"],"sourcesContent":["/**\n * BufferStore - Manages GPU buffer lifecycle\n * \n * Provides a unified interface for buffer management across backends.\n * Handles buffer creation, updates, and cleanup.\n */\n\nimport type { BufferId, BufferUsage } from \"../types\";\n\nexport interface BufferEntry {\n id: BufferId;\n usage: BufferUsage;\n byteLength: number;\n lastUpdated: number;\n}\n\nexport interface IBufferStore {\n /** Create or update a buffer with new data */\n createOrUpdate(id: BufferId, data: ArrayBufferView, usage?: BufferUsage): void;\n \n /** Partially update a buffer at an offset */\n partialUpdate(id: BufferId, data: ArrayBufferView, offsetBytes: number): boolean;\n \n /** Get buffer metadata */\n getInfo(id: BufferId): BufferEntry | undefined;\n \n /** Check if buffer exists */\n has(id: BufferId): boolean;\n \n /** Delete a buffer */\n delete(id: BufferId): void;\n \n /** Get all buffer IDs */\n keys(): IterableIterator<BufferId>;\n \n /** Get buffer count */\n readonly size: number;\n \n /** Cleanup all buffers */\n destroy(): void;\n}\n\n/**\n * Abstract base class for buffer stores\n */\nexport abstract class BaseBufferStore implements IBufferStore {\n protected entries = new Map<BufferId, BufferEntry>();\n \n abstract createOrUpdate(id: BufferId, data: ArrayBufferView, usage?: BufferUsage): void;\n abstract partialUpdate(id: BufferId, data: ArrayBufferView, offsetBytes: number): boolean;\n abstract delete(id: BufferId): void;\n abstract destroy(): void;\n \n getInfo(id: BufferId): BufferEntry | undefined {\n return this.entries.get(id);\n }\n \n has(id: BufferId): boolean {\n return this.entries.has(id);\n }\n \n keys(): IterableIterator<BufferId> {\n return this.entries.keys();\n }\n \n get size(): number {\n return this.entries.size;\n }\n}\n","/**\n * TextureStore - Manages GPU texture lifecycle\n * \n * Provides a unified interface for texture management across backends.\n */\n\nimport type { TextureId, TextureFormat } from \"../types\";\n\nexport interface TextureEntry {\n id: TextureId;\n format: TextureFormat;\n width: number;\n height: number;\n lastUpdated: number;\n}\n\nexport interface ITextureStore {\n /** Create or update a 1D texture (for colormaps) */\n createOrUpdate1D(id: TextureId, data: Uint8Array, width?: number): void;\n \n /** Create or update a 2D texture */\n createOrUpdate2D(id: TextureId, data: Uint8Array, width: number, height: number): void;\n \n /** Get texture metadata */\n getInfo(id: TextureId): TextureEntry | undefined;\n \n /** Check if texture exists */\n has(id: TextureId): boolean;\n \n /** Delete a texture */\n delete(id: TextureId): void;\n \n /** Get all texture IDs */\n keys(): IterableIterator<TextureId>;\n \n /** Get texture count */\n readonly size: number;\n \n /** Cleanup all textures */\n destroy(): void;\n}\n\n/**\n * Abstract base class for texture stores\n */\nexport abstract class BaseTextureStore implements ITextureStore {\n protected entries = new Map<TextureId, TextureEntry>();\n \n abstract createOrUpdate1D(id: TextureId, data: Uint8Array, width?: number): void;\n abstract createOrUpdate2D(id: TextureId, data: Uint8Array, width: number, height: number): void;\n abstract delete(id: TextureId): void;\n abstract destroy(): void;\n \n getInfo(id: TextureId): TextureEntry | undefined {\n return this.entries.get(id);\n }\n \n has(id: TextureId): boolean {\n return this.entries.has(id);\n }\n \n keys(): IterableIterator<TextureId> {\n return this.entries.keys();\n }\n \n get size(): number {\n return this.entries.size;\n }\n}\n","/**\n * PipelineCache - Manages GPU pipeline lifecycle\n * \n * Caches compiled pipelines to avoid recompilation overhead.\n */\n\nexport type PipelineKind = \n | \"triangle\"\n | \"line\"\n | \"point\"\n | \"band\"\n | \"heatmap\";\n\nexport interface PipelineKey {\n kind: PipelineKind;\n variant?: string; // For future shader variants\n}\n\nexport interface IPipelineCache {\n /** Get or create a pipeline */\n getOrCreate<T>(key: PipelineKey, factory: () => T): T;\n \n /** Check if pipeline exists */\n has(key: PipelineKey): boolean;\n \n /** Delete a pipeline */\n delete(key: PipelineKey): void;\n \n /** Get pipeline count */\n readonly size: number;\n \n /** Cleanup all pipelines */\n destroy(): void;\n}\n\nfunction keyToString(key: PipelineKey): string {\n return key.variant ? `${key.kind}:${key.variant}` : key.kind;\n}\n\n/**\n * Generic pipeline cache implementation\n */\nexport class PipelineCache implements IPipelineCache {\n private pipelines = new Map<string, any>();\n \n getOrCreate<T>(key: PipelineKey, factory: () => T): T {\n const keyStr = keyToString(key);\n \n if (!this.pipelines.has(keyStr)) {\n const pipeline = factory();\n this.pipelines.set(keyStr, pipeline);\n }\n \n return this.pipelines.get(keyStr) as T;\n }\n \n has(key: PipelineKey): boolean {\n return this.pipelines.has(keyToString(key));\n }\n \n delete(key: PipelineKey): void {\n this.pipelines.delete(keyToString(key));\n }\n \n get size(): number {\n return this.pipelines.size;\n }\n \n destroy(): void {\n // Note: Actual pipeline destruction is backend-specific\n this.pipelines.clear();\n }\n}\n","/**\n * GPU Benchmark Utilities\n * \n * Provides tools for measuring rendering performance across backends.\n */\n\nexport interface BenchmarkResult {\n backend: \"webgpu\" | \"webgl\" | \"unknown\";\n pointCount: number;\n fps: number;\n avgFrameTime: number; // ms\n minFrameTime: number; // ms\n maxFrameTime: number; // ms\n totalFrames: number;\n duration: number; // ms\n}\n\nexport interface BenchmarkOptions {\n /** Number of points to render */\n pointCount?: number;\n \n /** Duration of benchmark in milliseconds */\n durationMs?: number;\n \n /** Warm-up frames before measuring */\n warmupFrames?: number;\n \n /** Callback for progress updates */\n onProgress?: (progress: number) => void;\n}\n\n/**\n * Benchmark runner for GPU backends\n */\nexport class GpuBenchmark {\n private canvas: HTMLCanvasElement;\n private results: BenchmarkResult[] = [];\n \n constructor(canvas?: HTMLCanvasElement) {\n this.canvas = canvas ?? document.createElement(\"canvas\");\n if (!canvas) {\n this.canvas.width = 800;\n this.canvas.height = 600;\n }\n }\n \n /**\n * Generate random line data\n */\n private generateLineData(pointCount: number): Float32Array {\n const data = new Float32Array(pointCount * 2);\n for (let i = 0; i < pointCount; i++) {\n data[i * 2] = i / (pointCount - 1); // x: 0 to 1\n data[i * 2 + 1] = Math.random(); // y: random\n }\n return data;\n }\n \n /**\n * Measure frame times\n */\n private async measureFrameTimes(\n renderFn: () => void,\n durationMs: number,\n warmupFrames: number = 10,\n onProgress?: (progress: number) => void\n ): Promise<{ frameTimes: number[]; duration: number }> {\n const frameTimes: number[] = [];\n let lastTime = performance.now();\n let warmupCount = 0;\n const startTime = performance.now();\n \n return new Promise((resolve) => {\n const loop = () => {\n const now = performance.now();\n const elapsed = now - startTime;\n \n if (elapsed >= durationMs + (warmupFrames * 16)) {\n resolve({ frameTimes, duration: elapsed - (warmupFrames * 16) });\n return;\n }\n \n renderFn();\n \n if (warmupCount >= warmupFrames) {\n frameTimes.push(now - lastTime);\n \n if (onProgress) {\n const progress = Math.min(1, elapsed / durationMs);\n onProgress(progress);\n }\n } else {\n warmupCount++;\n }\n \n lastTime = now;\n requestAnimationFrame(loop);\n };\n \n requestAnimationFrame(loop);\n });\n }\n \n /**\n * Run benchmark with WebGPU backend\n */\n async benchmarkWebGPU(options: BenchmarkOptions = {}): Promise<BenchmarkResult | null> {\n // Dynamic import to handle environments without WebGPU\n const { WebGPUBackend } = await import(\"../backends/webgpu/WebGPUBackend\");\n \n if (!WebGPUBackend.isSupported()) {\n console.warn(\"[Benchmark] WebGPU not supported\");\n return null;\n }\n \n const pointCount = options.pointCount ?? 100000;\n const durationMs = options.durationMs ?? 5000;\n const warmupFrames = options.warmupFrames ?? 30;\n \n const backend = new WebGPUBackend(this.canvas);\n await backend.init();\n \n backend.setViewport({\n width: this.canvas.width,\n height: this.canvas.height,\n dpr: 1,\n });\n \n const data = this.generateLineData(pointCount);\n backend.createOrUpdateBuffer(\"bench-line\", data, { usage: \"vertex\" });\n \n const drawList = {\n items: [{\n id: \"bench-line\",\n kind: \"line\" as const,\n bufferId: \"bench-line\",\n count: pointCount,\n visible: true,\n style: { color: [0, 0.9, 1, 1] as const },\n }],\n };\n \n const frame = {\n viewport: { width: this.canvas.width, height: this.canvas.height, dpr: 1 },\n clearColor: [0.1, 0.1, 0.15, 1] as const,\n };\n \n const bounds = { xMin: 0, xMax: 1, yMin: 0, yMax: 1 };\n \n const renderFn = () => {\n (backend as any).renderWithBounds(drawList, frame, bounds);\n };\n \n const { frameTimes, duration } = await this.measureFrameTimes(\n renderFn,\n durationMs,\n warmupFrames,\n options.onProgress\n );\n \n backend.destroy();\n \n const result = this.calculateResult(\"webgpu\", pointCount, frameTimes, duration);\n this.results.push(result);\n return result;\n }\n \n /**\n * Run benchmark with WebGL backend\n */\n async benchmarkWebGL(options: BenchmarkOptions = {}): Promise<BenchmarkResult | null> {\n const { WebGLBackend } = await import(\"../backends/webgl/WebGLBackend\");\n \n if (!WebGLBackend.isSupported()) {\n console.warn(\"[Benchmark] WebGL not supported\");\n return null;\n }\n \n const pointCount = options.pointCount ?? 100000;\n const durationMs = options.durationMs ?? 5000;\n const warmupFrames = options.warmupFrames ?? 30;\n \n const backend = new WebGLBackend(this.canvas);\n await backend.init();\n \n backend.setViewport({\n width: this.canvas.width,\n height: this.canvas.height,\n dpr: 1,\n });\n \n const data = this.generateLineData(pointCount);\n backend.createOrUpdateBuffer(\"bench-line\", data, { usage: \"vertex\" });\n \n const drawList = {\n items: [{\n id: \"bench-line\",\n kind: \"line\" as const,\n bufferId: \"bench-line\",\n count: pointCount,\n visible: true,\n style: { color: [0, 0.9, 1, 1] as const },\n }],\n };\n \n const frame = {\n viewport: { width: this.canvas.width, height: this.canvas.height, dpr: 1 },\n clearColor: [0.1, 0.1, 0.15, 1] as const,\n };\n \n const bounds = { xMin: 0, xMax: 1, yMin: 0, yMax: 1 };\n \n const renderFn = () => {\n backend.renderWithBounds(drawList, frame, bounds);\n };\n \n const { frameTimes, duration } = await this.measureFrameTimes(\n renderFn,\n durationMs,\n warmupFrames,\n options.onProgress\n );\n \n backend.destroy();\n \n const result = this.calculateResult(\"webgl\", pointCount, frameTimes, duration);\n this.results.push(result);\n return result;\n }\n \n /**\n * Calculate benchmark result from frame times\n */\n private calculateResult(\n backend: \"webgpu\" | \"webgl\",\n pointCount: number,\n frameTimes: number[],\n duration: number\n ): BenchmarkResult {\n if (frameTimes.length === 0) {\n return {\n backend,\n pointCount,\n fps: 0,\n avgFrameTime: 0,\n minFrameTime: 0,\n maxFrameTime: 0,\n totalFrames: 0,\n duration,\n };\n }\n \n const sum = frameTimes.reduce((a, b) => a + b, 0);\n const avg = sum / frameTimes.length;\n const min = Math.min(...frameTimes);\n const max = Math.max(...frameTimes);\n \n return {\n backend,\n pointCount,\n fps: Math.round(1000 / avg),\n avgFrameTime: Math.round(avg * 100) / 100,\n minFrameTime: Math.round(min * 100) / 100,\n maxFrameTime: Math.round(max * 100) / 100,\n totalFrames: frameTimes.length,\n duration: Math.round(duration),\n };\n }\n \n /**\n * Run comparative benchmark\n */\n async runComparison(options: BenchmarkOptions = {}): Promise<{\n webgpu: BenchmarkResult | null;\n webgl: BenchmarkResult | null;\n winner: \"webgpu\" | \"webgl\" | \"tie\" | \"unknown\";\n speedup: number;\n }> {\n const webgpu = await this.benchmarkWebGPU(options);\n const webgl = await this.benchmarkWebGL(options);\n \n let winner: \"webgpu\" | \"webgl\" | \"tie\" | \"unknown\" = \"unknown\";\n let speedup = 1;\n \n if (webgpu && webgl) {\n if (webgpu.fps > webgl.fps * 1.05) {\n winner = \"webgpu\";\n speedup = webgpu.fps / webgl.fps;\n } else if (webgl.fps > webgpu.fps * 1.05) {\n winner = \"webgl\";\n speedup = webgl.fps / webgpu.fps;\n } else {\n winner = \"tie\";\n speedup = 1;\n }\n } else if (webgpu) {\n winner = \"webgpu\";\n } else if (webgl) {\n winner = \"webgl\";\n }\n \n return { webgpu, webgl, winner, speedup: Math.round(speedup * 100) / 100 };\n }\n \n /**\n * Get all results\n */\n getResults(): BenchmarkResult[] {\n return [...this.results];\n }\n \n /**\n * Clear results\n */\n clearResults(): void {\n this.results = [];\n }\n \n /**\n * Format result as string\n */\n static formatResult(result: BenchmarkResult): string {\n return [\n `Backend: ${result.backend.toUpperCase()}`,\n `Points: ${result.pointCount.toLocaleString()}`,\n `FPS: ${result.fps}`,\n `Avg Frame: ${result.avgFrameTime}ms`,\n `Min/Max: ${result.minFrameTime}ms / ${result.maxFrameTime}ms`,\n `Frames: ${result.totalFrames}`,\n `Duration: ${result.duration}ms`,\n ].join(\" | \");\n }\n}\n","/**\n * GPU Compute - Compute shader infrastructure for WebGPU\n * \n * Provides GPU-accelerated data analysis capabilities.\n */\n\n// ============================================\n// Statistics Compute Shader\n// ============================================\n\nexport const STATS_COMPUTE_WGSL = `\nstruct StatsResult {\n min_val: f32,\n max_val: f32,\n sum: f32,\n sum_sq: f32,\n count: u32,\n padding: vec3<u32>,\n}\n\n@group(0) @binding(0) var<storage, read> input_data: array<f32>;\n@group(0) @binding(1) var<storage, read_write> result: StatsResult;\n\nvar<workgroup> local_min: array<f32, 256>;\nvar<workgroup> local_max: array<f32, 256>;\nvar<workgroup> local_sum: array<f32, 256>;\nvar<workgroup> local_sum_sq: array<f32, 256>;\nvar<workgroup> local_count: array<u32, 256>;\n\n@compute @workgroup_size(256)\nfn main(\n @builtin(global_invocation_id) global_id: vec3<u32>,\n @builtin(local_invocation_id) local_id: vec3<u32>,\n @builtin(workgroup_id) workgroup_id: vec3<u32>\n) {\n let idx = global_id.x;\n let lid = local_id.x;\n let data_len = arrayLength(&input_data);\n \n // Initialize local values\n if (idx < data_len) {\n let val = input_data[idx];\n local_min[lid] = val;\n local_max[lid] = val;\n local_sum[lid] = val;\n local_sum_sq[lid] = val * val;\n local_count[lid] = 1u;\n } else {\n local_min[lid] = 3.402823e+38; // f32 max\n local_max[lid] = -3.402823e+38; // f32 min\n local_sum[lid] = 0.0;\n local_sum_sq[lid] = 0.0;\n local_count[lid] = 0u;\n }\n \n workgroupBarrier();\n \n // Parallel reduction\n for (var stride: u32 = 128u; stride > 0u; stride = stride >> 1u) {\n if (lid < stride) {\n local_min[lid] = min(local_min[lid], local_min[lid + stride]);\n local_max[lid] = max(local_max[lid], local_max[lid + stride]);\n local_sum[lid] = local_sum[lid] + local_sum[lid + stride];\n local_sum_sq[lid] = local_sum_sq[lid] + local_sum_sq[lid + stride];\n local_count[lid] = local_count[lid] + local_count[lid + stride];\n }\n workgroupBarrier();\n }\n \n // First thread writes result (atomic for multi-workgroup)\n if (lid == 0u) {\n // Use atomics for multi-workgroup reduction\n // For now, we assume single workgroup or post-process on CPU\n result.min_val = local_min[0];\n result.max_val = local_max[0];\n result.sum = local_sum[0];\n result.sum_sq = local_sum_sq[0];\n result.count = local_count[0];\n }\n}\n`;\n\n// ============================================\n// Min/Max Compute Shader (for bounds calculation)\n// ============================================\n\nexport const MINMAX_COMPUTE_WGSL = `\nstruct MinMax {\n min_x: f32,\n max_x: f32,\n min_y: f32,\n max_y: f32,\n}\n\n@group(0) @binding(0) var<storage, read> points: array<vec2<f32>>;\n@group(0) @binding(1) var<storage, read_write> result: MinMax;\n\nvar<workgroup> local_min_x: array<f32, 256>;\nvar<workgroup> local_max_x: array<f32, 256>;\nvar<workgroup> local_min_y: array<f32, 256>;\nvar<workgroup> local_max_y: array<f32, 256>;\n\n@compute @workgroup_size(256)\nfn main(\n @builtin(global_invocation_id) global_id: vec3<u32>,\n @builtin(local_invocation_id) local_id: vec3<u32>\n) {\n let idx = global_id.x;\n let lid = local_id.x;\n let data_len = arrayLength(&points);\n \n if (idx < data_len) {\n let pt = points[idx];\n local_min_x[lid] = pt.x;\n local_max_x[lid] = pt.x;\n local_min_y[lid] = pt.y;\n local_max_y[lid] = pt.y;\n } else {\n local_min_x[lid] = 3.402823e+38;\n local_max_x[lid] = -3.402823e+38;\n local_min_y[lid] = 3.402823e+38;\n local_max_y[lid] = -3.402823e+38;\n }\n \n workgroupBarrier();\n \n for (var stride: u32 = 128u; stride > 0u; stride = stride >> 1u) {\n if (lid < stride) {\n local_min_x[lid] = min(local_min_x[lid], local_min_x[lid + stride]);\n local_max_x[lid] = max(local_max_x[lid], local_max_x[lid + stride]);\n local_min_y[lid] = min(local_min_y[lid], local_min_y[lid + stride]);\n local_max_y[lid] = max(local_max_y[lid], local_max_y[lid + stride]);\n }\n workgroupBarrier();\n }\n \n if (lid == 0u) {\n result.min_x = local_min_x[0];\n result.max_x = local_max_x[0];\n result.min_y = local_min_y[0];\n result.max_y = local_max_y[0];\n }\n}\n`;\n\n// ============================================\n// Downsample Compute Shader (Min-Max per bucket)\n// ============================================\n\nexport const DOWNSAMPLE_COMPUTE_WGSL = `\nstruct Params {\n input_count: u32,\n output_count: u32,\n bucket_size: u32,\n padding: u32,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> input_points: array<vec2<f32>>;\n@group(0) @binding(2) var<storage, read_write> output_points: array<vec2<f32>>;\n\n@compute @workgroup_size(64)\nfn main(@builtin(global_invocation_id) global_id: vec3<u32>) {\n let bucket_idx = global_id.x;\n \n if (bucket_idx >= params.output_count / 2u) {\n return;\n }\n \n let start = bucket_idx * params.bucket_size;\n let end = min(start + params.bucket_size, params.input_count);\n \n if (start >= params.input_count) {\n return;\n }\n \n var min_y = input_points[start].y;\n var max_y = input_points[start].y;\n var min_idx = start;\n var max_idx = start;\n \n for (var i = start; i < end; i = i + 1u) {\n let y = input_points[i].y;\n if (y < min_y) {\n min_y = y;\n min_idx = i;\n }\n if (y > max_y) {\n max_y = y;\n max_idx = i;\n }\n }\n \n // Output min and max points (preserving x,y pairs)\n let out_base = bucket_idx * 2u;\n \n // Ensure min comes before max in x order\n if (min_idx <= max_idx) {\n output_points[out_base] = input_points[min_idx];\n output_points[out_base + 1u] = input_points[max_idx];\n } else {\n output_points[out_base] = input_points[max_idx];\n output_points[out_base + 1u] = input_points[min_idx];\n }\n}\n`;\n\n// ============================================\n// Peak Detection Compute Shader\n// ============================================\n\nexport const PEAK_DETECT_COMPUTE_WGSL = `\nstruct Params {\n data_count: u32,\n threshold: f32,\n min_distance: u32,\n padding: u32,\n}\n\nstruct Peak {\n index: u32,\n value: f32,\n is_peak: u32,\n padding: u32,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<storage, read_write> peaks: array<Peak>;\n\n@compute @workgroup_size(64)\nfn main(@builtin(global_invocation_id) global_id: vec3<u32>) {\n let idx = global_id.x;\n \n if (idx >= params.data_count) {\n return;\n }\n \n peaks[idx].index = idx;\n peaks[idx].value = data[idx];\n peaks[idx].is_peak = 0u;\n \n // Skip edges\n if (idx < params.min_distance || idx >= params.data_count - params.min_distance) {\n return;\n }\n \n let val = data[idx];\n \n // Check if above threshold\n if (val < params.threshold) {\n return;\n }\n \n // Check if local maximum\n var is_max = true;\n for (var i = 1u; i <= params.min_distance; i = i + 1u) {\n if (data[idx - i] >= val || data[idx + i] >= val) {\n is_max = false;\n break;\n }\n }\n \n if (is_max) {\n peaks[idx].is_peak = 1u;\n }\n}\n`;\n","/**\n * GPU Compute Engine\n * \n * Provides GPU-accelerated data analysis using WebGPU compute shaders.\n * Includes statistics calculation, bounds computation, downsampling, and peak detection.\n */\n\nimport {\n STATS_COMPUTE_WGSL,\n MINMAX_COMPUTE_WGSL,\n DOWNSAMPLE_COMPUTE_WGSL,\n PEAK_DETECT_COMPUTE_WGSL,\n} from \"./shaders\";\n\nexport interface DataStats {\n min: number;\n max: number;\n mean: number;\n std: number;\n count: number;\n}\n\nexport interface DataBounds {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n}\n\nexport interface Peak {\n index: number;\n value: number;\n}\n\nexport interface GpuComputeOptions {\n /** WebGPU device (if already available) */\n device?: any;\n}\n\n/**\n * GPU Compute Engine for data analysis\n */\nexport class GpuCompute {\n private device: any = null;\n private statsPipeline: any = null;\n private minmaxPipeline: any = null;\n private downsamplePipeline: any = null;\n private peaksPipeline: any = null;\n \n private isInitialized = false;\n \n constructor(private options: GpuComputeOptions = {}) {}\n \n /**\n * Check if GPU compute is available\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 /**\n * Initialize the compute engine\n */\n async init(): Promise<void> {\n if (this.options.device) {\n this.device = this.options.device;\n } else {\n if (!GpuCompute.isSupported()) {\n throw new Error(\"[GpuCompute] WebGPU not supported\");\n }\n \n const gpu = (globalThis as any).navigator.gpu;\n const adapter = await gpu.requestAdapter({ powerPreference: \"high-performance\" });\n if (!adapter) {\n throw new Error(\"[GpuCompute] Failed to get adapter\");\n }\n \n this.device = await adapter.requestDevice();\n }\n \n // Create pipelines\n await this.createPipelines();\n this.isInitialized = true;\n }\n \n private async createPipelines(): Promise<void> {\n // Stats pipeline\n const statsModule = this.device.createShaderModule({ code: STATS_COMPUTE_WGSL });\n this.statsPipeline = await this.device.createComputePipelineAsync({\n layout: \"auto\",\n compute: { module: statsModule, entryPoint: \"main\" },\n });\n \n // MinMax pipeline\n const minmaxModule = this.device.createShaderModule({ code: MINMAX_COMPUTE_WGSL });\n this.minmaxPipeline = await this.device.createComputePipelineAsync({\n layout: \"auto\",\n compute: { module: minmaxModule, entryPoint: \"main\" },\n });\n \n // Downsample pipeline\n const downsampleModule = this.device.createShaderModule({ code: DOWNSAMPLE_COMPUTE_WGSL });\n this.downsamplePipeline = await this.device.createComputePipelineAsync({\n layout: \"auto\",\n compute: { module: downsampleModule, entryPoint: \"main\" },\n });\n \n // Peak detection pipeline\n const peaksModule = this.device.createShaderModule({ code: PEAK_DETECT_COMPUTE_WGSL });\n this.peaksPipeline = await this.device.createComputePipelineAsync({\n layout: \"auto\",\n compute: { module: peaksModule, entryPoint: \"main\" },\n });\n }\n \n /**\n * Calculate statistics for a 1D array of values\n */\n async calculateStats(data: Float32Array): Promise<DataStats> {\n if (!this.isInitialized) {\n throw new Error(\"[GpuCompute] Not initialized\");\n }\n \n const GPUBufferUsage = (globalThis as any).GPUBufferUsage;\n \n // Create input buffer\n const inputBuffer = this.device.createBuffer({\n size: data.byteLength,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(inputBuffer, 0, data);\n \n // Create result buffer (32 bytes: 5 floats + padding)\n const resultBuffer = this.device.createBuffer({\n size: 32,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n });\n \n // Create staging buffer for readback\n const stagingBuffer = this.device.createBuffer({\n size: 32,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n \n // Create bind group\n const bindGroup = this.device.createBindGroup({\n layout: this.statsPipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: inputBuffer } },\n { binding: 1, resource: { buffer: resultBuffer } },\n ],\n });\n \n // Dispatch\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginComputePass();\n pass.setPipeline(this.statsPipeline);\n pass.setBindGroup(0, bindGroup);\n \n const workgroups = Math.ceil(data.length / 256);\n pass.dispatchWorkgroups(workgroups);\n pass.end();\n \n // Copy result to staging\n encoder.copyBufferToBuffer(resultBuffer, 0, stagingBuffer, 0, 32);\n \n this.device.queue.submit([encoder.finish()]);\n \n // Read back\n await stagingBuffer.mapAsync((globalThis as any).GPUMapMode.READ);\n const resultData = new Float32Array(stagingBuffer.getMappedRange().slice(0));\n stagingBuffer.unmap();\n \n // Cleanup\n inputBuffer.destroy();\n resultBuffer.destroy();\n stagingBuffer.destroy();\n \n const [min, max, sum, sumSq, countFloat] = resultData;\n const count = Math.floor(countFloat);\n const mean = count > 0 ? sum / count : 0;\n const variance = count > 1 ? (sumSq - (sum * sum) / count) / (count - 1) : 0;\n const std = Math.sqrt(Math.max(0, variance));\n \n return { min, max, mean, std, count };\n }\n \n /**\n * Calculate bounds for 2D point data\n */\n async calculateBounds(points: Float32Array): Promise<DataBounds> {\n if (!this.isInitialized) {\n throw new Error(\"[GpuCompute] Not initialized\");\n }\n \n const GPUBufferUsage = (globalThis as any).GPUBufferUsage;\n \n // Create input buffer (vec2 array)\n const inputBuffer = this.device.createBuffer({\n size: points.byteLength,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(inputBuffer, 0, points);\n \n // Create result buffer (16 bytes: 4 floats)\n const resultBuffer = this.device.createBuffer({\n size: 16,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n });\n \n // Staging buffer\n const stagingBuffer = this.device.createBuffer({\n size: 16,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n \n // Bind group\n const bindGroup = this.device.createBindGroup({\n layout: this.minmaxPipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: inputBuffer } },\n { binding: 1, resource: { buffer: resultBuffer } },\n ],\n });\n \n // Dispatch\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginComputePass();\n pass.setPipeline(this.minmaxPipeline);\n pass.setBindGroup(0, bindGroup);\n \n const pointCount = points.length / 2;\n const workgroups = Math.ceil(pointCount / 256);\n pass.dispatchWorkgroups(workgroups);\n pass.end();\n \n encoder.copyBufferToBuffer(resultBuffer, 0, stagingBuffer, 0, 16);\n this.device.queue.submit([encoder.finish()]);\n \n // Read back\n await stagingBuffer.mapAsync((globalThis as any).GPUMapMode.READ);\n const resultData = new Float32Array(stagingBuffer.getMappedRange().slice(0));\n stagingBuffer.unmap();\n \n // Cleanup\n inputBuffer.destroy();\n resultBuffer.destroy();\n stagingBuffer.destroy();\n \n return {\n xMin: resultData[0],\n xMax: resultData[1],\n yMin: resultData[2],\n yMax: resultData[3],\n };\n }\n \n /**\n * Downsample point data using min-max algorithm\n */\n async downsample(\n points: Float32Array,\n targetCount: number\n ): Promise<Float32Array> {\n if (!this.isInitialized) {\n throw new Error(\"[GpuCompute] Not initialized\");\n }\n \n const pointCount = points.length / 2;\n if (pointCount <= targetCount) {\n return points; // No downsampling needed\n }\n \n const GPUBufferUsage = (globalThis as any).GPUBufferUsage;\n \n // Calculate bucket size (output is 2 points per bucket: min and max)\n const outputPairs = Math.ceil(targetCount / 2);\n const bucketSize = Math.ceil(pointCount / outputPairs);\n const outputCount = outputPairs * 2;\n \n // Create params buffer\n const paramsData = new Uint32Array([pointCount, outputCount, bucketSize, 0]);\n const paramsBuffer = this.device.createBuffer({\n size: 16,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(paramsBuffer, 0, paramsData);\n \n // Create input buffer\n const inputBuffer = this.device.createBuffer({\n size: points.byteLength,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(inputBuffer, 0, points);\n \n // Create output buffer\n const outputSize = outputCount * 2 * 4; // vec2 * count * sizeof(float)\n const outputBuffer = this.device.createBuffer({\n size: outputSize,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n });\n \n // Staging buffer\n const stagingBuffer = this.device.createBuffer({\n size: outputSize,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n \n // Bind group\n const bindGroup = this.device.createBindGroup({\n layout: this.downsamplePipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: paramsBuffer } },\n { binding: 1, resource: { buffer: inputBuffer } },\n { binding: 2, resource: { buffer: outputBuffer } },\n ],\n });\n \n // Dispatch\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginComputePass();\n pass.setPipeline(this.downsamplePipeline);\n pass.setBindGroup(0, bindGroup);\n \n const workgroups = Math.ceil(outputPairs / 64);\n pass.dispatchWorkgroups(workgroups);\n pass.end();\n \n encoder.copyBufferToBuffer(outputBuffer, 0, stagingBuffer, 0, outputSize);\n this.device.queue.submit([encoder.finish()]);\n \n // Read back\n await stagingBuffer.mapAsync((globalThis as any).GPUMapMode.READ);\n const result = new Float32Array(stagingBuffer.getMappedRange().slice(0));\n stagingBuffer.unmap();\n \n // Cleanup\n paramsBuffer.destroy();\n inputBuffer.destroy();\n outputBuffer.destroy();\n stagingBuffer.destroy();\n \n return result;\n }\n \n /**\n * Detect peaks in 1D data\n */\n async detectPeaks(\n data: Float32Array,\n options: { threshold?: number; minDistance?: number } = {}\n ): Promise<Peak[]> {\n if (!this.isInitialized) {\n throw new Error(\"[GpuCompute] Not initialized\");\n }\n \n const threshold = options.threshold ?? 0;\n const minDistance = options.minDistance ?? 1;\n \n const GPUBufferUsage = (globalThis as any).GPUBufferUsage;\n \n // Create params buffer\n const paramsData = new Float32Array([\n data.length,\n threshold,\n minDistance,\n 0, // padding\n ]);\n const paramsBuffer = this.device.createBuffer({\n size: 16,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(paramsBuffer, 0, new Uint8Array(paramsData.buffer));\n \n // Input buffer\n const inputBuffer = this.device.createBuffer({\n size: data.byteLength,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(inputBuffer, 0, data);\n \n // Output buffer (Peak struct = 16 bytes each)\n const outputSize = data.length * 16;\n const outputBuffer = this.device.createBuffer({\n size: outputSize,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n });\n \n // Staging buffer\n const stagingBuffer = this.device.createBuffer({\n size: outputSize,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n \n // Bind group\n const bindGroup = this.device.createBindGroup({\n layout: this.peaksPipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: paramsBuffer } },\n { binding: 1, resource: { buffer: inputBuffer } },\n { binding: 2, resource: { buffer: outputBuffer } },\n ],\n });\n \n // Dispatch\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginComputePass();\n pass.setPipeline(this.peaksPipeline);\n pass.setBindGroup(0, bindGroup);\n \n const workgroups = Math.ceil(data.length / 64);\n pass.dispatchWorkgroups(workgroups);\n pass.end();\n \n encoder.copyBufferToBuffer(outputBuffer, 0, stagingBuffer, 0, outputSize);\n this.device.queue.submit([encoder.finish()]);\n \n // Read back\n await stagingBuffer.mapAsync((globalThis as any).GPUMapMode.READ);\n const resultBuffer = new ArrayBuffer(outputSize);\n new Uint8Array(resultBuffer).set(new Uint8Array(stagingBuffer.getMappedRange()));\n stagingBuffer.unmap();\n \n // Parse peaks\n const resultView = new DataView(resultBuffer);\n const peaks: Peak[] = [];\n \n for (let i = 0; i < data.length; i++) {\n const offset = i * 16;\n const isPeak = resultView.getUint32(offset + 8, true);\n \n if (isPeak) {\n peaks.push({\n index: resultView.getUint32(offset, true),\n value: resultView.getFloat32(offset + 4, true),\n });\n }\n }\n \n // Cleanup\n paramsBuffer.destroy();\n inputBuffer.destroy();\n outputBuffer.destroy();\n stagingBuffer.destroy();\n \n return peaks;\n }\n \n /**\n * Cleanup resources\n */\n destroy(): void {\n // Pipelines are managed by device, no explicit cleanup needed\n this.device = null;\n this.statsPipeline = null;\n this.minmaxPipeline = null;\n this.downsamplePipeline = null;\n this.peaksPipeline = null;\n this.isInitialized = false;\n }\n}\n","/**\n * SciPlot Engine - GPU Abstraction Plugin\n * \n * Provides WebGPU and WebGL2 backend support, GPU compute capabilities,\n * and performance benchmarking tools.\n * \n * @module plugins/gpu\n */\n\nexport {\n // Backends\n WebGPUBackend,\n WebGLBackend,\n\n // Renderer facade\n GpuRenderer,\n createGpuRenderer,\n\n // Adapter\n SeriesAdapter,\n parseColorToRGBA,\n\n // Resource management\n PipelineCache,\n BaseBufferStore,\n BaseTextureStore,\n\n // Benchmark\n GpuBenchmark,\n\n // GPU Compute\n GpuCompute,\n} from \"../../gpu\";\n\nexport * from \"../../gpu/types\";\n\nimport type { PluginManifest, ChartPlugin, PluginContext } from \"../types\";\n\nexport interface PluginGpuConfig {\n /** Preferred backend: 'webgpu' | 'webgl2' | 'webgl1' */\n preferredBackend?: string;\n /** Enable hardware acceleration for compute tasks */\n enableCompute?: boolean;\n}\n\nconst manifestGpu: PluginManifest = {\n name: \"velo-plot-gpu\",\n version: \"1.0.0\",\n description: \"GPU acceleration and WebGPU support for velo-plot\",\n provides: [\"renderer\", \"compute\"],\n tags: [\"gpu\", \"webgpu\", \"webgl2\", \"performance\"],\n};\n\n/**\n * SciPlot GPU Plugin\n * \n * Enables high-performance GPU-accelerated rendering and compute.\n */\nexport function PluginGpu(_config: PluginGpuConfig = {}): ChartPlugin<PluginGpuConfig> {\n return {\n manifest: manifestGpu,\n\n onInit(_ctx: PluginContext) {\n },\n\n onDestroy(_ctx: PluginContext) {\n }\n };\n}\n\nexport default PluginGpu;\n"],"names":["BaseBufferStore","__publicField","id","BaseTextureStore","keyToString","key","PipelineCache","factory","keyStr","pipeline","GpuBenchmark","canvas","pointCount","data","i","renderFn","durationMs","warmupFrames","onProgress","frameTimes","lastTime","warmupCount","startTime","resolve","loop","now","elapsed","progress","options","WebGPUBackend","n","backend","drawList","frame","bounds","duration","result","WebGLBackend","avg","a","b","min","max","webgpu","webgl","winner","speedup","STATS_COMPUTE_WGSL","MINMAX_COMPUTE_WGSL","DOWNSAMPLE_COMPUTE_WGSL","PEAK_DETECT_COMPUTE_WGSL","GpuCompute","adapter","statsModule","minmaxModule","downsampleModule","peaksModule","GPUBufferUsage","inputBuffer","resultBuffer","stagingBuffer","bindGroup","encoder","pass","workgroups","resultData","sum","sumSq","countFloat","count","mean","variance","std","points","targetCount","outputPairs","bucketSize","outputCount","paramsData","paramsBuffer","outputSize","outputBuffer","threshold","minDistance","resultView","peaks","offset","manifestGpu","PluginGpu","_config","_ctx"],"mappings":"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"}
1
+ {"version":3,"file":"gpu.js","sources":["../../src/gpu/resources/bufferStore.ts","../../src/gpu/resources/textureStore.ts","../../src/gpu/resources/pipelineCache.ts","../../src/gpu/benchmark/benchmark.ts","../../src/gpu/compute/shaders.ts","../../src/gpu/compute/gpuCompute.ts","../../src/plugins/gpu/index.ts"],"sourcesContent":["/**\n * BufferStore - Manages GPU buffer lifecycle\n * \n * Provides a unified interface for buffer management across backends.\n * Handles buffer creation, updates, and cleanup.\n */\n\nimport type { BufferId, BufferUsage } from \"../types\";\n\nexport interface BufferEntry {\n id: BufferId;\n usage: BufferUsage;\n byteLength: number;\n lastUpdated: number;\n}\n\nexport interface IBufferStore {\n /** Create or update a buffer with new data */\n createOrUpdate(id: BufferId, data: ArrayBufferView, usage?: BufferUsage): void;\n \n /** Partially update a buffer at an offset */\n partialUpdate(id: BufferId, data: ArrayBufferView, offsetBytes: number): boolean;\n \n /** Get buffer metadata */\n getInfo(id: BufferId): BufferEntry | undefined;\n \n /** Check if buffer exists */\n has(id: BufferId): boolean;\n \n /** Delete a buffer */\n delete(id: BufferId): void;\n \n /** Get all buffer IDs */\n keys(): IterableIterator<BufferId>;\n \n /** Get buffer count */\n readonly size: number;\n \n /** Cleanup all buffers */\n destroy(): void;\n}\n\n/**\n * Abstract base class for buffer stores\n */\nexport abstract class BaseBufferStore implements IBufferStore {\n protected entries = new Map<BufferId, BufferEntry>();\n \n abstract createOrUpdate(id: BufferId, data: ArrayBufferView, usage?: BufferUsage): void;\n abstract partialUpdate(id: BufferId, data: ArrayBufferView, offsetBytes: number): boolean;\n abstract delete(id: BufferId): void;\n abstract destroy(): void;\n \n getInfo(id: BufferId): BufferEntry | undefined {\n return this.entries.get(id);\n }\n \n has(id: BufferId): boolean {\n return this.entries.has(id);\n }\n \n keys(): IterableIterator<BufferId> {\n return this.entries.keys();\n }\n \n get size(): number {\n return this.entries.size;\n }\n}\n","/**\n * TextureStore - Manages GPU texture lifecycle\n * \n * Provides a unified interface for texture management across backends.\n */\n\nimport type { TextureId, TextureFormat } from \"../types\";\n\nexport interface TextureEntry {\n id: TextureId;\n format: TextureFormat;\n width: number;\n height: number;\n lastUpdated: number;\n}\n\nexport interface ITextureStore {\n /** Create or update a 1D texture (for colormaps) */\n createOrUpdate1D(id: TextureId, data: Uint8Array, width?: number): void;\n \n /** Create or update a 2D texture */\n createOrUpdate2D(id: TextureId, data: Uint8Array, width: number, height: number): void;\n \n /** Get texture metadata */\n getInfo(id: TextureId): TextureEntry | undefined;\n \n /** Check if texture exists */\n has(id: TextureId): boolean;\n \n /** Delete a texture */\n delete(id: TextureId): void;\n \n /** Get all texture IDs */\n keys(): IterableIterator<TextureId>;\n \n /** Get texture count */\n readonly size: number;\n \n /** Cleanup all textures */\n destroy(): void;\n}\n\n/**\n * Abstract base class for texture stores\n */\nexport abstract class BaseTextureStore implements ITextureStore {\n protected entries = new Map<TextureId, TextureEntry>();\n \n abstract createOrUpdate1D(id: TextureId, data: Uint8Array, width?: number): void;\n abstract createOrUpdate2D(id: TextureId, data: Uint8Array, width: number, height: number): void;\n abstract delete(id: TextureId): void;\n abstract destroy(): void;\n \n getInfo(id: TextureId): TextureEntry | undefined {\n return this.entries.get(id);\n }\n \n has(id: TextureId): boolean {\n return this.entries.has(id);\n }\n \n keys(): IterableIterator<TextureId> {\n return this.entries.keys();\n }\n \n get size(): number {\n return this.entries.size;\n }\n}\n","/**\n * PipelineCache - Manages GPU pipeline lifecycle\n * \n * Caches compiled pipelines to avoid recompilation overhead.\n */\n\nexport type PipelineKind = \n | \"triangle\"\n | \"line\"\n | \"point\"\n | \"band\"\n | \"heatmap\";\n\nexport interface PipelineKey {\n kind: PipelineKind;\n variant?: string; // For future shader variants\n}\n\nexport interface IPipelineCache {\n /** Get or create a pipeline */\n getOrCreate<T>(key: PipelineKey, factory: () => T): T;\n \n /** Check if pipeline exists */\n has(key: PipelineKey): boolean;\n \n /** Delete a pipeline */\n delete(key: PipelineKey): void;\n \n /** Get pipeline count */\n readonly size: number;\n \n /** Cleanup all pipelines */\n destroy(): void;\n}\n\nfunction keyToString(key: PipelineKey): string {\n return key.variant ? `${key.kind}:${key.variant}` : key.kind;\n}\n\n/**\n * Generic pipeline cache implementation\n */\nexport class PipelineCache implements IPipelineCache {\n private pipelines = new Map<string, any>();\n \n getOrCreate<T>(key: PipelineKey, factory: () => T): T {\n const keyStr = keyToString(key);\n \n if (!this.pipelines.has(keyStr)) {\n const pipeline = factory();\n this.pipelines.set(keyStr, pipeline);\n }\n \n return this.pipelines.get(keyStr) as T;\n }\n \n has(key: PipelineKey): boolean {\n return this.pipelines.has(keyToString(key));\n }\n \n delete(key: PipelineKey): void {\n this.pipelines.delete(keyToString(key));\n }\n \n get size(): number {\n return this.pipelines.size;\n }\n \n destroy(): void {\n // Note: Actual pipeline destruction is backend-specific\n this.pipelines.clear();\n }\n}\n","/**\n * GPU Benchmark Utilities\n * \n * Provides tools for measuring rendering performance across backends.\n */\n\nexport interface BenchmarkResult {\n backend: \"webgpu\" | \"webgl\" | \"unknown\";\n pointCount: number;\n fps: number;\n avgFrameTime: number; // ms\n minFrameTime: number; // ms\n maxFrameTime: number; // ms\n totalFrames: number;\n duration: number; // ms\n}\n\nexport interface BenchmarkOptions {\n /** Number of points to render */\n pointCount?: number;\n \n /** Duration of benchmark in milliseconds */\n durationMs?: number;\n \n /** Warm-up frames before measuring */\n warmupFrames?: number;\n \n /** Callback for progress updates */\n onProgress?: (progress: number) => void;\n}\n\n/**\n * Benchmark runner for GPU backends\n */\nexport class GpuBenchmark {\n private canvas: HTMLCanvasElement;\n private results: BenchmarkResult[] = [];\n \n constructor(canvas?: HTMLCanvasElement) {\n this.canvas = canvas ?? document.createElement(\"canvas\");\n if (!canvas) {\n this.canvas.width = 800;\n this.canvas.height = 600;\n }\n }\n \n /**\n * Generate random line data\n */\n private generateLineData(pointCount: number): Float32Array {\n const data = new Float32Array(pointCount * 2);\n for (let i = 0; i < pointCount; i++) {\n data[i * 2] = i / (pointCount - 1); // x: 0 to 1\n data[i * 2 + 1] = Math.random(); // y: random\n }\n return data;\n }\n \n /**\n * Measure frame times\n */\n private async measureFrameTimes(\n renderFn: () => void,\n durationMs: number,\n warmupFrames: number = 10,\n onProgress?: (progress: number) => void\n ): Promise<{ frameTimes: number[]; duration: number }> {\n const frameTimes: number[] = [];\n let lastTime = performance.now();\n let warmupCount = 0;\n const startTime = performance.now();\n \n return new Promise((resolve) => {\n const loop = () => {\n const now = performance.now();\n const elapsed = now - startTime;\n \n if (elapsed >= durationMs + (warmupFrames * 16)) {\n resolve({ frameTimes, duration: elapsed - (warmupFrames * 16) });\n return;\n }\n \n renderFn();\n \n if (warmupCount >= warmupFrames) {\n frameTimes.push(now - lastTime);\n \n if (onProgress) {\n const progress = Math.min(1, elapsed / durationMs);\n onProgress(progress);\n }\n } else {\n warmupCount++;\n }\n \n lastTime = now;\n requestAnimationFrame(loop);\n };\n \n requestAnimationFrame(loop);\n });\n }\n \n /**\n * Run benchmark with WebGPU backend\n */\n async benchmarkWebGPU(options: BenchmarkOptions = {}): Promise<BenchmarkResult | null> {\n // Dynamic import to handle environments without WebGPU\n const { WebGPUBackend } = await import(\"../backends/webgpu/WebGPUBackend\");\n \n if (!WebGPUBackend.isSupported()) {\n console.warn(\"[Benchmark] WebGPU not supported\");\n return null;\n }\n \n const pointCount = options.pointCount ?? 100000;\n const durationMs = options.durationMs ?? 5000;\n const warmupFrames = options.warmupFrames ?? 30;\n \n const backend = new WebGPUBackend(this.canvas);\n await backend.init();\n \n backend.setViewport({\n width: this.canvas.width,\n height: this.canvas.height,\n dpr: 1,\n });\n \n const data = this.generateLineData(pointCount);\n backend.createOrUpdateBuffer(\"bench-line\", data, { usage: \"vertex\" });\n \n const drawList = {\n items: [{\n id: \"bench-line\",\n kind: \"line\" as const,\n bufferId: \"bench-line\",\n count: pointCount,\n visible: true,\n style: { color: [0, 0.9, 1, 1] as const },\n }],\n };\n \n const frame = {\n viewport: { width: this.canvas.width, height: this.canvas.height, dpr: 1 },\n clearColor: [0.1, 0.1, 0.15, 1] as const,\n };\n \n const bounds = { xMin: 0, xMax: 1, yMin: 0, yMax: 1 };\n \n const renderFn = () => {\n (backend as any).renderWithBounds(drawList, frame, bounds);\n };\n \n const { frameTimes, duration } = await this.measureFrameTimes(\n renderFn,\n durationMs,\n warmupFrames,\n options.onProgress\n );\n \n backend.destroy();\n \n const result = this.calculateResult(\"webgpu\", pointCount, frameTimes, duration);\n this.results.push(result);\n return result;\n }\n \n /**\n * Run benchmark with WebGL backend\n */\n async benchmarkWebGL(options: BenchmarkOptions = {}): Promise<BenchmarkResult | null> {\n const { WebGLBackend } = await import(\"../backends/webgl/WebGLBackend\");\n \n if (!WebGLBackend.isSupported()) {\n console.warn(\"[Benchmark] WebGL not supported\");\n return null;\n }\n \n const pointCount = options.pointCount ?? 100000;\n const durationMs = options.durationMs ?? 5000;\n const warmupFrames = options.warmupFrames ?? 30;\n \n const backend = new WebGLBackend(this.canvas);\n await backend.init();\n \n backend.setViewport({\n width: this.canvas.width,\n height: this.canvas.height,\n dpr: 1,\n });\n \n const data = this.generateLineData(pointCount);\n backend.createOrUpdateBuffer(\"bench-line\", data, { usage: \"vertex\" });\n \n const drawList = {\n items: [{\n id: \"bench-line\",\n kind: \"line\" as const,\n bufferId: \"bench-line\",\n count: pointCount,\n visible: true,\n style: { color: [0, 0.9, 1, 1] as const },\n }],\n };\n \n const frame = {\n viewport: { width: this.canvas.width, height: this.canvas.height, dpr: 1 },\n clearColor: [0.1, 0.1, 0.15, 1] as const,\n };\n \n const bounds = { xMin: 0, xMax: 1, yMin: 0, yMax: 1 };\n \n const renderFn = () => {\n backend.renderWithBounds(drawList, frame, bounds);\n };\n \n const { frameTimes, duration } = await this.measureFrameTimes(\n renderFn,\n durationMs,\n warmupFrames,\n options.onProgress\n );\n \n backend.destroy();\n \n const result = this.calculateResult(\"webgl\", pointCount, frameTimes, duration);\n this.results.push(result);\n return result;\n }\n \n /**\n * Calculate benchmark result from frame times\n */\n private calculateResult(\n backend: \"webgpu\" | \"webgl\",\n pointCount: number,\n frameTimes: number[],\n duration: number\n ): BenchmarkResult {\n if (frameTimes.length === 0) {\n return {\n backend,\n pointCount,\n fps: 0,\n avgFrameTime: 0,\n minFrameTime: 0,\n maxFrameTime: 0,\n totalFrames: 0,\n duration,\n };\n }\n \n const sum = frameTimes.reduce((a, b) => a + b, 0);\n const avg = sum / frameTimes.length;\n const min = Math.min(...frameTimes);\n const max = Math.max(...frameTimes);\n \n return {\n backend,\n pointCount,\n fps: Math.round(1000 / avg),\n avgFrameTime: Math.round(avg * 100) / 100,\n minFrameTime: Math.round(min * 100) / 100,\n maxFrameTime: Math.round(max * 100) / 100,\n totalFrames: frameTimes.length,\n duration: Math.round(duration),\n };\n }\n \n /**\n * Run comparative benchmark\n */\n async runComparison(options: BenchmarkOptions = {}): Promise<{\n webgpu: BenchmarkResult | null;\n webgl: BenchmarkResult | null;\n winner: \"webgpu\" | \"webgl\" | \"tie\" | \"unknown\";\n speedup: number;\n }> {\n const webgpu = await this.benchmarkWebGPU(options);\n const webgl = await this.benchmarkWebGL(options);\n \n let winner: \"webgpu\" | \"webgl\" | \"tie\" | \"unknown\" = \"unknown\";\n let speedup = 1;\n \n if (webgpu && webgl) {\n if (webgpu.fps > webgl.fps * 1.05) {\n winner = \"webgpu\";\n speedup = webgpu.fps / webgl.fps;\n } else if (webgl.fps > webgpu.fps * 1.05) {\n winner = \"webgl\";\n speedup = webgl.fps / webgpu.fps;\n } else {\n winner = \"tie\";\n speedup = 1;\n }\n } else if (webgpu) {\n winner = \"webgpu\";\n } else if (webgl) {\n winner = \"webgl\";\n }\n \n return { webgpu, webgl, winner, speedup: Math.round(speedup * 100) / 100 };\n }\n \n /**\n * Get all results\n */\n getResults(): BenchmarkResult[] {\n return [...this.results];\n }\n \n /**\n * Clear results\n */\n clearResults(): void {\n this.results = [];\n }\n \n /**\n * Format result as string\n */\n static formatResult(result: BenchmarkResult): string {\n return [\n `Backend: ${result.backend.toUpperCase()}`,\n `Points: ${result.pointCount.toLocaleString()}`,\n `FPS: ${result.fps}`,\n `Avg Frame: ${result.avgFrameTime}ms`,\n `Min/Max: ${result.minFrameTime}ms / ${result.maxFrameTime}ms`,\n `Frames: ${result.totalFrames}`,\n `Duration: ${result.duration}ms`,\n ].join(\" | \");\n }\n}\n","/**\n * GPU Compute - Compute shader infrastructure for WebGPU\n * \n * Provides GPU-accelerated data analysis capabilities.\n */\n\n// ============================================\n// Statistics Compute Shader\n// ============================================\n\nexport const STATS_COMPUTE_WGSL = `\nstruct StatsResult {\n min_val: f32,\n max_val: f32,\n sum: f32,\n sum_sq: f32,\n count: u32,\n padding: vec3<u32>,\n}\n\n@group(0) @binding(0) var<storage, read> input_data: array<f32>;\n@group(0) @binding(1) var<storage, read_write> result: StatsResult;\n\nvar<workgroup> local_min: array<f32, 256>;\nvar<workgroup> local_max: array<f32, 256>;\nvar<workgroup> local_sum: array<f32, 256>;\nvar<workgroup> local_sum_sq: array<f32, 256>;\nvar<workgroup> local_count: array<u32, 256>;\n\n@compute @workgroup_size(256)\nfn main(\n @builtin(global_invocation_id) global_id: vec3<u32>,\n @builtin(local_invocation_id) local_id: vec3<u32>,\n @builtin(workgroup_id) workgroup_id: vec3<u32>\n) {\n let idx = global_id.x;\n let lid = local_id.x;\n let data_len = arrayLength(&input_data);\n \n // Initialize local values\n if (idx < data_len) {\n let val = input_data[idx];\n local_min[lid] = val;\n local_max[lid] = val;\n local_sum[lid] = val;\n local_sum_sq[lid] = val * val;\n local_count[lid] = 1u;\n } else {\n local_min[lid] = 3.402823e+38; // f32 max\n local_max[lid] = -3.402823e+38; // f32 min\n local_sum[lid] = 0.0;\n local_sum_sq[lid] = 0.0;\n local_count[lid] = 0u;\n }\n \n workgroupBarrier();\n \n // Parallel reduction\n for (var stride: u32 = 128u; stride > 0u; stride = stride >> 1u) {\n if (lid < stride) {\n local_min[lid] = min(local_min[lid], local_min[lid + stride]);\n local_max[lid] = max(local_max[lid], local_max[lid + stride]);\n local_sum[lid] = local_sum[lid] + local_sum[lid + stride];\n local_sum_sq[lid] = local_sum_sq[lid] + local_sum_sq[lid + stride];\n local_count[lid] = local_count[lid] + local_count[lid + stride];\n }\n workgroupBarrier();\n }\n \n // First thread writes result (atomic for multi-workgroup)\n if (lid == 0u) {\n // Use atomics for multi-workgroup reduction\n // For now, we assume single workgroup or post-process on CPU\n result.min_val = local_min[0];\n result.max_val = local_max[0];\n result.sum = local_sum[0];\n result.sum_sq = local_sum_sq[0];\n result.count = local_count[0];\n }\n}\n`;\n\n// ============================================\n// Min/Max Compute Shader (for bounds calculation)\n// ============================================\n\nexport const MINMAX_COMPUTE_WGSL = `\nstruct MinMax {\n min_x: f32,\n max_x: f32,\n min_y: f32,\n max_y: f32,\n}\n\n@group(0) @binding(0) var<storage, read> points: array<vec2<f32>>;\n@group(0) @binding(1) var<storage, read_write> result: MinMax;\n\nvar<workgroup> local_min_x: array<f32, 256>;\nvar<workgroup> local_max_x: array<f32, 256>;\nvar<workgroup> local_min_y: array<f32, 256>;\nvar<workgroup> local_max_y: array<f32, 256>;\n\n@compute @workgroup_size(256)\nfn main(\n @builtin(global_invocation_id) global_id: vec3<u32>,\n @builtin(local_invocation_id) local_id: vec3<u32>\n) {\n let idx = global_id.x;\n let lid = local_id.x;\n let data_len = arrayLength(&points);\n \n if (idx < data_len) {\n let pt = points[idx];\n local_min_x[lid] = pt.x;\n local_max_x[lid] = pt.x;\n local_min_y[lid] = pt.y;\n local_max_y[lid] = pt.y;\n } else {\n local_min_x[lid] = 3.402823e+38;\n local_max_x[lid] = -3.402823e+38;\n local_min_y[lid] = 3.402823e+38;\n local_max_y[lid] = -3.402823e+38;\n }\n \n workgroupBarrier();\n \n for (var stride: u32 = 128u; stride > 0u; stride = stride >> 1u) {\n if (lid < stride) {\n local_min_x[lid] = min(local_min_x[lid], local_min_x[lid + stride]);\n local_max_x[lid] = max(local_max_x[lid], local_max_x[lid + stride]);\n local_min_y[lid] = min(local_min_y[lid], local_min_y[lid + stride]);\n local_max_y[lid] = max(local_max_y[lid], local_max_y[lid + stride]);\n }\n workgroupBarrier();\n }\n \n if (lid == 0u) {\n result.min_x = local_min_x[0];\n result.max_x = local_max_x[0];\n result.min_y = local_min_y[0];\n result.max_y = local_max_y[0];\n }\n}\n`;\n\n// ============================================\n// Downsample Compute Shader (Min-Max per bucket)\n// ============================================\n\nexport const DOWNSAMPLE_COMPUTE_WGSL = `\nstruct Params {\n input_count: u32,\n output_count: u32,\n bucket_size: u32,\n padding: u32,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> input_points: array<vec2<f32>>;\n@group(0) @binding(2) var<storage, read_write> output_points: array<vec2<f32>>;\n\n@compute @workgroup_size(64)\nfn main(@builtin(global_invocation_id) global_id: vec3<u32>) {\n let bucket_idx = global_id.x;\n \n if (bucket_idx >= params.output_count / 2u) {\n return;\n }\n \n let start = bucket_idx * params.bucket_size;\n let end = min(start + params.bucket_size, params.input_count);\n \n if (start >= params.input_count) {\n return;\n }\n \n var min_y = input_points[start].y;\n var max_y = input_points[start].y;\n var min_idx = start;\n var max_idx = start;\n \n for (var i = start; i < end; i = i + 1u) {\n let y = input_points[i].y;\n if (y < min_y) {\n min_y = y;\n min_idx = i;\n }\n if (y > max_y) {\n max_y = y;\n max_idx = i;\n }\n }\n \n // Output min and max points (preserving x,y pairs)\n let out_base = bucket_idx * 2u;\n \n // Ensure min comes before max in x order\n if (min_idx <= max_idx) {\n output_points[out_base] = input_points[min_idx];\n output_points[out_base + 1u] = input_points[max_idx];\n } else {\n output_points[out_base] = input_points[max_idx];\n output_points[out_base + 1u] = input_points[min_idx];\n }\n}\n`;\n\n// ============================================\n// Peak Detection Compute Shader\n// ============================================\n\nexport const PEAK_DETECT_COMPUTE_WGSL = `\nstruct Params {\n data_count: u32,\n threshold: f32,\n min_distance: u32,\n padding: u32,\n}\n\nstruct Peak {\n index: u32,\n value: f32,\n is_peak: u32,\n padding: u32,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<storage, read_write> peaks: array<Peak>;\n\n@compute @workgroup_size(64)\nfn main(@builtin(global_invocation_id) global_id: vec3<u32>) {\n let idx = global_id.x;\n \n if (idx >= params.data_count) {\n return;\n }\n \n peaks[idx].index = idx;\n peaks[idx].value = data[idx];\n peaks[idx].is_peak = 0u;\n \n // Skip edges\n if (idx < params.min_distance || idx >= params.data_count - params.min_distance) {\n return;\n }\n \n let val = data[idx];\n \n // Check if above threshold\n if (val < params.threshold) {\n return;\n }\n \n // Check if local maximum\n var is_max = true;\n for (var i = 1u; i <= params.min_distance; i = i + 1u) {\n if (data[idx - i] >= val || data[idx + i] >= val) {\n is_max = false;\n break;\n }\n }\n \n if (is_max) {\n peaks[idx].is_peak = 1u;\n }\n}\n`;\n","/**\n * GPU Compute Engine\n * \n * Provides GPU-accelerated data analysis using WebGPU compute shaders.\n * Includes statistics calculation, bounds computation, downsampling, and peak detection.\n */\n\nimport {\n STATS_COMPUTE_WGSL,\n MINMAX_COMPUTE_WGSL,\n DOWNSAMPLE_COMPUTE_WGSL,\n PEAK_DETECT_COMPUTE_WGSL,\n} from \"./shaders\";\n\nexport interface DataStats {\n min: number;\n max: number;\n mean: number;\n std: number;\n count: number;\n}\n\nexport interface DataBounds {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n}\n\nexport interface Peak {\n index: number;\n value: number;\n}\n\nexport interface GpuComputeOptions {\n /** WebGPU device (if already available) */\n device?: any;\n}\n\n/**\n * GPU Compute Engine for data analysis\n */\nexport class GpuCompute {\n private device: any = null;\n private statsPipeline: any = null;\n private minmaxPipeline: any = null;\n private downsamplePipeline: any = null;\n private peaksPipeline: any = null;\n \n private isInitialized = false;\n \n constructor(private options: GpuComputeOptions = {}) {}\n \n /**\n * Check if GPU compute is available\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 /**\n * Initialize the compute engine\n */\n async init(): Promise<void> {\n if (this.options.device) {\n this.device = this.options.device;\n } else {\n if (!GpuCompute.isSupported()) {\n throw new Error(\"[GpuCompute] WebGPU not supported\");\n }\n \n const gpu = (globalThis as any).navigator.gpu;\n const adapter = await gpu.requestAdapter({ powerPreference: \"high-performance\" });\n if (!adapter) {\n throw new Error(\"[GpuCompute] Failed to get adapter\");\n }\n \n this.device = await adapter.requestDevice();\n }\n \n // Create pipelines\n await this.createPipelines();\n this.isInitialized = true;\n }\n \n private async createPipelines(): Promise<void> {\n // Stats pipeline\n const statsModule = this.device.createShaderModule({ code: STATS_COMPUTE_WGSL });\n this.statsPipeline = await this.device.createComputePipelineAsync({\n layout: \"auto\",\n compute: { module: statsModule, entryPoint: \"main\" },\n });\n \n // MinMax pipeline\n const minmaxModule = this.device.createShaderModule({ code: MINMAX_COMPUTE_WGSL });\n this.minmaxPipeline = await this.device.createComputePipelineAsync({\n layout: \"auto\",\n compute: { module: minmaxModule, entryPoint: \"main\" },\n });\n \n // Downsample pipeline\n const downsampleModule = this.device.createShaderModule({ code: DOWNSAMPLE_COMPUTE_WGSL });\n this.downsamplePipeline = await this.device.createComputePipelineAsync({\n layout: \"auto\",\n compute: { module: downsampleModule, entryPoint: \"main\" },\n });\n \n // Peak detection pipeline\n const peaksModule = this.device.createShaderModule({ code: PEAK_DETECT_COMPUTE_WGSL });\n this.peaksPipeline = await this.device.createComputePipelineAsync({\n layout: \"auto\",\n compute: { module: peaksModule, entryPoint: \"main\" },\n });\n }\n \n /**\n * Calculate statistics for a 1D array of values\n */\n async calculateStats(data: Float32Array): Promise<DataStats> {\n if (!this.isInitialized) {\n throw new Error(\"[GpuCompute] Not initialized\");\n }\n \n const GPUBufferUsage = (globalThis as any).GPUBufferUsage;\n \n // Create input buffer\n const inputBuffer = this.device.createBuffer({\n size: data.byteLength,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(inputBuffer, 0, data);\n \n // Create result buffer (32 bytes: 5 floats + padding)\n const resultBuffer = this.device.createBuffer({\n size: 32,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n });\n \n // Create staging buffer for readback\n const stagingBuffer = this.device.createBuffer({\n size: 32,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n \n // Create bind group\n const bindGroup = this.device.createBindGroup({\n layout: this.statsPipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: inputBuffer } },\n { binding: 1, resource: { buffer: resultBuffer } },\n ],\n });\n \n // Dispatch\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginComputePass();\n pass.setPipeline(this.statsPipeline);\n pass.setBindGroup(0, bindGroup);\n \n const workgroups = Math.ceil(data.length / 256);\n pass.dispatchWorkgroups(workgroups);\n pass.end();\n \n // Copy result to staging\n encoder.copyBufferToBuffer(resultBuffer, 0, stagingBuffer, 0, 32);\n \n this.device.queue.submit([encoder.finish()]);\n \n // Read back\n await stagingBuffer.mapAsync((globalThis as any).GPUMapMode.READ);\n const resultData = new Float32Array(stagingBuffer.getMappedRange().slice(0));\n stagingBuffer.unmap();\n \n // Cleanup\n inputBuffer.destroy();\n resultBuffer.destroy();\n stagingBuffer.destroy();\n \n const [min, max, sum, sumSq, countFloat] = resultData;\n const count = Math.floor(countFloat);\n const mean = count > 0 ? sum / count : 0;\n const variance = count > 1 ? (sumSq - (sum * sum) / count) / (count - 1) : 0;\n const std = Math.sqrt(Math.max(0, variance));\n \n return { min, max, mean, std, count };\n }\n \n /**\n * Calculate bounds for 2D point data\n */\n async calculateBounds(points: Float32Array): Promise<DataBounds> {\n if (!this.isInitialized) {\n throw new Error(\"[GpuCompute] Not initialized\");\n }\n \n const GPUBufferUsage = (globalThis as any).GPUBufferUsage;\n \n // Create input buffer (vec2 array)\n const inputBuffer = this.device.createBuffer({\n size: points.byteLength,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(inputBuffer, 0, points);\n \n // Create result buffer (16 bytes: 4 floats)\n const resultBuffer = this.device.createBuffer({\n size: 16,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n });\n \n // Staging buffer\n const stagingBuffer = this.device.createBuffer({\n size: 16,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n \n // Bind group\n const bindGroup = this.device.createBindGroup({\n layout: this.minmaxPipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: inputBuffer } },\n { binding: 1, resource: { buffer: resultBuffer } },\n ],\n });\n \n // Dispatch\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginComputePass();\n pass.setPipeline(this.minmaxPipeline);\n pass.setBindGroup(0, bindGroup);\n \n const pointCount = points.length / 2;\n const workgroups = Math.ceil(pointCount / 256);\n pass.dispatchWorkgroups(workgroups);\n pass.end();\n \n encoder.copyBufferToBuffer(resultBuffer, 0, stagingBuffer, 0, 16);\n this.device.queue.submit([encoder.finish()]);\n \n // Read back\n await stagingBuffer.mapAsync((globalThis as any).GPUMapMode.READ);\n const resultData = new Float32Array(stagingBuffer.getMappedRange().slice(0));\n stagingBuffer.unmap();\n \n // Cleanup\n inputBuffer.destroy();\n resultBuffer.destroy();\n stagingBuffer.destroy();\n \n return {\n xMin: resultData[0],\n xMax: resultData[1],\n yMin: resultData[2],\n yMax: resultData[3],\n };\n }\n \n /**\n * Downsample point data using min-max algorithm\n */\n async downsample(\n points: Float32Array,\n targetCount: number\n ): Promise<Float32Array> {\n if (!this.isInitialized) {\n throw new Error(\"[GpuCompute] Not initialized\");\n }\n \n const pointCount = points.length / 2;\n if (pointCount <= targetCount) {\n return points; // No downsampling needed\n }\n \n const GPUBufferUsage = (globalThis as any).GPUBufferUsage;\n \n // Calculate bucket size (output is 2 points per bucket: min and max)\n const outputPairs = Math.ceil(targetCount / 2);\n const bucketSize = Math.ceil(pointCount / outputPairs);\n const outputCount = outputPairs * 2;\n \n // Create params buffer\n const paramsData = new Uint32Array([pointCount, outputCount, bucketSize, 0]);\n const paramsBuffer = this.device.createBuffer({\n size: 16,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(paramsBuffer, 0, paramsData);\n \n // Create input buffer\n const inputBuffer = this.device.createBuffer({\n size: points.byteLength,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(inputBuffer, 0, points);\n \n // Create output buffer\n const outputSize = outputCount * 2 * 4; // vec2 * count * sizeof(float)\n const outputBuffer = this.device.createBuffer({\n size: outputSize,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n });\n \n // Staging buffer\n const stagingBuffer = this.device.createBuffer({\n size: outputSize,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n \n // Bind group\n const bindGroup = this.device.createBindGroup({\n layout: this.downsamplePipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: paramsBuffer } },\n { binding: 1, resource: { buffer: inputBuffer } },\n { binding: 2, resource: { buffer: outputBuffer } },\n ],\n });\n \n // Dispatch\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginComputePass();\n pass.setPipeline(this.downsamplePipeline);\n pass.setBindGroup(0, bindGroup);\n \n const workgroups = Math.ceil(outputPairs / 64);\n pass.dispatchWorkgroups(workgroups);\n pass.end();\n \n encoder.copyBufferToBuffer(outputBuffer, 0, stagingBuffer, 0, outputSize);\n this.device.queue.submit([encoder.finish()]);\n \n // Read back\n await stagingBuffer.mapAsync((globalThis as any).GPUMapMode.READ);\n const result = new Float32Array(stagingBuffer.getMappedRange().slice(0));\n stagingBuffer.unmap();\n \n // Cleanup\n paramsBuffer.destroy();\n inputBuffer.destroy();\n outputBuffer.destroy();\n stagingBuffer.destroy();\n \n return result;\n }\n \n /**\n * Detect peaks in 1D data\n */\n async detectPeaks(\n data: Float32Array,\n options: { threshold?: number; minDistance?: number } = {}\n ): Promise<Peak[]> {\n if (!this.isInitialized) {\n throw new Error(\"[GpuCompute] Not initialized\");\n }\n \n const threshold = options.threshold ?? 0;\n const minDistance = options.minDistance ?? 1;\n \n const GPUBufferUsage = (globalThis as any).GPUBufferUsage;\n \n // Create params buffer\n const paramsData = new Float32Array([\n data.length,\n threshold,\n minDistance,\n 0, // padding\n ]);\n const paramsBuffer = this.device.createBuffer({\n size: 16,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(paramsBuffer, 0, new Uint8Array(paramsData.buffer));\n \n // Input buffer\n const inputBuffer = this.device.createBuffer({\n size: data.byteLength,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n this.device.queue.writeBuffer(inputBuffer, 0, data);\n \n // Output buffer (Peak struct = 16 bytes each)\n const outputSize = data.length * 16;\n const outputBuffer = this.device.createBuffer({\n size: outputSize,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n });\n \n // Staging buffer\n const stagingBuffer = this.device.createBuffer({\n size: outputSize,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n \n // Bind group\n const bindGroup = this.device.createBindGroup({\n layout: this.peaksPipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: paramsBuffer } },\n { binding: 1, resource: { buffer: inputBuffer } },\n { binding: 2, resource: { buffer: outputBuffer } },\n ],\n });\n \n // Dispatch\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginComputePass();\n pass.setPipeline(this.peaksPipeline);\n pass.setBindGroup(0, bindGroup);\n \n const workgroups = Math.ceil(data.length / 64);\n pass.dispatchWorkgroups(workgroups);\n pass.end();\n \n encoder.copyBufferToBuffer(outputBuffer, 0, stagingBuffer, 0, outputSize);\n this.device.queue.submit([encoder.finish()]);\n \n // Read back\n await stagingBuffer.mapAsync((globalThis as any).GPUMapMode.READ);\n const resultBuffer = new ArrayBuffer(outputSize);\n new Uint8Array(resultBuffer).set(new Uint8Array(stagingBuffer.getMappedRange()));\n stagingBuffer.unmap();\n \n // Parse peaks\n const resultView = new DataView(resultBuffer);\n const peaks: Peak[] = [];\n \n for (let i = 0; i < data.length; i++) {\n const offset = i * 16;\n const isPeak = resultView.getUint32(offset + 8, true);\n \n if (isPeak) {\n peaks.push({\n index: resultView.getUint32(offset, true),\n value: resultView.getFloat32(offset + 4, true),\n });\n }\n }\n \n // Cleanup\n paramsBuffer.destroy();\n inputBuffer.destroy();\n outputBuffer.destroy();\n stagingBuffer.destroy();\n \n return peaks;\n }\n \n /**\n * Cleanup resources\n */\n destroy(): void {\n // Pipelines are managed by device, no explicit cleanup needed\n this.device = null;\n this.statsPipeline = null;\n this.minmaxPipeline = null;\n this.downsamplePipeline = null;\n this.peaksPipeline = null;\n this.isInitialized = false;\n }\n}\n","/**\n * VeloPlot Engine - GPU Abstraction Plugin\n * \n * Provides WebGPU and WebGL2 backend support, GPU compute capabilities,\n * and performance benchmarking tools.\n * \n * @module plugins/gpu\n */\n\nexport {\n // Backends\n WebGPUBackend,\n WebGLBackend,\n\n // Renderer facade\n GpuRenderer,\n createGpuRenderer,\n\n // Adapter\n SeriesAdapter,\n parseColorToRGBA,\n\n // Resource management\n PipelineCache,\n BaseBufferStore,\n BaseTextureStore,\n\n // Benchmark\n GpuBenchmark,\n\n // GPU Compute\n GpuCompute,\n} from \"../../gpu\";\n\nexport * from \"../../gpu/types\";\n\nimport type { PluginManifest, ChartPlugin, PluginContext } from \"../types\";\n\nexport interface PluginGpuConfig {\n /** Preferred backend: 'webgpu' | 'webgl2' | 'webgl1' */\n preferredBackend?: string;\n /** Enable hardware acceleration for compute tasks */\n enableCompute?: boolean;\n}\n\nconst manifestGpu: PluginManifest = {\n name: \"velo-plot-gpu\",\n version: \"1.0.0\",\n description: \"GPU acceleration and WebGPU support for velo-plot\",\n provides: [\"renderer\", \"compute\"],\n tags: [\"gpu\", \"webgpu\", \"webgl2\", \"performance\"],\n};\n\n/**\n * VeloPlot GPU Plugin\n * \n * Enables high-performance GPU-accelerated rendering and compute.\n */\nexport function PluginGpu(_config: PluginGpuConfig = {}): ChartPlugin<PluginGpuConfig> {\n return {\n manifest: manifestGpu,\n\n onInit(_ctx: PluginContext) {\n },\n\n onDestroy(_ctx: PluginContext) {\n }\n };\n}\n\nexport default PluginGpu;\n"],"names":["BaseBufferStore","__publicField","id","BaseTextureStore","keyToString","key","PipelineCache","factory","keyStr","pipeline","GpuBenchmark","canvas","pointCount","data","i","renderFn","durationMs","warmupFrames","onProgress","frameTimes","lastTime","warmupCount","startTime","resolve","loop","now","elapsed","progress","options","WebGPUBackend","n","backend","drawList","frame","bounds","duration","result","WebGLBackend","avg","a","b","min","max","webgpu","webgl","winner","speedup","STATS_COMPUTE_WGSL","MINMAX_COMPUTE_WGSL","DOWNSAMPLE_COMPUTE_WGSL","PEAK_DETECT_COMPUTE_WGSL","GpuCompute","adapter","statsModule","minmaxModule","downsampleModule","peaksModule","GPUBufferUsage","inputBuffer","resultBuffer","stagingBuffer","bindGroup","encoder","pass","workgroups","resultData","sum","sumSq","countFloat","count","mean","variance","std","points","targetCount","outputPairs","bucketSize","outputCount","paramsData","paramsBuffer","outputSize","outputBuffer","threshold","minDistance","resultView","peaks","offset","manifestGpu","PluginGpu","_config","_ctx"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { ChartPlugin } from '../types';
2
2
  /**
3
- * SciPlot Engine - Internationalization (i18n) Plugin
3
+ * VeloPlot Engine - Internationalization (i18n) Plugin
4
4
  *
5
5
  * Provides localization support for dates, numbers, and strings.
6
6
  *
@@ -14,7 +14,7 @@ export interface PluginI18nConfig {
14
14
  customLocales?: Record<string, any>;
15
15
  }
16
16
  /**
17
- * SciPlot i18n Plugin
17
+ * VeloPlot i18n Plugin
18
18
  *
19
19
  * Adds support for multiple languages and local data formatting.
20
20
  */
@@ -1,3 +1,3 @@
1
1
  export * from './i18n/index'
2
- import SciPlot from './i18n/index'
3
- export default SciPlot
2
+ import VeloPlot from './i18n/index'
3
+ export default VeloPlot
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.js","sources":["../../src/plugins/i18n/index.ts"],"sourcesContent":["/**\n * SciPlot Engine - Internationalization (i18n) Plugin\n * \n * Provides localization support for dates, numbers, and strings.\n * \n * @module plugins/i18n\n */\n\nexport * from \"../../core/locale\";\n\nimport type { PluginManifest, ChartPlugin, PluginContext } from \"../types\";\nimport { setGlobalLocale } from \"../../core/locale\";\n\nexport interface PluginI18nConfig {\n /** Default locale to use */\n locale?: string;\n /** Custom locale definitions */\n customLocales?: Record<string, any>;\n}\n\nconst manifestI18n: PluginManifest = {\n name: \"velo-plot-i18n\",\n version: \"1.0.0\",\n description: \"Internationalization and localization for velo-plot\",\n provides: [\"ui\"],\n tags: [\"i18n\", \"l10n\", \"locale\", \"language\"],\n};\n\n/**\n * SciPlot i18n Plugin\n * \n * Adds support for multiple languages and local data formatting.\n */\nexport function PluginI18n(config: PluginI18nConfig = {}): ChartPlugin<PluginI18nConfig> {\n return {\n manifest: manifestI18n,\n\n onInit(_ctx: PluginContext) {\n if (config.locale) {\n setGlobalLocale(config.locale);\n }\n },\n\n onDestroy(_ctx: PluginContext) {\n }\n };\n}\n\nexport default PluginI18n;\n"],"names":["manifestI18n","PluginI18n","config","_ctx","setGlobalLocale"],"mappings":";;AAoBA,MAAMA,IAA+B;AAAA,EACjC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU,CAAC,IAAI;AAAA,EACf,MAAM,CAAC,QAAQ,QAAQ,UAAU,UAAU;AAC/C;AAOO,SAASC,EAAWC,IAA2B,IAAmC;AACrF,SAAO;AAAA,IACH,UAAUF;AAAA,IAEV,OAAOG,GAAqB;AACxB,MAAID,EAAO,UACPE,EAAgBF,EAAO,MAAM;AAAA,IAErC;AAAA,IAEA,UAAUC,GAAqB;AAAA,IAC/B;AAAA,EAAA;AAER;"}
1
+ {"version":3,"file":"i18n.js","sources":["../../src/plugins/i18n/index.ts"],"sourcesContent":["/**\n * VeloPlot Engine - Internationalization (i18n) Plugin\n * \n * Provides localization support for dates, numbers, and strings.\n * \n * @module plugins/i18n\n */\n\nexport * from \"../../core/locale\";\n\nimport type { PluginManifest, ChartPlugin, PluginContext } from \"../types\";\nimport { setGlobalLocale } from \"../../core/locale\";\n\nexport interface PluginI18nConfig {\n /** Default locale to use */\n locale?: string;\n /** Custom locale definitions */\n customLocales?: Record<string, any>;\n}\n\nconst manifestI18n: PluginManifest = {\n name: \"velo-plot-i18n\",\n version: \"1.0.0\",\n description: \"Internationalization and localization for velo-plot\",\n provides: [\"ui\"],\n tags: [\"i18n\", \"l10n\", \"locale\", \"language\"],\n};\n\n/**\n * VeloPlot i18n Plugin\n * \n * Adds support for multiple languages and local data formatting.\n */\nexport function PluginI18n(config: PluginI18nConfig = {}): ChartPlugin<PluginI18nConfig> {\n return {\n manifest: manifestI18n,\n\n onInit(_ctx: PluginContext) {\n if (config.locale) {\n setGlobalLocale(config.locale);\n }\n },\n\n onDestroy(_ctx: PluginContext) {\n }\n };\n}\n\nexport default PluginI18n;\n"],"names":["manifestI18n","PluginI18n","config","_ctx","setGlobalLocale"],"mappings":";;AAoBA,MAAMA,IAA+B;AAAA,EACjC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU,CAAC,IAAI;AAAA,EACf,MAAM,CAAC,QAAQ,QAAQ,UAAU,UAAU;AAC/C;AAOO,SAASC,EAAWC,IAA2B,IAAmC;AACrF,SAAO;AAAA,IACH,UAAUF;AAAA,IAEV,OAAOG,GAAqB;AACxB,MAAID,EAAO,UACPE,EAAgBF,EAAO,MAAM;AAAA,IAErC;AAAA,IAEA,UAAUC,GAAqB;AAAA,IAC/B;AAAA,EAAA;AAER;"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Sci Plot - Plugin System
2
+ * Velo Plot - Plugin System
3
3
  *
4
4
  * Comprehensive plugin architecture for extending chart functionality.
5
5
  *
@@ -1,3 +1,3 @@
1
1
  export * from './keyboard/index'
2
- import SciPlot from './keyboard/index'
3
- export default SciPlot
2
+ import VeloPlot from './keyboard/index'
3
+ export default VeloPlot
@@ -1,8 +1,68 @@
1
- import { D as n, K as r, P as s, P as K } from "../index-DoYxf1cV.js";
1
+ import { K as c } from "../index-CWxIHdwX.js";
2
+ import { D as y } from "../index-CWxIHdwX.js";
3
+ const u = {
4
+ name: "velo-plot-keyboard",
5
+ version: "1.0.0",
6
+ description: "Keyboard shortcut management for velo-plot",
7
+ provides: ["interaction"],
8
+ tags: ["keyboard", "shortcuts", "interaction", "accessibility"]
9
+ };
10
+ function p(s = {}) {
11
+ let a = null;
12
+ return {
13
+ manifest: u,
14
+ onInit(l) {
15
+ var i;
16
+ const o = l.chart, t = (i = l.getPlugin) == null ? void 0 : i.call(l, "velo-plot-drawing-tools");
17
+ a = new c({
18
+ target: l.ui.container,
19
+ bindings: [...s.bindings ?? [], ...s.extraShortcuts ?? []],
20
+ replaceDefaults: s.replaceDefaults,
21
+ callbacks: {
22
+ onResetZoom: () => {
23
+ var e;
24
+ return (e = o.resetZoom) == null ? void 0 : e.call(o);
25
+ },
26
+ onAutoScale: () => {
27
+ var e;
28
+ return (e = o.autoScale) == null ? void 0 : e.call(o, !1);
29
+ },
30
+ onEscape: () => {
31
+ var e;
32
+ return (e = o.clearSelection) == null ? void 0 : e.call(o);
33
+ },
34
+ onExportImage: () => {
35
+ var e;
36
+ try {
37
+ const n = (e = o.exportImage) == null ? void 0 : e.call(o, "png");
38
+ if (n) {
39
+ const r = document.createElement("a");
40
+ r.href = n, r.download = "chart.png", r.click();
41
+ }
42
+ } catch {
43
+ }
44
+ },
45
+ onUndo: () => {
46
+ var e, n;
47
+ return (n = (e = t == null ? void 0 : t.api) == null ? void 0 : e.undo) == null ? void 0 : n.call(e);
48
+ },
49
+ onRedo: () => {
50
+ var e, n;
51
+ return (n = (e = t == null ? void 0 : t.api) == null ? void 0 : e.redo) == null ? void 0 : n.call(e);
52
+ },
53
+ ...s.callbacks
54
+ }
55
+ });
56
+ },
57
+ onDestroy() {
58
+ a == null || a.destroy(), a = null;
59
+ }
60
+ };
61
+ }
2
62
  export {
3
- n as DEFAULT_KEY_BINDINGS,
4
- r as KeyBindingManager,
5
- s as PluginKeyboard,
6
- K as default
63
+ y as DEFAULT_KEY_BINDINGS,
64
+ c as KeyBindingManager,
65
+ p as PluginKeyboard,
66
+ p as default
7
67
  };
8
68
  //# sourceMappingURL=keyboard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"keyboard.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"keyboard.js","sources":["../../src/plugins/keyboard/index.ts"],"sourcesContent":["/**\n * Velo Plot - Keyboard Shortcuts Plugin\n */\n\nimport { KeyBindingManager, DEFAULT_KEY_BINDINGS } from \"../../core/keybindings\";\nimport type { KeyBinding, KeyBindingManagerOptions } from \"../../core/keybindings\";\nimport type { PluginManifest, ChartPlugin, PluginContext } from \"../types\";\n\nexport interface PluginKeyboardConfig extends Partial<KeyBindingManagerOptions> {\n extraShortcuts?: KeyBinding[];\n}\n\nconst manifestKeyboard: PluginManifest = {\n name: \"velo-plot-keyboard\",\n version: \"1.0.0\",\n description: \"Keyboard shortcut management for velo-plot\",\n provides: [\"interaction\"],\n tags: [\"keyboard\", \"shortcuts\", \"interaction\", \"accessibility\"],\n};\n\nexport function PluginKeyboard(config: PluginKeyboardConfig = {}): ChartPlugin<PluginKeyboardConfig> {\n let manager: KeyBindingManager | null = null;\n\n return {\n manifest: manifestKeyboard,\n\n onInit(ctx: PluginContext) {\n const chart = ctx.chart as any;\n const drawing = ctx.getPlugin?.(\"velo-plot-drawing-tools\") as { api?: { undo?: () => boolean; redo?: () => boolean } } | undefined;\n\n manager = new KeyBindingManager({\n target: ctx.ui.container,\n bindings: [...(config.bindings ?? []), ...(config.extraShortcuts ?? [])],\n replaceDefaults: config.replaceDefaults,\n callbacks: {\n onResetZoom: () => chart.resetZoom?.(),\n onAutoScale: () => chart.autoScale?.(false),\n onEscape: () => chart.clearSelection?.(),\n onExportImage: () => {\n try {\n const url = chart.exportImage?.(\"png\");\n if (url) {\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = \"chart.png\";\n a.click();\n }\n } catch {\n /* ignore */\n }\n },\n onUndo: () => drawing?.api?.undo?.(),\n onRedo: () => drawing?.api?.redo?.(),\n ...config.callbacks,\n },\n });\n },\n\n onDestroy() {\n manager?.destroy();\n manager = null;\n },\n };\n}\n\nexport { KeyBindingManager, DEFAULT_KEY_BINDINGS };\nexport default PluginKeyboard;\n"],"names":["manifestKeyboard","PluginKeyboard","config","manager","ctx","chart","drawing","_a","KeyBindingManager","url","a","_b"],"mappings":";;AAYA,MAAMA,IAAmC;AAAA,EACvC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU,CAAC,aAAa;AAAA,EACxB,MAAM,CAAC,YAAY,aAAa,eAAe,eAAe;AAChE;AAEO,SAASC,EAAeC,IAA+B,IAAuC;AACnG,MAAIC,IAAoC;AAExC,SAAO;AAAA,IACL,UAAUH;AAAA,IAEV,OAAOI,GAAoB;;AACzB,YAAMC,IAAQD,EAAI,OACZE,KAAUC,IAAAH,EAAI,cAAJ,gBAAAG,EAAA,KAAAH,GAAgB;AAEhC,MAAAD,IAAU,IAAIK,EAAkB;AAAA,QAC9B,QAAQJ,EAAI,GAAG;AAAA,QACf,UAAU,CAAC,GAAIF,EAAO,YAAY,CAAA,GAAK,GAAIA,EAAO,kBAAkB,EAAG;AAAA,QACvE,iBAAiBA,EAAO;AAAA,QACxB,WAAW;AAAA,UACT,aAAa,MAAA;;AAAM,oBAAAK,IAAAF,EAAM,cAAN,gBAAAE,EAAA,KAAAF;AAAA;AAAA,UACnB,aAAa,MAAA;;AAAM,oBAAAE,IAAAF,EAAM,cAAN,gBAAAE,EAAA,KAAAF,GAAkB;AAAA;AAAA,UACrC,UAAU,MAAA;;AAAM,oBAAAE,IAAAF,EAAM,mBAAN,gBAAAE,EAAA,KAAAF;AAAA;AAAA,UAChB,eAAe,MAAM;;AACnB,gBAAI;AACF,oBAAMI,KAAMF,IAAAF,EAAM,gBAAN,gBAAAE,EAAA,KAAAF,GAAoB;AAChC,kBAAII,GAAK;AACP,sBAAMC,IAAI,SAAS,cAAc,GAAG;AACpC,gBAAAA,EAAE,OAAOD,GACTC,EAAE,WAAW,aACbA,EAAE,MAAA;AAAA,cACJ;AAAA,YACF,QAAQ;AAAA,YAER;AAAA,UACF;AAAA,UACA,QAAQ,MAAA;;AAAM,oBAAAC,KAAAJ,IAAAD,KAAA,gBAAAA,EAAS,QAAT,gBAAAC,EAAc,SAAd,gBAAAI,EAAA,KAAAJ;AAAA;AAAA,UACd,QAAQ,MAAA;;AAAM,oBAAAI,KAAAJ,IAAAD,KAAA,gBAAAA,EAAS,QAAT,gBAAAC,EAAc,SAAd,gBAAAI,EAAA,KAAAJ;AAAA;AAAA,UACd,GAAGL,EAAO;AAAA,QAAA;AAAA,MACZ,CACD;AAAA,IACH;AAAA,IAEA,YAAY;AACV,MAAAC,KAAA,QAAAA,EAAS,WACTA,IAAU;AAAA,IACZ;AAAA,EAAA;AAEJ;"}