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,6 +1,6 @@
1
1
  import { ChartPlugin } from '../types';
2
2
  /**
3
- * SciPlot Engine - Clipboard Plugin
3
+ * VeloPlot Engine - Clipboard Plugin
4
4
  *
5
5
  * Provides clipboard integration for copying chart data and images.
6
6
  *
@@ -12,7 +12,7 @@ export interface PluginClipboardConfig {
12
12
  defaultFormat?: string;
13
13
  }
14
14
  /**
15
- * SciPlot Clipboard Plugin
15
+ * VeloPlot Clipboard Plugin
16
16
  *
17
17
  * Adds support for copying data and screenshots to the clipboard.
18
18
  */
@@ -1,3 +1,3 @@
1
1
  export * from './clipboard/index'
2
- import SciPlot from './clipboard/index'
3
- export default SciPlot
2
+ import VeloPlot from './clipboard/index'
3
+ export default VeloPlot
@@ -1 +1 @@
1
- {"version":3,"file":"clipboard.js","sources":["../../src/core/clipboard/index.ts","../../src/plugins/clipboard/index.ts"],"sourcesContent":["/**\n * Sci Plot - Clipboard Module\n * \n * Provides clipboard operations for copying chart data to various formats.\n * Supports copying selected points, visible data, or all data.\n * \n * @module clipboard\n */\n\n// ============================================\n// Types\n// ============================================\n\nexport type ClipboardFormat = 'tsv' | 'csv' | 'json' | 'markdown';\n\nexport interface ClipboardOptions {\n /** Output format (default: 'tsv' - Excel compatible) */\n format?: ClipboardFormat;\n /** Include column headers (default: true) */\n includeHeaders?: boolean;\n /** Decimal precision (default: 6) */\n precision?: number;\n /** Use scientific notation for very large/small numbers (default: true) */\n scientific?: boolean;\n /** Scientific notation threshold (default: 1e6) */\n scientificThreshold?: number;\n /** Custom column separator (overrides format default) */\n separator?: string;\n /** Custom line separator (default: '\\n') */\n lineSeparator?: string;\n /** Include series name in output (default: true for multi-series) */\n includeSeriesName?: boolean;\n /** Custom header names */\n headers?: {\n x?: string;\n y?: string;\n series?: string;\n };\n}\n\nexport interface ClipboardDataPoint {\n x: number;\n y: number;\n seriesId?: string;\n seriesName?: string;\n index?: number;\n}\n\nexport interface ClipboardResult {\n /** Whether the copy was successful */\n success: boolean;\n /** Number of points copied */\n pointCount: number;\n /** Number of series included */\n seriesCount: number;\n /** The formatted text that was copied */\n text?: string;\n /** Error message if failed */\n error?: string;\n}\n\n// ============================================\n// Format Helpers\n// ============================================\n\nconst FORMAT_CONFIGS: Record<ClipboardFormat, { separator: string; quote: boolean; extension: string }> = {\n tsv: { separator: '\\t', quote: false, extension: 'tsv' },\n csv: { separator: ',', quote: true, extension: 'csv' },\n json: { separator: '', quote: false, extension: 'json' },\n markdown: { separator: ' | ', quote: false, extension: 'md' },\n};\n\n// ============================================\n// Clipboard Manager\n// ============================================\n\nexport class ClipboardManager {\n private defaultOptions: ClipboardOptions = {\n format: 'tsv',\n includeHeaders: true,\n precision: 6,\n scientific: true,\n scientificThreshold: 1e6,\n lineSeparator: '\\n',\n includeSeriesName: false,\n };\n\n constructor(options?: Partial<ClipboardOptions>) {\n if (options) {\n this.defaultOptions = { ...this.defaultOptions, ...options };\n }\n }\n\n /**\n * Copy data points to clipboard\n */\n async copyPoints(\n points: ClipboardDataPoint[],\n options?: Partial<ClipboardOptions>\n ): Promise<ClipboardResult> {\n const opts = { ...this.defaultOptions, ...options };\n \n if (!points || points.length === 0) {\n return {\n success: false,\n pointCount: 0,\n seriesCount: 0,\n error: 'No data points to copy',\n };\n }\n\n try {\n const text = this.formatPoints(points, opts);\n await this.writeToClipboard(text);\n\n const seriesIds = new Set(points.map(p => p.seriesId).filter(Boolean));\n \n return {\n success: true,\n pointCount: points.length,\n seriesCount: seriesIds.size || 1,\n text,\n };\n } catch (error) {\n return {\n success: false,\n pointCount: 0,\n seriesCount: 0,\n error: error instanceof Error ? error.message : 'Failed to copy to clipboard',\n };\n }\n }\n\n /**\n * Copy series data to clipboard\n */\n async copySeries(\n seriesData: { id: string; name?: string; x: Float32Array | Float64Array; y: Float32Array | Float64Array }[],\n options?: Partial<ClipboardOptions>\n ): Promise<ClipboardResult> {\n const points: ClipboardDataPoint[] = [];\n \n for (const series of seriesData) {\n for (let i = 0; i < series.x.length; i++) {\n points.push({\n x: series.x[i],\n y: series.y[i],\n seriesId: series.id,\n seriesName: series.name || series.id,\n index: i,\n });\n }\n }\n\n // Enable series name if multiple series\n const opts = { ...options };\n if (seriesData.length > 1 && opts.includeSeriesName === undefined) {\n opts.includeSeriesName = true;\n }\n\n return this.copyPoints(points, opts);\n }\n\n /**\n * Format data points to string\n */\n formatPoints(points: ClipboardDataPoint[], options: ClipboardOptions): string {\n const format = options.format || 'tsv';\n \n if (format === 'json') {\n return this.formatAsJson(points, options);\n }\n \n if (format === 'markdown') {\n return this.formatAsMarkdown(points, options);\n }\n\n return this.formatAsDelimited(points, options);\n }\n\n /**\n * Format as delimited text (TSV/CSV)\n */\n private formatAsDelimited(points: ClipboardDataPoint[], options: ClipboardOptions): string {\n const format = options.format || 'tsv';\n const config = FORMAT_CONFIGS[format];\n const separator = options.separator || config.separator;\n const lineSeparator = options.lineSeparator || '\\n';\n const lines: string[] = [];\n\n // Headers\n if (options.includeHeaders) {\n const headerParts: string[] = [];\n if (options.includeSeriesName) {\n headerParts.push(options.headers?.series || 'Series');\n }\n headerParts.push(options.headers?.x || 'X');\n headerParts.push(options.headers?.y || 'Y');\n lines.push(headerParts.join(separator));\n }\n\n // Data rows\n for (const point of points) {\n const rowParts: string[] = [];\n \n if (options.includeSeriesName) {\n const seriesName = point.seriesName || point.seriesId || '';\n rowParts.push(config.quote ? `\"${seriesName}\"` : seriesName);\n }\n \n rowParts.push(this.formatNumber(point.x, options));\n rowParts.push(this.formatNumber(point.y, options));\n \n lines.push(rowParts.join(separator));\n }\n\n return lines.join(lineSeparator);\n }\n\n /**\n * Format as JSON\n */\n private formatAsJson(points: ClipboardDataPoint[], options: ClipboardOptions): string {\n const data = points.map(p => {\n const obj: Record<string, unknown> = {\n x: this.roundNumber(p.x, options.precision || 6),\n y: this.roundNumber(p.y, options.precision || 6),\n };\n if (options.includeSeriesName && p.seriesId) {\n obj.series = p.seriesName || p.seriesId;\n }\n return obj;\n });\n\n return JSON.stringify(data, null, 2);\n }\n\n /**\n * Format as Markdown table\n */\n private formatAsMarkdown(points: ClipboardDataPoint[], options: ClipboardOptions): string {\n const lines: string[] = [];\n const separator = ' | ';\n\n // Header\n const headerParts: string[] = [];\n if (options.includeSeriesName) {\n headerParts.push(options.headers?.series || 'Series');\n }\n headerParts.push(options.headers?.x || 'X');\n headerParts.push(options.headers?.y || 'Y');\n \n lines.push('| ' + headerParts.join(separator) + ' |');\n \n // Separator row\n const sepRow = headerParts.map(() => '---');\n lines.push('| ' + sepRow.join(separator) + ' |');\n\n // Data rows\n for (const point of points) {\n const rowParts: string[] = [];\n \n if (options.includeSeriesName) {\n rowParts.push(point.seriesName || point.seriesId || '');\n }\n \n rowParts.push(this.formatNumber(point.x, options));\n rowParts.push(this.formatNumber(point.y, options));\n \n lines.push('| ' + rowParts.join(separator) + ' |');\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Format a number for output\n */\n private formatNumber(value: number, options: ClipboardOptions): string {\n const precision = options.precision ?? 6;\n const threshold = options.scientificThreshold ?? 1e6;\n\n if (!isFinite(value)) {\n return value.toString();\n }\n\n // Use scientific notation for very large or very small numbers\n if (options.scientific && (Math.abs(value) >= threshold || (Math.abs(value) < 1e-4 && value !== 0))) {\n return value.toExponential(precision);\n }\n\n return this.roundNumber(value, precision).toString();\n }\n\n /**\n * Round a number to specified precision\n */\n private roundNumber(value: number, precision: number): number {\n const factor = Math.pow(10, precision);\n return Math.round(value * factor) / factor;\n }\n\n /**\n * Write text to system clipboard\n */\n private async writeToClipboard(text: string): Promise<void> {\n if (navigator.clipboard && navigator.clipboard.writeText) {\n await navigator.clipboard.writeText(text);\n } else {\n // Fallback for older browsers\n this.fallbackCopyToClipboard(text);\n }\n }\n\n /**\n * Fallback clipboard copy using hidden textarea\n */\n private fallbackCopyToClipboard(text: string): void {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.left = '-9999px';\n textarea.style.top = '-9999px';\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n \n try {\n document.execCommand('copy');\n } finally {\n document.body.removeChild(textarea);\n }\n }\n\n /**\n * Read from clipboard (for paste functionality)\n */\n async readFromClipboard(): Promise<string | null> {\n if (navigator.clipboard && navigator.clipboard.readText) {\n try {\n return await navigator.clipboard.readText();\n } catch {\n return null;\n }\n }\n return null;\n }\n\n /**\n * Parse clipboard text to data points\n */\n parseClipboardData(text: string, format?: ClipboardFormat): ClipboardDataPoint[] {\n const points: ClipboardDataPoint[] = [];\n \n // Try to detect format\n const detectedFormat = format || this.detectFormat(text);\n \n if (detectedFormat === 'json') {\n return this.parseJson(text);\n }\n\n // Parse as delimited\n const lines = text.trim().split(/\\r?\\n/);\n const separator = detectedFormat === 'csv' ? ',' : detectedFormat === 'tsv' ? '\\t' : ',';\n \n // Skip header if present\n const hasHeader = lines.length > 0 && /^[a-zA-Z]/.test(lines[0].trim());\n const startIndex = hasHeader ? 1 : 0;\n\n for (let i = startIndex; i < lines.length; i++) {\n const parts = lines[i].split(separator).map(p => p.trim().replace(/^\"|\"$/g, ''));\n \n if (parts.length >= 2) {\n const x = parseFloat(parts[0]);\n const y = parseFloat(parts[1]);\n \n if (!isNaN(x) && !isNaN(y)) {\n points.push({ x, y, index: i - startIndex });\n }\n }\n }\n\n return points;\n }\n\n /**\n * Detect format from text content\n */\n private detectFormat(text: string): ClipboardFormat {\n const trimmed = text.trim();\n \n if (trimmed.startsWith('[') || trimmed.startsWith('{')) {\n return 'json';\n }\n \n if (trimmed.includes('\\t')) {\n return 'tsv';\n }\n \n if (trimmed.includes(' | ')) {\n return 'markdown';\n }\n \n return 'csv';\n }\n\n /**\n * Parse JSON data\n */\n private parseJson(text: string): ClipboardDataPoint[] {\n try {\n const data = JSON.parse(text);\n const points: ClipboardDataPoint[] = [];\n const items = Array.isArray(data) ? data : [data];\n \n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (typeof item.x === 'number' && typeof item.y === 'number') {\n points.push({\n x: item.x,\n y: item.y,\n seriesId: item.series || item.seriesId,\n seriesName: item.seriesName || item.series,\n index: i,\n });\n }\n }\n \n return points;\n } catch {\n return [];\n }\n }\n\n /**\n * Set default options\n */\n setDefaults(options: Partial<ClipboardOptions>): void {\n this.defaultOptions = { ...this.defaultOptions, ...options };\n }\n\n /**\n * Get current default options\n */\n getDefaults(): ClipboardOptions {\n return { ...this.defaultOptions };\n }\n}\n\n// ============================================\n// Convenience Functions\n// ============================================\n\n/** Singleton instance for global use */\nlet globalClipboardManager: ClipboardManager | null = null;\n\n/**\n * Get the global clipboard manager instance\n */\nexport function getClipboardManager(): ClipboardManager {\n if (!globalClipboardManager) {\n globalClipboardManager = new ClipboardManager();\n }\n return globalClipboardManager;\n}\n\n/**\n * Copy data points to clipboard (convenience function)\n */\nexport async function copyToClipboard(\n points: ClipboardDataPoint[],\n options?: Partial<ClipboardOptions>\n): Promise<ClipboardResult> {\n return getClipboardManager().copyPoints(points, options);\n}\n\n/**\n * Format data as delimited string (without copying)\n */\nexport function formatData(\n points: ClipboardDataPoint[],\n options?: Partial<ClipboardOptions>\n): string {\n const manager = getClipboardManager();\n return manager.formatPoints(points, { ...manager.getDefaults(), ...options });\n}\n","/**\n * SciPlot Engine - Clipboard Plugin\n * \n * Provides clipboard integration for copying chart data and images.\n * \n * @module plugins/clipboard\n */\n\nexport * from \"../../core/clipboard\";\n\nimport type { PluginManifest, ChartPlugin, PluginContext } from \"../types\";\n\nexport interface PluginClipboardConfig {\n /** Default format for copied data: 'csv' | 'json' | 'image' */\n defaultFormat?: string;\n}\n\nconst manifestClipboard: PluginManifest = {\n name: \"velo-plot-clipboard\",\n version: \"1.0.0\",\n description: \"Clipboard integration for velo-plot\",\n provides: [\"interaction\"],\n tags: [\"clipboard\", \"copy\", \"paste\", \"export\"],\n};\n\n/**\n * SciPlot Clipboard Plugin\n * \n * Adds support for copying data and screenshots to the clipboard.\n */\nexport function PluginClipboard(_config: PluginClipboardConfig = {}): ChartPlugin<PluginClipboardConfig> {\n return {\n manifest: manifestClipboard,\n\n onInit(_ctx: PluginContext) {\n },\n\n onDestroy(_ctx: PluginContext) {\n },\n\n api: {\n copyCurrentView() {\n // Implementation would call copyToClipboard with data from current view\n }\n }\n };\n}\n\nexport default PluginClipboard;\n"],"names":["FORMAT_CONFIGS","ClipboardManager","options","__publicField","points","opts","text","seriesIds","p","error","seriesData","series","i","format","_a","_b","_c","config","separator","lineSeparator","lines","headerParts","point","rowParts","seriesName","data","obj","sepRow","value","precision","threshold","factor","textarea","detectedFormat","startIndex","parts","x","y","trimmed","items","item","globalClipboardManager","getClipboardManager","copyToClipboard","formatData","manager","manifestClipboard","PluginClipboard","_config","_ctx"],"mappings":"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"}
1
+ {"version":3,"file":"clipboard.js","sources":["../../src/core/clipboard/index.ts","../../src/plugins/clipboard/index.ts"],"sourcesContent":["/**\n * Velo Plot - Clipboard Module\n * \n * Provides clipboard operations for copying chart data to various formats.\n * Supports copying selected points, visible data, or all data.\n * \n * @module clipboard\n */\n\n// ============================================\n// Types\n// ============================================\n\nexport type ClipboardFormat = 'tsv' | 'csv' | 'json' | 'markdown';\n\nexport interface ClipboardOptions {\n /** Output format (default: 'tsv' - Excel compatible) */\n format?: ClipboardFormat;\n /** Include column headers (default: true) */\n includeHeaders?: boolean;\n /** Decimal precision (default: 6) */\n precision?: number;\n /** Use scientific notation for very large/small numbers (default: true) */\n scientific?: boolean;\n /** Scientific notation threshold (default: 1e6) */\n scientificThreshold?: number;\n /** Custom column separator (overrides format default) */\n separator?: string;\n /** Custom line separator (default: '\\n') */\n lineSeparator?: string;\n /** Include series name in output (default: true for multi-series) */\n includeSeriesName?: boolean;\n /** Custom header names */\n headers?: {\n x?: string;\n y?: string;\n series?: string;\n };\n}\n\nexport interface ClipboardDataPoint {\n x: number;\n y: number;\n seriesId?: string;\n seriesName?: string;\n index?: number;\n}\n\nexport interface ClipboardResult {\n /** Whether the copy was successful */\n success: boolean;\n /** Number of points copied */\n pointCount: number;\n /** Number of series included */\n seriesCount: number;\n /** The formatted text that was copied */\n text?: string;\n /** Error message if failed */\n error?: string;\n}\n\n// ============================================\n// Format Helpers\n// ============================================\n\nconst FORMAT_CONFIGS: Record<ClipboardFormat, { separator: string; quote: boolean; extension: string }> = {\n tsv: { separator: '\\t', quote: false, extension: 'tsv' },\n csv: { separator: ',', quote: true, extension: 'csv' },\n json: { separator: '', quote: false, extension: 'json' },\n markdown: { separator: ' | ', quote: false, extension: 'md' },\n};\n\n// ============================================\n// Clipboard Manager\n// ============================================\n\nexport class ClipboardManager {\n private defaultOptions: ClipboardOptions = {\n format: 'tsv',\n includeHeaders: true,\n precision: 6,\n scientific: true,\n scientificThreshold: 1e6,\n lineSeparator: '\\n',\n includeSeriesName: false,\n };\n\n constructor(options?: Partial<ClipboardOptions>) {\n if (options) {\n this.defaultOptions = { ...this.defaultOptions, ...options };\n }\n }\n\n /**\n * Copy data points to clipboard\n */\n async copyPoints(\n points: ClipboardDataPoint[],\n options?: Partial<ClipboardOptions>\n ): Promise<ClipboardResult> {\n const opts = { ...this.defaultOptions, ...options };\n \n if (!points || points.length === 0) {\n return {\n success: false,\n pointCount: 0,\n seriesCount: 0,\n error: 'No data points to copy',\n };\n }\n\n try {\n const text = this.formatPoints(points, opts);\n await this.writeToClipboard(text);\n\n const seriesIds = new Set(points.map(p => p.seriesId).filter(Boolean));\n \n return {\n success: true,\n pointCount: points.length,\n seriesCount: seriesIds.size || 1,\n text,\n };\n } catch (error) {\n return {\n success: false,\n pointCount: 0,\n seriesCount: 0,\n error: error instanceof Error ? error.message : 'Failed to copy to clipboard',\n };\n }\n }\n\n /**\n * Copy series data to clipboard\n */\n async copySeries(\n seriesData: { id: string; name?: string; x: Float32Array | Float64Array; y: Float32Array | Float64Array }[],\n options?: Partial<ClipboardOptions>\n ): Promise<ClipboardResult> {\n const points: ClipboardDataPoint[] = [];\n \n for (const series of seriesData) {\n for (let i = 0; i < series.x.length; i++) {\n points.push({\n x: series.x[i],\n y: series.y[i],\n seriesId: series.id,\n seriesName: series.name || series.id,\n index: i,\n });\n }\n }\n\n // Enable series name if multiple series\n const opts = { ...options };\n if (seriesData.length > 1 && opts.includeSeriesName === undefined) {\n opts.includeSeriesName = true;\n }\n\n return this.copyPoints(points, opts);\n }\n\n /**\n * Format data points to string\n */\n formatPoints(points: ClipboardDataPoint[], options: ClipboardOptions): string {\n const format = options.format || 'tsv';\n \n if (format === 'json') {\n return this.formatAsJson(points, options);\n }\n \n if (format === 'markdown') {\n return this.formatAsMarkdown(points, options);\n }\n\n return this.formatAsDelimited(points, options);\n }\n\n /**\n * Format as delimited text (TSV/CSV)\n */\n private formatAsDelimited(points: ClipboardDataPoint[], options: ClipboardOptions): string {\n const format = options.format || 'tsv';\n const config = FORMAT_CONFIGS[format];\n const separator = options.separator || config.separator;\n const lineSeparator = options.lineSeparator || '\\n';\n const lines: string[] = [];\n\n // Headers\n if (options.includeHeaders) {\n const headerParts: string[] = [];\n if (options.includeSeriesName) {\n headerParts.push(options.headers?.series || 'Series');\n }\n headerParts.push(options.headers?.x || 'X');\n headerParts.push(options.headers?.y || 'Y');\n lines.push(headerParts.join(separator));\n }\n\n // Data rows\n for (const point of points) {\n const rowParts: string[] = [];\n \n if (options.includeSeriesName) {\n const seriesName = point.seriesName || point.seriesId || '';\n rowParts.push(config.quote ? `\"${seriesName}\"` : seriesName);\n }\n \n rowParts.push(this.formatNumber(point.x, options));\n rowParts.push(this.formatNumber(point.y, options));\n \n lines.push(rowParts.join(separator));\n }\n\n return lines.join(lineSeparator);\n }\n\n /**\n * Format as JSON\n */\n private formatAsJson(points: ClipboardDataPoint[], options: ClipboardOptions): string {\n const data = points.map(p => {\n const obj: Record<string, unknown> = {\n x: this.roundNumber(p.x, options.precision || 6),\n y: this.roundNumber(p.y, options.precision || 6),\n };\n if (options.includeSeriesName && p.seriesId) {\n obj.series = p.seriesName || p.seriesId;\n }\n return obj;\n });\n\n return JSON.stringify(data, null, 2);\n }\n\n /**\n * Format as Markdown table\n */\n private formatAsMarkdown(points: ClipboardDataPoint[], options: ClipboardOptions): string {\n const lines: string[] = [];\n const separator = ' | ';\n\n // Header\n const headerParts: string[] = [];\n if (options.includeSeriesName) {\n headerParts.push(options.headers?.series || 'Series');\n }\n headerParts.push(options.headers?.x || 'X');\n headerParts.push(options.headers?.y || 'Y');\n \n lines.push('| ' + headerParts.join(separator) + ' |');\n \n // Separator row\n const sepRow = headerParts.map(() => '---');\n lines.push('| ' + sepRow.join(separator) + ' |');\n\n // Data rows\n for (const point of points) {\n const rowParts: string[] = [];\n \n if (options.includeSeriesName) {\n rowParts.push(point.seriesName || point.seriesId || '');\n }\n \n rowParts.push(this.formatNumber(point.x, options));\n rowParts.push(this.formatNumber(point.y, options));\n \n lines.push('| ' + rowParts.join(separator) + ' |');\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Format a number for output\n */\n private formatNumber(value: number, options: ClipboardOptions): string {\n const precision = options.precision ?? 6;\n const threshold = options.scientificThreshold ?? 1e6;\n\n if (!isFinite(value)) {\n return value.toString();\n }\n\n // Use scientific notation for very large or very small numbers\n if (options.scientific && (Math.abs(value) >= threshold || (Math.abs(value) < 1e-4 && value !== 0))) {\n return value.toExponential(precision);\n }\n\n return this.roundNumber(value, precision).toString();\n }\n\n /**\n * Round a number to specified precision\n */\n private roundNumber(value: number, precision: number): number {\n const factor = Math.pow(10, precision);\n return Math.round(value * factor) / factor;\n }\n\n /**\n * Write text to system clipboard\n */\n private async writeToClipboard(text: string): Promise<void> {\n if (navigator.clipboard && navigator.clipboard.writeText) {\n await navigator.clipboard.writeText(text);\n } else {\n // Fallback for older browsers\n this.fallbackCopyToClipboard(text);\n }\n }\n\n /**\n * Fallback clipboard copy using hidden textarea\n */\n private fallbackCopyToClipboard(text: string): void {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.left = '-9999px';\n textarea.style.top = '-9999px';\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n \n try {\n document.execCommand('copy');\n } finally {\n document.body.removeChild(textarea);\n }\n }\n\n /**\n * Read from clipboard (for paste functionality)\n */\n async readFromClipboard(): Promise<string | null> {\n if (navigator.clipboard && navigator.clipboard.readText) {\n try {\n return await navigator.clipboard.readText();\n } catch {\n return null;\n }\n }\n return null;\n }\n\n /**\n * Parse clipboard text to data points\n */\n parseClipboardData(text: string, format?: ClipboardFormat): ClipboardDataPoint[] {\n const points: ClipboardDataPoint[] = [];\n \n // Try to detect format\n const detectedFormat = format || this.detectFormat(text);\n \n if (detectedFormat === 'json') {\n return this.parseJson(text);\n }\n\n // Parse as delimited\n const lines = text.trim().split(/\\r?\\n/);\n const separator = detectedFormat === 'csv' ? ',' : detectedFormat === 'tsv' ? '\\t' : ',';\n \n // Skip header if present\n const hasHeader = lines.length > 0 && /^[a-zA-Z]/.test(lines[0].trim());\n const startIndex = hasHeader ? 1 : 0;\n\n for (let i = startIndex; i < lines.length; i++) {\n const parts = lines[i].split(separator).map(p => p.trim().replace(/^\"|\"$/g, ''));\n \n if (parts.length >= 2) {\n const x = parseFloat(parts[0]);\n const y = parseFloat(parts[1]);\n \n if (!isNaN(x) && !isNaN(y)) {\n points.push({ x, y, index: i - startIndex });\n }\n }\n }\n\n return points;\n }\n\n /**\n * Detect format from text content\n */\n private detectFormat(text: string): ClipboardFormat {\n const trimmed = text.trim();\n \n if (trimmed.startsWith('[') || trimmed.startsWith('{')) {\n return 'json';\n }\n \n if (trimmed.includes('\\t')) {\n return 'tsv';\n }\n \n if (trimmed.includes(' | ')) {\n return 'markdown';\n }\n \n return 'csv';\n }\n\n /**\n * Parse JSON data\n */\n private parseJson(text: string): ClipboardDataPoint[] {\n try {\n const data = JSON.parse(text);\n const points: ClipboardDataPoint[] = [];\n const items = Array.isArray(data) ? data : [data];\n \n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (typeof item.x === 'number' && typeof item.y === 'number') {\n points.push({\n x: item.x,\n y: item.y,\n seriesId: item.series || item.seriesId,\n seriesName: item.seriesName || item.series,\n index: i,\n });\n }\n }\n \n return points;\n } catch {\n return [];\n }\n }\n\n /**\n * Set default options\n */\n setDefaults(options: Partial<ClipboardOptions>): void {\n this.defaultOptions = { ...this.defaultOptions, ...options };\n }\n\n /**\n * Get current default options\n */\n getDefaults(): ClipboardOptions {\n return { ...this.defaultOptions };\n }\n}\n\n// ============================================\n// Convenience Functions\n// ============================================\n\n/** Singleton instance for global use */\nlet globalClipboardManager: ClipboardManager | null = null;\n\n/**\n * Get the global clipboard manager instance\n */\nexport function getClipboardManager(): ClipboardManager {\n if (!globalClipboardManager) {\n globalClipboardManager = new ClipboardManager();\n }\n return globalClipboardManager;\n}\n\n/**\n * Copy data points to clipboard (convenience function)\n */\nexport async function copyToClipboard(\n points: ClipboardDataPoint[],\n options?: Partial<ClipboardOptions>\n): Promise<ClipboardResult> {\n return getClipboardManager().copyPoints(points, options);\n}\n\n/**\n * Format data as delimited string (without copying)\n */\nexport function formatData(\n points: ClipboardDataPoint[],\n options?: Partial<ClipboardOptions>\n): string {\n const manager = getClipboardManager();\n return manager.formatPoints(points, { ...manager.getDefaults(), ...options });\n}\n","/**\n * VeloPlot Engine - Clipboard Plugin\n * \n * Provides clipboard integration for copying chart data and images.\n * \n * @module plugins/clipboard\n */\n\nexport * from \"../../core/clipboard\";\n\nimport type { PluginManifest, ChartPlugin, PluginContext } from \"../types\";\n\nexport interface PluginClipboardConfig {\n /** Default format for copied data: 'csv' | 'json' | 'image' */\n defaultFormat?: string;\n}\n\nconst manifestClipboard: PluginManifest = {\n name: \"velo-plot-clipboard\",\n version: \"1.0.0\",\n description: \"Clipboard integration for velo-plot\",\n provides: [\"interaction\"],\n tags: [\"clipboard\", \"copy\", \"paste\", \"export\"],\n};\n\n/**\n * VeloPlot Clipboard Plugin\n * \n * Adds support for copying data and screenshots to the clipboard.\n */\nexport function PluginClipboard(_config: PluginClipboardConfig = {}): ChartPlugin<PluginClipboardConfig> {\n return {\n manifest: manifestClipboard,\n\n onInit(_ctx: PluginContext) {\n },\n\n onDestroy(_ctx: PluginContext) {\n },\n\n api: {\n copyCurrentView() {\n // Implementation would call copyToClipboard with data from current view\n }\n }\n };\n}\n\nexport default PluginClipboard;\n"],"names":["FORMAT_CONFIGS","ClipboardManager","options","__publicField","points","opts","text","seriesIds","p","error","seriesData","series","i","format","_a","_b","_c","config","separator","lineSeparator","lines","headerParts","point","rowParts","seriesName","data","obj","sepRow","value","precision","threshold","factor","textarea","detectedFormat","startIndex","parts","x","y","trimmed","items","item","globalClipboardManager","getClipboardManager","copyToClipboard","formatData","manager","manifestClipboard","PluginClipboard","_config","_ctx"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { PluginContextMenuConfig } from './types';
3
3
 
4
4
  export * from './types';
5
5
  /**
6
- * Sci Plot Context Menu Plugin
6
+ * Velo Plot Context Menu Plugin
7
7
  *
8
8
  * Adds a customizable context menu with built-in actions and
9
9
  * extensibility for custom menu items.
@@ -1,3 +1,3 @@
1
1
  export * from './context-menu/index'
2
- import SciPlot from './context-menu/index'
3
- export default SciPlot
2
+ import VeloPlot from './context-menu/index'
3
+ export default VeloPlot
@@ -273,7 +273,7 @@ const _ = [
273
273
  name: "velo-plot-context-menu",
274
274
  version: "1.0.0",
275
275
  description: "Customizable right-click context menu for velo-plot",
276
- author: "Sci Plot Team",
276
+ author: "Velo Plot Team",
277
277
  provides: ["interaction"],
278
278
  tags: ["context-menu", "right-click", "menu", "ui"]
279
279
  };
@@ -1 +1 @@
1
- {"version":3,"file":"context-menu.js","sources":["../../src/plugins/context-menu/renderer.ts","../../src/plugins/context-menu/index.ts"],"sourcesContent":["/**\n * Context Menu Renderer\n * \n * Handles DOM creation and rendering of the context menu.\n * \n * @module plugins/context-menu/renderer\n */\n\nimport type { \n MenuItem, \n MenuStyle, \n MenuPosition,\n MenuContext,\n MenuState \n} from \"./types\";\n\n// ============================================\n// Default Styles\n// ============================================\n\nconst DEFAULT_STYLE: Required<MenuStyle> = {\n backgroundColor: 'rgba(30, 30, 40, 0.95)',\n textColor: '#e0e0e0',\n borderColor: 'rgba(100, 100, 120, 0.5)',\n borderRadius: '8px',\n boxShadow: '0 8px 32px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255, 255, 255, 0.1)',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: '13px',\n itemPadding: '8px 16px',\n hoverBackground: 'rgba(0, 242, 255, 0.15)',\n separatorColor: 'rgba(100, 100, 120, 0.3)',\n disabledOpacity: 0.4,\n minWidth: '180px',\n maxWidth: '300px',\n animationDuration: '150ms'\n};\n\n// ============================================\n// Menu Renderer Class\n// ============================================\n\nexport class MenuRenderer {\n private _container: HTMLElement;\n private menuElement: HTMLDivElement | null = null;\n private style: Required<MenuStyle>;\n private onItemClick: (item: MenuItem, context: MenuContext) => void;\n private zIndex: number;\n\n constructor(\n container: HTMLElement,\n style: MenuStyle | undefined,\n zIndex: number,\n onItemClick: (item: MenuItem, context: MenuContext) => void\n ) {\n this._container = container;\n this.style = { ...DEFAULT_STYLE, ...style };\n this.zIndex = zIndex;\n this.onItemClick = onItemClick;\n }\n\n /**\n * Show the context menu\n */\n show(state: MenuState): void {\n this.hide();\n\n if (!state.items.length || !state.context) return;\n\n this.menuElement = this.createMenu(state.items, state.context);\n this.positionMenu(state.position);\n document.body.appendChild(this.menuElement);\n\n // Animate in\n requestAnimationFrame(() => {\n if (this.menuElement) {\n this.menuElement.style.opacity = '1';\n this.menuElement.style.transform = 'scale(1)';\n }\n });\n\n // Add click-outside listener\n document.addEventListener('mousedown', this.handleOutsideClick);\n document.addEventListener('keydown', this.handleKeyDown);\n }\n\n /**\n * Hide the context menu\n */\n hide(): void {\n if (this.menuElement) {\n this.menuElement.style.opacity = '0';\n this.menuElement.style.transform = 'scale(0.95)';\n \n setTimeout(() => {\n if (this.menuElement?.parentNode) {\n this.menuElement.parentNode.removeChild(this.menuElement);\n }\n this.menuElement = null;\n }, 100);\n }\n\n document.removeEventListener('mousedown', this.handleOutsideClick);\n document.removeEventListener('keydown', this.handleKeyDown);\n }\n\n /**\n * Check if menu is visible\n */\n isVisible(): boolean {\n return this.menuElement !== null;\n }\n\n /**\n * Destroy the renderer\n */\n destroy(): void {\n this.hide();\n }\n\n /**\n * Update styling\n */\n updateStyle(style: MenuStyle): void {\n this.style = { ...DEFAULT_STYLE, ...style };\n }\n\n /**\n * Get container reference\n */\n getContainer(): HTMLElement {\n return this._container;\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private createMenu(items: MenuItem[], context: MenuContext): HTMLDivElement {\n const menu = document.createElement('div');\n menu.className = 'velo-plot-context-menu';\n menu.style.cssText = this.getMenuStyle();\n\n items.forEach(item => {\n const element = this.createMenuItem(item, context);\n if (element) {\n menu.appendChild(element);\n }\n });\n\n return menu;\n }\n\n private createMenuItem(item: MenuItem, context: MenuContext): HTMLElement | null {\n // Hidden items\n if ('hidden' in item && item.hidden) return null;\n\n // Separator\n if (item.type === 'separator') {\n const sep = document.createElement('div');\n sep.className = 'velo-plot-menu-separator';\n sep.style.cssText = `\n height: 1px;\n margin: 4px 8px;\n background: ${this.style.separatorColor};\n `;\n return sep;\n }\n\n // Regular item\n const el = document.createElement('div');\n el.className = 'velo-plot-menu-item';\n \n const isDisabled = 'disabled' in item && Boolean(item.disabled);\n el.style.cssText = this.getItemStyle(isDisabled);\n\n // Icon\n if ('icon' in item && item.icon) {\n const icon = document.createElement('span');\n icon.className = 'velo-plot-menu-icon';\n icon.style.cssText = 'margin-right: 12px; width: 16px; text-align: center;';\n icon.textContent = item.icon;\n el.appendChild(icon);\n }\n\n // Label\n const label = document.createElement('span');\n label.className = 'velo-plot-menu-label';\n label.style.cssText = 'flex: 1;';\n label.textContent = item.label;\n el.appendChild(label);\n\n // Checkbox/Radio indicator\n if (item.type === 'checkbox') {\n const check = document.createElement('span');\n check.style.cssText = 'margin-left: 12px; width: 16px;';\n check.textContent = item.checked ? '✓' : '';\n el.appendChild(check);\n }\n\n if (item.type === 'radio') {\n const radio = document.createElement('span');\n radio.style.cssText = 'margin-left: 12px; width: 16px;';\n radio.textContent = item.selected ? '●' : '○';\n el.appendChild(radio);\n }\n\n // Shortcut\n if ('shortcut' in item && item.shortcut) {\n const shortcut = document.createElement('span');\n shortcut.className = 'velo-plot-menu-shortcut';\n shortcut.style.cssText = `\n margin-left: 24px;\n opacity: 0.5;\n font-size: 11px;\n `;\n shortcut.textContent = item.shortcut;\n el.appendChild(shortcut);\n }\n\n // Submenu arrow\n if (item.type === 'submenu') {\n const arrow = document.createElement('span');\n arrow.style.cssText = 'margin-left: 8px;';\n arrow.textContent = '▶';\n el.appendChild(arrow);\n\n // Create submenu on hover\n el.addEventListener('mouseenter', () => {\n this.showSubmenu(el, item.items, context);\n });\n el.addEventListener('mouseleave', (e: MouseEvent) => {\n this.hideSubmenu(el, e);\n });\n }\n\n // Hover effects\n if (!isDisabled) {\n el.addEventListener('mouseenter', () => {\n el.style.background = this.style.hoverBackground;\n });\n el.addEventListener('mouseleave', () => {\n el.style.background = 'transparent';\n });\n\n // Click handler\n el.addEventListener('click', (e) => {\n e.stopPropagation();\n if (item.type !== 'submenu') {\n this.onItemClick(item, context);\n }\n });\n }\n\n return el;\n }\n\n private showSubmenu(parent: HTMLElement, items: MenuItem[], context: MenuContext): void {\n // Remove any existing submenu\n const existing = parent.querySelector('.velo-plot-submenu');\n if (existing) return;\n\n const submenu = document.createElement('div');\n submenu.className = 'velo-plot-submenu';\n submenu.style.cssText = `\n ${this.getMenuStyle()}\n position: absolute;\n left: 100%;\n top: 0;\n margin-left: 4px;\n `;\n\n items.forEach(item => {\n const el = this.createMenuItem(item, context);\n if (el) submenu.appendChild(el);\n });\n\n parent.style.position = 'relative';\n parent.appendChild(submenu);\n }\n\n private hideSubmenu(parent: HTMLElement, e: MouseEvent): void {\n const submenu = parent.querySelector('.velo-plot-submenu');\n if (!submenu) return;\n\n // Check if moving to submenu\n const rect = submenu.getBoundingClientRect();\n if (\n e.clientX >= rect.left &&\n e.clientX <= rect.right &&\n e.clientY >= rect.top &&\n e.clientY <= rect.bottom\n ) {\n return;\n }\n\n setTimeout(() => {\n submenu.remove();\n }, 100);\n }\n\n private positionMenu(position: MenuPosition): void {\n if (!this.menuElement) return;\n\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n \n // Initial position\n this.menuElement.style.left = `${position.x}px`;\n this.menuElement.style.top = `${position.y}px`;\n\n // Get actual dimensions\n const rect = this.menuElement.getBoundingClientRect();\n\n // Adjust if off-screen\n if (rect.right > viewportWidth) {\n this.menuElement.style.left = `${position.x - rect.width}px`;\n }\n if (rect.bottom > viewportHeight) {\n this.menuElement.style.top = `${position.y - rect.height}px`;\n }\n }\n\n private getMenuStyle(): string {\n return `\n position: fixed;\n z-index: ${this.zIndex};\n background: ${this.style.backgroundColor};\n color: ${this.style.textColor};\n border: 1px solid ${this.style.borderColor};\n border-radius: ${this.style.borderRadius};\n box-shadow: ${this.style.boxShadow};\n font-family: ${this.style.fontFamily};\n font-size: ${this.style.fontSize};\n min-width: ${this.style.minWidth};\n max-width: ${this.style.maxWidth};\n padding: 4px 0;\n opacity: 0;\n transform: scale(0.95);\n transform-origin: top left;\n transition: opacity ${this.style.animationDuration}, transform ${this.style.animationDuration};\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n `;\n }\n\n private getItemStyle(disabled: boolean): string {\n return `\n display: flex;\n align-items: center;\n padding: ${this.style.itemPadding};\n cursor: ${disabled ? 'default' : 'pointer'};\n opacity: ${disabled ? this.style.disabledOpacity : 1};\n user-select: none;\n transition: background 100ms;\n `;\n }\n\n private handleOutsideClick = (e: MouseEvent): void => {\n if (this.menuElement && !this.menuElement.contains(e.target as Node)) {\n this.hide();\n }\n };\n\n private handleKeyDown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') {\n this.hide();\n }\n };\n}\n","/**\n * Sci Plot - Context Menu Plugin\n * \n * Provides a customizable right-click context menu for chart interactions.\n * \n * @module plugins/context-menu\n * \n * @example\n * ```typescript\n * import { createChart } from 'velo-plot';\n * import { PluginContextMenu } from 'velo-plot/plugins/context-menu';\n * \n * const chart = createChart({ container });\n * chart.use(PluginContextMenu({\n * items: [\n * { label: 'Zoom to Fit', icon: '🔍', action: 'zoomToFit' },\n * { type: 'separator' },\n * { label: 'Export...', icon: '💾', type: 'submenu', items: [\n * { label: 'CSV', action: 'exportCSV' },\n * { label: 'JSON', action: 'exportJSON' },\n * ]},\n * ]\n * }));\n * ```\n */\n\nimport type { PluginManifest, ChartPlugin, PluginContext } from \"../types\";\nimport type {\n PluginContextMenuConfig,\n MenuItem,\n MenuContext,\n MenuState,\n BuiltinAction,\n MenuActionItem\n} from \"./types\";\nimport { MenuRenderer } from \"./renderer\";\n\n// Re-export types\nexport * from \"./types\";\n\n// ============================================\n// Default Menu Items\n// ============================================\n\nconst DEFAULT_PLOT_ITEMS: MenuItem[] = [\n { \n label: 'Zoom to Fit', \n icon: '⊡', \n action: 'zoomToFit',\n shortcut: 'Home'\n },\n { \n label: 'Reset View', \n icon: '↻', \n action: 'resetView',\n shortcut: 'R'\n },\n { type: 'separator' },\n {\n label: 'Interaction Mode',\n icon: '✋',\n type: 'submenu',\n items: [\n { label: 'Pan', icon: '✋', action: 'panMode' },\n { label: 'Box Zoom', icon: '⬚', action: 'boxZoomMode' },\n { label: 'Select', icon: '➤', action: 'selectMode' },\n ]\n },\n { type: 'separator' },\n {\n label: 'Export',\n icon: '💾',\n type: 'submenu',\n items: [\n { label: 'CSV', icon: '📄', action: 'exportCSV' },\n { label: 'JSON', icon: '📋', action: 'exportJSON' },\n { label: 'Image', icon: '🖼️', action: 'exportImage' },\n ]\n },\n { \n label: 'Copy to Clipboard', \n icon: '📋', \n action: 'copyToClipboard',\n shortcut: 'Ctrl+C'\n },\n { type: 'separator' },\n {\n label: 'Annotations',\n icon: '📝',\n type: 'submenu',\n items: [\n { label: 'Add Horizontal Line', icon: '—', action: 'addHorizontalLine' },\n { label: 'Add Vertical Line', icon: '|', action: 'addVerticalLine' },\n { label: 'Add Text', icon: 'T', action: 'addTextAnnotation' },\n { type: 'separator' },\n { label: 'Clear All', icon: '🗑️', action: 'clearAnnotations' },\n ]\n },\n { type: 'separator' },\n { \n label: 'Toggle Legend', \n icon: '☰', \n action: 'toggleLegend',\n shortcut: 'L'\n },\n { \n label: 'Toggle Grid', \n icon: '#', \n action: 'toggleGrid',\n shortcut: 'G'\n },\n { \n label: 'Show Statistics', \n icon: '📊', \n action: 'showStats',\n shortcut: 'S'\n },\n];\n\n// ============================================\n// Plugin Definition\n// ============================================\n\nconst manifestContextMenu: PluginManifest = {\n name: \"velo-plot-context-menu\",\n version: \"1.0.0\",\n description: \"Customizable right-click context menu for velo-plot\",\n author: \"Sci Plot Team\",\n provides: [\"interaction\"],\n tags: [\"context-menu\", \"right-click\", \"menu\", \"ui\"],\n};\n\n/**\n * Sci Plot Context Menu Plugin\n * \n * Adds a customizable context menu with built-in actions and \n * extensibility for custom menu items.\n */\nexport function PluginContextMenu(\n config: PluginContextMenuConfig = {}\n): ChartPlugin<PluginContextMenuConfig> {\n \n const {\n enabled = true,\n items = [],\n templates = [],\n useDefaults = true,\n style,\n preventDefault = true,\n showOnRightClick = true,\n showOnLongPress = true,\n longPressDuration = 500,\n beforeShow,\n afterHide,\n zIndex = 10000\n } = config;\n\n let _ctx: PluginContext | null = null;\n let renderer: MenuRenderer | null = null;\n let state: MenuState = {\n visible: false,\n position: { x: 0, y: 0 },\n items: [],\n submenuPath: [],\n context: null\n };\n\n // Long press handling\n let longPressTimer: ReturnType<typeof setTimeout> | null = null;\n let longPressStart: { x: number; y: number } | null = null;\n\n // ============================================\n // Action Handlers\n // ============================================\n\n function executeAction(action: BuiltinAction, context: MenuContext): void {\n if (!_ctx) return;\n\n const chart = _ctx.chart as any;\n\n switch (action) {\n case 'zoomToFit':\n chart.zoomToFit?.();\n break;\n \n case 'zoomIn':\n chart.zoom?.(1.5);\n break;\n \n case 'zoomOut':\n chart.zoom?.(0.67);\n break;\n \n case 'resetView':\n chart.resetView?.();\n break;\n \n case 'panMode':\n chart.setMode?.('pan');\n break;\n \n case 'boxZoomMode':\n chart.setMode?.('boxZoom');\n break;\n \n case 'selectMode':\n chart.setMode?.('select');\n break;\n \n case 'exportCSV':\n executeExport('csv');\n break;\n \n case 'exportJSON':\n executeExport('json');\n break;\n \n case 'exportImage':\n downloadImage();\n break;\n \n case 'copyToClipboard':\n copyToClipboard();\n break;\n \n case 'toggleLegend':\n chart.setShowLegend?.(!chart.getShowLegend?.());\n break;\n \n case 'toggleGrid':\n chart.setShowGrid?.(!chart.getShowGrid?.());\n break;\n \n case 'toggleCrosshair':\n // Toggle crosshair if available\n break;\n \n case 'addHorizontalLine':\n addAnnotation('hline', context);\n break;\n \n case 'addVerticalLine':\n addAnnotation('vline', context);\n break;\n \n case 'addTextAnnotation':\n addAnnotation('text', context);\n break;\n \n case 'clearAnnotations':\n chart.clearAnnotations?.();\n break;\n \n case 'showStats':\n // Show stats panel\n break;\n }\n }\n\n function executeExport(format: 'csv' | 'json'): void {\n const chart = _ctx?.chart as any;\n const exportPlugin = chart?.plugins?.get('velo-plot-data-export')?.api;\n \n if (exportPlugin) {\n exportPlugin.download(format);\n } else {\n // Fallback to basic export\n const data = chart.toCSV?.() || chart.toJSON?.();\n if (data) {\n downloadString(data, `chart.${format}`, `text/${format}`);\n }\n }\n }\n\n function downloadImage(): void {\n const chart = _ctx?.chart as any;\n const dataUrl = chart.toImage?.('png');\n if (dataUrl) {\n const link = document.createElement('a');\n link.href = dataUrl;\n link.download = 'chart.png';\n link.click();\n }\n }\n\n function copyToClipboard(): void {\n const chart = _ctx?.chart as any;\n const data = chart.toCSV?.();\n if (data) {\n navigator.clipboard.writeText(data).catch(console.error);\n }\n }\n\n function addAnnotation(type: 'hline' | 'vline' | 'text', context: MenuContext): void {\n if (!context.dataPosition) return;\n \n const chart = _ctx?.chart as any;\n const { x, y } = context.dataPosition;\n\n switch (type) {\n case 'hline':\n chart.addAnnotation?.({\n type: 'horizontalLine',\n y,\n color: '#ff6b6b',\n label: `Y = ${y.toFixed(4)}`\n });\n break;\n \n case 'vline':\n chart.addAnnotation?.({\n type: 'verticalLine',\n x,\n color: '#4ecdc4',\n label: `X = ${x.toFixed(4)}`\n });\n break;\n \n case 'text':\n chart.addAnnotation?.({\n type: 'text',\n x,\n y,\n text: 'Annotation',\n color: '#ffffff'\n });\n break;\n }\n }\n\n function downloadString(content: string, filename: string, type: string): void {\n const blob = new Blob([content], { type });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n link.click();\n URL.revokeObjectURL(url);\n }\n\n // ============================================\n // Menu Logic\n // ============================================\n\n function buildMenuContext(event: MouseEvent): MenuContext {\n const chart = _ctx?.chart as any;\n const container = _ctx?.ui.container;\n \n if (!container) {\n return {\n chart,\n event,\n pixelPosition: { x: event.clientX, y: event.clientY },\n dataPosition: null,\n seriesId: null,\n annotationId: null,\n pointIndex: null,\n area: 'outside'\n };\n }\n\n const rect = container.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n\n // Determine area\n const plotArea = _ctx?.render.plotArea;\n let area: MenuContext['area'] = 'outside';\n \n if (plotArea) {\n if (x >= plotArea.x && x <= plotArea.x + plotArea.width &&\n y >= plotArea.y && y <= plotArea.y + plotArea.height) {\n area = 'plot';\n } else if (y > plotArea.y + plotArea.height) {\n area = 'xAxis';\n } else if (x < plotArea.x) {\n area = 'yAxis';\n }\n }\n\n // Convert to data coordinates\n let dataPosition: { x: number; y: number } | null = null;\n if (area === 'plot' && _ctx) {\n dataPosition = {\n x: _ctx.coords.pixelToDataX(x),\n y: _ctx.coords.pixelToDataY(y)\n };\n }\n\n // Try to detect series/point\n let seriesId: string | null = null;\n let pointIndex: number | null = null;\n \n if (dataPosition && _ctx) {\n const pick = _ctx.coords.pickPoint(x, y, 10);\n if (pick) {\n seriesId = pick.seriesId;\n pointIndex = pick.index;\n }\n }\n\n return {\n chart,\n event,\n pixelPosition: { x, y },\n dataPosition,\n seriesId,\n annotationId: null,\n pointIndex,\n area\n };\n }\n\n function getMenuItems(context: MenuContext): MenuItem[] {\n // Try templates first\n for (const template of templates) {\n if (template.condition?.(context)) {\n return [...template.items];\n }\n }\n\n // Build items based on context\n let menuItems: MenuItem[] = [];\n\n if (useDefaults) {\n menuItems = [...DEFAULT_PLOT_ITEMS];\n }\n\n // Add custom items\n if (items.length > 0) {\n if (menuItems.length > 0) {\n menuItems.push({ type: 'separator' });\n }\n menuItems.push(...items);\n }\n\n // Apply beforeShow hook\n if (beforeShow) {\n const result = beforeShow(context);\n if (result === false) {\n return [];\n }\n menuItems = result;\n }\n\n return menuItems;\n }\n\n function showMenu(event: MouseEvent): void {\n if (!enabled || !_ctx) return;\n\n const context = buildMenuContext(event);\n const menuItems = getMenuItems(context);\n\n if (menuItems.length === 0) return;\n\n state = {\n visible: true,\n position: { x: event.clientX, y: event.clientY },\n items: menuItems,\n submenuPath: [],\n context\n };\n\n renderer?.show(state);\n }\n\n function hideMenu(): void {\n state = {\n ...state,\n visible: false,\n context: null\n };\n\n renderer?.hide();\n afterHide?.();\n }\n\n function handleItemClick(item: MenuItem, context: MenuContext): void {\n hideMenu();\n\n if (item.type === 'separator' || item.type === 'submenu') {\n return;\n }\n\n if (item.type === 'checkbox' && item.onChange) {\n item.onChange(!item.checked, context);\n return;\n }\n\n if (item.type === 'radio' && item.onChange) {\n item.onChange(item.value, context);\n return;\n }\n\n // Action item\n const actionItem = item as MenuActionItem;\n \n if (actionItem.onClick) {\n actionItem.onClick(context);\n } else if (actionItem.action) {\n executeAction(actionItem.action, context);\n }\n }\n\n // ============================================\n // Event Handlers\n // ============================================\n\n function handleContextMenu(e: MouseEvent): void {\n if (!showOnRightClick) return;\n \n if (preventDefault) {\n e.preventDefault();\n }\n\n showMenu(e);\n }\n\n function handleTouchStart(e: TouchEvent): void {\n if (!showOnLongPress) return;\n\n const touch = e.touches[0];\n longPressStart = { x: touch.clientX, y: touch.clientY };\n\n longPressTimer = setTimeout(() => {\n if (longPressStart) {\n const syntheticEvent = new MouseEvent('contextmenu', {\n clientX: longPressStart.x,\n clientY: longPressStart.y\n });\n showMenu(syntheticEvent);\n }\n }, longPressDuration);\n }\n\n function handleTouchMove(e: TouchEvent): void {\n if (!longPressStart || !longPressTimer) return;\n\n const touch = e.touches[0];\n const dx = touch.clientX - longPressStart.x;\n const dy = touch.clientY - longPressStart.y;\n\n // Cancel if moved too far\n if (Math.sqrt(dx * dx + dy * dy) > 10) {\n clearTimeout(longPressTimer);\n longPressTimer = null;\n longPressStart = null;\n }\n }\n\n function handleTouchEnd(): void {\n if (longPressTimer) {\n clearTimeout(longPressTimer);\n longPressTimer = null;\n }\n longPressStart = null;\n }\n\n // ============================================\n // Plugin Implementation\n // ============================================\n\n return {\n manifest: manifestContextMenu,\n\n onInit(ctx: PluginContext) {\n _ctx = ctx;\n\n const container = ctx.ui.container;\n\n renderer = new MenuRenderer(\n container,\n style,\n zIndex,\n handleItemClick\n );\n\n // Attach event listeners\n container.addEventListener('contextmenu', handleContextMenu);\n container.addEventListener('touchstart', handleTouchStart, { passive: true });\n container.addEventListener('touchmove', handleTouchMove, { passive: true });\n container.addEventListener('touchend', handleTouchEnd);\n\n ctx.log.info('ContextMenu plugin initialized');\n },\n\n onDestroy() {\n const container = _ctx?.ui.container;\n\n if (container) {\n container.removeEventListener('contextmenu', handleContextMenu);\n container.removeEventListener('touchstart', handleTouchStart);\n container.removeEventListener('touchmove', handleTouchMove);\n container.removeEventListener('touchend', handleTouchEnd);\n }\n\n renderer?.destroy();\n renderer = null;\n _ctx = null;\n },\n\n api: {\n /**\n * Show the context menu programmatically\n */\n show(x: number, y: number, customItems?: MenuItem[]) {\n const event = new MouseEvent('contextmenu', { clientX: x, clientY: y });\n const context = buildMenuContext(event);\n \n state = {\n visible: true,\n position: { x, y },\n items: customItems || getMenuItems(context),\n submenuPath: [],\n context\n };\n\n renderer?.show(state);\n },\n\n /**\n * Hide the context menu\n */\n hide() {\n hideMenu();\n },\n\n /**\n * Check if menu is visible\n */\n isVisible(): boolean {\n return renderer?.isVisible() ?? false;\n },\n\n /**\n * Update menu items dynamically\n */\n setItems(newItems: MenuItem[]) {\n // Update for next show\n (config as any).items = newItems;\n },\n\n /**\n * Enable/disable the menu\n */\n setEnabled(value: boolean) {\n (config as any).enabled = value;\n },\n\n /**\n * Update styling\n */\n setStyle(newStyle: typeof style) {\n renderer?.updateStyle(newStyle || {});\n },\n\n /**\n * Get available built-in actions\n */\n getBuiltinActions(): BuiltinAction[] {\n return [\n 'zoomToFit', 'zoomIn', 'zoomOut', 'resetView',\n 'panMode', 'boxZoomMode', 'selectMode',\n 'exportCSV', 'exportJSON', 'exportImage', 'copyToClipboard',\n 'toggleLegend', 'toggleGrid', 'toggleCrosshair',\n 'addHorizontalLine', 'addVerticalLine', 'addTextAnnotation', 'clearAnnotations',\n 'showStats'\n ];\n }\n }\n };\n}\n\nexport default PluginContextMenu;\n"],"names":["DEFAULT_STYLE","MenuRenderer","container","style","zIndex","onItemClick","__publicField","e","state","_a","items","context","menu","item","element","sep","el","isDisabled","icon","label","check","radio","shortcut","arrow","parent","submenu","rect","position","viewportWidth","viewportHeight","disabled","DEFAULT_PLOT_ITEMS","manifestContextMenu","PluginContextMenu","config","enabled","templates","useDefaults","preventDefault","showOnRightClick","showOnLongPress","longPressDuration","beforeShow","afterHide","_ctx","renderer","longPressTimer","longPressStart","executeAction","action","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","chart","executeExport","downloadImage","copyToClipboard","addAnnotation","format","exportPlugin","data","downloadString","dataUrl","link","type","x","y","content","filename","blob","url","buildMenuContext","event","plotArea","area","dataPosition","seriesId","pointIndex","pick","getMenuItems","template","menuItems","result","showMenu","hideMenu","handleItemClick","actionItem","handleContextMenu","handleTouchStart","touch","syntheticEvent","handleTouchMove","dx","dy","handleTouchEnd","ctx","customItems","newItems","value","newStyle"],"mappings":"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"}
1
+ {"version":3,"file":"context-menu.js","sources":["../../src/plugins/context-menu/renderer.ts","../../src/plugins/context-menu/index.ts"],"sourcesContent":["/**\n * Context Menu Renderer\n * \n * Handles DOM creation and rendering of the context menu.\n * \n * @module plugins/context-menu/renderer\n */\n\nimport type { \n MenuItem, \n MenuStyle, \n MenuPosition,\n MenuContext,\n MenuState \n} from \"./types\";\n\n// ============================================\n// Default Styles\n// ============================================\n\nconst DEFAULT_STYLE: Required<MenuStyle> = {\n backgroundColor: 'rgba(30, 30, 40, 0.95)',\n textColor: '#e0e0e0',\n borderColor: 'rgba(100, 100, 120, 0.5)',\n borderRadius: '8px',\n boxShadow: '0 8px 32px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255, 255, 255, 0.1)',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: '13px',\n itemPadding: '8px 16px',\n hoverBackground: 'rgba(0, 242, 255, 0.15)',\n separatorColor: 'rgba(100, 100, 120, 0.3)',\n disabledOpacity: 0.4,\n minWidth: '180px',\n maxWidth: '300px',\n animationDuration: '150ms'\n};\n\n// ============================================\n// Menu Renderer Class\n// ============================================\n\nexport class MenuRenderer {\n private _container: HTMLElement;\n private menuElement: HTMLDivElement | null = null;\n private style: Required<MenuStyle>;\n private onItemClick: (item: MenuItem, context: MenuContext) => void;\n private zIndex: number;\n\n constructor(\n container: HTMLElement,\n style: MenuStyle | undefined,\n zIndex: number,\n onItemClick: (item: MenuItem, context: MenuContext) => void\n ) {\n this._container = container;\n this.style = { ...DEFAULT_STYLE, ...style };\n this.zIndex = zIndex;\n this.onItemClick = onItemClick;\n }\n\n /**\n * Show the context menu\n */\n show(state: MenuState): void {\n this.hide();\n\n if (!state.items.length || !state.context) return;\n\n this.menuElement = this.createMenu(state.items, state.context);\n this.positionMenu(state.position);\n document.body.appendChild(this.menuElement);\n\n // Animate in\n requestAnimationFrame(() => {\n if (this.menuElement) {\n this.menuElement.style.opacity = '1';\n this.menuElement.style.transform = 'scale(1)';\n }\n });\n\n // Add click-outside listener\n document.addEventListener('mousedown', this.handleOutsideClick);\n document.addEventListener('keydown', this.handleKeyDown);\n }\n\n /**\n * Hide the context menu\n */\n hide(): void {\n if (this.menuElement) {\n this.menuElement.style.opacity = '0';\n this.menuElement.style.transform = 'scale(0.95)';\n \n setTimeout(() => {\n if (this.menuElement?.parentNode) {\n this.menuElement.parentNode.removeChild(this.menuElement);\n }\n this.menuElement = null;\n }, 100);\n }\n\n document.removeEventListener('mousedown', this.handleOutsideClick);\n document.removeEventListener('keydown', this.handleKeyDown);\n }\n\n /**\n * Check if menu is visible\n */\n isVisible(): boolean {\n return this.menuElement !== null;\n }\n\n /**\n * Destroy the renderer\n */\n destroy(): void {\n this.hide();\n }\n\n /**\n * Update styling\n */\n updateStyle(style: MenuStyle): void {\n this.style = { ...DEFAULT_STYLE, ...style };\n }\n\n /**\n * Get container reference\n */\n getContainer(): HTMLElement {\n return this._container;\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private createMenu(items: MenuItem[], context: MenuContext): HTMLDivElement {\n const menu = document.createElement('div');\n menu.className = 'velo-plot-context-menu';\n menu.style.cssText = this.getMenuStyle();\n\n items.forEach(item => {\n const element = this.createMenuItem(item, context);\n if (element) {\n menu.appendChild(element);\n }\n });\n\n return menu;\n }\n\n private createMenuItem(item: MenuItem, context: MenuContext): HTMLElement | null {\n // Hidden items\n if ('hidden' in item && item.hidden) return null;\n\n // Separator\n if (item.type === 'separator') {\n const sep = document.createElement('div');\n sep.className = 'velo-plot-menu-separator';\n sep.style.cssText = `\n height: 1px;\n margin: 4px 8px;\n background: ${this.style.separatorColor};\n `;\n return sep;\n }\n\n // Regular item\n const el = document.createElement('div');\n el.className = 'velo-plot-menu-item';\n \n const isDisabled = 'disabled' in item && Boolean(item.disabled);\n el.style.cssText = this.getItemStyle(isDisabled);\n\n // Icon\n if ('icon' in item && item.icon) {\n const icon = document.createElement('span');\n icon.className = 'velo-plot-menu-icon';\n icon.style.cssText = 'margin-right: 12px; width: 16px; text-align: center;';\n icon.textContent = item.icon;\n el.appendChild(icon);\n }\n\n // Label\n const label = document.createElement('span');\n label.className = 'velo-plot-menu-label';\n label.style.cssText = 'flex: 1;';\n label.textContent = item.label;\n el.appendChild(label);\n\n // Checkbox/Radio indicator\n if (item.type === 'checkbox') {\n const check = document.createElement('span');\n check.style.cssText = 'margin-left: 12px; width: 16px;';\n check.textContent = item.checked ? '✓' : '';\n el.appendChild(check);\n }\n\n if (item.type === 'radio') {\n const radio = document.createElement('span');\n radio.style.cssText = 'margin-left: 12px; width: 16px;';\n radio.textContent = item.selected ? '●' : '○';\n el.appendChild(radio);\n }\n\n // Shortcut\n if ('shortcut' in item && item.shortcut) {\n const shortcut = document.createElement('span');\n shortcut.className = 'velo-plot-menu-shortcut';\n shortcut.style.cssText = `\n margin-left: 24px;\n opacity: 0.5;\n font-size: 11px;\n `;\n shortcut.textContent = item.shortcut;\n el.appendChild(shortcut);\n }\n\n // Submenu arrow\n if (item.type === 'submenu') {\n const arrow = document.createElement('span');\n arrow.style.cssText = 'margin-left: 8px;';\n arrow.textContent = '▶';\n el.appendChild(arrow);\n\n // Create submenu on hover\n el.addEventListener('mouseenter', () => {\n this.showSubmenu(el, item.items, context);\n });\n el.addEventListener('mouseleave', (e: MouseEvent) => {\n this.hideSubmenu(el, e);\n });\n }\n\n // Hover effects\n if (!isDisabled) {\n el.addEventListener('mouseenter', () => {\n el.style.background = this.style.hoverBackground;\n });\n el.addEventListener('mouseleave', () => {\n el.style.background = 'transparent';\n });\n\n // Click handler\n el.addEventListener('click', (e) => {\n e.stopPropagation();\n if (item.type !== 'submenu') {\n this.onItemClick(item, context);\n }\n });\n }\n\n return el;\n }\n\n private showSubmenu(parent: HTMLElement, items: MenuItem[], context: MenuContext): void {\n // Remove any existing submenu\n const existing = parent.querySelector('.velo-plot-submenu');\n if (existing) return;\n\n const submenu = document.createElement('div');\n submenu.className = 'velo-plot-submenu';\n submenu.style.cssText = `\n ${this.getMenuStyle()}\n position: absolute;\n left: 100%;\n top: 0;\n margin-left: 4px;\n `;\n\n items.forEach(item => {\n const el = this.createMenuItem(item, context);\n if (el) submenu.appendChild(el);\n });\n\n parent.style.position = 'relative';\n parent.appendChild(submenu);\n }\n\n private hideSubmenu(parent: HTMLElement, e: MouseEvent): void {\n const submenu = parent.querySelector('.velo-plot-submenu');\n if (!submenu) return;\n\n // Check if moving to submenu\n const rect = submenu.getBoundingClientRect();\n if (\n e.clientX >= rect.left &&\n e.clientX <= rect.right &&\n e.clientY >= rect.top &&\n e.clientY <= rect.bottom\n ) {\n return;\n }\n\n setTimeout(() => {\n submenu.remove();\n }, 100);\n }\n\n private positionMenu(position: MenuPosition): void {\n if (!this.menuElement) return;\n\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n \n // Initial position\n this.menuElement.style.left = `${position.x}px`;\n this.menuElement.style.top = `${position.y}px`;\n\n // Get actual dimensions\n const rect = this.menuElement.getBoundingClientRect();\n\n // Adjust if off-screen\n if (rect.right > viewportWidth) {\n this.menuElement.style.left = `${position.x - rect.width}px`;\n }\n if (rect.bottom > viewportHeight) {\n this.menuElement.style.top = `${position.y - rect.height}px`;\n }\n }\n\n private getMenuStyle(): string {\n return `\n position: fixed;\n z-index: ${this.zIndex};\n background: ${this.style.backgroundColor};\n color: ${this.style.textColor};\n border: 1px solid ${this.style.borderColor};\n border-radius: ${this.style.borderRadius};\n box-shadow: ${this.style.boxShadow};\n font-family: ${this.style.fontFamily};\n font-size: ${this.style.fontSize};\n min-width: ${this.style.minWidth};\n max-width: ${this.style.maxWidth};\n padding: 4px 0;\n opacity: 0;\n transform: scale(0.95);\n transform-origin: top left;\n transition: opacity ${this.style.animationDuration}, transform ${this.style.animationDuration};\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n `;\n }\n\n private getItemStyle(disabled: boolean): string {\n return `\n display: flex;\n align-items: center;\n padding: ${this.style.itemPadding};\n cursor: ${disabled ? 'default' : 'pointer'};\n opacity: ${disabled ? this.style.disabledOpacity : 1};\n user-select: none;\n transition: background 100ms;\n `;\n }\n\n private handleOutsideClick = (e: MouseEvent): void => {\n if (this.menuElement && !this.menuElement.contains(e.target as Node)) {\n this.hide();\n }\n };\n\n private handleKeyDown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') {\n this.hide();\n }\n };\n}\n","/**\n * Velo Plot - Context Menu Plugin\n * \n * Provides a customizable right-click context menu for chart interactions.\n * \n * @module plugins/context-menu\n * \n * @example\n * ```typescript\n * import { createChart } from 'velo-plot';\n * import { PluginContextMenu } from 'velo-plot/plugins/context-menu';\n * \n * const chart = createChart({ container });\n * chart.use(PluginContextMenu({\n * items: [\n * { label: 'Zoom to Fit', icon: '🔍', action: 'zoomToFit' },\n * { type: 'separator' },\n * { label: 'Export...', icon: '💾', type: 'submenu', items: [\n * { label: 'CSV', action: 'exportCSV' },\n * { label: 'JSON', action: 'exportJSON' },\n * ]},\n * ]\n * }));\n * ```\n */\n\nimport type { PluginManifest, ChartPlugin, PluginContext } from \"../types\";\nimport type {\n PluginContextMenuConfig,\n MenuItem,\n MenuContext,\n MenuState,\n BuiltinAction,\n MenuActionItem\n} from \"./types\";\nimport { MenuRenderer } from \"./renderer\";\n\n// Re-export types\nexport * from \"./types\";\n\n// ============================================\n// Default Menu Items\n// ============================================\n\nconst DEFAULT_PLOT_ITEMS: MenuItem[] = [\n { \n label: 'Zoom to Fit', \n icon: '⊡', \n action: 'zoomToFit',\n shortcut: 'Home'\n },\n { \n label: 'Reset View', \n icon: '↻', \n action: 'resetView',\n shortcut: 'R'\n },\n { type: 'separator' },\n {\n label: 'Interaction Mode',\n icon: '✋',\n type: 'submenu',\n items: [\n { label: 'Pan', icon: '✋', action: 'panMode' },\n { label: 'Box Zoom', icon: '⬚', action: 'boxZoomMode' },\n { label: 'Select', icon: '➤', action: 'selectMode' },\n ]\n },\n { type: 'separator' },\n {\n label: 'Export',\n icon: '💾',\n type: 'submenu',\n items: [\n { label: 'CSV', icon: '📄', action: 'exportCSV' },\n { label: 'JSON', icon: '📋', action: 'exportJSON' },\n { label: 'Image', icon: '🖼️', action: 'exportImage' },\n ]\n },\n { \n label: 'Copy to Clipboard', \n icon: '📋', \n action: 'copyToClipboard',\n shortcut: 'Ctrl+C'\n },\n { type: 'separator' },\n {\n label: 'Annotations',\n icon: '📝',\n type: 'submenu',\n items: [\n { label: 'Add Horizontal Line', icon: '—', action: 'addHorizontalLine' },\n { label: 'Add Vertical Line', icon: '|', action: 'addVerticalLine' },\n { label: 'Add Text', icon: 'T', action: 'addTextAnnotation' },\n { type: 'separator' },\n { label: 'Clear All', icon: '🗑️', action: 'clearAnnotations' },\n ]\n },\n { type: 'separator' },\n { \n label: 'Toggle Legend', \n icon: '☰', \n action: 'toggleLegend',\n shortcut: 'L'\n },\n { \n label: 'Toggle Grid', \n icon: '#', \n action: 'toggleGrid',\n shortcut: 'G'\n },\n { \n label: 'Show Statistics', \n icon: '📊', \n action: 'showStats',\n shortcut: 'S'\n },\n];\n\n// ============================================\n// Plugin Definition\n// ============================================\n\nconst manifestContextMenu: PluginManifest = {\n name: \"velo-plot-context-menu\",\n version: \"1.0.0\",\n description: \"Customizable right-click context menu for velo-plot\",\n author: \"Velo Plot Team\",\n provides: [\"interaction\"],\n tags: [\"context-menu\", \"right-click\", \"menu\", \"ui\"],\n};\n\n/**\n * Velo Plot Context Menu Plugin\n * \n * Adds a customizable context menu with built-in actions and \n * extensibility for custom menu items.\n */\nexport function PluginContextMenu(\n config: PluginContextMenuConfig = {}\n): ChartPlugin<PluginContextMenuConfig> {\n \n const {\n enabled = true,\n items = [],\n templates = [],\n useDefaults = true,\n style,\n preventDefault = true,\n showOnRightClick = true,\n showOnLongPress = true,\n longPressDuration = 500,\n beforeShow,\n afterHide,\n zIndex = 10000\n } = config;\n\n let _ctx: PluginContext | null = null;\n let renderer: MenuRenderer | null = null;\n let state: MenuState = {\n visible: false,\n position: { x: 0, y: 0 },\n items: [],\n submenuPath: [],\n context: null\n };\n\n // Long press handling\n let longPressTimer: ReturnType<typeof setTimeout> | null = null;\n let longPressStart: { x: number; y: number } | null = null;\n\n // ============================================\n // Action Handlers\n // ============================================\n\n function executeAction(action: BuiltinAction, context: MenuContext): void {\n if (!_ctx) return;\n\n const chart = _ctx.chart as any;\n\n switch (action) {\n case 'zoomToFit':\n chart.zoomToFit?.();\n break;\n \n case 'zoomIn':\n chart.zoom?.(1.5);\n break;\n \n case 'zoomOut':\n chart.zoom?.(0.67);\n break;\n \n case 'resetView':\n chart.resetView?.();\n break;\n \n case 'panMode':\n chart.setMode?.('pan');\n break;\n \n case 'boxZoomMode':\n chart.setMode?.('boxZoom');\n break;\n \n case 'selectMode':\n chart.setMode?.('select');\n break;\n \n case 'exportCSV':\n executeExport('csv');\n break;\n \n case 'exportJSON':\n executeExport('json');\n break;\n \n case 'exportImage':\n downloadImage();\n break;\n \n case 'copyToClipboard':\n copyToClipboard();\n break;\n \n case 'toggleLegend':\n chart.setShowLegend?.(!chart.getShowLegend?.());\n break;\n \n case 'toggleGrid':\n chart.setShowGrid?.(!chart.getShowGrid?.());\n break;\n \n case 'toggleCrosshair':\n // Toggle crosshair if available\n break;\n \n case 'addHorizontalLine':\n addAnnotation('hline', context);\n break;\n \n case 'addVerticalLine':\n addAnnotation('vline', context);\n break;\n \n case 'addTextAnnotation':\n addAnnotation('text', context);\n break;\n \n case 'clearAnnotations':\n chart.clearAnnotations?.();\n break;\n \n case 'showStats':\n // Show stats panel\n break;\n }\n }\n\n function executeExport(format: 'csv' | 'json'): void {\n const chart = _ctx?.chart as any;\n const exportPlugin = chart?.plugins?.get('velo-plot-data-export')?.api;\n \n if (exportPlugin) {\n exportPlugin.download(format);\n } else {\n // Fallback to basic export\n const data = chart.toCSV?.() || chart.toJSON?.();\n if (data) {\n downloadString(data, `chart.${format}`, `text/${format}`);\n }\n }\n }\n\n function downloadImage(): void {\n const chart = _ctx?.chart as any;\n const dataUrl = chart.toImage?.('png');\n if (dataUrl) {\n const link = document.createElement('a');\n link.href = dataUrl;\n link.download = 'chart.png';\n link.click();\n }\n }\n\n function copyToClipboard(): void {\n const chart = _ctx?.chart as any;\n const data = chart.toCSV?.();\n if (data) {\n navigator.clipboard.writeText(data).catch(console.error);\n }\n }\n\n function addAnnotation(type: 'hline' | 'vline' | 'text', context: MenuContext): void {\n if (!context.dataPosition) return;\n \n const chart = _ctx?.chart as any;\n const { x, y } = context.dataPosition;\n\n switch (type) {\n case 'hline':\n chart.addAnnotation?.({\n type: 'horizontalLine',\n y,\n color: '#ff6b6b',\n label: `Y = ${y.toFixed(4)}`\n });\n break;\n \n case 'vline':\n chart.addAnnotation?.({\n type: 'verticalLine',\n x,\n color: '#4ecdc4',\n label: `X = ${x.toFixed(4)}`\n });\n break;\n \n case 'text':\n chart.addAnnotation?.({\n type: 'text',\n x,\n y,\n text: 'Annotation',\n color: '#ffffff'\n });\n break;\n }\n }\n\n function downloadString(content: string, filename: string, type: string): void {\n const blob = new Blob([content], { type });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n link.click();\n URL.revokeObjectURL(url);\n }\n\n // ============================================\n // Menu Logic\n // ============================================\n\n function buildMenuContext(event: MouseEvent): MenuContext {\n const chart = _ctx?.chart as any;\n const container = _ctx?.ui.container;\n \n if (!container) {\n return {\n chart,\n event,\n pixelPosition: { x: event.clientX, y: event.clientY },\n dataPosition: null,\n seriesId: null,\n annotationId: null,\n pointIndex: null,\n area: 'outside'\n };\n }\n\n const rect = container.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n\n // Determine area\n const plotArea = _ctx?.render.plotArea;\n let area: MenuContext['area'] = 'outside';\n \n if (plotArea) {\n if (x >= plotArea.x && x <= plotArea.x + plotArea.width &&\n y >= plotArea.y && y <= plotArea.y + plotArea.height) {\n area = 'plot';\n } else if (y > plotArea.y + plotArea.height) {\n area = 'xAxis';\n } else if (x < plotArea.x) {\n area = 'yAxis';\n }\n }\n\n // Convert to data coordinates\n let dataPosition: { x: number; y: number } | null = null;\n if (area === 'plot' && _ctx) {\n dataPosition = {\n x: _ctx.coords.pixelToDataX(x),\n y: _ctx.coords.pixelToDataY(y)\n };\n }\n\n // Try to detect series/point\n let seriesId: string | null = null;\n let pointIndex: number | null = null;\n \n if (dataPosition && _ctx) {\n const pick = _ctx.coords.pickPoint(x, y, 10);\n if (pick) {\n seriesId = pick.seriesId;\n pointIndex = pick.index;\n }\n }\n\n return {\n chart,\n event,\n pixelPosition: { x, y },\n dataPosition,\n seriesId,\n annotationId: null,\n pointIndex,\n area\n };\n }\n\n function getMenuItems(context: MenuContext): MenuItem[] {\n // Try templates first\n for (const template of templates) {\n if (template.condition?.(context)) {\n return [...template.items];\n }\n }\n\n // Build items based on context\n let menuItems: MenuItem[] = [];\n\n if (useDefaults) {\n menuItems = [...DEFAULT_PLOT_ITEMS];\n }\n\n // Add custom items\n if (items.length > 0) {\n if (menuItems.length > 0) {\n menuItems.push({ type: 'separator' });\n }\n menuItems.push(...items);\n }\n\n // Apply beforeShow hook\n if (beforeShow) {\n const result = beforeShow(context);\n if (result === false) {\n return [];\n }\n menuItems = result;\n }\n\n return menuItems;\n }\n\n function showMenu(event: MouseEvent): void {\n if (!enabled || !_ctx) return;\n\n const context = buildMenuContext(event);\n const menuItems = getMenuItems(context);\n\n if (menuItems.length === 0) return;\n\n state = {\n visible: true,\n position: { x: event.clientX, y: event.clientY },\n items: menuItems,\n submenuPath: [],\n context\n };\n\n renderer?.show(state);\n }\n\n function hideMenu(): void {\n state = {\n ...state,\n visible: false,\n context: null\n };\n\n renderer?.hide();\n afterHide?.();\n }\n\n function handleItemClick(item: MenuItem, context: MenuContext): void {\n hideMenu();\n\n if (item.type === 'separator' || item.type === 'submenu') {\n return;\n }\n\n if (item.type === 'checkbox' && item.onChange) {\n item.onChange(!item.checked, context);\n return;\n }\n\n if (item.type === 'radio' && item.onChange) {\n item.onChange(item.value, context);\n return;\n }\n\n // Action item\n const actionItem = item as MenuActionItem;\n \n if (actionItem.onClick) {\n actionItem.onClick(context);\n } else if (actionItem.action) {\n executeAction(actionItem.action, context);\n }\n }\n\n // ============================================\n // Event Handlers\n // ============================================\n\n function handleContextMenu(e: MouseEvent): void {\n if (!showOnRightClick) return;\n \n if (preventDefault) {\n e.preventDefault();\n }\n\n showMenu(e);\n }\n\n function handleTouchStart(e: TouchEvent): void {\n if (!showOnLongPress) return;\n\n const touch = e.touches[0];\n longPressStart = { x: touch.clientX, y: touch.clientY };\n\n longPressTimer = setTimeout(() => {\n if (longPressStart) {\n const syntheticEvent = new MouseEvent('contextmenu', {\n clientX: longPressStart.x,\n clientY: longPressStart.y\n });\n showMenu(syntheticEvent);\n }\n }, longPressDuration);\n }\n\n function handleTouchMove(e: TouchEvent): void {\n if (!longPressStart || !longPressTimer) return;\n\n const touch = e.touches[0];\n const dx = touch.clientX - longPressStart.x;\n const dy = touch.clientY - longPressStart.y;\n\n // Cancel if moved too far\n if (Math.sqrt(dx * dx + dy * dy) > 10) {\n clearTimeout(longPressTimer);\n longPressTimer = null;\n longPressStart = null;\n }\n }\n\n function handleTouchEnd(): void {\n if (longPressTimer) {\n clearTimeout(longPressTimer);\n longPressTimer = null;\n }\n longPressStart = null;\n }\n\n // ============================================\n // Plugin Implementation\n // ============================================\n\n return {\n manifest: manifestContextMenu,\n\n onInit(ctx: PluginContext) {\n _ctx = ctx;\n\n const container = ctx.ui.container;\n\n renderer = new MenuRenderer(\n container,\n style,\n zIndex,\n handleItemClick\n );\n\n // Attach event listeners\n container.addEventListener('contextmenu', handleContextMenu);\n container.addEventListener('touchstart', handleTouchStart, { passive: true });\n container.addEventListener('touchmove', handleTouchMove, { passive: true });\n container.addEventListener('touchend', handleTouchEnd);\n\n ctx.log.info('ContextMenu plugin initialized');\n },\n\n onDestroy() {\n const container = _ctx?.ui.container;\n\n if (container) {\n container.removeEventListener('contextmenu', handleContextMenu);\n container.removeEventListener('touchstart', handleTouchStart);\n container.removeEventListener('touchmove', handleTouchMove);\n container.removeEventListener('touchend', handleTouchEnd);\n }\n\n renderer?.destroy();\n renderer = null;\n _ctx = null;\n },\n\n api: {\n /**\n * Show the context menu programmatically\n */\n show(x: number, y: number, customItems?: MenuItem[]) {\n const event = new MouseEvent('contextmenu', { clientX: x, clientY: y });\n const context = buildMenuContext(event);\n \n state = {\n visible: true,\n position: { x, y },\n items: customItems || getMenuItems(context),\n submenuPath: [],\n context\n };\n\n renderer?.show(state);\n },\n\n /**\n * Hide the context menu\n */\n hide() {\n hideMenu();\n },\n\n /**\n * Check if menu is visible\n */\n isVisible(): boolean {\n return renderer?.isVisible() ?? false;\n },\n\n /**\n * Update menu items dynamically\n */\n setItems(newItems: MenuItem[]) {\n // Update for next show\n (config as any).items = newItems;\n },\n\n /**\n * Enable/disable the menu\n */\n setEnabled(value: boolean) {\n (config as any).enabled = value;\n },\n\n /**\n * Update styling\n */\n setStyle(newStyle: typeof style) {\n renderer?.updateStyle(newStyle || {});\n },\n\n /**\n * Get available built-in actions\n */\n getBuiltinActions(): BuiltinAction[] {\n return [\n 'zoomToFit', 'zoomIn', 'zoomOut', 'resetView',\n 'panMode', 'boxZoomMode', 'selectMode',\n 'exportCSV', 'exportJSON', 'exportImage', 'copyToClipboard',\n 'toggleLegend', 'toggleGrid', 'toggleCrosshair',\n 'addHorizontalLine', 'addVerticalLine', 'addTextAnnotation', 'clearAnnotations',\n 'showStats'\n ];\n }\n }\n };\n}\n\nexport default PluginContextMenu;\n"],"names":["DEFAULT_STYLE","MenuRenderer","container","style","zIndex","onItemClick","__publicField","e","state","_a","items","context","menu","item","element","sep","el","isDisabled","icon","label","check","radio","shortcut","arrow","parent","submenu","rect","position","viewportWidth","viewportHeight","disabled","DEFAULT_PLOT_ITEMS","manifestContextMenu","PluginContextMenu","config","enabled","templates","useDefaults","preventDefault","showOnRightClick","showOnLongPress","longPressDuration","beforeShow","afterHide","_ctx","renderer","longPressTimer","longPressStart","executeAction","action","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","chart","executeExport","downloadImage","copyToClipboard","addAnnotation","format","exportPlugin","data","downloadString","dataUrl","link","type","x","y","content","filename","blob","url","buildMenuContext","event","plotArea","area","dataPosition","seriesId","pointIndex","pick","getMenuItems","template","menuItems","result","showMenu","hideMenu","handleItemClick","actionItem","handleContextMenu","handleTouchStart","touch","syntheticEvent","handleTouchMove","dx","dy","handleTouchEnd","ctx","customItems","newItems","value","newStyle"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { PluginDataExportConfig } from './types';
3
3
 
4
4
  export * from './types';
5
5
  /**
6
- * Sci Plot Data Export Plugin
6
+ * Velo Plot Data Export Plugin
7
7
  *
8
8
  * Provides comprehensive data export functionality with support for
9
9
  * multiple scientific and standard data formats.
@@ -1,3 +1,3 @@
1
1
  export * from './data-export/index'
2
- import SciPlot from './data-export/index'
3
- export default SciPlot
2
+ import VeloPlot from './data-export/index'
3
+ export default VeloPlot
@@ -43,7 +43,7 @@ function _(r, s) {
43
43
  precision: e = 6,
44
44
  scientificThreshold: p = 1e6
45
45
  } = s, v = [], O = s.format === "xlsx" ? D.xlsx.bom : "";
46
- if (f && Object.keys(l).length > 0 && (v.push("# Sci Plot Data Export"), n && v.push(`# Timestamp: ${(/* @__PURE__ */ new Date()).toISOString()}`), Object.entries(l).forEach(([d, x]) => {
46
+ if (f && Object.keys(l).length > 0 && (v.push("# Velo Plot Data Export"), n && v.push(`# Timestamp: ${(/* @__PURE__ */ new Date()).toISOString()}`), Object.entries(l).forEach(([d, x]) => {
47
47
  v.push(`# ${d}: ${x}`);
48
48
  }), v.push("")), i) {
49
49
  const d = [];
@@ -220,7 +220,7 @@ const k = {
220
220
  name: "velo-plot-data-export",
221
221
  version: "1.0.0",
222
222
  description: "Advanced data export capabilities for velo-plot",
223
- author: "Sci Plot Team",
223
+ author: "Velo Plot Team",
224
224
  provides: ["export"],
225
225
  tags: ["export", "csv", "json", "matlab", "python", "data"]
226
226
  };