velo-plot 2.0.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 (265) hide show
  1. package/README.md +15 -8
  2. package/dist/{ChartCore-BhQ4j7f5.js → ChartCore-BpzRvN4Y.js} +998 -855
  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/{axisFormat-SPX-CD5s.js → axisFormat-CzumxpCL.js} +3 -3
  20. package/dist/axisFormat-CzumxpCL.js.map +1 -0
  21. package/dist/bindings/shared/a11y.d.ts +26 -0
  22. package/dist/bindings/shared/chartLifecycle.d.ts +16 -0
  23. package/dist/bindings/shared/chartSyncBridge.d.ts +8 -0
  24. package/dist/bindings/shared/dimensions.d.ts +1 -0
  25. package/dist/bindings/shared/index.d.ts +9 -0
  26. package/dist/bindings/shared/indicatorBridge.d.ts +11 -0
  27. package/dist/bindings/shared/optionsSync.d.ts +7 -0
  28. package/dist/bindings/shared/seriesDiff.d.ts +8 -0
  29. package/dist/bindings/shared/stackedSync.d.ts +9 -0
  30. package/dist/bindings/shared/types.d.ts +46 -0
  31. package/dist/bindings/test-utils/index.d.ts +35 -0
  32. package/dist/bindings/test-utils/mockLifecycle.d.ts +120 -0
  33. package/dist/bindings/test-utils/vitestSveltePlugin.d.ts +3 -0
  34. package/dist/chartSyncBridge-DbWrwtyP.js +57 -0
  35. package/dist/chartSyncBridge-DbWrwtyP.js.map +1 -0
  36. package/dist/core/Chart.d.ts +1 -1
  37. package/dist/core/InteractionManager.d.ts +7 -1
  38. package/dist/core/OverlayRenderer.d.ts +5 -0
  39. package/dist/core/annotations/types.d.ts +1 -1
  40. package/dist/core/chart/ChartAxisManager.d.ts +2 -0
  41. package/dist/core/chart/ChartCore.d.ts +17 -2
  42. package/dist/core/chart/ChartPluginBridge.d.ts +1 -0
  43. package/dist/core/chart/ChartRenderLoop.d.ts +2 -0
  44. package/dist/core/chart/ChartStateManager.d.ts +2 -0
  45. package/dist/core/chart/types.d.ts +6 -1
  46. package/dist/core/clipboard/index.d.ts +1 -1
  47. package/dist/core/debug/index.d.ts +1 -1
  48. package/dist/core/keybindings/index.d.ts +1 -1
  49. package/dist/core/loading/index.d.ts +1 -1
  50. package/dist/core/locale/index.d.ts +1 -1
  51. package/dist/core/stacked/paneResize.d.ts +3 -0
  52. package/dist/core/stacked/types.d.ts +10 -0
  53. package/dist/core/sync/index.d.ts +0 -1
  54. package/dist/core/theme-editor/index.d.ts +1 -1
  55. package/dist/createStackedChart-Dm-YqUT7.js +756 -0
  56. package/dist/createStackedChart-Dm-YqUT7.js.map +1 -0
  57. package/dist/examples/PluginDemonstration.d.ts +1 -1
  58. package/dist/gpuRenderer-BpaMYz-k.js.map +1 -1
  59. package/dist/hooks-CYPCxoZx.js +69 -0
  60. package/dist/hooks-CYPCxoZx.js.map +1 -0
  61. package/dist/{index-D7dTq6VB.js → index-0InEyj0q.js} +130 -134
  62. package/dist/index-0InEyj0q.js.map +1 -0
  63. package/dist/index-BMiZoKmm.js.map +1 -1
  64. package/dist/{index-DoYxf1cV.js → index-CWxIHdwX.js} +38 -98
  65. package/dist/index-CWxIHdwX.js.map +1 -0
  66. package/dist/{index-CUGS98p4.js → index-CaXWSOTk.js} +3 -6
  67. package/dist/index-CaXWSOTk.js.map +1 -0
  68. package/dist/index-Dag88bW4.js.map +1 -1
  69. package/dist/index-qhscKTDy.js.map +1 -1
  70. package/dist/{index-CWipqOLP.js → index-qunX30Xu.js} +2 -2
  71. package/dist/index-qunX30Xu.js.map +1 -0
  72. package/dist/index-x4stH3jD.js.map +1 -1
  73. package/dist/{index.core-fpZ1dYN0.js → index.core-BmZe2jRQ.js} +30 -29
  74. package/dist/index.core-BmZe2jRQ.js.map +1 -0
  75. package/dist/index.core.d.ts +1 -1
  76. package/dist/index.d.ts +3 -3
  77. package/dist/indicators--eJGmVox.js.map +1 -1
  78. package/dist/{mockDatafeed-Cdg5hKEo.js → mockDatafeed-DHIDPcpX.js} +150 -146
  79. package/dist/mockDatafeed-DHIDPcpX.js.map +1 -0
  80. package/dist/optionsSync-QUiN4Inw.js +119 -0
  81. package/dist/optionsSync-QUiN4Inw.js.map +1 -0
  82. package/dist/plugins/3d/index.d.ts +2 -2
  83. package/dist/plugins/3d.d.ts +2 -2
  84. package/dist/plugins/3d.js.map +1 -1
  85. package/dist/plugins/analysis/contours.d.ts +31 -0
  86. package/dist/plugins/analysis/index.d.ts +1 -1
  87. package/dist/plugins/analysis/indicators.d.ts +1 -1
  88. package/dist/plugins/analysis.d.ts +2 -2
  89. package/dist/plugins/analysis.js +495 -408
  90. package/dist/plugins/analysis.js.map +1 -1
  91. package/dist/plugins/annotations/index.d.ts +1 -1
  92. package/dist/plugins/annotations.d.ts +2 -2
  93. package/dist/plugins/annotations.js.map +1 -1
  94. package/dist/plugins/anomaly-detection.js +1 -1
  95. package/dist/plugins/anomaly-detection.js.map +1 -1
  96. package/dist/plugins/broken-axis.d.ts +2 -2
  97. package/dist/plugins/broken-axis.js +170 -181
  98. package/dist/plugins/broken-axis.js.map +1 -1
  99. package/dist/plugins/builtins/crosshair/CrosshairPlugin.d.ts +1 -1
  100. package/dist/plugins/builtins/index.d.ts +1 -1
  101. package/dist/plugins/caching.d.ts +2 -2
  102. package/dist/plugins/clipboard/index.d.ts +2 -2
  103. package/dist/plugins/clipboard.d.ts +2 -2
  104. package/dist/plugins/clipboard.js.map +1 -1
  105. package/dist/plugins/context-menu/index.d.ts +1 -1
  106. package/dist/plugins/context-menu.d.ts +2 -2
  107. package/dist/plugins/context-menu.js +1 -1
  108. package/dist/plugins/context-menu.js.map +1 -1
  109. package/dist/plugins/data-export/index.d.ts +1 -1
  110. package/dist/plugins/data-export.d.ts +2 -2
  111. package/dist/plugins/data-export.js +2 -2
  112. package/dist/plugins/data-export.js.map +1 -1
  113. package/dist/plugins/data-transform.d.ts +2 -2
  114. package/dist/plugins/data-transform.js +19 -19
  115. package/dist/plugins/data-transform.js.map +1 -1
  116. package/dist/plugins/debug/index.d.ts +2 -2
  117. package/dist/plugins/debug.d.ts +2 -2
  118. package/dist/plugins/debug.js +2 -2
  119. package/dist/plugins/debug.js.map +1 -1
  120. package/dist/plugins/forecasting/algorithms.d.ts +7 -2
  121. package/dist/plugins/forecasting/index.d.ts +1 -1
  122. package/dist/plugins/forecasting/types.d.ts +13 -3
  123. package/dist/plugins/forecasting.js +355 -175
  124. package/dist/plugins/forecasting.js.map +1 -1
  125. package/dist/plugins/gpu/index.d.ts +2 -2
  126. package/dist/plugins/gpu.d.ts +2 -2
  127. package/dist/plugins/gpu.js.map +1 -1
  128. package/dist/plugins/i18n/index.d.ts +2 -2
  129. package/dist/plugins/i18n.d.ts +2 -2
  130. package/dist/plugins/i18n.js.map +1 -1
  131. package/dist/plugins/index.d.ts +1 -1
  132. package/dist/plugins/keyboard.d.ts +2 -2
  133. package/dist/plugins/keyboard.js +65 -5
  134. package/dist/plugins/keyboard.js.map +1 -1
  135. package/dist/plugins/latex/symbols.d.ts +50 -0
  136. package/dist/plugins/latex/types.d.ts +13 -1
  137. package/dist/plugins/latex.js +351 -331
  138. package/dist/plugins/latex.js.map +1 -1
  139. package/dist/plugins/lazy-load.d.ts +2 -2
  140. package/dist/plugins/loading/index.d.ts +1 -1
  141. package/dist/plugins/loading.d.ts +2 -2
  142. package/dist/plugins/ml-integration/native-algorithms.d.ts +24 -4
  143. package/dist/plugins/ml-integration/types.d.ts +19 -0
  144. package/dist/plugins/ml-integration.d.ts +2 -2
  145. package/dist/plugins/ml-integration.js +190 -139
  146. package/dist/plugins/ml-integration.js.map +1 -1
  147. package/dist/plugins/offscreen.d.ts +2 -2
  148. package/dist/plugins/pattern-recognition/types.d.ts +28 -1
  149. package/dist/plugins/pattern-recognition.d.ts +2 -2
  150. package/dist/plugins/pattern-recognition.js +417 -344
  151. package/dist/plugins/pattern-recognition.js.map +1 -1
  152. package/dist/plugins/radar.d.ts +2 -2
  153. package/dist/plugins/regression.d.ts +2 -2
  154. package/dist/plugins/regression.js +1 -1
  155. package/dist/plugins/regression.js.map +1 -1
  156. package/dist/plugins/roi.js +9 -9
  157. package/dist/plugins/roi.js.map +1 -1
  158. package/dist/plugins/snapshot/index.d.ts +1 -1
  159. package/dist/plugins/snapshot/types.d.ts +1 -1
  160. package/dist/plugins/snapshot.d.ts +2 -2
  161. package/dist/plugins/snapshot.js +36 -36
  162. package/dist/plugins/snapshot.js.map +1 -1
  163. package/dist/plugins/streaming/index.d.ts +2 -2
  164. package/dist/plugins/streaming.d.ts +2 -2
  165. package/dist/plugins/sync/index.d.ts +3 -2
  166. package/dist/plugins/sync.d.ts +2 -2
  167. package/dist/plugins/sync.js +1 -1
  168. package/dist/plugins/sync.js.map +1 -1
  169. package/dist/plugins/theme-editor/index.d.ts +1 -1
  170. package/dist/plugins/theme-editor.d.ts +2 -2
  171. package/dist/plugins/tools/index.d.ts +1 -1
  172. package/dist/plugins/tools/tooltip/index.d.ts +1 -1
  173. package/dist/plugins/tools.d.ts +2 -2
  174. package/dist/plugins/tools.js +1 -1
  175. package/dist/plugins/types.d.ts +1 -1
  176. package/dist/plugins/video-recorder.d.ts +2 -2
  177. package/dist/plugins/virtualization.d.ts +2 -2
  178. package/dist/plugins/virtualization.js +1 -1
  179. package/dist/pool-DZ8shSqv.js +109 -0
  180. package/dist/pool-DZ8shSqv.js.map +1 -0
  181. package/dist/react/StackedPlot.d.ts +31 -0
  182. package/dist/react/VeloPlot.d.ts +29 -0
  183. package/dist/react/index.d.ts +25 -3
  184. package/dist/react/useChartSync.d.ts +8 -0
  185. package/dist/react/useIndicator.d.ts +12 -0
  186. package/dist/react/useVeloPlot.d.ts +19 -0
  187. package/dist/react.js +328 -24
  188. package/dist/react.js.map +1 -1
  189. package/dist/scientific/index.d.ts +48 -0
  190. package/dist/scientific.d.ts +1 -0
  191. package/dist/scientific.js +91 -0
  192. package/dist/scientific.js.map +1 -0
  193. package/dist/solid/VeloPlot.d.ts +16 -0
  194. package/dist/solid/index.d.ts +13 -0
  195. package/dist/solid/useChartSync.d.ts +6 -0
  196. package/dist/solid/useIndicator.d.ts +11 -0
  197. package/dist/solid/useStackedPlot.d.ts +14 -0
  198. package/dist/solid/useVeloPlot.d.ts +18 -0
  199. package/dist/solid.d.ts +1 -0
  200. package/dist/solid.js +172 -0
  201. package/dist/solid.js.map +1 -0
  202. package/dist/stackedSync-tnrunZMt.js +100 -0
  203. package/dist/stackedSync-tnrunZMt.js.map +1 -0
  204. package/dist/svelte/StackedPlot.svelte +29 -0
  205. package/dist/svelte/StackedPlot.test.ts +114 -0
  206. package/dist/svelte/VeloPlot.svelte +44 -0
  207. package/dist/svelte/VeloPlot.test.ts +105 -0
  208. package/dist/svelte/index.d.ts +11 -0
  209. package/dist/svelte/index.test.ts +20 -0
  210. package/dist/svelte/index.ts +15 -0
  211. package/dist/svelte/useChartSync.d.ts +8 -0
  212. package/dist/svelte/useChartSync.test.ts +49 -0
  213. package/dist/svelte/useChartSync.ts +29 -0
  214. package/dist/svelte/useIndicator.d.ts +13 -0
  215. package/dist/svelte/useIndicator.test.ts +67 -0
  216. package/dist/svelte/useIndicator.ts +43 -0
  217. package/dist/svelte/useStackedPlot.d.ts +16 -0
  218. package/dist/svelte/useStackedPlot.test.ts +76 -0
  219. package/dist/svelte/useStackedPlot.ts +54 -0
  220. package/dist/svelte/useVeloPlot.d.ts +21 -0
  221. package/dist/svelte/useVeloPlot.test.ts +100 -0
  222. package/dist/svelte/useVeloPlot.ts +81 -0
  223. package/dist/svelte.d.ts +1 -0
  224. package/dist/svelte.js +143 -0
  225. package/dist/svelte.js.map +1 -0
  226. package/dist/symbols-DT0eLlpW.js +568 -0
  227. package/dist/symbols-DT0eLlpW.js.map +1 -0
  228. package/dist/testing/index.d.ts +1 -1
  229. package/dist/theme/index.d.ts +2 -1
  230. package/dist/trading.js +7 -7
  231. package/dist/types.d.ts +1 -1
  232. package/dist/{utils-BK5UUXxj.js → utils-Dx0h0bgQ.js} +9 -9
  233. package/dist/{utils-BK5UUXxj.js.map → utils-Dx0h0bgQ.js.map} +1 -1
  234. package/dist/velo-plot.full.js +444 -433
  235. package/dist/velo-plot.full.js.map +1 -1
  236. package/dist/velo-plot.js +15 -15
  237. package/dist/vue/StackedPlot.vue.d.ts +48 -0
  238. package/dist/vue/VeloPlot.vue.d.ts +64 -0
  239. package/dist/vue/index.d.ts +250 -0
  240. package/dist/vue/useChartSync.d.ts +52 -0
  241. package/dist/vue/useIndicator.d.ts +23 -0
  242. package/dist/vue/useStackedPlot.d.ts +15 -0
  243. package/dist/vue/useVeloPlot.d.ts +20 -0
  244. package/dist/vue.d.ts +1 -0
  245. package/dist/vue.js +312 -0
  246. package/dist/vue.js.map +1 -0
  247. package/dist/workers/indicatorsAsync.d.ts +26 -0
  248. package/dist/workers/pool.d.ts +9 -0
  249. package/package.json +88 -10
  250. package/dist/ChartCore-BhQ4j7f5.js.map +0 -1
  251. package/dist/SciPlot-GJvw7GJo.js +0 -463
  252. package/dist/SciPlot-GJvw7GJo.js.map +0 -1
  253. package/dist/axisFormat-SPX-CD5s.js.map +0 -1
  254. package/dist/createStackedChart-DJSmqerD.js +0 -706
  255. package/dist/createStackedChart-DJSmqerD.js.map +0 -1
  256. package/dist/index-CUGS98p4.js.map +0 -1
  257. package/dist/index-CWipqOLP.js.map +0 -1
  258. package/dist/index-D7dTq6VB.js.map +0 -1
  259. package/dist/index-DoYxf1cV.js.map +0 -1
  260. package/dist/index.core-fpZ1dYN0.js.map +0 -1
  261. package/dist/mockDatafeed-Cdg5hKEo.js.map +0 -1
  262. package/dist/pool-15HMCNv8.js +0 -88
  263. package/dist/pool-15HMCNv8.js.map +0 -1
  264. package/dist/react/SciPlot.d.ts +0 -60
  265. package/dist/react/useSciPlot.d.ts +0 -56
@@ -1 +1 @@
1
- {"version":3,"file":"data-export.js","sources":["../../src/plugins/data-export/formatters.ts","../../src/plugins/data-export/index.ts"],"sourcesContent":["/**\n * Data Export Formatters\n * \n * Handles conversion of chart data to various output formats.\n * \n * @module plugins/data-export/formatters\n */\n\nimport type { \n DataExportOptions, \n ExportFormat, \n FormatConfig,\n SeriesExportInfo,\n MatlabExportData,\n NumpyExportData\n} from \"./types\";\n\n// ============================================\n// Format Configurations\n// ============================================\n\nexport const FORMAT_CONFIGS: Record<ExportFormat, FormatConfig> = {\n csv: {\n mimeType: 'text/csv',\n extension: '.csv'\n },\n tsv: {\n mimeType: 'text/tab-separated-values',\n extension: '.tsv'\n },\n json: {\n mimeType: 'application/json',\n extension: '.json'\n },\n matlab: {\n mimeType: 'application/json',\n extension: '.mat.json'\n },\n python: {\n mimeType: 'application/json',\n extension: '.npy.json'\n },\n xlsx: {\n mimeType: 'text/csv;charset=utf-8',\n extension: '.csv',\n bom: '\\uFEFF' // UTF-8 BOM for Excel\n },\n binary: {\n mimeType: 'application/octet-stream',\n extension: '.bin',\n binary: true\n }\n};\n\n// ============================================\n// CSV/TSV Formatter\n// ============================================\n\n/**\n * Format data as CSV or TSV\n */\nexport function formatCSV(\n seriesData: SeriesExportInfo[],\n options: DataExportOptions\n): string {\n const {\n delimiter = options.format === 'tsv' ? '\\t' : ',',\n lineEnding = '\\n',\n includeHeaders = true,\n includeTimestamp = false,\n includeMetadata = false,\n metadata = {},\n precision = 6,\n scientificThreshold = 1e6\n } = options;\n\n const lines: string[] = [];\n const bom = options.format === 'xlsx' ? FORMAT_CONFIGS.xlsx.bom : '';\n\n // Add metadata as comments (if supported)\n if (includeMetadata && Object.keys(metadata).length > 0) {\n lines.push(`# Sci Plot Data Export`);\n if (includeTimestamp) {\n lines.push(`# Timestamp: ${new Date().toISOString()}`);\n }\n Object.entries(metadata).forEach(([key, value]) => {\n lines.push(`# ${key}: ${value}`);\n });\n lines.push('');\n }\n\n // Generate headers\n if (includeHeaders) {\n const headers: string[] = [];\n seriesData.forEach(s => {\n const prefix = seriesData.length > 1 ? `${s.name || s.id}_` : '';\n headers.push(`${prefix}x`, `${prefix}y`);\n \n // Add additional columns if present\n if (s.data.y2) headers.push(`${prefix}y2`);\n if (s.data.yError) headers.push(`${prefix}yError`);\n if (s.data.open) headers.push(`${prefix}open`, `${prefix}high`, `${prefix}low`, `${prefix}close`);\n });\n lines.push(headers.join(delimiter));\n }\n\n // Find max length\n const maxLength = Math.max(...seriesData.map(s => s.data.x.length));\n\n // Generate data rows\n for (let i = 0; i < maxLength; i++) {\n const row: string[] = [];\n \n seriesData.forEach(s => {\n const { x, y, y2, yError, open, high, low, close } = s.data;\n \n if (i < x.length) {\n row.push(\n formatNumber(x[i], precision, scientificThreshold),\n formatNumber(y[i], precision, scientificThreshold)\n );\n if (y2) row.push(formatNumber(y2[i], precision, scientificThreshold));\n if (yError) row.push(formatNumber(yError[i], precision, scientificThreshold));\n if (open && high && low && close) {\n row.push(\n formatNumber(open[i], precision, scientificThreshold),\n formatNumber(high[i], precision, scientificThreshold),\n formatNumber(low[i], precision, scientificThreshold),\n formatNumber(close[i], precision, scientificThreshold)\n );\n }\n } else {\n row.push('', '');\n if (s.data.y2) row.push('');\n if (s.data.yError) row.push('');\n if (s.data.open) row.push('', '', '', '');\n }\n });\n \n lines.push(row.join(delimiter));\n }\n\n return bom + lines.join(lineEnding);\n}\n\n// ============================================\n// JSON Formatter\n// ============================================\n\n/**\n * Format data as JSON\n */\nexport function formatJSON(\n seriesData: SeriesExportInfo[],\n options: DataExportOptions,\n viewBounds?: { xMin: number; xMax: number; yMin: number; yMax: number }\n): string {\n const {\n precision = 6,\n prettyPrint = true,\n includeMetadata = true,\n metadata = {}\n } = options;\n\n const exportData: Record<string, unknown> = {\n version: '1.0',\n exportDate: new Date().toISOString(),\n format: 'velo-plot-json'\n };\n\n if (includeMetadata) {\n exportData.metadata = {\n ...metadata,\n seriesCount: seriesData.length,\n totalPoints: seriesData.reduce((sum, s) => sum + s.pointCount, 0)\n };\n }\n\n if (viewBounds) {\n exportData.viewBounds = viewBounds;\n }\n\n exportData.series = seriesData.map(s => ({\n id: s.id,\n name: s.name || s.id,\n type: s.type,\n pointCount: s.pointCount,\n yAxisId: s.yAxisId,\n style: s.style,\n data: {\n x: roundArray(Array.from(s.data.x), precision),\n y: roundArray(Array.from(s.data.y), precision),\n ...(s.data.y2 && { y2: roundArray(Array.from(s.data.y2), precision) }),\n ...(s.data.yError && { yError: roundArray(Array.from(s.data.yError), precision) }),\n ...(s.data.open && { \n open: roundArray(Array.from(s.data.open), precision),\n high: roundArray(Array.from(s.data.high!), precision),\n low: roundArray(Array.from(s.data.low!), precision),\n close: roundArray(Array.from(s.data.close!), precision)\n })\n }\n }));\n\n return JSON.stringify(exportData, null, prettyPrint ? 2 : undefined);\n}\n\n// ============================================\n// MATLAB Format\n// ============================================\n\n/**\n * Format data for MATLAB compatibility\n * Outputs JSON that can be easily loaded in MATLAB using jsondecode()\n */\nexport function formatMATLAB(\n seriesData: SeriesExportInfo[],\n options: DataExportOptions\n): string {\n const { precision = 6, prettyPrint = true } = options;\n\n const matlabData: {\n format: string;\n version: string;\n created: string;\n variables: MatlabExportData[];\n } = {\n format: 'matlab-compatible-json',\n version: '1.0',\n created: new Date().toISOString(),\n variables: []\n };\n\n seriesData.forEach(s => {\n const xData = roundArray(Array.from(s.data.x), precision);\n const yData = roundArray(Array.from(s.data.y), precision);\n const safeName = sanitizeVariableName(s.name || s.id);\n\n // Create x variable\n matlabData.variables.push({\n name: `${safeName}_x`,\n type: 'double',\n size: [xData.length, 1],\n data: xData\n });\n\n // Create y variable\n matlabData.variables.push({\n name: `${safeName}_y`,\n type: 'double',\n size: [yData.length, 1],\n data: yData\n });\n\n // Create combined matrix variable\n matlabData.variables.push({\n name: safeName,\n type: 'double',\n size: [xData.length, 2],\n data: interleaveArrays(xData, yData)\n });\n });\n\n return JSON.stringify(matlabData, null, prettyPrint ? 2 : undefined);\n}\n\n// ============================================\n// Python/NumPy Format\n// ============================================\n\n/**\n * Format data for Python/NumPy compatibility\n * Outputs JSON that can be easily loaded in Python\n */\nexport function formatPython(\n seriesData: SeriesExportInfo[],\n options: DataExportOptions\n): string {\n const { precision = 6, prettyPrint = true } = options;\n\n const pythonData: {\n format: string;\n version: string;\n created: string;\n import_code: string;\n arrays: Record<string, NumpyExportData>;\n } = {\n format: 'numpy-compatible-json',\n version: '1.0',\n created: new Date().toISOString(),\n import_code: `\n# Load data in Python:\nimport json\nimport numpy as np\n\nwith open('data.npy.json', 'r') as f:\n data = json.load(f)\n\n# Access arrays:\n# x = np.array(data['arrays']['series_name']['x']['data'], dtype=np.float32)\n# y = np.array(data['arrays']['series_name']['y']['data'], dtype=np.float32)\n`.trim(),\n arrays: {}\n };\n\n seriesData.forEach(s => {\n const safeName = sanitizeVariableName(s.name || s.id);\n const xData = roundArray(Array.from(s.data.x), precision);\n const yData = roundArray(Array.from(s.data.y), precision);\n\n pythonData.arrays[safeName] = {\n dtype: 'float32',\n shape: [xData.length, 2],\n data: interleaveArrays(xData, yData),\n name: safeName\n };\n\n // Also provide separate x and y arrays\n pythonData.arrays[`${safeName}_x`] = {\n dtype: 'float32',\n shape: [xData.length],\n data: xData,\n name: `${safeName}_x`\n };\n\n pythonData.arrays[`${safeName}_y`] = {\n dtype: 'float32',\n shape: [yData.length],\n data: yData,\n name: `${safeName}_y`\n };\n });\n\n return JSON.stringify(pythonData, null, prettyPrint ? 2 : undefined);\n}\n\n// ============================================\n// Binary Format\n// ============================================\n\n/**\n * Format data as binary Float32Array\n * \n * Binary format structure:\n * - Header (32 bytes): magic number, version, series count, reserved\n * - Per series: name length (4 bytes), name (UTF-8), point count (4 bytes), x data, y data\n */\nexport function formatBinary(\n seriesData: SeriesExportInfo[]\n): ArrayBuffer {\n // Calculate total size\n let totalSize = 32; // Header\n \n seriesData.forEach(s => {\n const nameBytes = new TextEncoder().encode(s.name || s.id);\n totalSize += 4 + nameBytes.length; // name length + name\n totalSize += 4; // point count\n totalSize += s.data.x.length * 4 * 2; // x and y as Float32\n });\n \n const buffer = new ArrayBuffer(totalSize);\n const view = new DataView(buffer);\n const encoder = new TextEncoder();\n \n let offset = 0;\n \n // Header\n // Magic number: \"SCE1\" (Sci Plot v1)\n view.setUint8(offset++, 0x53); // S\n view.setUint8(offset++, 0x43); // C\n view.setUint8(offset++, 0x45); // E\n view.setUint8(offset++, 0x31); // 1\n \n // Version\n view.setUint32(offset, 1, true); offset += 4;\n \n // Series count\n view.setUint32(offset, seriesData.length, true); offset += 4;\n \n // Timestamp (milliseconds since epoch)\n const timestamp = Math.floor(Date.now() / 1000);\n view.setUint32(offset, timestamp, true); offset += 4;\n \n // Reserved (16 bytes)\n offset += 16;\n \n // Series data\n seriesData.forEach(s => {\n const nameBytes = encoder.encode(s.name || s.id);\n \n // Name length\n view.setUint32(offset, nameBytes.length, true); offset += 4;\n \n // Name\n new Uint8Array(buffer, offset, nameBytes.length).set(nameBytes);\n offset += nameBytes.length;\n \n // Point count\n const pointCount = s.data.x.length;\n view.setUint32(offset, pointCount, true); offset += 4;\n \n // X data\n const xFloat32 = new Float32Array(buffer, offset, pointCount);\n for (let i = 0; i < pointCount; i++) {\n xFloat32[i] = s.data.x[i];\n }\n offset += pointCount * 4;\n \n // Y data\n const yFloat32 = new Float32Array(buffer, offset, pointCount);\n for (let i = 0; i < pointCount; i++) {\n yFloat32[i] = s.data.y[i];\n }\n offset += pointCount * 4;\n });\n \n return buffer;\n}\n\n// ============================================\n// Utility Functions\n// ============================================\n\n/**\n * Format a number with appropriate precision\n */\nfunction formatNumber(value: number, precision: number, scientificThreshold: number): string {\n if (!isFinite(value)) {\n return isNaN(value) ? 'NaN' : (value > 0 ? 'Inf' : '-Inf');\n }\n \n const absValue = Math.abs(value);\n if (absValue !== 0 && (absValue >= scientificThreshold || absValue < 1e-4)) {\n return value.toExponential(precision);\n }\n \n return value.toFixed(precision);\n}\n\n/**\n * Round array values to specified precision\n */\nfunction roundArray(arr: number[], precision: number): number[] {\n const factor = Math.pow(10, precision);\n return arr.map(v => Math.round(v * factor) / factor);\n}\n\n/**\n * Sanitize string for use as variable name\n */\nfunction sanitizeVariableName(name: string): string {\n return name\n .replace(/[^a-zA-Z0-9_]/g, '_')\n .replace(/^[0-9]/, '_$&')\n .substring(0, 63);\n}\n\n/**\n * Interleave two arrays [a0, b0, a1, b1, ...]\n */\nfunction interleaveArrays(a: number[], b: number[]): number[] {\n const result: number[] = [];\n const len = Math.max(a.length, b.length);\n for (let i = 0; i < len; i++) {\n if (i < a.length) result.push(a[i]);\n if (i < b.length) result.push(b[i]);\n }\n return result;\n}\n","/**\n * Sci Plot - Data Export Plugin\n * \n * Advanced data export capabilities for scientific chart data.\n * Supports multiple formats including CSV, JSON, MATLAB, and Python.\n * \n * @module plugins/data-export\n * \n * @example\n * ```typescript\n * import { createChart } from 'velo-plot';\n * import { PluginDataExport } from 'velo-plot/plugins/data-export';\n * \n * const chart = createChart({ container });\n * chart.use(PluginDataExport({\n * defaultFormat: 'csv',\n * autoDownload: true\n * }));\n * \n * // Export visible data\n * const result = await chart.export('csv', { range: 'visible' });\n * \n * // Export all data to MATLAB format\n * await chart.export('matlab', { \n * seriesIds: ['voltage', 'current'],\n * includeMetadata: true \n * });\n * ```\n */\n\nimport type { PluginManifest, ChartPlugin, PluginContext } from \"../types\";\nimport type { \n PluginDataExportConfig, \n DataExportOptions, \n ExportResult,\n ExportFormat,\n SeriesExportInfo,\n ExportRange\n} from \"./types\";\nimport { \n FORMAT_CONFIGS,\n formatCSV, \n formatJSON, \n formatMATLAB, \n formatPython,\n formatBinary\n} from \"./formatters\";\n\n// Re-export types\nexport * from \"./types\";\n\n// ============================================\n// Plugin Definition\n// ============================================\n\nconst manifestDataExport: PluginManifest = {\n name: \"velo-plot-data-export\",\n version: \"1.0.0\",\n description: \"Advanced data export capabilities for velo-plot\",\n author: \"Sci Plot Team\",\n provides: [\"export\"],\n tags: [\"export\", \"csv\", \"json\", \"matlab\", \"python\", \"data\"],\n};\n\n/**\n * Sci Plot Data Export Plugin\n * \n * Provides comprehensive data export functionality with support for\n * multiple scientific and standard data formats.\n * \n * @param config - Plugin configuration options\n * @returns ChartPlugin instance\n */\nexport function PluginDataExport(\n config: PluginDataExportConfig = {}\n): ChartPlugin<PluginDataExportConfig> {\n \n const {\n formats = ['csv', 'tsv', 'json', 'matlab', 'python', 'xlsx', 'binary'],\n defaultFormat = 'csv',\n defaultPrecision = 6,\n includeMetadata = true,\n autoDownload = false,\n filenameGenerator,\n beforeExport,\n afterExport\n } = config;\n\n let _ctx: PluginContext | null = null;\n\n // ============================================\n // Internal Helpers\n // ============================================\n\n /**\n * Collect series data for export\n */\n function collectSeriesData(\n seriesIds?: string[],\n range?: ExportRange\n ): SeriesExportInfo[] {\n if (!_ctx) return [];\n\n const allSeries = _ctx.data.getAllSeries();\n const seriesToExport = seriesIds \n ? allSeries.filter(s => seriesIds.includes(s.getId()))\n : allSeries;\n\n return seriesToExport.map(s => {\n let data = s.getData();\n \n // Filter by range if specified\n if (range === 'visible' && data) {\n const bounds = _ctx!.data.getViewBounds();\n const filteredIndices: number[] = [];\n \n for (let i = 0; i < data.x.length; i++) {\n if (data.x[i] >= bounds.xMin && data.x[i] <= bounds.xMax) {\n filteredIndices.push(i);\n }\n }\n \n if (filteredIndices.length > 0 && filteredIndices.length < data.x.length) {\n const newX = new Float32Array(filteredIndices.length);\n const newY = new Float32Array(filteredIndices.length);\n \n filteredIndices.forEach((idx, i) => {\n newX[i] = data!.x[idx];\n newY[i] = data!.y[idx];\n });\n \n data = { ...data, x: newX, y: newY };\n }\n }\n\n return {\n id: s.getId(),\n name: s.getName?.() ?? s.getId(),\n type: s.getType(),\n data: data || { x: new Float32Array(0), y: new Float32Array(0) },\n pointCount: data?.x.length ?? 0,\n style: s.getStyle() as Record<string, unknown>,\n yAxisId: s.getYAxisId?.()\n };\n });\n }\n\n /**\n * Generate filename based on format and content\n */\n function generateFilename(format: ExportFormat, seriesIds: string[]): string {\n if (filenameGenerator) {\n return filenameGenerator(format, seriesIds);\n }\n \n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').substring(0, 19);\n const seriesPart = seriesIds.length <= 3 \n ? seriesIds.join('_') \n : `${seriesIds.length}_series`;\n \n const config = FORMAT_CONFIGS[format];\n return `velo-plot_${seriesPart}_${timestamp}${config.extension}`;\n }\n\n /**\n * Execute export operation\n */\n function doExport(options: DataExportOptions): ExportResult {\n const format = options.format ?? defaultFormat;\n const warnings: string[] = [];\n\n // Validate format\n if (!formats.includes(format)) {\n return {\n success: false,\n error: `Format '${format}' is not enabled. Available: ${formats.join(', ')}`,\n contentType: 'text/plain',\n filename: 'error.txt',\n seriesCount: 0,\n pointCount: 0,\n timestamp: new Date().toISOString()\n };\n }\n\n // Apply beforeExport hook\n let finalOptions: DataExportOptions = { ...options, precision: options.precision ?? defaultPrecision };\n if (beforeExport) {\n const hookResult = beforeExport(finalOptions);\n if (hookResult === false) {\n return {\n success: false,\n error: 'Export cancelled by beforeExport hook',\n contentType: 'text/plain',\n filename: 'cancelled.txt',\n seriesCount: 0,\n pointCount: 0,\n timestamp: new Date().toISOString()\n };\n }\n finalOptions = hookResult;\n }\n\n // Collect data\n const seriesData = collectSeriesData(finalOptions.seriesIds, finalOptions.range);\n \n if (seriesData.length === 0) {\n warnings.push('No series data found to export');\n }\n\n const totalPoints = seriesData.reduce((sum, s) => sum + s.pointCount, 0);\n const formatConfig = FORMAT_CONFIGS[format];\n const filename = finalOptions.filename ?? generateFilename(format, seriesData.map(s => s.id));\n\n let content: string | undefined;\n let blob: Blob | undefined;\n\n try {\n // Format data\n switch (format) {\n case 'csv':\n case 'tsv':\n case 'xlsx':\n content = formatCSV(seriesData, { ...finalOptions, format });\n break;\n \n case 'json':\n content = formatJSON(\n seriesData, \n finalOptions,\n _ctx?.data.getViewBounds()\n );\n break;\n \n case 'matlab':\n content = formatMATLAB(seriesData, finalOptions);\n break;\n \n case 'python':\n content = formatPython(seriesData, finalOptions);\n break;\n \n case 'binary':\n const buffer = formatBinary(seriesData);\n blob = new Blob([buffer], { type: formatConfig.mimeType });\n break;\n }\n\n // Create blob for string content\n if (content && !blob) {\n blob = new Blob([content], { type: formatConfig.mimeType });\n }\n\n } catch (error) {\n return {\n success: false,\n error: `Export failed: ${(error as Error).message}`,\n contentType: 'text/plain',\n filename: 'error.txt',\n seriesCount: seriesData.length,\n pointCount: totalPoints,\n timestamp: new Date().toISOString()\n };\n }\n\n const result: ExportResult = {\n success: true,\n content,\n blob,\n contentType: formatConfig.mimeType,\n filename,\n seriesCount: seriesData.length,\n pointCount: totalPoints,\n timestamp: new Date().toISOString(),\n warnings: warnings.length > 0 ? warnings : undefined\n };\n\n // Apply afterExport hook\n if (afterExport) {\n afterExport(result);\n }\n\n return result;\n }\n\n /**\n * Download a blob as a file\n */\n function downloadBlob(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n\n // ============================================\n // Plugin Implementation\n // ============================================\n\n const pluginApi: any = {\n /**\n * Export chart data to specified format\n * \n * @param format - Export format\n * @param options - Export options\n * @returns Export result with content/blob\n */\n export(format: ExportFormat, options: Partial<DataExportOptions> = {}): ExportResult {\n const fullOptions: DataExportOptions = {\n format,\n includeHeaders: true,\n includeTimestamp: true,\n includeMetadata,\n prettyPrint: true,\n ...options\n };\n\n const result = doExport(fullOptions);\n\n // Auto download if enabled and successful\n if (autoDownload && result.success && result.blob) {\n downloadBlob(result.blob, result.filename);\n }\n\n return result;\n },\n\n /**\n * Export and immediately download\n * \n * @param format - Export format\n * @param options - Export options\n */\n download(format: ExportFormat, options: Partial<DataExportOptions> = {}): ExportResult {\n const fullOptions: DataExportOptions = {\n format,\n includeHeaders: true,\n includeTimestamp: true,\n includeMetadata,\n prettyPrint: true,\n ...options\n };\n const result = doExport(fullOptions);\n \n if (result.success && result.blob) {\n downloadBlob(result.blob, result.filename);\n }\n \n return result;\n },\n\n /**\n * Export to CSV format\n */\n toCSV(options: Partial<DataExportOptions> = {}): ExportResult {\n return doExport({ format: 'csv', includeHeaders: true, includeTimestamp: true, includeMetadata, prettyPrint: true, ...options });\n },\n\n /**\n * Export to JSON format\n */\n toJSON(options: Partial<DataExportOptions> = {}): ExportResult {\n return doExport({ format: 'json', includeHeaders: true, includeTimestamp: true, includeMetadata, prettyPrint: true, ...options });\n },\n\n /**\n * Export to MATLAB format\n */\n toMATLAB(options: Partial<DataExportOptions> = {}): ExportResult {\n return doExport({ format: 'matlab', includeHeaders: true, includeTimestamp: true, includeMetadata, prettyPrint: true, ...options });\n },\n\n /**\n * Export to Python/NumPy format\n */\n toPython(options: Partial<DataExportOptions> = {}): ExportResult {\n return doExport({ format: 'python', includeHeaders: true, includeTimestamp: true, includeMetadata, prettyPrint: true, ...options });\n },\n\n /**\n * Export to Excel-compatible CSV\n */\n toExcel(options: Partial<DataExportOptions> = {}): ExportResult {\n return doExport({ format: 'xlsx', includeHeaders: true, includeTimestamp: true, includeMetadata, prettyPrint: true, ...options });\n },\n\n /**\n * Export to binary format\n */\n toBinary(options: Partial<DataExportOptions> = {}): ExportResult {\n return doExport({ format: 'binary', includeHeaders: true, includeTimestamp: true, includeMetadata, prettyPrint: true, ...options });\n },\n\n /**\n * Get available export formats\n */\n getFormats(): ExportFormat[] {\n return [...formats];\n },\n\n /**\n * Check if a format is supported\n */\n supportsFormat(format: ExportFormat): boolean {\n return formats.includes(format);\n },\n\n /**\n * Get format configuration\n */\n getFormatConfig(format: ExportFormat) {\n return FORMAT_CONFIGS[format];\n }\n };\n\n return {\n manifest: manifestDataExport,\n\n onInit(ctx: PluginContext) {\n _ctx = ctx;\n ctx.log.info(`DataExport plugin initialized with formats: ${formats.join(', ')}`);\n },\n\n onDestroy() {\n _ctx = null;\n },\n\n api: pluginApi\n };\n}\n\nexport default PluginDataExport;\n"],"names":["FORMAT_CONFIGS","formatCSV","seriesData","options","delimiter","lineEnding","includeHeaders","includeTimestamp","includeMetadata","metadata","precision","scientificThreshold","lines","bom","key","value","headers","s","prefix","maxLength","i","row","x","y","y2","yError","open","high","low","close","formatNumber","formatJSON","viewBounds","prettyPrint","exportData","sum","roundArray","formatMATLAB","matlabData","xData","yData","safeName","sanitizeVariableName","interleaveArrays","formatPython","pythonData","formatBinary","totalSize","nameBytes","buffer","view","encoder","offset","timestamp","pointCount","xFloat32","yFloat32","absValue","arr","factor","v","name","a","b","result","len","manifestDataExport","PluginDataExport","config","formats","defaultFormat","defaultPrecision","autoDownload","filenameGenerator","beforeExport","afterExport","_ctx","collectSeriesData","seriesIds","range","allSeries","_a","_b","data","bounds","filteredIndices","newX","newY","idx","generateFilename","format","seriesPart","doExport","warnings","finalOptions","hookResult","totalPoints","formatConfig","filename","content","blob","error","downloadBlob","url","link","ctx","fullOptions"],"mappings":"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"}
1
+ {"version":3,"file":"data-export.js","sources":["../../src/plugins/data-export/formatters.ts","../../src/plugins/data-export/index.ts"],"sourcesContent":["/**\n * Data Export Formatters\n * \n * Handles conversion of chart data to various output formats.\n * \n * @module plugins/data-export/formatters\n */\n\nimport type { \n DataExportOptions, \n ExportFormat, \n FormatConfig,\n SeriesExportInfo,\n MatlabExportData,\n NumpyExportData\n} from \"./types\";\n\n// ============================================\n// Format Configurations\n// ============================================\n\nexport const FORMAT_CONFIGS: Record<ExportFormat, FormatConfig> = {\n csv: {\n mimeType: 'text/csv',\n extension: '.csv'\n },\n tsv: {\n mimeType: 'text/tab-separated-values',\n extension: '.tsv'\n },\n json: {\n mimeType: 'application/json',\n extension: '.json'\n },\n matlab: {\n mimeType: 'application/json',\n extension: '.mat.json'\n },\n python: {\n mimeType: 'application/json',\n extension: '.npy.json'\n },\n xlsx: {\n mimeType: 'text/csv;charset=utf-8',\n extension: '.csv',\n bom: '\\uFEFF' // UTF-8 BOM for Excel\n },\n binary: {\n mimeType: 'application/octet-stream',\n extension: '.bin',\n binary: true\n }\n};\n\n// ============================================\n// CSV/TSV Formatter\n// ============================================\n\n/**\n * Format data as CSV or TSV\n */\nexport function formatCSV(\n seriesData: SeriesExportInfo[],\n options: DataExportOptions\n): string {\n const {\n delimiter = options.format === 'tsv' ? '\\t' : ',',\n lineEnding = '\\n',\n includeHeaders = true,\n includeTimestamp = false,\n includeMetadata = false,\n metadata = {},\n precision = 6,\n scientificThreshold = 1e6\n } = options;\n\n const lines: string[] = [];\n const bom = options.format === 'xlsx' ? FORMAT_CONFIGS.xlsx.bom : '';\n\n // Add metadata as comments (if supported)\n if (includeMetadata && Object.keys(metadata).length > 0) {\n lines.push(`# Velo Plot Data Export`);\n if (includeTimestamp) {\n lines.push(`# Timestamp: ${new Date().toISOString()}`);\n }\n Object.entries(metadata).forEach(([key, value]) => {\n lines.push(`# ${key}: ${value}`);\n });\n lines.push('');\n }\n\n // Generate headers\n if (includeHeaders) {\n const headers: string[] = [];\n seriesData.forEach(s => {\n const prefix = seriesData.length > 1 ? `${s.name || s.id}_` : '';\n headers.push(`${prefix}x`, `${prefix}y`);\n \n // Add additional columns if present\n if (s.data.y2) headers.push(`${prefix}y2`);\n if (s.data.yError) headers.push(`${prefix}yError`);\n if (s.data.open) headers.push(`${prefix}open`, `${prefix}high`, `${prefix}low`, `${prefix}close`);\n });\n lines.push(headers.join(delimiter));\n }\n\n // Find max length\n const maxLength = Math.max(...seriesData.map(s => s.data.x.length));\n\n // Generate data rows\n for (let i = 0; i < maxLength; i++) {\n const row: string[] = [];\n \n seriesData.forEach(s => {\n const { x, y, y2, yError, open, high, low, close } = s.data;\n \n if (i < x.length) {\n row.push(\n formatNumber(x[i], precision, scientificThreshold),\n formatNumber(y[i], precision, scientificThreshold)\n );\n if (y2) row.push(formatNumber(y2[i], precision, scientificThreshold));\n if (yError) row.push(formatNumber(yError[i], precision, scientificThreshold));\n if (open && high && low && close) {\n row.push(\n formatNumber(open[i], precision, scientificThreshold),\n formatNumber(high[i], precision, scientificThreshold),\n formatNumber(low[i], precision, scientificThreshold),\n formatNumber(close[i], precision, scientificThreshold)\n );\n }\n } else {\n row.push('', '');\n if (s.data.y2) row.push('');\n if (s.data.yError) row.push('');\n if (s.data.open) row.push('', '', '', '');\n }\n });\n \n lines.push(row.join(delimiter));\n }\n\n return bom + lines.join(lineEnding);\n}\n\n// ============================================\n// JSON Formatter\n// ============================================\n\n/**\n * Format data as JSON\n */\nexport function formatJSON(\n seriesData: SeriesExportInfo[],\n options: DataExportOptions,\n viewBounds?: { xMin: number; xMax: number; yMin: number; yMax: number }\n): string {\n const {\n precision = 6,\n prettyPrint = true,\n includeMetadata = true,\n metadata = {}\n } = options;\n\n const exportData: Record<string, unknown> = {\n version: '1.0',\n exportDate: new Date().toISOString(),\n format: 'velo-plot-json'\n };\n\n if (includeMetadata) {\n exportData.metadata = {\n ...metadata,\n seriesCount: seriesData.length,\n totalPoints: seriesData.reduce((sum, s) => sum + s.pointCount, 0)\n };\n }\n\n if (viewBounds) {\n exportData.viewBounds = viewBounds;\n }\n\n exportData.series = seriesData.map(s => ({\n id: s.id,\n name: s.name || s.id,\n type: s.type,\n pointCount: s.pointCount,\n yAxisId: s.yAxisId,\n style: s.style,\n data: {\n x: roundArray(Array.from(s.data.x), precision),\n y: roundArray(Array.from(s.data.y), precision),\n ...(s.data.y2 && { y2: roundArray(Array.from(s.data.y2), precision) }),\n ...(s.data.yError && { yError: roundArray(Array.from(s.data.yError), precision) }),\n ...(s.data.open && { \n open: roundArray(Array.from(s.data.open), precision),\n high: roundArray(Array.from(s.data.high!), precision),\n low: roundArray(Array.from(s.data.low!), precision),\n close: roundArray(Array.from(s.data.close!), precision)\n })\n }\n }));\n\n return JSON.stringify(exportData, null, prettyPrint ? 2 : undefined);\n}\n\n// ============================================\n// MATLAB Format\n// ============================================\n\n/**\n * Format data for MATLAB compatibility\n * Outputs JSON that can be easily loaded in MATLAB using jsondecode()\n */\nexport function formatMATLAB(\n seriesData: SeriesExportInfo[],\n options: DataExportOptions\n): string {\n const { precision = 6, prettyPrint = true } = options;\n\n const matlabData: {\n format: string;\n version: string;\n created: string;\n variables: MatlabExportData[];\n } = {\n format: 'matlab-compatible-json',\n version: '1.0',\n created: new Date().toISOString(),\n variables: []\n };\n\n seriesData.forEach(s => {\n const xData = roundArray(Array.from(s.data.x), precision);\n const yData = roundArray(Array.from(s.data.y), precision);\n const safeName = sanitizeVariableName(s.name || s.id);\n\n // Create x variable\n matlabData.variables.push({\n name: `${safeName}_x`,\n type: 'double',\n size: [xData.length, 1],\n data: xData\n });\n\n // Create y variable\n matlabData.variables.push({\n name: `${safeName}_y`,\n type: 'double',\n size: [yData.length, 1],\n data: yData\n });\n\n // Create combined matrix variable\n matlabData.variables.push({\n name: safeName,\n type: 'double',\n size: [xData.length, 2],\n data: interleaveArrays(xData, yData)\n });\n });\n\n return JSON.stringify(matlabData, null, prettyPrint ? 2 : undefined);\n}\n\n// ============================================\n// Python/NumPy Format\n// ============================================\n\n/**\n * Format data for Python/NumPy compatibility\n * Outputs JSON that can be easily loaded in Python\n */\nexport function formatPython(\n seriesData: SeriesExportInfo[],\n options: DataExportOptions\n): string {\n const { precision = 6, prettyPrint = true } = options;\n\n const pythonData: {\n format: string;\n version: string;\n created: string;\n import_code: string;\n arrays: Record<string, NumpyExportData>;\n } = {\n format: 'numpy-compatible-json',\n version: '1.0',\n created: new Date().toISOString(),\n import_code: `\n# Load data in Python:\nimport json\nimport numpy as np\n\nwith open('data.npy.json', 'r') as f:\n data = json.load(f)\n\n# Access arrays:\n# x = np.array(data['arrays']['series_name']['x']['data'], dtype=np.float32)\n# y = np.array(data['arrays']['series_name']['y']['data'], dtype=np.float32)\n`.trim(),\n arrays: {}\n };\n\n seriesData.forEach(s => {\n const safeName = sanitizeVariableName(s.name || s.id);\n const xData = roundArray(Array.from(s.data.x), precision);\n const yData = roundArray(Array.from(s.data.y), precision);\n\n pythonData.arrays[safeName] = {\n dtype: 'float32',\n shape: [xData.length, 2],\n data: interleaveArrays(xData, yData),\n name: safeName\n };\n\n // Also provide separate x and y arrays\n pythonData.arrays[`${safeName}_x`] = {\n dtype: 'float32',\n shape: [xData.length],\n data: xData,\n name: `${safeName}_x`\n };\n\n pythonData.arrays[`${safeName}_y`] = {\n dtype: 'float32',\n shape: [yData.length],\n data: yData,\n name: `${safeName}_y`\n };\n });\n\n return JSON.stringify(pythonData, null, prettyPrint ? 2 : undefined);\n}\n\n// ============================================\n// Binary Format\n// ============================================\n\n/**\n * Format data as binary Float32Array\n * \n * Binary format structure:\n * - Header (32 bytes): magic number, version, series count, reserved\n * - Per series: name length (4 bytes), name (UTF-8), point count (4 bytes), x data, y data\n */\nexport function formatBinary(\n seriesData: SeriesExportInfo[]\n): ArrayBuffer {\n // Calculate total size\n let totalSize = 32; // Header\n \n seriesData.forEach(s => {\n const nameBytes = new TextEncoder().encode(s.name || s.id);\n totalSize += 4 + nameBytes.length; // name length + name\n totalSize += 4; // point count\n totalSize += s.data.x.length * 4 * 2; // x and y as Float32\n });\n \n const buffer = new ArrayBuffer(totalSize);\n const view = new DataView(buffer);\n const encoder = new TextEncoder();\n \n let offset = 0;\n \n // Header\n // Magic number: \"SCE1\" (Velo Plot v1)\n view.setUint8(offset++, 0x53); // S\n view.setUint8(offset++, 0x43); // C\n view.setUint8(offset++, 0x45); // E\n view.setUint8(offset++, 0x31); // 1\n \n // Version\n view.setUint32(offset, 1, true); offset += 4;\n \n // Series count\n view.setUint32(offset, seriesData.length, true); offset += 4;\n \n // Timestamp (milliseconds since epoch)\n const timestamp = Math.floor(Date.now() / 1000);\n view.setUint32(offset, timestamp, true); offset += 4;\n \n // Reserved (16 bytes)\n offset += 16;\n \n // Series data\n seriesData.forEach(s => {\n const nameBytes = encoder.encode(s.name || s.id);\n \n // Name length\n view.setUint32(offset, nameBytes.length, true); offset += 4;\n \n // Name\n new Uint8Array(buffer, offset, nameBytes.length).set(nameBytes);\n offset += nameBytes.length;\n \n // Point count\n const pointCount = s.data.x.length;\n view.setUint32(offset, pointCount, true); offset += 4;\n \n // X data\n const xFloat32 = new Float32Array(buffer, offset, pointCount);\n for (let i = 0; i < pointCount; i++) {\n xFloat32[i] = s.data.x[i];\n }\n offset += pointCount * 4;\n \n // Y data\n const yFloat32 = new Float32Array(buffer, offset, pointCount);\n for (let i = 0; i < pointCount; i++) {\n yFloat32[i] = s.data.y[i];\n }\n offset += pointCount * 4;\n });\n \n return buffer;\n}\n\n// ============================================\n// Utility Functions\n// ============================================\n\n/**\n * Format a number with appropriate precision\n */\nfunction formatNumber(value: number, precision: number, scientificThreshold: number): string {\n if (!isFinite(value)) {\n return isNaN(value) ? 'NaN' : (value > 0 ? 'Inf' : '-Inf');\n }\n \n const absValue = Math.abs(value);\n if (absValue !== 0 && (absValue >= scientificThreshold || absValue < 1e-4)) {\n return value.toExponential(precision);\n }\n \n return value.toFixed(precision);\n}\n\n/**\n * Round array values to specified precision\n */\nfunction roundArray(arr: number[], precision: number): number[] {\n const factor = Math.pow(10, precision);\n return arr.map(v => Math.round(v * factor) / factor);\n}\n\n/**\n * Sanitize string for use as variable name\n */\nfunction sanitizeVariableName(name: string): string {\n return name\n .replace(/[^a-zA-Z0-9_]/g, '_')\n .replace(/^[0-9]/, '_$&')\n .substring(0, 63);\n}\n\n/**\n * Interleave two arrays [a0, b0, a1, b1, ...]\n */\nfunction interleaveArrays(a: number[], b: number[]): number[] {\n const result: number[] = [];\n const len = Math.max(a.length, b.length);\n for (let i = 0; i < len; i++) {\n if (i < a.length) result.push(a[i]);\n if (i < b.length) result.push(b[i]);\n }\n return result;\n}\n","/**\n * Velo Plot - Data Export Plugin\n * \n * Advanced data export capabilities for scientific chart data.\n * Supports multiple formats including CSV, JSON, MATLAB, and Python.\n * \n * @module plugins/data-export\n * \n * @example\n * ```typescript\n * import { createChart } from 'velo-plot';\n * import { PluginDataExport } from 'velo-plot/plugins/data-export';\n * \n * const chart = createChart({ container });\n * chart.use(PluginDataExport({\n * defaultFormat: 'csv',\n * autoDownload: true\n * }));\n * \n * // Export visible data\n * const result = await chart.export('csv', { range: 'visible' });\n * \n * // Export all data to MATLAB format\n * await chart.export('matlab', { \n * seriesIds: ['voltage', 'current'],\n * includeMetadata: true \n * });\n * ```\n */\n\nimport type { PluginManifest, ChartPlugin, PluginContext } from \"../types\";\nimport type { \n PluginDataExportConfig, \n DataExportOptions, \n ExportResult,\n ExportFormat,\n SeriesExportInfo,\n ExportRange\n} from \"./types\";\nimport { \n FORMAT_CONFIGS,\n formatCSV, \n formatJSON, \n formatMATLAB, \n formatPython,\n formatBinary\n} from \"./formatters\";\n\n// Re-export types\nexport * from \"./types\";\n\n// ============================================\n// Plugin Definition\n// ============================================\n\nconst manifestDataExport: PluginManifest = {\n name: \"velo-plot-data-export\",\n version: \"1.0.0\",\n description: \"Advanced data export capabilities for velo-plot\",\n author: \"Velo Plot Team\",\n provides: [\"export\"],\n tags: [\"export\", \"csv\", \"json\", \"matlab\", \"python\", \"data\"],\n};\n\n/**\n * Velo Plot Data Export Plugin\n * \n * Provides comprehensive data export functionality with support for\n * multiple scientific and standard data formats.\n * \n * @param config - Plugin configuration options\n * @returns ChartPlugin instance\n */\nexport function PluginDataExport(\n config: PluginDataExportConfig = {}\n): ChartPlugin<PluginDataExportConfig> {\n \n const {\n formats = ['csv', 'tsv', 'json', 'matlab', 'python', 'xlsx', 'binary'],\n defaultFormat = 'csv',\n defaultPrecision = 6,\n includeMetadata = true,\n autoDownload = false,\n filenameGenerator,\n beforeExport,\n afterExport\n } = config;\n\n let _ctx: PluginContext | null = null;\n\n // ============================================\n // Internal Helpers\n // ============================================\n\n /**\n * Collect series data for export\n */\n function collectSeriesData(\n seriesIds?: string[],\n range?: ExportRange\n ): SeriesExportInfo[] {\n if (!_ctx) return [];\n\n const allSeries = _ctx.data.getAllSeries();\n const seriesToExport = seriesIds \n ? allSeries.filter(s => seriesIds.includes(s.getId()))\n : allSeries;\n\n return seriesToExport.map(s => {\n let data = s.getData();\n \n // Filter by range if specified\n if (range === 'visible' && data) {\n const bounds = _ctx!.data.getViewBounds();\n const filteredIndices: number[] = [];\n \n for (let i = 0; i < data.x.length; i++) {\n if (data.x[i] >= bounds.xMin && data.x[i] <= bounds.xMax) {\n filteredIndices.push(i);\n }\n }\n \n if (filteredIndices.length > 0 && filteredIndices.length < data.x.length) {\n const newX = new Float32Array(filteredIndices.length);\n const newY = new Float32Array(filteredIndices.length);\n \n filteredIndices.forEach((idx, i) => {\n newX[i] = data!.x[idx];\n newY[i] = data!.y[idx];\n });\n \n data = { ...data, x: newX, y: newY };\n }\n }\n\n return {\n id: s.getId(),\n name: s.getName?.() ?? s.getId(),\n type: s.getType(),\n data: data || { x: new Float32Array(0), y: new Float32Array(0) },\n pointCount: data?.x.length ?? 0,\n style: s.getStyle() as Record<string, unknown>,\n yAxisId: s.getYAxisId?.()\n };\n });\n }\n\n /**\n * Generate filename based on format and content\n */\n function generateFilename(format: ExportFormat, seriesIds: string[]): string {\n if (filenameGenerator) {\n return filenameGenerator(format, seriesIds);\n }\n \n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').substring(0, 19);\n const seriesPart = seriesIds.length <= 3 \n ? seriesIds.join('_') \n : `${seriesIds.length}_series`;\n \n const config = FORMAT_CONFIGS[format];\n return `velo-plot_${seriesPart}_${timestamp}${config.extension}`;\n }\n\n /**\n * Execute export operation\n */\n function doExport(options: DataExportOptions): ExportResult {\n const format = options.format ?? defaultFormat;\n const warnings: string[] = [];\n\n // Validate format\n if (!formats.includes(format)) {\n return {\n success: false,\n error: `Format '${format}' is not enabled. Available: ${formats.join(', ')}`,\n contentType: 'text/plain',\n filename: 'error.txt',\n seriesCount: 0,\n pointCount: 0,\n timestamp: new Date().toISOString()\n };\n }\n\n // Apply beforeExport hook\n let finalOptions: DataExportOptions = { ...options, precision: options.precision ?? defaultPrecision };\n if (beforeExport) {\n const hookResult = beforeExport(finalOptions);\n if (hookResult === false) {\n return {\n success: false,\n error: 'Export cancelled by beforeExport hook',\n contentType: 'text/plain',\n filename: 'cancelled.txt',\n seriesCount: 0,\n pointCount: 0,\n timestamp: new Date().toISOString()\n };\n }\n finalOptions = hookResult;\n }\n\n // Collect data\n const seriesData = collectSeriesData(finalOptions.seriesIds, finalOptions.range);\n \n if (seriesData.length === 0) {\n warnings.push('No series data found to export');\n }\n\n const totalPoints = seriesData.reduce((sum, s) => sum + s.pointCount, 0);\n const formatConfig = FORMAT_CONFIGS[format];\n const filename = finalOptions.filename ?? generateFilename(format, seriesData.map(s => s.id));\n\n let content: string | undefined;\n let blob: Blob | undefined;\n\n try {\n // Format data\n switch (format) {\n case 'csv':\n case 'tsv':\n case 'xlsx':\n content = formatCSV(seriesData, { ...finalOptions, format });\n break;\n \n case 'json':\n content = formatJSON(\n seriesData, \n finalOptions,\n _ctx?.data.getViewBounds()\n );\n break;\n \n case 'matlab':\n content = formatMATLAB(seriesData, finalOptions);\n break;\n \n case 'python':\n content = formatPython(seriesData, finalOptions);\n break;\n \n case 'binary':\n const buffer = formatBinary(seriesData);\n blob = new Blob([buffer], { type: formatConfig.mimeType });\n break;\n }\n\n // Create blob for string content\n if (content && !blob) {\n blob = new Blob([content], { type: formatConfig.mimeType });\n }\n\n } catch (error) {\n return {\n success: false,\n error: `Export failed: ${(error as Error).message}`,\n contentType: 'text/plain',\n filename: 'error.txt',\n seriesCount: seriesData.length,\n pointCount: totalPoints,\n timestamp: new Date().toISOString()\n };\n }\n\n const result: ExportResult = {\n success: true,\n content,\n blob,\n contentType: formatConfig.mimeType,\n filename,\n seriesCount: seriesData.length,\n pointCount: totalPoints,\n timestamp: new Date().toISOString(),\n warnings: warnings.length > 0 ? warnings : undefined\n };\n\n // Apply afterExport hook\n if (afterExport) {\n afterExport(result);\n }\n\n return result;\n }\n\n /**\n * Download a blob as a file\n */\n function downloadBlob(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n\n // ============================================\n // Plugin Implementation\n // ============================================\n\n const pluginApi: any = {\n /**\n * Export chart data to specified format\n * \n * @param format - Export format\n * @param options - Export options\n * @returns Export result with content/blob\n */\n export(format: ExportFormat, options: Partial<DataExportOptions> = {}): ExportResult {\n const fullOptions: DataExportOptions = {\n format,\n includeHeaders: true,\n includeTimestamp: true,\n includeMetadata,\n prettyPrint: true,\n ...options\n };\n\n const result = doExport(fullOptions);\n\n // Auto download if enabled and successful\n if (autoDownload && result.success && result.blob) {\n downloadBlob(result.blob, result.filename);\n }\n\n return result;\n },\n\n /**\n * Export and immediately download\n * \n * @param format - Export format\n * @param options - Export options\n */\n download(format: ExportFormat, options: Partial<DataExportOptions> = {}): ExportResult {\n const fullOptions: DataExportOptions = {\n format,\n includeHeaders: true,\n includeTimestamp: true,\n includeMetadata,\n prettyPrint: true,\n ...options\n };\n const result = doExport(fullOptions);\n \n if (result.success && result.blob) {\n downloadBlob(result.blob, result.filename);\n }\n \n return result;\n },\n\n /**\n * Export to CSV format\n */\n toCSV(options: Partial<DataExportOptions> = {}): ExportResult {\n return doExport({ format: 'csv', includeHeaders: true, includeTimestamp: true, includeMetadata, prettyPrint: true, ...options });\n },\n\n /**\n * Export to JSON format\n */\n toJSON(options: Partial<DataExportOptions> = {}): ExportResult {\n return doExport({ format: 'json', includeHeaders: true, includeTimestamp: true, includeMetadata, prettyPrint: true, ...options });\n },\n\n /**\n * Export to MATLAB format\n */\n toMATLAB(options: Partial<DataExportOptions> = {}): ExportResult {\n return doExport({ format: 'matlab', includeHeaders: true, includeTimestamp: true, includeMetadata, prettyPrint: true, ...options });\n },\n\n /**\n * Export to Python/NumPy format\n */\n toPython(options: Partial<DataExportOptions> = {}): ExportResult {\n return doExport({ format: 'python', includeHeaders: true, includeTimestamp: true, includeMetadata, prettyPrint: true, ...options });\n },\n\n /**\n * Export to Excel-compatible CSV\n */\n toExcel(options: Partial<DataExportOptions> = {}): ExportResult {\n return doExport({ format: 'xlsx', includeHeaders: true, includeTimestamp: true, includeMetadata, prettyPrint: true, ...options });\n },\n\n /**\n * Export to binary format\n */\n toBinary(options: Partial<DataExportOptions> = {}): ExportResult {\n return doExport({ format: 'binary', includeHeaders: true, includeTimestamp: true, includeMetadata, prettyPrint: true, ...options });\n },\n\n /**\n * Get available export formats\n */\n getFormats(): ExportFormat[] {\n return [...formats];\n },\n\n /**\n * Check if a format is supported\n */\n supportsFormat(format: ExportFormat): boolean {\n return formats.includes(format);\n },\n\n /**\n * Get format configuration\n */\n getFormatConfig(format: ExportFormat) {\n return FORMAT_CONFIGS[format];\n }\n };\n\n return {\n manifest: manifestDataExport,\n\n onInit(ctx: PluginContext) {\n _ctx = ctx;\n ctx.log.info(`DataExport plugin initialized with formats: ${formats.join(', ')}`);\n },\n\n onDestroy() {\n _ctx = null;\n },\n\n api: pluginApi\n };\n}\n\nexport default PluginDataExport;\n"],"names":["FORMAT_CONFIGS","formatCSV","seriesData","options","delimiter","lineEnding","includeHeaders","includeTimestamp","includeMetadata","metadata","precision","scientificThreshold","lines","bom","key","value","headers","s","prefix","maxLength","i","row","x","y","y2","yError","open","high","low","close","formatNumber","formatJSON","viewBounds","prettyPrint","exportData","sum","roundArray","formatMATLAB","matlabData","xData","yData","safeName","sanitizeVariableName","interleaveArrays","formatPython","pythonData","formatBinary","totalSize","nameBytes","buffer","view","encoder","offset","timestamp","pointCount","xFloat32","yFloat32","absValue","arr","factor","v","name","a","b","result","len","manifestDataExport","PluginDataExport","config","formats","defaultFormat","defaultPrecision","autoDownload","filenameGenerator","beforeExport","afterExport","_ctx","collectSeriesData","seriesIds","range","allSeries","_a","_b","data","bounds","filteredIndices","newX","newY","idx","generateFilename","format","seriesPart","doExport","warnings","finalOptions","hookResult","totalPoints","formatConfig","filename","content","blob","error","downloadBlob","url","link","ctx","fullOptions"],"mappings":"AAqBO,MAAMA,IAAqD;AAAA,EAChE,KAAK;AAAA,IACH,UAAU;AAAA,IACV,WAAW;AAAA,EAAA;AAAA,EAEb,KAAK;AAAA,IACH,UAAU;AAAA,IACV,WAAW;AAAA,EAAA;AAAA,EAEb,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,WAAW;AAAA,EAAA;AAAA,EAEb,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,EAAA;AAAA,EAEb,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,EAAA;AAAA,EAEb,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,KAAK;AAAA;AAAA,EAAA;AAAA,EAEP,QAAQ;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,IACX,QAAQ;AAAA,EAAA;AAEZ;AASO,SAASC,EACdC,GACAC,GACQ;AACR,QAAM;AAAA,IACJ,WAAAC,IAAYD,EAAQ,WAAW,QAAQ,MAAO;AAAA,IAC9C,YAAAE,IAAa;AAAA;AAAA,IACb,gBAAAC,IAAiB;AAAA,IACjB,kBAAAC,IAAmB;AAAA,IACnB,iBAAAC,IAAkB;AAAA,IAClB,UAAAC,IAAW,CAAA;AAAA,IACX,WAAAC,IAAY;AAAA,IACZ,qBAAAC,IAAsB;AAAA,EAAA,IACpBR,GAEES,IAAkB,CAAA,GAClBC,IAAMV,EAAQ,WAAW,SAASH,EAAe,KAAK,MAAM;AAelE,MAZIQ,KAAmB,OAAO,KAAKC,CAAQ,EAAE,SAAS,MACpDG,EAAM,KAAK,yBAAyB,GAChCL,KACFK,EAAM,KAAK,iBAAgB,oBAAI,QAAO,YAAA,CAAa,EAAE,GAEvD,OAAO,QAAQH,CAAQ,EAAE,QAAQ,CAAC,CAACK,GAAKC,CAAK,MAAM;AACjD,IAAAH,EAAM,KAAK,KAAKE,CAAG,KAAKC,CAAK,EAAE;AAAA,EACjC,CAAC,GACDH,EAAM,KAAK,EAAE,IAIXN,GAAgB;AAClB,UAAMU,IAAoB,CAAA;AAC1B,IAAAd,EAAW,QAAQ,CAAAe,MAAK;AACtB,YAAMC,IAAShB,EAAW,SAAS,IAAI,GAAGe,EAAE,QAAQA,EAAE,EAAE,MAAM;AAC9D,MAAAD,EAAQ,KAAK,GAAGE,CAAM,KAAK,GAAGA,CAAM,GAAG,GAGnCD,EAAE,KAAK,QAAY,KAAK,GAAGC,CAAM,IAAI,GACrCD,EAAE,KAAK,YAAgB,KAAK,GAAGC,CAAM,QAAQ,GAC7CD,EAAE,KAAK,QAAMD,EAAQ,KAAK,GAAGE,CAAM,QAAQ,GAAGA,CAAM,QAAQ,GAAGA,CAAM,OAAO,GAAGA,CAAM,OAAO;AAAA,IAClG,CAAC,GACDN,EAAM,KAAKI,EAAQ,KAAKZ,CAAS,CAAC;AAAA,EACpC;AAGA,QAAMe,IAAY,KAAK,IAAI,GAAGjB,EAAW,IAAI,CAAAe,MAAKA,EAAE,KAAK,EAAE,MAAM,CAAC;AAGlE,WAASG,IAAI,GAAGA,IAAID,GAAWC,KAAK;AAClC,UAAMC,IAAgB,CAAA;AAEtB,IAAAnB,EAAW,QAAQ,CAAAe,MAAK;AACtB,YAAM,EAAE,GAAAK,GAAG,GAAAC,GAAG,IAAAC,GAAI,QAAAC,GAAQ,MAAAC,GAAM,MAAAC,GAAM,KAAAC,GAAK,OAAAC,EAAA,IAAUZ,EAAE;AAEvD,MAAIG,IAAIE,EAAE,UACRD,EAAI;AAAA,QACFS,EAAaR,EAAEF,CAAC,GAAGV,GAAWC,CAAmB;AAAA,QACjDmB,EAAaP,EAAEH,CAAC,GAAGV,GAAWC,CAAmB;AAAA,MAAA,GAE/Ca,OAAQ,KAAKM,EAAaN,EAAGJ,CAAC,GAAGV,GAAWC,CAAmB,CAAC,GAChEc,OAAY,KAAKK,EAAaL,EAAOL,CAAC,GAAGV,GAAWC,CAAmB,CAAC,GACxEe,KAAQC,KAAQC,KAAOC,KACzBR,EAAI;AAAA,QACFS,EAAaJ,EAAKN,CAAC,GAAGV,GAAWC,CAAmB;AAAA,QACpDmB,EAAaH,EAAKP,CAAC,GAAGV,GAAWC,CAAmB;AAAA,QACpDmB,EAAaF,EAAIR,CAAC,GAAGV,GAAWC,CAAmB;AAAA,QACnDmB,EAAaD,EAAMT,CAAC,GAAGV,GAAWC,CAAmB;AAAA,MAAA,MAIzDU,EAAI,KAAK,IAAI,EAAE,GACXJ,EAAE,KAAK,MAAII,EAAI,KAAK,EAAE,GACtBJ,EAAE,KAAK,UAAQI,EAAI,KAAK,EAAE,GAC1BJ,EAAE,KAAK,QAAMI,EAAI,KAAK,IAAI,IAAI,IAAI,EAAE;AAAA,IAE5C,CAAC,GAEDT,EAAM,KAAKS,EAAI,KAAKjB,CAAS,CAAC;AAAA,EAChC;AAEA,SAAOS,IAAMD,EAAM,KAAKP,CAAU;AACpC;AASO,SAAS0B,EACd7B,GACAC,GACA6B,GACQ;AACR,QAAM;AAAA,IACJ,WAAAtB,IAAY;AAAA,IACZ,aAAAuB,IAAc;AAAA,IACd,iBAAAzB,IAAkB;AAAA,IAClB,UAAAC,IAAW,CAAA;AAAA,EAAC,IACVN,GAEE+B,IAAsC;AAAA,IAC1C,SAAS;AAAA,IACT,aAAY,oBAAI,KAAA,GAAO,YAAA;AAAA,IACvB,QAAQ;AAAA,EAAA;AAGV,SAAI1B,MACF0B,EAAW,WAAW;AAAA,IACpB,GAAGzB;AAAA,IACH,aAAaP,EAAW;AAAA,IACxB,aAAaA,EAAW,OAAO,CAACiC,GAAKlB,MAAMkB,IAAMlB,EAAE,YAAY,CAAC;AAAA,EAAA,IAIhEe,MACFE,EAAW,aAAaF,IAG1BE,EAAW,SAAShC,EAAW,IAAI,CAAAe,OAAM;AAAA,IACvC,IAAIA,EAAE;AAAA,IACN,MAAMA,EAAE,QAAQA,EAAE;AAAA,IAClB,MAAMA,EAAE;AAAA,IACR,YAAYA,EAAE;AAAA,IACd,SAASA,EAAE;AAAA,IACX,OAAOA,EAAE;AAAA,IACT,MAAM;AAAA,MACJ,GAAGmB,EAAW,MAAM,KAAKnB,EAAE,KAAK,CAAC,GAAGP,CAAS;AAAA,MAC7C,GAAG0B,EAAW,MAAM,KAAKnB,EAAE,KAAK,CAAC,GAAGP,CAAS;AAAA,MAC7C,GAAIO,EAAE,KAAK,MAAM,EAAE,IAAImB,EAAW,MAAM,KAAKnB,EAAE,KAAK,EAAE,GAAGP,CAAS,EAAA;AAAA,MAClE,GAAIO,EAAE,KAAK,UAAU,EAAE,QAAQmB,EAAW,MAAM,KAAKnB,EAAE,KAAK,MAAM,GAAGP,CAAS,EAAA;AAAA,MAC9E,GAAIO,EAAE,KAAK,QAAQ;AAAA,QACjB,MAAMmB,EAAW,MAAM,KAAKnB,EAAE,KAAK,IAAI,GAAGP,CAAS;AAAA,QACnD,MAAM0B,EAAW,MAAM,KAAKnB,EAAE,KAAK,IAAK,GAAGP,CAAS;AAAA,QACpD,KAAK0B,EAAW,MAAM,KAAKnB,EAAE,KAAK,GAAI,GAAGP,CAAS;AAAA,QAClD,OAAO0B,EAAW,MAAM,KAAKnB,EAAE,KAAK,KAAM,GAAGP,CAAS;AAAA,MAAA;AAAA,IACxD;AAAA,EACF,EACA,GAEK,KAAK,UAAUwB,GAAY,MAAMD,IAAc,IAAI,MAAS;AACrE;AAUO,SAASI,EACdnC,GACAC,GACQ;AACR,QAAM,EAAE,WAAAO,IAAY,GAAG,aAAAuB,IAAc,OAAS9B,GAExCmC,IAKF;AAAA,IACF,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAS,oBAAI,KAAA,GAAO,YAAA;AAAA,IACpB,WAAW,CAAA;AAAA,EAAC;AAGd,SAAApC,EAAW,QAAQ,CAAAe,MAAK;AACtB,UAAMsB,IAAQH,EAAW,MAAM,KAAKnB,EAAE,KAAK,CAAC,GAAGP,CAAS,GAClD8B,IAAQJ,EAAW,MAAM,KAAKnB,EAAE,KAAK,CAAC,GAAGP,CAAS,GAClD+B,IAAWC,EAAqBzB,EAAE,QAAQA,EAAE,EAAE;AAGpD,IAAAqB,EAAW,UAAU,KAAK;AAAA,MACxB,MAAM,GAAGG,CAAQ;AAAA,MACjB,MAAM;AAAA,MACN,MAAM,CAACF,EAAM,QAAQ,CAAC;AAAA,MACtB,MAAMA;AAAA,IAAA,CACP,GAGDD,EAAW,UAAU,KAAK;AAAA,MACxB,MAAM,GAAGG,CAAQ;AAAA,MACjB,MAAM;AAAA,MACN,MAAM,CAACD,EAAM,QAAQ,CAAC;AAAA,MACtB,MAAMA;AAAA,IAAA,CACP,GAGDF,EAAW,UAAU,KAAK;AAAA,MACxB,MAAMG;AAAA,MACN,MAAM;AAAA,MACN,MAAM,CAACF,EAAM,QAAQ,CAAC;AAAA,MACtB,MAAMI,EAAiBJ,GAAOC,CAAK;AAAA,IAAA,CACpC;AAAA,EACH,CAAC,GAEM,KAAK,UAAUF,GAAY,MAAML,IAAc,IAAI,MAAS;AACrE;AAUO,SAASW,EACd1C,GACAC,GACQ;AACR,QAAM,EAAE,WAAAO,IAAY,GAAG,aAAAuB,IAAc,OAAS9B,GAExC0C,IAMF;AAAA,IACF,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAS,oBAAI,KAAA,GAAO,YAAA;AAAA,IACpB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWf,KAAA;AAAA,IACE,QAAQ,CAAA;AAAA,EAAC;AAGX,SAAA3C,EAAW,QAAQ,CAAAe,MAAK;AACtB,UAAMwB,IAAWC,EAAqBzB,EAAE,QAAQA,EAAE,EAAE,GAC9CsB,IAAQH,EAAW,MAAM,KAAKnB,EAAE,KAAK,CAAC,GAAGP,CAAS,GAClD8B,IAAQJ,EAAW,MAAM,KAAKnB,EAAE,KAAK,CAAC,GAAGP,CAAS;AAExD,IAAAmC,EAAW,OAAOJ,CAAQ,IAAI;AAAA,MAC5B,OAAO;AAAA,MACP,OAAO,CAACF,EAAM,QAAQ,CAAC;AAAA,MACvB,MAAMI,EAAiBJ,GAAOC,CAAK;AAAA,MACnC,MAAMC;AAAA,IAAA,GAIRI,EAAW,OAAO,GAAGJ,CAAQ,IAAI,IAAI;AAAA,MACnC,OAAO;AAAA,MACP,OAAO,CAACF,EAAM,MAAM;AAAA,MACpB,MAAMA;AAAA,MACN,MAAM,GAAGE,CAAQ;AAAA,IAAA,GAGnBI,EAAW,OAAO,GAAGJ,CAAQ,IAAI,IAAI;AAAA,MACnC,OAAO;AAAA,MACP,OAAO,CAACD,EAAM,MAAM;AAAA,MACpB,MAAMA;AAAA,MACN,MAAM,GAAGC,CAAQ;AAAA,IAAA;AAAA,EAErB,CAAC,GAEM,KAAK,UAAUI,GAAY,MAAMZ,IAAc,IAAI,MAAS;AACrE;AAaO,SAASa,EACd5C,GACa;AAEb,MAAI6C,IAAY;AAEhB,EAAA7C,EAAW,QAAQ,CAAAe,MAAK;AACtB,UAAM+B,IAAY,IAAI,cAAc,OAAO/B,EAAE,QAAQA,EAAE,EAAE;AACzD,IAAA8B,KAAa,IAAIC,EAAU,QAC3BD,KAAa,GACbA,KAAa9B,EAAE,KAAK,EAAE,SAAS,IAAI;AAAA,EACrC,CAAC;AAED,QAAMgC,IAAS,IAAI,YAAYF,CAAS,GAClCG,IAAO,IAAI,SAASD,CAAM,GAC1BE,IAAU,IAAI,YAAA;AAEpB,MAAIC,IAAS;AAIb,EAAAF,EAAK,SAASE,KAAU,EAAI,GAC5BF,EAAK,SAASE,KAAU,EAAI,GAC5BF,EAAK,SAASE,KAAU,EAAI,GAC5BF,EAAK,SAASE,KAAU,EAAI,GAG5BF,EAAK,UAAUE,GAAQ,GAAG,EAAI,GAAGA,KAAU,GAG3CF,EAAK,UAAUE,GAAQlD,EAAW,QAAQ,EAAI,GAAGkD,KAAU;AAG3D,QAAMC,IAAY,KAAK,MAAM,KAAK,IAAA,IAAQ,GAAI;AAC9C,SAAAH,EAAK,UAAUE,GAAQC,GAAW,EAAI,GAAGD,KAAU,GAGnDA,KAAU,IAGVlD,EAAW,QAAQ,CAAAe,MAAK;AACtB,UAAM+B,IAAYG,EAAQ,OAAOlC,EAAE,QAAQA,EAAE,EAAE;AAG/C,IAAAiC,EAAK,UAAUE,GAAQJ,EAAU,QAAQ,EAAI,GAAGI,KAAU,GAG1D,IAAI,WAAWH,GAAQG,GAAQJ,EAAU,MAAM,EAAE,IAAIA,CAAS,GAC9DI,KAAUJ,EAAU;AAGpB,UAAMM,IAAarC,EAAE,KAAK,EAAE;AAC5B,IAAAiC,EAAK,UAAUE,GAAQE,GAAY,EAAI,GAAGF,KAAU;AAGpD,UAAMG,IAAW,IAAI,aAAaN,GAAQG,GAAQE,CAAU;AAC5D,aAASlC,IAAI,GAAGA,IAAIkC,GAAYlC;AAC9B,MAAAmC,EAASnC,CAAC,IAAIH,EAAE,KAAK,EAAEG,CAAC;AAE1B,IAAAgC,KAAUE,IAAa;AAGvB,UAAME,IAAW,IAAI,aAAaP,GAAQG,GAAQE,CAAU;AAC5D,aAASlC,IAAI,GAAGA,IAAIkC,GAAYlC;AAC9B,MAAAoC,EAASpC,CAAC,IAAIH,EAAE,KAAK,EAAEG,CAAC;AAE1B,IAAAgC,KAAUE,IAAa;AAAA,EACzB,CAAC,GAEML;AACT;AASA,SAASnB,EAAaf,GAAeL,GAAmBC,GAAqC;AAC3F,MAAI,CAAC,SAASI,CAAK;AACjB,WAAO,MAAMA,CAAK,IAAI,QAASA,IAAQ,IAAI,QAAQ;AAGrD,QAAM0C,IAAW,KAAK,IAAI1C,CAAK;AAC/B,SAAI0C,MAAa,MAAMA,KAAY9C,KAAuB8C,IAAW,QAC5D1C,EAAM,cAAcL,CAAS,IAG/BK,EAAM,QAAQL,CAAS;AAChC;AAKA,SAAS0B,EAAWsB,GAAehD,GAA6B;AAC9D,QAAMiD,IAAS,KAAK,IAAI,IAAIjD,CAAS;AACrC,SAAOgD,EAAI,IAAI,CAAAE,MAAK,KAAK,MAAMA,IAAID,CAAM,IAAIA,CAAM;AACrD;AAKA,SAASjB,EAAqBmB,GAAsB;AAClD,SAAOA,EACJ,QAAQ,kBAAkB,GAAG,EAC7B,QAAQ,UAAU,KAAK,EACvB,UAAU,GAAG,EAAE;AACpB;AAKA,SAASlB,EAAiBmB,GAAaC,GAAuB;AAC5D,QAAMC,IAAmB,CAAA,GACnBC,IAAM,KAAK,IAAIH,EAAE,QAAQC,EAAE,MAAM;AACvC,WAAS,IAAI,GAAG,IAAIE,GAAK;AACvB,IAAI,IAAIH,EAAE,YAAe,KAAKA,EAAE,CAAC,CAAC,GAC9B,IAAIC,EAAE,YAAe,KAAKA,EAAE,CAAC,CAAC;AAEpC,SAAOC;AACT;AC5ZA,MAAME,IAAqC;AAAA,EACzC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,UAAU,CAAC,QAAQ;AAAA,EACnB,MAAM,CAAC,UAAU,OAAO,QAAQ,UAAU,UAAU,MAAM;AAC5D;AAWO,SAASC,EACdC,IAAiC,IACI;AAErC,QAAM;AAAA,IACJ,SAAAC,IAAU,CAAC,OAAO,OAAO,QAAQ,UAAU,UAAU,QAAQ,QAAQ;AAAA,IACrE,eAAAC,IAAgB;AAAA,IAChB,kBAAAC,IAAmB;AAAA,IACnB,iBAAA/D,IAAkB;AAAA,IAClB,cAAAgE,IAAe;AAAA,IACf,mBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,aAAAC;AAAA,EAAA,IACEP;AAEJ,MAAIQ,IAA6B;AASjC,WAASC,EACPC,GACAC,GACoB;AACpB,QAAI,CAACH,EAAM,QAAO,CAAA;AAElB,UAAMI,IAAYJ,EAAK,KAAK,aAAA;AAK5B,YAJuBE,IACnBE,EAAU,OAAO,CAAA/D,MAAK6D,EAAU,SAAS7D,EAAE,MAAA,CAAO,CAAC,IACnD+D,GAEkB,IAAI,CAAA/D,MAAK;ADvF5B,UAAAgE,GAAAC;ACwFD,UAAIC,IAAOlE,EAAE,QAAA;AAGb,UAAI8D,MAAU,aAAaI,GAAM;AAC/B,cAAMC,IAASR,EAAM,KAAK,cAAA,GACpBS,IAA4B,CAAA;AAElC,iBAASjE,IAAI,GAAGA,IAAI+D,EAAK,EAAE,QAAQ/D;AACjC,UAAI+D,EAAK,EAAE/D,CAAC,KAAKgE,EAAO,QAAQD,EAAK,EAAE/D,CAAC,KAAKgE,EAAO,QAClDC,EAAgB,KAAKjE,CAAC;AAI1B,YAAIiE,EAAgB,SAAS,KAAKA,EAAgB,SAASF,EAAK,EAAE,QAAQ;AACxE,gBAAMG,IAAO,IAAI,aAAaD,EAAgB,MAAM,GAC9CE,IAAO,IAAI,aAAaF,EAAgB,MAAM;AAEpD,UAAAA,EAAgB,QAAQ,CAACG,GAAKpE,MAAM;AAClC,YAAAkE,EAAKlE,CAAC,IAAI+D,EAAM,EAAEK,CAAG,GACrBD,EAAKnE,CAAC,IAAI+D,EAAM,EAAEK,CAAG;AAAA,UACvB,CAAC,GAEDL,IAAO,EAAE,GAAGA,GAAM,GAAGG,GAAM,GAAGC,EAAA;AAAA,QAChC;AAAA,MACF;AAEA,aAAO;AAAA,QACL,IAAItE,EAAE,MAAA;AAAA,QACN,QAAMgE,IAAAhE,EAAE,YAAF,gBAAAgE,EAAA,KAAAhE,OAAiBA,EAAE,MAAA;AAAA,QACzB,MAAMA,EAAE,QAAA;AAAA,QACR,MAAMkE,KAAQ,EAAE,GAAG,IAAI,aAAa,CAAC,GAAG,GAAG,IAAI,aAAa,CAAC,EAAA;AAAA,QAC7D,aAAYA,KAAA,gBAAAA,EAAM,EAAE,WAAU;AAAA,QAC9B,OAAOlE,EAAE,SAAA;AAAA,QACT,UAASiE,IAAAjE,EAAE,eAAF,gBAAAiE,EAAA,KAAAjE;AAAA,MAAe;AAAA,IAE5B,CAAC;AAAA,EACH;AAKA,WAASwE,EAAiBC,GAAsBZ,GAA6B;AAC3E,QAAIL;AACF,aAAOA,EAAkBiB,GAAQZ,CAAS;AAG5C,UAAMzB,KAAY,oBAAI,KAAA,GAAO,YAAA,EAAc,QAAQ,SAAS,GAAG,EAAE,UAAU,GAAG,EAAE,GAC1EsC,IAAab,EAAU,UAAU,IACnCA,EAAU,KAAK,GAAG,IAClB,GAAGA,EAAU,MAAM,WAEjBV,IAASpE,EAAe0F,CAAM;AACpC,WAAO,aAAaC,CAAU,IAAItC,CAAS,GAAGe,EAAO,SAAS;AAAA,EAChE;AAKA,WAASwB,EAASzF,GAA0C;AAC1D,UAAMuF,IAASvF,EAAQ,UAAUmE,GAC3BuB,IAAqB,CAAA;AAG3B,QAAI,CAACxB,EAAQ,SAASqB,CAAM;AAC1B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,WAAWA,CAAM,gCAAgCrB,EAAQ,KAAK,IAAI,CAAC;AAAA,QAC1E,aAAa;AAAA,QACb,UAAU;AAAA,QACV,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,MAAY;AAKtC,QAAIyB,IAAkC,EAAE,GAAG3F,GAAS,WAAWA,EAAQ,aAAaoE,EAAA;AACpF,QAAIG,GAAc;AAChB,YAAMqB,IAAarB,EAAaoB,CAAY;AAC5C,UAAIC,MAAe;AACjB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO;AAAA,UACP,aAAa;AAAA,UACb,UAAU;AAAA,UACV,aAAa;AAAA,UACb,YAAY;AAAA,UACZ,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,QAAY;AAGtC,MAAAD,IAAeC;AAAA,IACjB;AAGA,UAAM7F,IAAa2E,EAAkBiB,EAAa,WAAWA,EAAa,KAAK;AAE/E,IAAI5F,EAAW,WAAW,KACxB2F,EAAS,KAAK,gCAAgC;AAGhD,UAAMG,IAAc9F,EAAW,OAAO,CAACiC,GAAKlB,MAAMkB,IAAMlB,EAAE,YAAY,CAAC,GACjEgF,IAAejG,EAAe0F,CAAM,GACpCQ,IAAWJ,EAAa,YAAYL,EAAiBC,GAAQxF,EAAW,IAAI,CAAAe,MAAKA,EAAE,EAAE,CAAC;AAE5F,QAAIkF,GACAC;AAEJ,QAAI;AAEF,cAAQV,GAAA;AAAA,QACN,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,UAAAS,IAAUlG,EAAUC,GAAY,EAAE,GAAG4F,GAAc,QAAAJ,GAAQ;AAC3D;AAAA,QAEF,KAAK;AACH,UAAAS,IAAUpE;AAAA,YACR7B;AAAA,YACA4F;AAAA,YACAlB,KAAA,gBAAAA,EAAM,KAAK;AAAA,UAAc;AAE3B;AAAA,QAEF,KAAK;AACH,UAAAuB,IAAU9D,EAAanC,GAAY4F,CAAY;AAC/C;AAAA,QAEF,KAAK;AACH,UAAAK,IAAUvD,EAAa1C,GAAY4F,CAAY;AAC/C;AAAA,QAEF,KAAK;AACH,gBAAM7C,IAASH,EAAa5C,CAAU;AACtC,UAAAkG,IAAO,IAAI,KAAK,CAACnD,CAAM,GAAG,EAAE,MAAMgD,EAAa,UAAU;AACzD;AAAA,MAAA;AAIJ,MAAIE,KAAW,CAACC,MACdA,IAAO,IAAI,KAAK,CAACD,CAAO,GAAG,EAAE,MAAMF,EAAa,UAAU;AAAA,IAG9D,SAASI,GAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,kBAAmBA,EAAgB,OAAO;AAAA,QACjD,aAAa;AAAA,QACb,UAAU;AAAA,QACV,aAAanG,EAAW;AAAA,QACxB,YAAY8F;AAAA,QACZ,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,MAAY;AAAA,IAEtC;AAEA,UAAMhC,IAAuB;AAAA,MAC3B,SAAS;AAAA,MACT,SAAAmC;AAAA,MACA,MAAAC;AAAA,MACA,aAAaH,EAAa;AAAA,MAC1B,UAAAC;AAAA,MACA,aAAahG,EAAW;AAAA,MACxB,YAAY8F;AAAA,MACZ,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,MACtB,UAAUH,EAAS,SAAS,IAAIA,IAAW;AAAA,IAAA;AAI7C,WAAIlB,KACFA,EAAYX,CAAM,GAGbA;AAAA,EACT;AAKA,WAASsC,EAAaF,GAAYF,GAAwB;AACxD,UAAMK,IAAM,IAAI,gBAAgBH,CAAI,GAC9BI,IAAO,SAAS,cAAc,GAAG;AACvC,IAAAA,EAAK,OAAOD,GACZC,EAAK,WAAWN,GAChB,SAAS,KAAK,YAAYM,CAAI,GAC9BA,EAAK,MAAA,GACL,SAAS,KAAK,YAAYA,CAAI,GAC9B,IAAI,gBAAgBD,CAAG;AAAA,EACzB;AA0HA,SAAO;AAAA,IACL,UAAUrC;AAAA,IAEV,OAAOuC,GAAoB;AACzB,MAAA7B,IAAO6B,GACPA,EAAI,IAAI,KAAK,+CAA+CpC,EAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,IAClF;AAAA,IAEA,YAAY;AACV,MAAAO,IAAO;AAAA,IACT;AAAA,IAEA,KAhIqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQrB,OAAOc,GAAsBvF,IAAsC,IAAkB;AACnF,cAAMuG,IAAiC;AAAA,UACrC,QAAAhB;AAAA,UACA,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,UAClB,iBAAAlF;AAAA,UACA,aAAa;AAAA,UACb,GAAGL;AAAA,QAAA,GAGC6D,IAAS4B,EAASc,CAAW;AAGnC,eAAIlC,KAAgBR,EAAO,WAAWA,EAAO,QAC3CsC,EAAatC,EAAO,MAAMA,EAAO,QAAQ,GAGpCA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,SAAS0B,GAAsBvF,IAAsC,IAAkB;AACrF,cAAMuG,IAAiC;AAAA,UACrC,QAAAhB;AAAA,UACA,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,UAClB,iBAAAlF;AAAA,UACA,aAAa;AAAA,UACb,GAAGL;AAAA,QAAA,GAEC6D,IAAS4B,EAASc,CAAW;AAEnC,eAAI1C,EAAO,WAAWA,EAAO,QAC3BsC,EAAatC,EAAO,MAAMA,EAAO,QAAQ,GAGpCA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM7D,IAAsC,IAAkB;AAC5D,eAAOyF,EAAS,EAAE,QAAQ,OAAO,gBAAgB,IAAM,kBAAkB,IAAM,iBAAApF,GAAiB,aAAa,IAAM,GAAGL,GAAS;AAAA,MACjI;AAAA;AAAA;AAAA;AAAA,MAKA,OAAOA,IAAsC,IAAkB;AAC7D,eAAOyF,EAAS,EAAE,QAAQ,QAAQ,gBAAgB,IAAM,kBAAkB,IAAM,iBAAApF,GAAiB,aAAa,IAAM,GAAGL,GAAS;AAAA,MAClI;AAAA;AAAA;AAAA;AAAA,MAKA,SAASA,IAAsC,IAAkB;AAC/D,eAAOyF,EAAS,EAAE,QAAQ,UAAU,gBAAgB,IAAM,kBAAkB,IAAM,iBAAApF,GAAiB,aAAa,IAAM,GAAGL,GAAS;AAAA,MACpI;AAAA;AAAA;AAAA;AAAA,MAKA,SAASA,IAAsC,IAAkB;AAC/D,eAAOyF,EAAS,EAAE,QAAQ,UAAU,gBAAgB,IAAM,kBAAkB,IAAM,iBAAApF,GAAiB,aAAa,IAAM,GAAGL,GAAS;AAAA,MACpI;AAAA;AAAA;AAAA;AAAA,MAKA,QAAQA,IAAsC,IAAkB;AAC9D,eAAOyF,EAAS,EAAE,QAAQ,QAAQ,gBAAgB,IAAM,kBAAkB,IAAM,iBAAApF,GAAiB,aAAa,IAAM,GAAGL,GAAS;AAAA,MAClI;AAAA;AAAA;AAAA;AAAA,MAKA,SAASA,IAAsC,IAAkB;AAC/D,eAAOyF,EAAS,EAAE,QAAQ,UAAU,gBAAgB,IAAM,kBAAkB,IAAM,iBAAApF,GAAiB,aAAa,IAAM,GAAGL,GAAS;AAAA,MACpI;AAAA;AAAA;AAAA;AAAA,MAKA,aAA6B;AAC3B,eAAO,CAAC,GAAGkE,CAAO;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA,MAKA,eAAeqB,GAA+B;AAC5C,eAAOrB,EAAQ,SAASqB,CAAM;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA,MAKA,gBAAgBA,GAAsB;AACpC,eAAO1F,EAAe0F,CAAM;AAAA,MAC9B;AAAA,IAAA;AAAA,EAeK;AAET;"}
@@ -1,3 +1,3 @@
1
1
  export * from './data-transform/index'
2
- import SciPlot from './data-transform/index'
3
- export default SciPlot
2
+ import VeloPlot from './data-transform/index'
3
+ export default VeloPlot
@@ -1,11 +1,11 @@
1
1
  import { c as S, d as T } from "../math-Ddm2EZjj.js";
2
- import { s as $, m as k } from "../utils-BK5UUXxj.js";
2
+ import { s as $, m as k } from "../utils-Dx0h0bgQ.js";
3
3
  const z = {
4
4
  name: "data-transform",
5
5
  version: "1.0.0",
6
6
  description: "Advanced data transformation pipeline",
7
7
  provides: ["data-transform", "processing"],
8
- author: "Sci Plot Team"
8
+ author: "Velo Plot Team"
9
9
  };
10
10
  function X(y = {}) {
11
11
  const v = {
@@ -16,7 +16,7 @@ function X(y = {}) {
16
16
  const g = /* @__PURE__ */ new Map();
17
17
  async function b(t, e) {
18
18
  if (!u) return;
19
- const i = u.chart, s = i.getSeries(t);
19
+ const l = u.chart, s = l.getSeries(t);
20
20
  if (!s)
21
21
  throw new Error(`Series ${t} not found`);
22
22
  if (!g.has(t)) {
@@ -29,25 +29,25 @@ function X(y = {}) {
29
29
  const n = g.get(t);
30
30
  let a = new Float32Array(n.x.buffer.slice(0)), r = new Float32Array(n.y.buffer.slice(0));
31
31
  for (const o of e) {
32
- const l = await A(a, r, o);
33
- a = l.x, r = l.y;
32
+ const i = await A(a, r, o);
33
+ a = i.x, r = i.y;
34
34
  }
35
- i.updateSeries(t, { x: a, y: r });
35
+ l.updateSeries(t, { x: a, y: r });
36
36
  }
37
- async function A(t, e, i) {
38
- const s = i.parameters || i;
39
- switch (i.type) {
37
+ async function A(t, e, l) {
38
+ const s = l.parameters || l;
39
+ switch (l.type) {
40
40
  case "normalize": {
41
41
  const n = s.range || [0, 1];
42
42
  let a = 1 / 0, r = -1 / 0;
43
43
  for (let c = 0; c < e.length; c++)
44
44
  e[c] < a && (a = e[c]), e[c] > r && (r = e[c]);
45
- const o = r - a, l = n[1] - n[0], f = new Float32Array(e.length);
45
+ const o = r - a, i = n[1] - n[0], f = new Float32Array(e.length);
46
46
  if (o === 0)
47
47
  f.fill(n[0]);
48
48
  else
49
49
  for (let c = 0; c < e.length; c++)
50
- f[c] = n[0] + (e[c] - a) / o * l;
50
+ f[c] = n[0] + (e[c] - a) / o * i;
51
51
  return { x: t, y: f };
52
52
  }
53
53
  case "smooth":
@@ -93,15 +93,15 @@ function X(y = {}) {
93
93
  return { x: t, y: a };
94
94
  }
95
95
  default:
96
- return console.warn(`Unknown transform type: ${i.type}`), { x: t, y: e };
96
+ return console.warn(`Unknown transform type: ${l.type}`), { x: t, y: e };
97
97
  }
98
98
  }
99
- function M(t, e, i) {
100
- if (t.length <= 1 || i <= 1) return { x: t, y: e };
101
- const s = new Float32Array(i), n = new Float32Array(i), a = t[0], o = (t[t.length - 1] - a) / (i - 1);
102
- for (let l = 0; l < i; l++) {
103
- const f = a + l * o;
104
- s[l] = f;
99
+ function M(t, e, l) {
100
+ if (t.length <= 1 || l <= 1) return { x: t, y: e };
101
+ const s = new Float32Array(l), n = new Float32Array(l), a = t[0], o = (t[t.length - 1] - a) / (l - 1);
102
+ for (let i = 0; i < l; i++) {
103
+ const f = a + i * o;
104
+ s[i] = f;
105
105
  let c = 0, w = t.length - 2, m = 0;
106
106
  for (; c <= w; ) {
107
107
  const p = c + w >> 1;
@@ -112,7 +112,7 @@ function X(y = {}) {
112
112
  t[p] < f ? c = p + 1 : w = p - 1;
113
113
  }
114
114
  const h = t[m], F = t[m + 1], d = e[m], D = e[m + 1], Y = (f - h) / (F - h);
115
- n[l] = d + Y * (D - d);
115
+ n[i] = d + Y * (D - d);
116
116
  }
117
117
  return { x: s, y: n };
118
118
  }
@@ -1 +1 @@
1
- {"version":3,"file":"data-transform.js","sources":["../../src/plugins/data-transform/index.ts"],"sourcesContent":["/**\n * PluginDataTransform - Implementation\n * \n * Provides a pipeline-based data transformation system for Sci Plot.\n */\n\nimport type { \n PluginManifest, \n ChartPlugin, \n PluginContext,\n} from '../types';\n\nimport type {\n PluginDataTransformConfig,\n DataTransformAPI,\n TransformOp\n} from './types';\n\n// Import algorithms from analysis plugin where available\nimport { \n movingAverage, \n derivative as calcDerivative, \n cumulativeIntegral as calcIntegral,\n subtractBaseline\n} from '../analysis';\n\nimport { Series } from '../../core/series/Series';\n\nconst manifest: PluginManifest = {\n name: 'data-transform',\n version: '1.0.0',\n description: 'Advanced data transformation pipeline',\n provides: ['data-transform', 'processing'],\n author: 'Sci Plot Team'\n};\n\nexport function PluginDataTransform(\n userConfig: Partial<PluginDataTransformConfig> = {}\n): ChartPlugin<PluginDataTransformConfig> {\n const _config: Required<PluginDataTransformConfig> = {\n autoApply: false,\n createDerivativeSeries: false,\n precision: 6,\n ...userConfig\n };\n\n let ctx: PluginContext | null = null;\n const originalDataStore = new Map<string, { x: Float32Array; y: Float32Array }>();\n\n /**\n * Core transformation logic\n */\n async function applyTransform(\n seriesId: string, \n pipeline: TransformOp[]\n ): Promise<void> {\n if (!ctx) return;\n \n const chart = ctx.chart;\n const series = chart.getSeries(seriesId) as unknown as Series;\n if (!series) {\n throw new Error(`Series ${seriesId} not found`);\n }\n\n // Capture original data if not already captured\n if (!originalDataStore.has(seriesId)) {\n const currentData = series.getData();\n originalDataStore.set(seriesId, {\n x: new Float32Array(currentData.x.buffer.slice(0)),\n y: new Float32Array(currentData.y.buffer.slice(0))\n });\n }\n\n const original = originalDataStore.get(seriesId)!;\n let x = new Float32Array(original.x.buffer.slice(0));\n let y = new Float32Array(original.y.buffer.slice(0));\n\n // Apply pipeline\n for (const op of pipeline) {\n const result = await executeOp(x, y, op);\n x = result.x;\n y = result.y;\n }\n\n // Update series with transformed data\n chart.updateSeries(seriesId, { x, y });\n }\n\n async function executeOp(\n x: Float32Array, \n y: Float32Array, \n op: TransformOp\n ): Promise<{ x: Float32Array; y: Float32Array }> {\n const params = op.parameters || (op as any);\n\n switch (op.type) {\n case 'normalize': {\n const range = params.range || [0, 1];\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < y.length; i++) {\n if (y[i] < min) min = y[i];\n if (y[i] > max) max = y[i];\n }\n const rangeWidth = max - min;\n const targetRange = range[1] - range[0];\n const newY = new Float32Array(y.length);\n if (rangeWidth === 0) {\n newY.fill(range[0]);\n } else {\n for (let i = 0; i < y.length; i++) {\n newY[i] = range[0] + ((y[i] - min) / rangeWidth) * targetRange;\n }\n }\n return { x, y: newY };\n }\n\n case 'smooth':\n case 'moving-average': {\n const window = params.window || 5;\n const smoothedY = movingAverage(y, window);\n return { x, y: smoothedY };\n }\n\n case 'derivative': {\n const order = params.order || 1;\n let dy = y;\n for (let i = 0; i < order; i++) {\n dy = calcDerivative(x, dy);\n }\n return { x, y: dy };\n }\n\n case 'integral': {\n const iy = calcIntegral(x, y);\n return { x, y: iy };\n }\n\n case 'scale-offset': {\n const scale = params.scale ?? 1;\n const offset = params.offset ?? 0;\n const newY = new Float32Array(y.length);\n for (let i = 0; i < y.length; i++) {\n newY[i] = y[i] * scale + offset;\n }\n return { x, y: newY };\n }\n\n case 'resample': {\n const points = params.points || 1000;\n return resample(x, y, points);\n }\n\n case 'baseline-removal': {\n const x1 = params.x1 ?? x[0];\n const x2 = params.x2 ?? x[x.length - 1];\n const result = subtractBaseline(x, y, x1, x2);\n return { x, y: result };\n }\n\n case 'abs': {\n const newY = y.map(v => Math.abs(v));\n return { x, y: newY };\n }\n\n case 'log': {\n const base = params.base || Math.E;\n const logBase = Math.log(base);\n const newY = y.map(v => v > 0 ? Math.log(v) / logBase : 0);\n return { x, y: newY };\n }\n\n case 'power': {\n const exp = params.exponent || 2;\n const newY = y.map(v => Math.pow(v, exp));\n return { x, y: newY };\n }\n\n default:\n console.warn(`Unknown transform type: ${op.type}`);\n return { x, y };\n }\n }\n\n function resample(\n x: Float32Array, \n y: Float32Array, \n numPoints: number\n ): { x: Float32Array; y: Float32Array } {\n if (x.length <= 1 || numPoints <= 1) return { x, y };\n \n const newX = new Float32Array(numPoints);\n const newY = new Float32Array(numPoints);\n \n const xMin = x[0];\n const xMax = x[x.length - 1];\n const dx = (xMax - xMin) / (numPoints - 1);\n \n for (let i = 0; i < numPoints; i++) {\n const targetX = xMin + i * dx;\n newX[i] = targetX;\n \n let low = 0;\n let high = x.length - 2;\n let found = 0;\n \n while (low <= high) {\n const mid = (low + high) >> 1;\n if (x[mid] <= targetX && targetX <= x[mid + 1]) {\n found = mid;\n break;\n }\n if (x[mid] < targetX) low = mid + 1;\n else high = mid - 1;\n }\n \n const x0 = x[found];\n const x1 = x[found + 1];\n const y0 = y[found];\n const y1 = y[found + 1];\n const t = (targetX - x0) / (x1 - x0);\n newY[i] = y0 + t * (y1 - y0);\n }\n \n return { x: newX, y: newY };\n }\n\n const api: DataTransformAPI & Record<string, unknown> = {\n transform: applyTransform,\n \n resetTransform(seriesId: string) {\n if (originalDataStore.has(seriesId) && ctx) {\n const original = originalDataStore.get(seriesId)!;\n ctx.chart.updateSeries(seriesId, { x: original.x, y: original.y });\n originalDataStore.delete(seriesId);\n }\n },\n \n getOriginalData(seriesId: string) {\n return originalDataStore.get(seriesId) || null;\n }\n };\n\n return {\n manifest,\n onInit(context: PluginContext) {\n ctx = context;\n ctx.log?.info(`DataTransform plugin initialized (precision: ${_config.precision})`);\n },\n onDestroy() {\n originalDataStore.clear();\n ctx = null;\n },\n api\n };\n}\n\nexport default PluginDataTransform;\n\nexport type {\n TransformType,\n TransformOp,\n PluginDataTransformConfig,\n DataTransformAPI\n} from './types';\n"],"names":["manifest","PluginDataTransform","userConfig","_config","ctx","originalDataStore","applyTransform","seriesId","pipeline","chart","series","currentData","original","x","y","op","result","executeOp","params","range","min","max","i","rangeWidth","targetRange","newY","window","smoothedY","movingAverage","order","dy","calcDerivative","iy","calcIntegral","scale","offset","points","resample","x1","x2","subtractBaseline","v","base","logBase","exp","numPoints","newX","xMin","dx","targetX","low","high","found","mid","x0","y0","y1","t","context","_a"],"mappings":"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"}
1
+ {"version":3,"file":"data-transform.js","sources":["../../src/plugins/data-transform/index.ts"],"sourcesContent":["/**\n * PluginDataTransform - Implementation\n * \n * Provides a pipeline-based data transformation system for Velo Plot.\n */\n\nimport type { \n PluginManifest, \n ChartPlugin, \n PluginContext,\n} from '../types';\n\nimport type {\n PluginDataTransformConfig,\n DataTransformAPI,\n TransformOp\n} from './types';\n\n// Import algorithms from analysis plugin where available\nimport { \n movingAverage, \n derivative as calcDerivative, \n cumulativeIntegral as calcIntegral,\n subtractBaseline\n} from '../analysis';\n\nimport { Series } from '../../core/series/Series';\n\nconst manifest: PluginManifest = {\n name: 'data-transform',\n version: '1.0.0',\n description: 'Advanced data transformation pipeline',\n provides: ['data-transform', 'processing'],\n author: 'Velo Plot Team'\n};\n\nexport function PluginDataTransform(\n userConfig: Partial<PluginDataTransformConfig> = {}\n): ChartPlugin<PluginDataTransformConfig> {\n const _config: Required<PluginDataTransformConfig> = {\n autoApply: false,\n createDerivativeSeries: false,\n precision: 6,\n ...userConfig\n };\n\n let ctx: PluginContext | null = null;\n const originalDataStore = new Map<string, { x: Float32Array; y: Float32Array }>();\n\n /**\n * Core transformation logic\n */\n async function applyTransform(\n seriesId: string, \n pipeline: TransformOp[]\n ): Promise<void> {\n if (!ctx) return;\n \n const chart = ctx.chart;\n const series = chart.getSeries(seriesId) as unknown as Series;\n if (!series) {\n throw new Error(`Series ${seriesId} not found`);\n }\n\n // Capture original data if not already captured\n if (!originalDataStore.has(seriesId)) {\n const currentData = series.getData();\n originalDataStore.set(seriesId, {\n x: new Float32Array(currentData.x.buffer.slice(0)),\n y: new Float32Array(currentData.y.buffer.slice(0))\n });\n }\n\n const original = originalDataStore.get(seriesId)!;\n let x = new Float32Array(original.x.buffer.slice(0));\n let y = new Float32Array(original.y.buffer.slice(0));\n\n // Apply pipeline\n for (const op of pipeline) {\n const result = await executeOp(x, y, op);\n x = result.x;\n y = result.y;\n }\n\n // Update series with transformed data\n chart.updateSeries(seriesId, { x, y });\n }\n\n async function executeOp(\n x: Float32Array, \n y: Float32Array, \n op: TransformOp\n ): Promise<{ x: Float32Array; y: Float32Array }> {\n const params = op.parameters || (op as any);\n\n switch (op.type) {\n case 'normalize': {\n const range = params.range || [0, 1];\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < y.length; i++) {\n if (y[i] < min) min = y[i];\n if (y[i] > max) max = y[i];\n }\n const rangeWidth = max - min;\n const targetRange = range[1] - range[0];\n const newY = new Float32Array(y.length);\n if (rangeWidth === 0) {\n newY.fill(range[0]);\n } else {\n for (let i = 0; i < y.length; i++) {\n newY[i] = range[0] + ((y[i] - min) / rangeWidth) * targetRange;\n }\n }\n return { x, y: newY };\n }\n\n case 'smooth':\n case 'moving-average': {\n const window = params.window || 5;\n const smoothedY = movingAverage(y, window);\n return { x, y: smoothedY };\n }\n\n case 'derivative': {\n const order = params.order || 1;\n let dy = y;\n for (let i = 0; i < order; i++) {\n dy = calcDerivative(x, dy);\n }\n return { x, y: dy };\n }\n\n case 'integral': {\n const iy = calcIntegral(x, y);\n return { x, y: iy };\n }\n\n case 'scale-offset': {\n const scale = params.scale ?? 1;\n const offset = params.offset ?? 0;\n const newY = new Float32Array(y.length);\n for (let i = 0; i < y.length; i++) {\n newY[i] = y[i] * scale + offset;\n }\n return { x, y: newY };\n }\n\n case 'resample': {\n const points = params.points || 1000;\n return resample(x, y, points);\n }\n\n case 'baseline-removal': {\n const x1 = params.x1 ?? x[0];\n const x2 = params.x2 ?? x[x.length - 1];\n const result = subtractBaseline(x, y, x1, x2);\n return { x, y: result };\n }\n\n case 'abs': {\n const newY = y.map(v => Math.abs(v));\n return { x, y: newY };\n }\n\n case 'log': {\n const base = params.base || Math.E;\n const logBase = Math.log(base);\n const newY = y.map(v => v > 0 ? Math.log(v) / logBase : 0);\n return { x, y: newY };\n }\n\n case 'power': {\n const exp = params.exponent || 2;\n const newY = y.map(v => Math.pow(v, exp));\n return { x, y: newY };\n }\n\n default:\n console.warn(`Unknown transform type: ${op.type}`);\n return { x, y };\n }\n }\n\n function resample(\n x: Float32Array, \n y: Float32Array, \n numPoints: number\n ): { x: Float32Array; y: Float32Array } {\n if (x.length <= 1 || numPoints <= 1) return { x, y };\n \n const newX = new Float32Array(numPoints);\n const newY = new Float32Array(numPoints);\n \n const xMin = x[0];\n const xMax = x[x.length - 1];\n const dx = (xMax - xMin) / (numPoints - 1);\n \n for (let i = 0; i < numPoints; i++) {\n const targetX = xMin + i * dx;\n newX[i] = targetX;\n \n let low = 0;\n let high = x.length - 2;\n let found = 0;\n \n while (low <= high) {\n const mid = (low + high) >> 1;\n if (x[mid] <= targetX && targetX <= x[mid + 1]) {\n found = mid;\n break;\n }\n if (x[mid] < targetX) low = mid + 1;\n else high = mid - 1;\n }\n \n const x0 = x[found];\n const x1 = x[found + 1];\n const y0 = y[found];\n const y1 = y[found + 1];\n const t = (targetX - x0) / (x1 - x0);\n newY[i] = y0 + t * (y1 - y0);\n }\n \n return { x: newX, y: newY };\n }\n\n const api: DataTransformAPI & Record<string, unknown> = {\n transform: applyTransform,\n \n resetTransform(seriesId: string) {\n if (originalDataStore.has(seriesId) && ctx) {\n const original = originalDataStore.get(seriesId)!;\n ctx.chart.updateSeries(seriesId, { x: original.x, y: original.y });\n originalDataStore.delete(seriesId);\n }\n },\n \n getOriginalData(seriesId: string) {\n return originalDataStore.get(seriesId) || null;\n }\n };\n\n return {\n manifest,\n onInit(context: PluginContext) {\n ctx = context;\n ctx.log?.info(`DataTransform plugin initialized (precision: ${_config.precision})`);\n },\n onDestroy() {\n originalDataStore.clear();\n ctx = null;\n },\n api\n };\n}\n\nexport default PluginDataTransform;\n\nexport type {\n TransformType,\n TransformOp,\n PluginDataTransformConfig,\n DataTransformAPI\n} from './types';\n"],"names":["manifest","PluginDataTransform","userConfig","_config","ctx","originalDataStore","applyTransform","seriesId","pipeline","chart","series","currentData","original","x","y","op","result","executeOp","params","range","min","max","i","rangeWidth","targetRange","newY","window","smoothedY","movingAverage","order","dy","calcDerivative","iy","calcIntegral","scale","offset","points","resample","x1","x2","subtractBaseline","v","base","logBase","exp","numPoints","newX","xMin","dx","targetX","low","high","found","mid","x0","y0","y1","t","context","_a"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { ChartPlugin } from '../types';
2
2
  import { DebugOverlay, DebugOverlayOptions } from '../../core/debug';
3
3
  /**
4
- * SciPlot Engine - Debug Overlay Plugin
4
+ * VeloPlot Engine - Debug Overlay Plugin
5
5
  *
6
6
  * Provides performance metrics and debugging information.
7
7
  *
@@ -15,7 +15,7 @@ export interface PluginDebugConfig extends Partial<DebugOverlayOptions> {
15
15
  showDataStats?: boolean;
16
16
  }
17
17
  /**
18
- * SciPlot Debug Plugin
18
+ * VeloPlot Debug Plugin
19
19
  *
20
20
  * Adds a useful overlay with real-time performance metrics and debugging info.
21
21
  */
@@ -1,3 +1,3 @@
1
1
  export * from './debug/index'
2
- import SciPlot from './debug/index'
3
- export default SciPlot
2
+ import VeloPlot from './debug/index'
3
+ export default VeloPlot
@@ -2,7 +2,7 @@ var c = Object.defineProperty;
2
2
  var m = (r, e, t) => e in r ? c(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t;
3
3
  var n = (r, e, t) => m(r, typeof e != "symbol" ? e + "" : e, t);
4
4
  import { i as f } from "../math-Ddm2EZjj.js";
5
- import { c as g } from "../utils-BK5UUXxj.js";
5
+ import { h as g } from "../utils-Dx0h0bgQ.js";
6
6
  class u {
7
7
  constructor(e, t) {
8
8
  n(this, "container");
@@ -184,7 +184,7 @@ function S(r, e) {
184
184
  function C(r) {
185
185
  const e = document.querySelector(".velo-plot-container");
186
186
  if (!e)
187
- return console.warn("[SciPlot] No chart container found for debug overlay"), null;
187
+ return console.warn("[VeloPlot] No chart container found for debug overlay"), null;
188
188
  const t = new u(e, r);
189
189
  return t.show(), t;
190
190
  }
@@ -1 +1 @@
1
- {"version":3,"file":"debug.js","sources":["../../src/core/debug/index.ts","../../src/core/ChartStatistics.ts","../../src/plugins/debug/index.ts"],"sourcesContent":["/**\n * Sci Plot - Debug Overlay Module\n * \n * Provides a visual debug overlay showing performance metrics,\n * rendering info, and chart state for development and debugging.\n * \n * @module debug\n */\n\n// ============================================\n// Types\n// ============================================\n\nexport interface DebugStats {\n /** Current frames per second */\n fps: number;\n /** Average frame time in ms */\n frameTime: number;\n /** Total number of points being rendered */\n pointCount: number;\n /** Number of visible series */\n seriesCount: number;\n /** Current view bounds */\n viewBounds: {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n };\n /** WebGL/WebGPU renderer info */\n rendererInfo: {\n type: 'webgl' | 'webgpu' | 'unknown';\n vendor?: string;\n renderer?: string;\n };\n /** Memory usage estimate (bytes) */\n memoryEstimate: number;\n /** Number of draw calls per frame */\n drawCalls: number;\n /** Whether GPU downsampling is active */\n downsamplingActive: boolean;\n /** Device pixel ratio */\n devicePixelRatio: number;\n /** Canvas dimensions */\n canvasSize: { width: number; height: number };\n /** Plot area dimensions */\n plotArea: { x: number; y: number; width: number; height: number };\n}\n\nexport interface DebugOverlayOptions {\n /** Show FPS counter (default: true) */\n showFps?: boolean;\n /** Show point count (default: true) */\n showPointCount?: boolean;\n /** Show view bounds (default: true) */\n showBounds?: boolean;\n /** Show renderer info (default: true) */\n showRendererInfo?: boolean;\n /** Show memory estimate (default: true) */\n showMemory?: boolean;\n /** Show draw calls (default: true) */\n showDrawCalls?: boolean;\n /** Position: 'top-left', 'top-right', 'bottom-left', 'bottom-right' */\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n /** Background opacity (0-1, default: 0.8) */\n opacity?: number;\n /** Font size in pixels (default: 11) */\n fontSize?: number;\n /** Update interval in ms (default: 250) */\n updateInterval?: number;\n /** Custom CSS class name */\n className?: string;\n}\n\n// ============================================\n// Debug Overlay Implementation\n// ============================================\n\nexport class DebugOverlay {\n private container: HTMLElement;\n private element: HTMLDivElement | null = null;\n private options: Required<DebugOverlayOptions>;\n private visible: boolean = false;\n private updateIntervalId: number | null = null;\n private statsProvider: (() => Partial<DebugStats>) | null = null;\n private lastStats: Partial<DebugStats> = {};\n\n // FPS calculation\n private frameCount: number = 0;\n private lastFpsUpdate: number = 0;\n private currentFps: number = 0;\n private frameTimes: number[] = [];\n\n constructor(container: HTMLElement, options?: DebugOverlayOptions) {\n this.container = container;\n this.options = {\n showFps: true,\n showPointCount: true,\n showBounds: true,\n showRendererInfo: true,\n showMemory: true,\n showDrawCalls: true,\n position: 'top-left',\n opacity: 0.8,\n fontSize: 11,\n updateInterval: 250,\n className: 'velo-plot-debug-overlay',\n ...options,\n };\n }\n\n /**\n * Set the stats provider function\n */\n setStatsProvider(provider: () => Partial<DebugStats>): void {\n this.statsProvider = provider;\n }\n\n /**\n * Record a frame for FPS calculation\n */\n recordFrame(frameTime?: number): void {\n const now = performance.now();\n this.frameCount++;\n\n if (frameTime !== undefined) {\n this.frameTimes.push(frameTime);\n if (this.frameTimes.length > 60) {\n this.frameTimes.shift();\n }\n }\n\n // Update FPS every second\n if (now - this.lastFpsUpdate >= 1000) {\n this.currentFps = Math.round((this.frameCount * 1000) / (now - this.lastFpsUpdate));\n this.frameCount = 0;\n this.lastFpsUpdate = now;\n }\n }\n\n /**\n * Show the debug overlay\n */\n show(): void {\n if (this.visible) return;\n \n this.visible = true;\n this.createElement();\n this.startUpdates();\n }\n\n /**\n * Hide the debug overlay\n */\n hide(): void {\n if (!this.visible) return;\n \n this.visible = false;\n this.stopUpdates();\n this.destroyElement();\n }\n\n /**\n * Toggle visibility\n */\n toggle(): void {\n if (this.visible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n /**\n * Check if visible\n */\n isVisible(): boolean {\n return this.visible;\n }\n\n /**\n * Update the display with new stats\n */\n update(stats?: Partial<DebugStats>): void {\n if (!this.visible || !this.element) return;\n\n // Merge with provider stats\n const providerStats = this.statsProvider?.() || {};\n this.lastStats = {\n ...this.lastStats,\n ...providerStats,\n ...stats,\n fps: this.currentFps,\n frameTime: this.getAverageFrameTime(),\n };\n\n this.renderStats();\n }\n\n /**\n * Get current stats\n */\n getStats(): Partial<DebugStats> {\n return {\n ...this.lastStats,\n fps: this.currentFps,\n frameTime: this.getAverageFrameTime(),\n };\n }\n\n /**\n * Destroy the overlay\n */\n destroy(): void {\n this.hide();\n this.statsProvider = null;\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private createElement(): void {\n if (this.element) return;\n\n this.element = document.createElement('div');\n this.element.className = this.options.className;\n \n // Apply styles\n Object.assign(this.element.style, {\n position: 'absolute',\n zIndex: '9999',\n fontFamily: 'monospace',\n fontSize: `${this.options.fontSize}px`,\n lineHeight: '1.4',\n padding: '8px 12px',\n backgroundColor: `rgba(0, 0, 0, ${this.options.opacity})`,\n color: '#00ff00',\n borderRadius: '4px',\n pointerEvents: 'none',\n userSelect: 'none',\n whiteSpace: 'pre',\n ...this.getPositionStyles(),\n });\n\n this.container.style.position = 'relative';\n this.container.appendChild(this.element);\n }\n\n private destroyElement(): void {\n if (this.element && this.element.parentNode) {\n this.element.parentNode.removeChild(this.element);\n }\n this.element = null;\n }\n\n private getPositionStyles(): Partial<CSSStyleDeclaration> {\n switch (this.options.position) {\n case 'top-right':\n return { top: '8px', right: '8px' };\n case 'bottom-left':\n return { bottom: '8px', left: '8px' };\n case 'bottom-right':\n return { bottom: '8px', right: '8px' };\n case 'top-left':\n default:\n return { top: '8px', left: '8px' };\n }\n }\n\n private startUpdates(): void {\n if (this.updateIntervalId !== null) return;\n \n this.updateIntervalId = window.setInterval(() => {\n this.update();\n }, this.options.updateInterval);\n }\n\n private stopUpdates(): void {\n if (this.updateIntervalId !== null) {\n clearInterval(this.updateIntervalId);\n this.updateIntervalId = null;\n }\n }\n\n private getAverageFrameTime(): number {\n if (this.frameTimes.length === 0) return 0;\n const sum = this.frameTimes.reduce((a, b) => a + b, 0);\n return sum / this.frameTimes.length;\n }\n\n private renderStats(): void {\n if (!this.element) return;\n\n const lines: string[] = [];\n const stats = this.lastStats;\n\n // FPS\n if (this.options.showFps && stats.fps !== undefined) {\n const fpsColor = stats.fps >= 55 ? '#00ff00' : stats.fps >= 30 ? '#ffff00' : '#ff4444';\n lines.push(`<span style=\"color:${fpsColor}\">FPS: ${stats.fps}</span>`);\n if (stats.frameTime) {\n lines.push(`Frame: ${stats.frameTime.toFixed(2)}ms`);\n }\n }\n\n // Point count\n if (this.options.showPointCount && stats.pointCount !== undefined) {\n lines.push(`Points: ${this.formatNumber(stats.pointCount)}`);\n }\n\n // Series count\n if (stats.seriesCount !== undefined) {\n lines.push(`Series: ${stats.seriesCount}`);\n }\n\n // Draw calls\n if (this.options.showDrawCalls && stats.drawCalls !== undefined) {\n lines.push(`Draw calls: ${stats.drawCalls}`);\n }\n\n // Memory\n if (this.options.showMemory && stats.memoryEstimate !== undefined) {\n lines.push(`Memory: ${this.formatBytes(stats.memoryEstimate)}`);\n }\n\n // Bounds\n if (this.options.showBounds && stats.viewBounds) {\n const b = stats.viewBounds;\n lines.push(`X: [${this.formatValue(b.xMin)}, ${this.formatValue(b.xMax)}]`);\n lines.push(`Y: [${this.formatValue(b.yMin)}, ${this.formatValue(b.yMax)}]`);\n }\n\n // Renderer info\n if (this.options.showRendererInfo && stats.rendererInfo) {\n const info = stats.rendererInfo;\n lines.push(`Renderer: ${info.type.toUpperCase()}`);\n if (info.renderer) {\n // Truncate long renderer names\n const shortRenderer = info.renderer.length > 30 \n ? info.renderer.substring(0, 27) + '...'\n : info.renderer;\n lines.push(`GPU: ${shortRenderer}`);\n }\n }\n\n // Canvas size\n if (stats.canvasSize) {\n lines.push(`Canvas: ${stats.canvasSize.width}×${stats.canvasSize.height}`);\n }\n\n // Downsampling\n if (stats.downsamplingActive !== undefined) {\n lines.push(`Downsampling: ${stats.downsamplingActive ? 'ON' : 'OFF'}`);\n }\n\n // DPR\n if (stats.devicePixelRatio !== undefined) {\n lines.push(`DPR: ${stats.devicePixelRatio}`);\n }\n\n this.element.innerHTML = lines.join('\\n');\n }\n\n private formatNumber(n: number): string {\n if (n >= 1e9) return (n / 1e9).toFixed(1) + 'B';\n if (n >= 1e6) return (n / 1e6).toFixed(1) + 'M';\n if (n >= 1e3) return (n / 1e3).toFixed(1) + 'K';\n return n.toLocaleString();\n }\n\n private formatBytes(bytes: number): string {\n if (bytes >= 1e9) return (bytes / 1e9).toFixed(2) + ' GB';\n if (bytes >= 1e6) return (bytes / 1e6).toFixed(2) + ' MB';\n if (bytes >= 1e3) return (bytes / 1e3).toFixed(2) + ' KB';\n return bytes + ' B';\n }\n\n private formatValue(v: number): string {\n if (!isFinite(v)) return v.toString();\n if (Math.abs(v) >= 1e6 || (Math.abs(v) < 0.001 && v !== 0)) {\n return v.toExponential(2);\n }\n return v.toFixed(3);\n }\n}\n\n// ============================================\n// Convenience Functions\n// ============================================\n\n/**\n * Create a debug overlay for a chart container\n */\nexport function createDebugOverlay(\n container: HTMLElement,\n options?: DebugOverlayOptions\n): DebugOverlay {\n return new DebugOverlay(container, options);\n}\n\n/**\n * Quick enable debug mode (attaches to first chart container found)\n */\nexport function enableDebugMode(options?: DebugOverlayOptions): DebugOverlay | null {\n const container = document.querySelector('.velo-plot-container') as HTMLElement;\n if (!container) {\n console.warn('[SciPlot] No chart container found for debug overlay');\n return null;\n }\n \n const overlay = new DebugOverlay(container, options);\n overlay.show();\n return overlay;\n}\n","/**\n * ChartStatistics - In-chart statistics panel\n * \n * Displays real-time statistics (Min, Max, Mean, StdDev, Area) \n * for the visible data range of active series.\n */\n\nimport { ChartTheme } from \"../theme\";\nimport { Series } from \"./Series\";\nimport { calculateStats, integrate } from \"../plugins/analysis\";\nimport { Bounds } from \"../types\";\n\nexport class ChartStatistics {\n private container: HTMLDivElement;\n private content: HTMLDivElement;\n private theme: ChartTheme;\n private series: Map<string, Series>;\n private isExpanded = false;\n\n constructor(\n parent: HTMLElement,\n theme: ChartTheme,\n series: Map<string, Series>\n ) {\n this.theme = theme;\n this.series = series;\n\n this.container = document.createElement(\"div\");\n this.container.className = \"velo-plot-stats-panel\";\n this.updateContainerStyle();\n\n const title = document.createElement(\"div\");\n title.innerHTML = \"📊 Statistics\";\n title.style.cssText = `\n font-weight: 600;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: pointer;\n `;\n title.onclick = () => this.toggle();\n\n this.content = document.createElement(\"div\");\n this.content.style.display = \"none\";\n \n this.container.appendChild(title);\n this.container.appendChild(this.content);\n parent.appendChild(this.container);\n }\n\n private isDarkTheme(): boolean {\n const name = this.theme.name.toLowerCase();\n return name.includes(\"dark\") || name.includes(\"midnight\") || name.includes(\"electro\");\n }\n\n private updateContainerStyle(): void {\n const isDark = this.isDarkTheme();\n const bg = isDark ? \"rgba(15, 23, 42, 0.85)\" : \"rgba(255, 255, 255, 0.95)\";\n const color = isDark ? \"#f1f5f9\" : \"#1e293b\";\n const borderColor = isDark ? \"rgba(255, 255, 255, 0.1)\" : \"rgba(0, 0, 0, 0.1)\";\n const shadow = isDark ? \"0 4px 12px rgba(0, 0, 0, 0.5)\" : \"0 4px 12px rgba(0, 0, 0, 0.1)\";\n\n this.container.style.cssText = `\n position: absolute;\n bottom: 8px;\n right: 8px;\n width: 240px;\n background: ${bg};\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n border: 1px solid ${borderColor};\n border-radius: 8px;\n box-shadow: ${shadow};\n color: ${color};\n font-family: system-ui, -apple-system, sans-serif;\n padding: 8px 12px;\n z-index: 90;\n transition: all 0.3s ease;\n font-size: 12px;\n pointer-events: auto;\n `;\n }\n\n public update(viewBounds: Bounds): void {\n if (!this.isExpanded) return;\n\n this.content.innerHTML = \"\";\n \n this.series.forEach((s) => {\n if (!s.getVisible()) return;\n\n const data = s.getData();\n if (!data) return;\n\n // Filter data in visible range\n const visibleY: number[] = [];\n const visibleX: number[] = [];\n for (let i = 0; i < data.x.length; i++) {\n if (data.x[i] >= viewBounds.xMin && data.x[i] <= viewBounds.xMax) {\n visibleX.push(data.x[i]);\n visibleY.push(data.y[i]);\n }\n }\n\n if (visibleY.length === 0) return;\n\n const stats = calculateStats(visibleY);\n const area = integrate(visibleX as any, visibleY as any);\n const style = s.getStyle();\n\n const item = document.createElement(\"div\");\n item.style.cssText = `\n padding: 8px 0;\n border-top: 1px solid ${this.isDarkTheme() ? \"rgba(255,255,255,0.05)\" : \"rgba(0,0,0,0.05)\"};\n `;\n\n item.innerHTML = `\n <div style=\"display: flex; align-items: center; gap: 6px; margin-bottom: 4px; font-weight: 600;\">\n <div style=\"width: 8px; height: 8px; border-radius: 2px; background: ${style.color}\"></div>\n ${s.getId()}\n </div>\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 4px; opacity: 0.9; font-size: 11px;\">\n <span>Min: ${stats.min.toExponential(3)}</span>\n <span>Max: ${stats.max.toExponential(3)}</span>\n <span>Mean: ${stats.mean.toExponential(3)}</span>\n <span>Count: ${stats.count}</span>\n <span style=\"grid-column: span 2;\">Area: ${area.toExponential(4)}</span>\n </div>\n `;\n\n this.content.appendChild(item);\n });\n\n if (this.content.innerHTML === \"\") {\n this.content.innerHTML = \"<div style='opacity: 0.5; font-style: italic;'>No series visible in range</div>\";\n }\n }\n\n public toggle(): void {\n this.isExpanded = !this.isExpanded;\n this.content.style.display = this.isExpanded ? \"block\" : \"none\";\n if (this.isExpanded) {\n // Redraw immediately will be handled by the chart's next render\n }\n }\n\n public updateTheme(theme: ChartTheme): void {\n this.theme = theme;\n this.updateContainerStyle();\n }\n\n public destroy(): void {\n this.container.remove();\n }\n}\n","/**\n * SciPlot Engine - Debug Overlay Plugin\n * \n * Provides performance metrics and debugging information.\n * \n * @module plugins/debug\n */\n\nexport * from \"../../core/debug\";\nimport type { PluginManifest, ChartPlugin, PluginContext, AfterRenderEvent } from \"../types\";\n\nexport interface PluginDebugConfig extends Partial<DebugOverlayOptions> {\n /** Show FPS counter */\n showFPS?: boolean;\n /** Show data stats */\n showDataStats?: boolean;\n}\n\nconst manifestDebug: PluginManifest = {\n name: \"velo-plot-debug\",\n version: \"1.0.0\",\n description: \"Performance monitoring and debugging overlay for velo-plot\",\n provides: [\"ui\"],\n tags: [\"debug\", \"performance\", \"fps\", \"monitoring\"],\n};\n\nimport { DebugOverlay, DebugOverlayOptions } from \"../../core/debug\";\nimport { ChartStatistics } from \"../../core/ChartStatistics\";\n\n/**\n * SciPlot Debug Plugin\n * \n * Adds a useful overlay with real-time performance metrics and debugging info.\n */\nexport function PluginDebug(config: PluginDebugConfig = {}): ChartPlugin<PluginDebugConfig> {\n let overlay: DebugOverlay | null = null;\n let stats: ChartStatistics | null = null;\n\n let ctx: PluginContext;\n\n return {\n manifest: manifestDebug,\n\n onInit(pCtx: PluginContext) {\n ctx = pCtx;\n\n // Initialize FPS/Performance overlay\n if (config.showFPS !== false) {\n overlay = new DebugOverlay(ctx.ui.container, {\n showFps: true,\n showMemory: true,\n showPointCount: true,\n updateInterval: 500,\n ...config\n });\n overlay.show();\n\n // Set stats provider for more detailed info\n overlay.setStatsProvider(() => {\n const series = ctx.data.getAllSeries();\n const pointCount = series.reduce((sum, s) => sum + s.getData().x.length, 0);\n\n return {\n pointCount,\n seriesCount: series.length,\n viewBounds: ctx.data.getViewBounds(),\n devicePixelRatio: (ctx.chart as any).dpr || 1,\n };\n });\n }\n\n // Initialize data statistics panel\n if (config.showDataStats) {\n stats = new ChartStatistics(\n ctx.ui.container,\n (ctx.chart as any).theme,\n (ctx.chart as any).series\n );\n }\n },\n\n onBeforeRender() {\n if (overlay) {\n overlay.recordFrame();\n }\n },\n\n onAfterRender(_ctx, event: AfterRenderEvent) {\n if (overlay) {\n overlay.update({\n frameTime: (event as any).frameTime || event.renderTime,\n });\n }\n },\n\n onRenderOverlay(_ctx) {\n if (stats) {\n stats.update(ctx.data.getViewBounds());\n }\n },\n\n onDestroy(_ctx: PluginContext) {\n if (overlay) {\n overlay.destroy();\n overlay = null;\n }\n if (stats) {\n stats.destroy();\n stats = null;\n }\n }\n };\n}\n\nexport { DebugOverlay };\nexport default PluginDebug;\n"],"names":["DebugOverlay","container","options","__publicField","provider","frameTime","now","stats","providerStats","_a","a","b","lines","fpsColor","info","shortRenderer","n","bytes","v","createDebugOverlay","enableDebugMode","overlay","ChartStatistics","parent","theme","series","title","name","isDark","bg","color","borderColor","shadow","viewBounds","s","data","visibleY","visibleX","i","calculateStats","area","integrate","style","item","manifestDebug","PluginDebug","config","ctx","pCtx","sum","_ctx","event"],"mappings":"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"}
1
+ {"version":3,"file":"debug.js","sources":["../../src/core/debug/index.ts","../../src/core/ChartStatistics.ts","../../src/plugins/debug/index.ts"],"sourcesContent":["/**\n * Velo Plot - Debug Overlay Module\n * \n * Provides a visual debug overlay showing performance metrics,\n * rendering info, and chart state for development and debugging.\n * \n * @module debug\n */\n\n// ============================================\n// Types\n// ============================================\n\nexport interface DebugStats {\n /** Current frames per second */\n fps: number;\n /** Average frame time in ms */\n frameTime: number;\n /** Total number of points being rendered */\n pointCount: number;\n /** Number of visible series */\n seriesCount: number;\n /** Current view bounds */\n viewBounds: {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n };\n /** WebGL/WebGPU renderer info */\n rendererInfo: {\n type: 'webgl' | 'webgpu' | 'unknown';\n vendor?: string;\n renderer?: string;\n };\n /** Memory usage estimate (bytes) */\n memoryEstimate: number;\n /** Number of draw calls per frame */\n drawCalls: number;\n /** Whether GPU downsampling is active */\n downsamplingActive: boolean;\n /** Device pixel ratio */\n devicePixelRatio: number;\n /** Canvas dimensions */\n canvasSize: { width: number; height: number };\n /** Plot area dimensions */\n plotArea: { x: number; y: number; width: number; height: number };\n}\n\nexport interface DebugOverlayOptions {\n /** Show FPS counter (default: true) */\n showFps?: boolean;\n /** Show point count (default: true) */\n showPointCount?: boolean;\n /** Show view bounds (default: true) */\n showBounds?: boolean;\n /** Show renderer info (default: true) */\n showRendererInfo?: boolean;\n /** Show memory estimate (default: true) */\n showMemory?: boolean;\n /** Show draw calls (default: true) */\n showDrawCalls?: boolean;\n /** Position: 'top-left', 'top-right', 'bottom-left', 'bottom-right' */\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n /** Background opacity (0-1, default: 0.8) */\n opacity?: number;\n /** Font size in pixels (default: 11) */\n fontSize?: number;\n /** Update interval in ms (default: 250) */\n updateInterval?: number;\n /** Custom CSS class name */\n className?: string;\n}\n\n// ============================================\n// Debug Overlay Implementation\n// ============================================\n\nexport class DebugOverlay {\n private container: HTMLElement;\n private element: HTMLDivElement | null = null;\n private options: Required<DebugOverlayOptions>;\n private visible: boolean = false;\n private updateIntervalId: number | null = null;\n private statsProvider: (() => Partial<DebugStats>) | null = null;\n private lastStats: Partial<DebugStats> = {};\n\n // FPS calculation\n private frameCount: number = 0;\n private lastFpsUpdate: number = 0;\n private currentFps: number = 0;\n private frameTimes: number[] = [];\n\n constructor(container: HTMLElement, options?: DebugOverlayOptions) {\n this.container = container;\n this.options = {\n showFps: true,\n showPointCount: true,\n showBounds: true,\n showRendererInfo: true,\n showMemory: true,\n showDrawCalls: true,\n position: 'top-left',\n opacity: 0.8,\n fontSize: 11,\n updateInterval: 250,\n className: 'velo-plot-debug-overlay',\n ...options,\n };\n }\n\n /**\n * Set the stats provider function\n */\n setStatsProvider(provider: () => Partial<DebugStats>): void {\n this.statsProvider = provider;\n }\n\n /**\n * Record a frame for FPS calculation\n */\n recordFrame(frameTime?: number): void {\n const now = performance.now();\n this.frameCount++;\n\n if (frameTime !== undefined) {\n this.frameTimes.push(frameTime);\n if (this.frameTimes.length > 60) {\n this.frameTimes.shift();\n }\n }\n\n // Update FPS every second\n if (now - this.lastFpsUpdate >= 1000) {\n this.currentFps = Math.round((this.frameCount * 1000) / (now - this.lastFpsUpdate));\n this.frameCount = 0;\n this.lastFpsUpdate = now;\n }\n }\n\n /**\n * Show the debug overlay\n */\n show(): void {\n if (this.visible) return;\n \n this.visible = true;\n this.createElement();\n this.startUpdates();\n }\n\n /**\n * Hide the debug overlay\n */\n hide(): void {\n if (!this.visible) return;\n \n this.visible = false;\n this.stopUpdates();\n this.destroyElement();\n }\n\n /**\n * Toggle visibility\n */\n toggle(): void {\n if (this.visible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n /**\n * Check if visible\n */\n isVisible(): boolean {\n return this.visible;\n }\n\n /**\n * Update the display with new stats\n */\n update(stats?: Partial<DebugStats>): void {\n if (!this.visible || !this.element) return;\n\n // Merge with provider stats\n const providerStats = this.statsProvider?.() || {};\n this.lastStats = {\n ...this.lastStats,\n ...providerStats,\n ...stats,\n fps: this.currentFps,\n frameTime: this.getAverageFrameTime(),\n };\n\n this.renderStats();\n }\n\n /**\n * Get current stats\n */\n getStats(): Partial<DebugStats> {\n return {\n ...this.lastStats,\n fps: this.currentFps,\n frameTime: this.getAverageFrameTime(),\n };\n }\n\n /**\n * Destroy the overlay\n */\n destroy(): void {\n this.hide();\n this.statsProvider = null;\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private createElement(): void {\n if (this.element) return;\n\n this.element = document.createElement('div');\n this.element.className = this.options.className;\n \n // Apply styles\n Object.assign(this.element.style, {\n position: 'absolute',\n zIndex: '9999',\n fontFamily: 'monospace',\n fontSize: `${this.options.fontSize}px`,\n lineHeight: '1.4',\n padding: '8px 12px',\n backgroundColor: `rgba(0, 0, 0, ${this.options.opacity})`,\n color: '#00ff00',\n borderRadius: '4px',\n pointerEvents: 'none',\n userSelect: 'none',\n whiteSpace: 'pre',\n ...this.getPositionStyles(),\n });\n\n this.container.style.position = 'relative';\n this.container.appendChild(this.element);\n }\n\n private destroyElement(): void {\n if (this.element && this.element.parentNode) {\n this.element.parentNode.removeChild(this.element);\n }\n this.element = null;\n }\n\n private getPositionStyles(): Partial<CSSStyleDeclaration> {\n switch (this.options.position) {\n case 'top-right':\n return { top: '8px', right: '8px' };\n case 'bottom-left':\n return { bottom: '8px', left: '8px' };\n case 'bottom-right':\n return { bottom: '8px', right: '8px' };\n case 'top-left':\n default:\n return { top: '8px', left: '8px' };\n }\n }\n\n private startUpdates(): void {\n if (this.updateIntervalId !== null) return;\n \n this.updateIntervalId = window.setInterval(() => {\n this.update();\n }, this.options.updateInterval);\n }\n\n private stopUpdates(): void {\n if (this.updateIntervalId !== null) {\n clearInterval(this.updateIntervalId);\n this.updateIntervalId = null;\n }\n }\n\n private getAverageFrameTime(): number {\n if (this.frameTimes.length === 0) return 0;\n const sum = this.frameTimes.reduce((a, b) => a + b, 0);\n return sum / this.frameTimes.length;\n }\n\n private renderStats(): void {\n if (!this.element) return;\n\n const lines: string[] = [];\n const stats = this.lastStats;\n\n // FPS\n if (this.options.showFps && stats.fps !== undefined) {\n const fpsColor = stats.fps >= 55 ? '#00ff00' : stats.fps >= 30 ? '#ffff00' : '#ff4444';\n lines.push(`<span style=\"color:${fpsColor}\">FPS: ${stats.fps}</span>`);\n if (stats.frameTime) {\n lines.push(`Frame: ${stats.frameTime.toFixed(2)}ms`);\n }\n }\n\n // Point count\n if (this.options.showPointCount && stats.pointCount !== undefined) {\n lines.push(`Points: ${this.formatNumber(stats.pointCount)}`);\n }\n\n // Series count\n if (stats.seriesCount !== undefined) {\n lines.push(`Series: ${stats.seriesCount}`);\n }\n\n // Draw calls\n if (this.options.showDrawCalls && stats.drawCalls !== undefined) {\n lines.push(`Draw calls: ${stats.drawCalls}`);\n }\n\n // Memory\n if (this.options.showMemory && stats.memoryEstimate !== undefined) {\n lines.push(`Memory: ${this.formatBytes(stats.memoryEstimate)}`);\n }\n\n // Bounds\n if (this.options.showBounds && stats.viewBounds) {\n const b = stats.viewBounds;\n lines.push(`X: [${this.formatValue(b.xMin)}, ${this.formatValue(b.xMax)}]`);\n lines.push(`Y: [${this.formatValue(b.yMin)}, ${this.formatValue(b.yMax)}]`);\n }\n\n // Renderer info\n if (this.options.showRendererInfo && stats.rendererInfo) {\n const info = stats.rendererInfo;\n lines.push(`Renderer: ${info.type.toUpperCase()}`);\n if (info.renderer) {\n // Truncate long renderer names\n const shortRenderer = info.renderer.length > 30 \n ? info.renderer.substring(0, 27) + '...'\n : info.renderer;\n lines.push(`GPU: ${shortRenderer}`);\n }\n }\n\n // Canvas size\n if (stats.canvasSize) {\n lines.push(`Canvas: ${stats.canvasSize.width}×${stats.canvasSize.height}`);\n }\n\n // Downsampling\n if (stats.downsamplingActive !== undefined) {\n lines.push(`Downsampling: ${stats.downsamplingActive ? 'ON' : 'OFF'}`);\n }\n\n // DPR\n if (stats.devicePixelRatio !== undefined) {\n lines.push(`DPR: ${stats.devicePixelRatio}`);\n }\n\n this.element.innerHTML = lines.join('\\n');\n }\n\n private formatNumber(n: number): string {\n if (n >= 1e9) return (n / 1e9).toFixed(1) + 'B';\n if (n >= 1e6) return (n / 1e6).toFixed(1) + 'M';\n if (n >= 1e3) return (n / 1e3).toFixed(1) + 'K';\n return n.toLocaleString();\n }\n\n private formatBytes(bytes: number): string {\n if (bytes >= 1e9) return (bytes / 1e9).toFixed(2) + ' GB';\n if (bytes >= 1e6) return (bytes / 1e6).toFixed(2) + ' MB';\n if (bytes >= 1e3) return (bytes / 1e3).toFixed(2) + ' KB';\n return bytes + ' B';\n }\n\n private formatValue(v: number): string {\n if (!isFinite(v)) return v.toString();\n if (Math.abs(v) >= 1e6 || (Math.abs(v) < 0.001 && v !== 0)) {\n return v.toExponential(2);\n }\n return v.toFixed(3);\n }\n}\n\n// ============================================\n// Convenience Functions\n// ============================================\n\n/**\n * Create a debug overlay for a chart container\n */\nexport function createDebugOverlay(\n container: HTMLElement,\n options?: DebugOverlayOptions\n): DebugOverlay {\n return new DebugOverlay(container, options);\n}\n\n/**\n * Quick enable debug mode (attaches to first chart container found)\n */\nexport function enableDebugMode(options?: DebugOverlayOptions): DebugOverlay | null {\n const container = document.querySelector('.velo-plot-container') as HTMLElement;\n if (!container) {\n console.warn('[VeloPlot] No chart container found for debug overlay');\n return null;\n }\n \n const overlay = new DebugOverlay(container, options);\n overlay.show();\n return overlay;\n}\n","/**\n * ChartStatistics - In-chart statistics panel\n * \n * Displays real-time statistics (Min, Max, Mean, StdDev, Area) \n * for the visible data range of active series.\n */\n\nimport { ChartTheme } from \"../theme\";\nimport { Series } from \"./Series\";\nimport { calculateStats, integrate } from \"../plugins/analysis\";\nimport { Bounds } from \"../types\";\n\nexport class ChartStatistics {\n private container: HTMLDivElement;\n private content: HTMLDivElement;\n private theme: ChartTheme;\n private series: Map<string, Series>;\n private isExpanded = false;\n\n constructor(\n parent: HTMLElement,\n theme: ChartTheme,\n series: Map<string, Series>\n ) {\n this.theme = theme;\n this.series = series;\n\n this.container = document.createElement(\"div\");\n this.container.className = \"velo-plot-stats-panel\";\n this.updateContainerStyle();\n\n const title = document.createElement(\"div\");\n title.innerHTML = \"📊 Statistics\";\n title.style.cssText = `\n font-weight: 600;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: pointer;\n `;\n title.onclick = () => this.toggle();\n\n this.content = document.createElement(\"div\");\n this.content.style.display = \"none\";\n \n this.container.appendChild(title);\n this.container.appendChild(this.content);\n parent.appendChild(this.container);\n }\n\n private isDarkTheme(): boolean {\n const name = this.theme.name.toLowerCase();\n return name.includes(\"dark\") || name.includes(\"midnight\") || name.includes(\"electro\");\n }\n\n private updateContainerStyle(): void {\n const isDark = this.isDarkTheme();\n const bg = isDark ? \"rgba(15, 23, 42, 0.85)\" : \"rgba(255, 255, 255, 0.95)\";\n const color = isDark ? \"#f1f5f9\" : \"#1e293b\";\n const borderColor = isDark ? \"rgba(255, 255, 255, 0.1)\" : \"rgba(0, 0, 0, 0.1)\";\n const shadow = isDark ? \"0 4px 12px rgba(0, 0, 0, 0.5)\" : \"0 4px 12px rgba(0, 0, 0, 0.1)\";\n\n this.container.style.cssText = `\n position: absolute;\n bottom: 8px;\n right: 8px;\n width: 240px;\n background: ${bg};\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n border: 1px solid ${borderColor};\n border-radius: 8px;\n box-shadow: ${shadow};\n color: ${color};\n font-family: system-ui, -apple-system, sans-serif;\n padding: 8px 12px;\n z-index: 90;\n transition: all 0.3s ease;\n font-size: 12px;\n pointer-events: auto;\n `;\n }\n\n public update(viewBounds: Bounds): void {\n if (!this.isExpanded) return;\n\n this.content.innerHTML = \"\";\n \n this.series.forEach((s) => {\n if (!s.getVisible()) return;\n\n const data = s.getData();\n if (!data) return;\n\n // Filter data in visible range\n const visibleY: number[] = [];\n const visibleX: number[] = [];\n for (let i = 0; i < data.x.length; i++) {\n if (data.x[i] >= viewBounds.xMin && data.x[i] <= viewBounds.xMax) {\n visibleX.push(data.x[i]);\n visibleY.push(data.y[i]);\n }\n }\n\n if (visibleY.length === 0) return;\n\n const stats = calculateStats(visibleY);\n const area = integrate(visibleX as any, visibleY as any);\n const style = s.getStyle();\n\n const item = document.createElement(\"div\");\n item.style.cssText = `\n padding: 8px 0;\n border-top: 1px solid ${this.isDarkTheme() ? \"rgba(255,255,255,0.05)\" : \"rgba(0,0,0,0.05)\"};\n `;\n\n item.innerHTML = `\n <div style=\"display: flex; align-items: center; gap: 6px; margin-bottom: 4px; font-weight: 600;\">\n <div style=\"width: 8px; height: 8px; border-radius: 2px; background: ${style.color}\"></div>\n ${s.getId()}\n </div>\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 4px; opacity: 0.9; font-size: 11px;\">\n <span>Min: ${stats.min.toExponential(3)}</span>\n <span>Max: ${stats.max.toExponential(3)}</span>\n <span>Mean: ${stats.mean.toExponential(3)}</span>\n <span>Count: ${stats.count}</span>\n <span style=\"grid-column: span 2;\">Area: ${area.toExponential(4)}</span>\n </div>\n `;\n\n this.content.appendChild(item);\n });\n\n if (this.content.innerHTML === \"\") {\n this.content.innerHTML = \"<div style='opacity: 0.5; font-style: italic;'>No series visible in range</div>\";\n }\n }\n\n public toggle(): void {\n this.isExpanded = !this.isExpanded;\n this.content.style.display = this.isExpanded ? \"block\" : \"none\";\n if (this.isExpanded) {\n // Redraw immediately will be handled by the chart's next render\n }\n }\n\n public updateTheme(theme: ChartTheme): void {\n this.theme = theme;\n this.updateContainerStyle();\n }\n\n public destroy(): void {\n this.container.remove();\n }\n}\n","/**\n * VeloPlot Engine - Debug Overlay Plugin\n * \n * Provides performance metrics and debugging information.\n * \n * @module plugins/debug\n */\n\nexport * from \"../../core/debug\";\nimport type { PluginManifest, ChartPlugin, PluginContext, AfterRenderEvent } from \"../types\";\n\nexport interface PluginDebugConfig extends Partial<DebugOverlayOptions> {\n /** Show FPS counter */\n showFPS?: boolean;\n /** Show data stats */\n showDataStats?: boolean;\n}\n\nconst manifestDebug: PluginManifest = {\n name: \"velo-plot-debug\",\n version: \"1.0.0\",\n description: \"Performance monitoring and debugging overlay for velo-plot\",\n provides: [\"ui\"],\n tags: [\"debug\", \"performance\", \"fps\", \"monitoring\"],\n};\n\nimport { DebugOverlay, DebugOverlayOptions } from \"../../core/debug\";\nimport { ChartStatistics } from \"../../core/ChartStatistics\";\n\n/**\n * VeloPlot Debug Plugin\n * \n * Adds a useful overlay with real-time performance metrics and debugging info.\n */\nexport function PluginDebug(config: PluginDebugConfig = {}): ChartPlugin<PluginDebugConfig> {\n let overlay: DebugOverlay | null = null;\n let stats: ChartStatistics | null = null;\n\n let ctx: PluginContext;\n\n return {\n manifest: manifestDebug,\n\n onInit(pCtx: PluginContext) {\n ctx = pCtx;\n\n // Initialize FPS/Performance overlay\n if (config.showFPS !== false) {\n overlay = new DebugOverlay(ctx.ui.container, {\n showFps: true,\n showMemory: true,\n showPointCount: true,\n updateInterval: 500,\n ...config\n });\n overlay.show();\n\n // Set stats provider for more detailed info\n overlay.setStatsProvider(() => {\n const series = ctx.data.getAllSeries();\n const pointCount = series.reduce((sum, s) => sum + s.getData().x.length, 0);\n\n return {\n pointCount,\n seriesCount: series.length,\n viewBounds: ctx.data.getViewBounds(),\n devicePixelRatio: (ctx.chart as any).dpr || 1,\n };\n });\n }\n\n // Initialize data statistics panel\n if (config.showDataStats) {\n stats = new ChartStatistics(\n ctx.ui.container,\n (ctx.chart as any).theme,\n (ctx.chart as any).series\n );\n }\n },\n\n onBeforeRender() {\n if (overlay) {\n overlay.recordFrame();\n }\n },\n\n onAfterRender(_ctx, event: AfterRenderEvent) {\n if (overlay) {\n overlay.update({\n frameTime: (event as any).frameTime || event.renderTime,\n });\n }\n },\n\n onRenderOverlay(_ctx) {\n if (stats) {\n stats.update(ctx.data.getViewBounds());\n }\n },\n\n onDestroy(_ctx: PluginContext) {\n if (overlay) {\n overlay.destroy();\n overlay = null;\n }\n if (stats) {\n stats.destroy();\n stats = null;\n }\n }\n };\n}\n\nexport { DebugOverlay };\nexport default PluginDebug;\n"],"names":["DebugOverlay","container","options","__publicField","provider","frameTime","now","stats","providerStats","_a","a","b","lines","fpsColor","info","shortRenderer","n","bytes","v","createDebugOverlay","enableDebugMode","overlay","ChartStatistics","parent","theme","series","title","name","isDark","bg","color","borderColor","shadow","viewBounds","s","data","visibleY","visibleX","i","calculateStats","area","integrate","style","item","manifestDebug","PluginDebug","config","ctx","pCtx","sum","_ctx","event"],"mappings":"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"}
@@ -1,6 +1,11 @@
1
1
  import { ForecastingMethod, ForecastingParams, ForecastingResult } from './types';
2
2
 
3
3
  /**
4
- * Main dispatcher for forecasting algorithms
4
+ * Main dispatcher for forecasting algorithms.
5
5
  */
6
- export declare function calculateForecast(x: number[] | Float64Array | Float32Array, y: number[] | Float64Array | Float32Array, method: ForecastingMethod, horizon: number, params?: ForecastingParams): ForecastingResult;
6
+ export declare function calculateForecast(x: number[] | Float64Array | Float32Array, y: number[] | Float64Array | Float32Array, method: ForecastingMethod, horizon: number, params?: ForecastingParams, confidence?: number): ForecastingResult;
7
+ /**
8
+ * Solve `A x = b` for a square matrix via Gaussian elimination with partial
9
+ * pivoting. Returns [] if the matrix is singular.
10
+ */
11
+ export declare function gaussianSolve(A: number[][], b: number[]): number[];
@@ -3,7 +3,7 @@ import { PluginManifest, ChartPlugin } from '../types';
3
3
 
4
4
  declare const manifestForecasting: PluginManifest;
5
5
  /**
6
- * Forecasting Plugin for Sci Plot
6
+ * Forecasting Plugin for Velo Plot
7
7
  */
8
8
  export declare function PluginForecasting(config?: Partial<PluginForecastingConfig>): ChartPlugin<PluginForecastingConfig>;
9
9
  export * from './types';