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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockDatafeed-DHIDPcpX.js","sources":["../src/plugins/drawing-tools/snapToCandle.ts","../src/plugins/drawing-tools/measure.ts","../src/plugins/drawing-tools/index.ts","../src/plugins/replay/index.ts","../src/trading/datafeed.ts","../src/trading/mockDatafeed.ts"],"sourcesContent":["/**\n * Snap drawing points to nearest candlestick O/H/L/C (TradingView-style magnet).\n */\n\nexport interface CandleSnapInput {\n x: number;\n y: number;\n barX: Float32Array | Float64Array;\n open: Float32Array | Float64Array;\n high: Float32Array | Float64Array;\n low: Float32Array | Float64Array;\n close: Float32Array | Float64Array;\n dataToPixelX: (x: number) => number;\n dataToPixelY: (y: number) => number;\n pixelThreshold?: number;\n enabled?: boolean;\n}\n\nexport function findNearestBarIndex(\n barX: Float32Array | Float64Array,\n x: number,\n): number {\n if (barX.length === 0) return -1;\n let bestIdx = 0;\n let bestDist = Math.abs(barX[0] - x);\n for (let i = 1; i < barX.length; i++) {\n const d = Math.abs(barX[i] - x);\n if (d < bestDist) {\n bestDist = d;\n bestIdx = i;\n }\n }\n return bestIdx;\n}\n\nexport function snapToCandle(input: CandleSnapInput): { x: number; y: number } {\n if (input.enabled === false || input.barX.length === 0) {\n return { x: input.x, y: input.y };\n }\n\n const idx = findNearestBarIndex(input.barX, input.x);\n if (idx < 0) return { x: input.x, y: input.y };\n\n const barX = input.barX[idx];\n const candidates = [\n input.open[idx],\n input.high[idx],\n input.low[idx],\n input.close[idx],\n ];\n\n const clickPy = input.dataToPixelY(input.y);\n const threshold = input.pixelThreshold ?? 12;\n let bestY = input.y;\n let bestPyDist = Infinity;\n\n for (const cy of candidates) {\n const py = input.dataToPixelY(cy);\n const dist = Math.abs(py - clickPy);\n if (dist < bestPyDist && dist <= threshold) {\n bestPyDist = dist;\n bestY = cy;\n }\n }\n\n return { x: barX, y: bestY };\n}\n","/**\n * Measurement helper for the price-range / measure tool (TradingView-style).\n */\n\nexport interface MeasurePoint {\n x: number;\n y: number;\n}\n\nexport interface Measurement {\n /** Absolute price change (end - start) */\n change: number;\n /** Percentage change relative to the start price */\n percent: number;\n /** Number of bars spanned (rounded X distance) */\n bars: number;\n /** True when the range moves up (change >= 0) */\n up: boolean;\n}\n\nexport function computeMeasurement(a: MeasurePoint, b: MeasurePoint): Measurement {\n const change = b.y - a.y;\n const denom = Math.abs(a.y);\n const percent = denom > 0 ? (change / denom) * 100 : 0;\n const bars = Math.round(Math.abs(b.x - a.x));\n return { change, percent, bars, up: change >= 0 };\n}\n\nexport function formatMeasurement(m: Measurement): string {\n const sign = m.change >= 0 ? \"+\" : \"\";\n return `${sign}${m.change.toFixed(2)} (${sign}${m.percent.toFixed(2)}%) · ${m.bars} bars`;\n}\n\n/** Compact price formatting used for level labels. */\nexport function formatPrice(value: number): string {\n const abs = Math.abs(value);\n const decimals = abs >= 1000 ? 0 : abs >= 1 ? 2 : 4;\n return value.toLocaleString(\"en-US\", {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n}\n","/**\n * PluginDrawingTools — interactive drawing on chart (Stage 2.9).\n * TradingView-style live preview, drag-to-draw, optional candle magnet.\n */\n\nimport type { ChartPlugin, InteractionEvent, PluginContext, PluginManifest } from \"../types\";\nimport type { Annotation } from \"../../core/annotations/types\";\nimport type { Series } from \"../../core/Series\";\nimport { snapToCandle } from \"./snapToCandle\";\nimport { computeMeasurement, formatMeasurement, formatPrice } from \"./measure\";\n\nexport type DrawingMode =\n | \"none\"\n | \"pan\"\n | \"trendline\"\n | \"horizontal\"\n | \"vertical\"\n | \"rectangle\"\n | \"fibonacci\"\n | \"measure\";\n\nconst FIB_LEVELS = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1];\nconst DRAG_THRESHOLD_PX = 4;\nconst DEFAULT_MEASURE_UP = \"#26a69a\";\nconst DEFAULT_MEASURE_DOWN = \"#ef5350\";\n\nexport interface PluginDrawingToolsConfig {\n /** Default stroke color */\n color?: string;\n /** Enable candle magnet by default */\n magnet?: boolean;\n /** Return to pan mode after each completed stroke (default true) */\n autoDeselect?: boolean;\n /** Notified when drawing mode changes (including auto-deselect to none) */\n onModeChange?: (mode: DrawingMode) => void;\n /** Color for upward measurements (default green) */\n measureUpColor?: string;\n /** Color for downward measurements (default red) */\n measureDownColor?: string;\n}\n\nfunction withAlpha(color: string, alpha: string): string {\n return color.startsWith(\"#\") && color.length === 7 ? color + alpha : color;\n}\n\nexport interface DrawingToolsAPI {\n setMode(mode: DrawingMode): void;\n getMode(): DrawingMode;\n setMagnet(enabled: boolean): void;\n isMagnet(): boolean;\n undo(): boolean;\n redo(): boolean;\n clear(): void;\n}\n\nconst manifest: PluginManifest = {\n name: \"velo-plot-drawing-tools\",\n version: \"1.0.0\",\n description: \"Interactive trendline, horizontal, vertical, rectangle, and fibonacci drawing\",\n provides: [\"drawing\"],\n tags: [\"drawing\", \"annotations\", \"trading\"],\n};\n\ninterface DrawPoint {\n x: number;\n y: number;\n}\n\ninterface DrawState {\n mode: DrawingMode;\n pending: DrawPoint | null;\n start: DrawPoint | null;\n dragging: boolean;\n dragMoved: boolean;\n dragStartPixel: { x: number; y: number } | null;\n cursor: DrawPoint | null;\n magnet: boolean;\n undoStack: Annotation[][];\n redoStack: Annotation[][];\n}\n\nfunction isDrawingMode(mode: DrawingMode): boolean {\n return mode !== \"none\" && mode !== \"pan\";\n}\n\nfunction findCandlestickSeries(ctx: PluginContext): Series | undefined {\n for (const s of ctx.data.getAllSeries()) {\n if (s.getType() === \"candlestick\") return s;\n }\n return undefined;\n}\n\nexport function PluginDrawingTools(\n config: PluginDrawingToolsConfig = {},\n): ChartPlugin<PluginDrawingToolsConfig> {\n let ctx: PluginContext | null = null;\n const autoDeselect = config.autoDeselect !== false;\n let state: DrawState = {\n mode: \"none\",\n pending: null,\n start: null,\n dragging: false,\n dragMoved: false,\n dragStartPixel: null,\n cursor: null,\n magnet: config.magnet ?? false,\n undoStack: [],\n redoStack: [],\n };\n\n const stroke = config.color ?? \"#38bdf8\";\n const measureUp = config.measureUpColor ?? DEFAULT_MEASURE_UP;\n const measureDown = config.measureDownColor ?? DEFAULT_MEASURE_DOWN;\n\n function snapshot(): Annotation[] {\n return ctx?.chart.getAnnotations?.() ?? [];\n }\n\n function pushUndo(): void {\n state.undoStack.push(snapshot());\n state.redoStack = [];\n }\n\n function resetInteractionState(): void {\n state.pending = null;\n state.start = null;\n state.dragging = false;\n state.dragMoved = false;\n state.dragStartPixel = null;\n }\n\n function setModeInternal(mode: DrawingMode): void {\n state.mode = mode;\n resetInteractionState();\n config.onModeChange?.(mode);\n ctx?.requestRender?.();\n }\n\n function finishStroke(): void {\n resetInteractionState();\n if (autoDeselect) {\n setModeInternal(\"none\");\n } else {\n ctx?.requestRender?.();\n }\n }\n\n function resolvePoint(x: number, y: number): DrawPoint {\n if (!ctx || !state.magnet) return { x, y };\n const series = findCandlestickSeries(ctx);\n if (!series) return { x, y };\n const d = series.getData();\n if (!d.open || !d.high || !d.low || !d.close) return { x, y };\n return snapToCandle({\n x,\n y,\n barX: d.x,\n open: d.open,\n high: d.high,\n low: d.low,\n close: d.close,\n dataToPixelX: ctx.coords.dataToPixelX,\n dataToPixelY: (dy) => ctx!.coords.dataToPixelY(dy),\n enabled: true,\n });\n }\n\n function pointFromEvent(pluginCtx: PluginContext, event: InteractionEvent): DrawPoint {\n return resolvePoint(\n pluginCtx.coords.pixelToDataX(event.pixelX),\n pluginCtx.coords.pixelToDataY(event.pixelY),\n );\n }\n\n function commitHorizontal(y: number): void {\n if (!ctx) return;\n pushUndo();\n ctx.chart.addAnnotation({\n type: \"horizontal-line\",\n y,\n color: stroke,\n interactive: true,\n });\n }\n\n function commitVertical(x: number): void {\n if (!ctx) return;\n pushUndo();\n ctx.chart.addAnnotation({\n type: \"vertical-line\",\n x,\n color: stroke,\n interactive: true,\n });\n }\n\n function commitMeasure(p0: DrawPoint, p1: DrawPoint): void {\n if (!ctx) return;\n pushUndo();\n\n const m = computeMeasurement(p0, p1);\n const color = m.up ? measureUp : measureDown;\n const midX = (p0.x + p1.x) / 2;\n ctx.chart.addAnnotation({\n type: \"rectangle\",\n xMin: Math.min(p0.x, p1.x),\n xMax: Math.max(p0.x, p1.x),\n yMin: Math.min(p0.y, p1.y),\n yMax: Math.max(p0.y, p1.y),\n strokeColor: color,\n fillColor: withAlpha(color, \"33\"),\n interactive: true,\n });\n ctx.chart.addAnnotation({\n type: \"arrow\",\n x1: midX,\n y1: p0.y,\n x2: midX,\n y2: p1.y,\n color,\n headStyle: \"filled\",\n interactive: true,\n });\n ctx.chart.addAnnotation({\n type: \"text\",\n x: midX,\n y: p1.y,\n text: formatMeasurement(m),\n color: \"#ffffff\",\n backgroundColor: color,\n padding: 4,\n fontWeight: \"bold\",\n anchor: m.up ? \"bottom-center\" : \"top-center\",\n interactive: true,\n });\n }\n\n function commitTwoPoint(p0: DrawPoint, p1: DrawPoint): void {\n if (!ctx) return;\n\n if (state.mode === \"measure\") {\n commitMeasure(p0, p1);\n return;\n }\n\n pushUndo();\n\n if (state.mode === \"trendline\") {\n ctx.chart.addAnnotation({\n type: \"arrow\",\n x1: p0.x,\n y1: p0.y,\n x2: p1.x,\n y2: p1.y,\n color: stroke,\n interactive: true,\n });\n } else if (state.mode === \"rectangle\") {\n ctx.chart.addAnnotation({\n type: \"rectangle\",\n xMin: Math.min(p0.x, p1.x),\n xMax: Math.max(p0.x, p1.x),\n yMin: Math.min(p0.y, p1.y),\n yMax: Math.max(p0.y, p1.y),\n strokeColor: stroke,\n fillColor: stroke + \"22\",\n interactive: true,\n });\n } else if (state.mode === \"fibonacci\") {\n const yMin = Math.min(p0.y, p1.y);\n const yMax = Math.max(p0.y, p1.y);\n for (const level of FIB_LEVELS) {\n const fy = yMax - (yMax - yMin) * level;\n ctx.chart.addAnnotation({\n type: \"horizontal-line\",\n y: fy,\n color: stroke,\n lineDash: level === 0 || level === 1 ? undefined : [4, 4],\n label: `${(level * 100).toFixed(1)}% ${formatPrice(fy)}`,\n labelPosition: \"right\",\n interactive: true,\n });\n }\n }\n }\n\n function drawPreview(\n c2d: CanvasRenderingContext2D,\n plotArea: { x: number; y: number; width: number; height: number },\n coords: PluginContext[\"coords\"],\n ): void {\n const mode = state.mode;\n if (!isDrawingMode(mode) || !state.cursor) return;\n\n const cursor = state.cursor;\n const anchor = state.pending ?? state.start;\n\n c2d.save();\n c2d.strokeStyle = stroke;\n c2d.lineWidth = 1.5;\n c2d.setLineDash([6, 4]);\n c2d.globalAlpha = 0.85;\n\n const toPx = (x: number, y: number) => ({\n px: coords.dataToPixelX(x),\n py: coords.dataToPixelY(y),\n });\n\n if (mode === \"horizontal\") {\n const { py } = toPx(0, cursor.y);\n c2d.beginPath();\n c2d.moveTo(plotArea.x, py);\n c2d.lineTo(plotArea.x + plotArea.width, py);\n c2d.stroke();\n } else if (mode === \"vertical\") {\n const { px } = toPx(cursor.x, 0);\n c2d.beginPath();\n c2d.moveTo(px, plotArea.y);\n c2d.lineTo(px, plotArea.y + plotArea.height);\n c2d.stroke();\n } else if (anchor) {\n const a = toPx(anchor.x, anchor.y);\n const b = toPx(cursor.x, cursor.y);\n\n if (mode === \"trendline\") {\n c2d.beginPath();\n c2d.moveTo(a.px, a.py);\n c2d.lineTo(b.px, b.py);\n c2d.stroke();\n } else if (mode === \"rectangle\") {\n const x = Math.min(a.px, b.px);\n const y = Math.min(a.py, b.py);\n const w = Math.abs(b.px - a.px);\n const h = Math.abs(b.py - a.py);\n c2d.strokeRect(x, y, w, h);\n c2d.fillStyle = stroke + \"22\";\n c2d.fillRect(x, y, w, h);\n } else if (mode === \"fibonacci\") {\n const yMin = Math.min(anchor.y, cursor.y);\n const yMax = Math.max(anchor.y, cursor.y);\n c2d.font = \"11px sans-serif\";\n c2d.textAlign = \"left\";\n c2d.textBaseline = \"bottom\";\n for (const level of FIB_LEVELS) {\n const fy = yMax - (yMax - yMin) * level;\n const { py } = toPx(0, fy);\n c2d.beginPath();\n c2d.moveTo(plotArea.x, py);\n c2d.lineTo(plotArea.x + plotArea.width, py);\n c2d.stroke();\n c2d.save();\n c2d.setLineDash([]);\n c2d.globalAlpha = 1;\n c2d.fillStyle = stroke;\n c2d.fillText(\n `${(level * 100).toFixed(1)}% ${formatPrice(fy)}`,\n plotArea.x + 4,\n py - 2,\n );\n c2d.restore();\n }\n } else if (mode === \"measure\") {\n drawMeasurePreview(c2d, a, b, anchor, cursor);\n }\n }\n\n c2d.restore();\n }\n\n function drawMeasurePreview(\n c2d: CanvasRenderingContext2D,\n a: { px: number; py: number },\n b: { px: number; py: number },\n anchor: DrawPoint,\n cursor: DrawPoint,\n ): void {\n const m = computeMeasurement(anchor, cursor);\n const color = m.up ? measureUp : measureDown;\n const x = Math.min(a.px, b.px);\n const y = Math.min(a.py, b.py);\n const w = Math.abs(b.px - a.px);\n const h = Math.abs(b.py - a.py);\n\n c2d.setLineDash([]);\n c2d.globalAlpha = 0.9;\n c2d.fillStyle = withAlpha(color, \"33\");\n c2d.fillRect(x, y, w, h);\n c2d.strokeStyle = color;\n c2d.lineWidth = 1.5;\n c2d.strokeRect(x, y, w, h);\n\n // Vertical direction arrow at the horizontal center.\n const midX = (a.px + b.px) / 2;\n c2d.beginPath();\n c2d.moveTo(midX, a.py);\n c2d.lineTo(midX, b.py);\n c2d.stroke();\n const headLen = 7;\n const dir = b.py >= a.py ? 1 : -1;\n c2d.beginPath();\n c2d.moveTo(midX, b.py);\n c2d.lineTo(midX - 4, b.py - dir * headLen);\n c2d.lineTo(midX + 4, b.py - dir * headLen);\n c2d.closePath();\n c2d.fillStyle = color;\n c2d.fill();\n\n // Label with change / percent / bars.\n const label = formatMeasurement(m);\n c2d.font = \"12px sans-serif\";\n const textW = c2d.measureText(label).width;\n const padX = 6;\n const boxW = textW + padX * 2;\n const boxH = 20;\n const boxX = midX - boxW / 2;\n const boxY = m.up ? b.py - boxH - 8 : b.py + 8;\n c2d.globalAlpha = 1;\n c2d.fillStyle = color;\n c2d.fillRect(boxX, boxY, boxW, boxH);\n c2d.fillStyle = \"#ffffff\";\n c2d.textAlign = \"center\";\n c2d.textBaseline = \"middle\";\n c2d.fillText(label, midX, boxY + boxH / 2);\n }\n\n function handleMouseDown(pluginCtx: PluginContext, event: InteractionEvent): void {\n if (!event.inPlotArea) return;\n\n event.preventDefault();\n const point = pointFromEvent(pluginCtx, event);\n\n if (state.mode === \"horizontal\") {\n commitHorizontal(point.y);\n finishStroke();\n return;\n }\n\n if (state.mode === \"vertical\") {\n commitVertical(point.x);\n finishStroke();\n return;\n }\n\n if (state.pending) {\n commitTwoPoint(state.pending, point);\n finishStroke();\n return;\n }\n\n state.start = point;\n state.dragging = true;\n state.dragMoved = false;\n state.dragStartPixel = { x: event.pixelX, y: event.pixelY };\n state.cursor = point;\n pluginCtx.requestRender?.();\n }\n\n function handleMouseMove(pluginCtx: PluginContext, event: InteractionEvent): void {\n const point = pointFromEvent(pluginCtx, event);\n state.cursor = point;\n\n if (state.dragging && state.dragStartPixel) {\n const dx = event.pixelX - state.dragStartPixel.x;\n const dy = event.pixelY - state.dragStartPixel.y;\n if (Math.hypot(dx, dy) >= DRAG_THRESHOLD_PX) {\n state.dragMoved = true;\n }\n }\n\n event.preventDefault();\n pluginCtx.requestRender?.();\n }\n\n function handleMouseUp(pluginCtx: PluginContext, event: InteractionEvent): void {\n if (!state.dragging || !state.start) return;\n\n const point = pointFromEvent(pluginCtx, event);\n const start = state.start;\n state.dragging = false;\n state.dragStartPixel = null;\n\n if (state.dragMoved) {\n commitTwoPoint(start, point);\n finishStroke();\n return;\n }\n\n state.pending = start;\n state.start = null;\n state.cursor = point;\n pluginCtx.requestRender?.();\n }\n\n const api: DrawingToolsAPI & Record<string, unknown> = {\n setMode(mode) {\n setModeInternal(mode);\n },\n getMode() {\n return state.mode;\n },\n setMagnet(enabled) {\n state.magnet = enabled;\n },\n isMagnet() {\n return state.magnet;\n },\n undo() {\n if (!ctx || state.undoStack.length === 0) return false;\n state.redoStack.push(snapshot());\n const prev = state.undoStack.pop()!;\n const current = snapshot();\n for (const a of current) ctx.chart.removeAnnotation(a.id!);\n for (const a of prev) ctx.chart.addAnnotation(a);\n return true;\n },\n redo() {\n if (!ctx || state.redoStack.length === 0) return false;\n state.undoStack.push(snapshot());\n const next = state.redoStack.pop()!;\n const current = snapshot();\n for (const a of current) ctx.chart.removeAnnotation(a.id!);\n for (const a of next) ctx.chart.addAnnotation(a);\n return true;\n },\n clear() {\n if (!ctx) return;\n pushUndo();\n for (const a of snapshot()) ctx.chart.removeAnnotation(a.id!);\n },\n };\n\n return {\n manifest,\n api,\n onInit(pluginCtx) {\n ctx = pluginCtx;\n },\n onDestroy() {\n ctx = null;\n },\n onInteraction(pluginCtx, event) {\n if (!isDrawingMode(state.mode)) return;\n\n if (event.type === \"mousedown\") {\n handleMouseDown(pluginCtx, event);\n return;\n }\n\n if (event.type === \"mousemove\") {\n handleMouseMove(pluginCtx, event);\n return;\n }\n\n if (event.type === \"mouseup\") {\n handleMouseUp(pluginCtx, event);\n }\n },\n onRenderOverlay(pluginCtx) {\n const c2d = pluginCtx.render.ctx2d;\n if (!c2d) return;\n drawPreview(c2d, pluginCtx.render.plotArea, pluginCtx.coords);\n },\n };\n}\n\nexport { snapToCandle, findNearestBarIndex } from \"./snapToCandle\";\nexport default PluginDrawingTools;\n","/**\n * PluginReplay — bar-by-bar playback (Stage 2.17 MVP).\n */\n\nimport type { ChartPlugin, PluginContext, PluginManifest } from \"../types\";\n\nexport interface PluginReplayConfig {\n /** Series id to replay */\n seriesId: string;\n /** Milliseconds between frames at 1x speed */\n frameMs?: number;\n}\n\nexport interface ReplayAPI {\n play(speed?: number): void;\n pause(): void;\n step(count?: number): void;\n seek(index: number): void;\n getIndex(): number;\n getLength(): number;\n isPlaying(): boolean;\n}\n\nconst manifest: PluginManifest = {\n name: \"velo-plot-replay\",\n version: \"1.0.0\",\n description: \"Bar-by-bar chart replay with speed control\",\n provides: [\"replay\"],\n tags: [\"replay\", \"trading\"],\n};\n\ninterface ReplayBuffer {\n x: Float32Array;\n open?: Float32Array;\n high?: Float32Array;\n low?: Float32Array;\n close?: Float32Array;\n y?: Float32Array;\n}\n\nexport function PluginReplay(config: PluginReplayConfig): ChartPlugin<PluginReplayConfig> {\n let ctx: PluginContext | null = null;\n let buffer: ReplayBuffer | null = null;\n let index = 0;\n let timer: ReturnType<typeof setInterval> | null = null;\n let speed = 1;\n const frameMs = config.frameMs ?? 250;\n\n function applyWindow(end: number): void {\n if (!ctx || !buffer) return;\n const n = Math.min(end + 1, buffer.x.length);\n const slice = (arr?: Float32Array) => (arr ? arr.subarray(0, n) : undefined);\n ctx.chart.updateSeries(config.seriesId, {\n x: slice(buffer.x)!,\n y: slice(buffer.y),\n open: slice(buffer.open),\n high: slice(buffer.high),\n low: slice(buffer.low),\n close: slice(buffer.close),\n });\n }\n\n const api: ReplayAPI & Record<string, unknown> = {\n play(s = 1) {\n if (!buffer) return;\n speed = Math.max(0.1, s);\n if (timer) clearInterval(timer);\n timer = setInterval(() => {\n if (!ctx || !buffer) {\n api.pause();\n return;\n }\n if (index >= buffer.x.length - 1) {\n api.pause();\n return;\n }\n index++;\n applyWindow(index);\n }, frameMs / speed);\n },\n pause() {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n },\n step(count = 1) {\n if (!buffer) return;\n index = Math.min(buffer.x.length - 1, index + count);\n applyWindow(index);\n },\n seek(i) {\n if (!buffer) return;\n index = Math.max(0, Math.min(buffer.x.length - 1, i));\n applyWindow(index);\n },\n getIndex() {\n return index;\n },\n getLength() {\n return buffer?.x.length ?? 0;\n },\n isPlaying() {\n return timer != null;\n },\n };\n\n return {\n manifest,\n api,\n onInit(pluginCtx) {\n ctx = pluginCtx;\n const series = ctx.chart.getSeries(config.seriesId);\n if (!series) {\n console.warn(`[PluginReplay] Series \"${config.seriesId}\" not found`);\n return;\n }\n const d = series.getData();\n buffer = {\n x: Float32Array.from(d.x),\n y: d.y ? Float32Array.from(d.y) : undefined,\n open: d.open ? Float32Array.from(d.open) : undefined,\n high: d.high ? Float32Array.from(d.high) : undefined,\n low: d.low ? Float32Array.from(d.low) : undefined,\n close: d.close ? Float32Array.from(d.close) : undefined,\n };\n index = Math.max(0, buffer.x.length - 1);\n },\n onDestroy() {\n api.pause();\n ctx = null;\n buffer = null;\n },\n };\n}\n\nexport default PluginReplay;\n","/**\n * UDF-inspired datafeed contract for trading charts (Stage 2.24).\n */\n\nexport interface SymbolInfo {\n symbol: string;\n name: string;\n description?: string;\n timezone?: string;\n session?: string;\n pricescale?: number;\n minmov?: number;\n}\n\nexport interface Bar {\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume?: number;\n}\n\nexport interface HistoryRequest {\n symbol: string;\n resolution: string;\n from: number;\n to: number;\n}\n\nexport interface SubscribeBarsRequest {\n symbol: string;\n resolution: string;\n onBar: (bar: Bar) => void;\n}\n\n/**\n * TradingView UDF-style adapter surface.\n */\nexport interface DatafeedAdapter {\n resolveSymbol(symbol: string): Promise<SymbolInfo>;\n getBars(request: HistoryRequest): Promise<Bar[]>;\n subscribeBars(request: SubscribeBarsRequest): () => void;\n}\n\n/** Convert bars to typed OHLC arrays for velo-plot series. */\nexport function barsToOhlc(bars: Bar[]): {\n x: Float64Array;\n open: Float32Array;\n high: Float32Array;\n low: Float32Array;\n close: Float32Array;\n volume: Float32Array;\n} {\n const n = bars.length;\n const x = new Float64Array(n);\n const open = new Float32Array(n);\n const high = new Float32Array(n);\n const low = new Float32Array(n);\n const close = new Float32Array(n);\n const volume = new Float32Array(n);\n for (let i = 0; i < n; i++) {\n const b = bars[i];\n x[i] = b.time;\n open[i] = b.open;\n high[i] = b.high;\n low[i] = b.low;\n close[i] = b.close;\n volume[i] = b.volume ?? 0;\n }\n return { x, open, high, low, close, volume };\n}\n","/**\n * Mock datafeed for demos and tests (Stage 2.25).\n */\n\nimport type {\n Bar,\n DatafeedAdapter,\n HistoryRequest,\n SubscribeBarsRequest,\n SymbolInfo,\n} from \"./datafeed\";\n\nexport interface MockDatafeedOptions {\n symbol?: string;\n barMs?: number;\n basePrice?: number;\n seed?: number;\n}\n\nfunction pseudoRandom(seed: number): () => number {\n let s = seed;\n return () => {\n s = (s * 16807) % 2147483647;\n return (s - 1) / 2147483646;\n };\n}\n\nfunction generateBars(from: number, to: number, barMs: number, base: number, rand: () => number): Bar[] {\n const bars: Bar[] = [];\n let price = base;\n for (let t = from; t <= to; t += barMs) {\n const open = price;\n const delta = (rand() - 0.48) * 2;\n const close = Math.max(1, open + delta);\n const high = Math.max(open, close) + rand() * 1.5;\n const low = Math.min(open, close) - rand() * 1.5;\n bars.push({\n time: t,\n open,\n high,\n low,\n close,\n volume: 1000 + rand() * 5000,\n });\n price = close;\n }\n return bars;\n}\n\nexport function createMockDatafeed(options: MockDatafeedOptions = {}): DatafeedAdapter {\n const barMs = options.barMs ?? 60_000;\n const basePrice = options.basePrice ?? 100;\n const rand = pseudoRandom(options.seed ?? 42);\n const cache = new Map<string, Bar[]>();\n\n return {\n async resolveSymbol(sym: string): Promise<SymbolInfo> {\n return {\n symbol: sym,\n name: sym,\n description: `Mock symbol ${sym}`,\n timezone: \"UTC\",\n session: \"24x7\",\n pricescale: 100,\n };\n },\n\n async getBars(request: HistoryRequest): Promise<Bar[]> {\n const key = `${request.symbol}:${request.from}:${request.to}`;\n if (!cache.has(key)) {\n cache.set(\n key,\n generateBars(request.from, request.to, barMs, basePrice, rand),\n );\n }\n return cache.get(key)!;\n },\n\n subscribeBars(request: SubscribeBarsRequest): () => void {\n let last = basePrice + rand() * 5;\n const timer = setInterval(() => {\n const open = last;\n const close = Math.max(1, open + (rand() - 0.5) * 2);\n const high = Math.max(open, close) + rand();\n const low = Math.min(open, close) - rand();\n request.onBar({\n time: Date.now(),\n open,\n high,\n low,\n close,\n volume: 1000 + rand() * 3000,\n });\n last = close;\n }, barMs);\n return () => clearInterval(timer);\n },\n };\n}\n"],"names":["findNearestBarIndex","barX","x","bestIdx","bestDist","d","snapToCandle","input","idx","candidates","clickPy","threshold","bestY","bestPyDist","cy","py","dist","computeMeasurement","a","b","change","denom","percent","bars","formatMeasurement","m","sign","formatPrice","value","abs","decimals","FIB_LEVELS","DRAG_THRESHOLD_PX","DEFAULT_MEASURE_UP","DEFAULT_MEASURE_DOWN","withAlpha","color","alpha","manifest","isDrawingMode","mode","findCandlestickSeries","ctx","s","PluginDrawingTools","config","autoDeselect","state","stroke","measureUp","measureDown","snapshot","_a","_b","pushUndo","resetInteractionState","setModeInternal","finishStroke","resolvePoint","y","series","dy","pointFromEvent","pluginCtx","event","commitHorizontal","commitVertical","commitMeasure","p0","p1","midX","commitTwoPoint","yMin","yMax","level","fy","drawPreview","c2d","plotArea","coords","cursor","anchor","toPx","px","w","h","drawMeasurePreview","headLen","dir","label","boxW","boxH","boxX","boxY","handleMouseDown","point","handleMouseMove","dx","handleMouseUp","start","enabled","prev","current","next","PluginReplay","buffer","index","timer","speed","frameMs","applyWindow","end","n","slice","arr","api","count","i","barsToOhlc","open","high","low","close","volume","pseudoRandom","seed","generateBars","from","to","barMs","base","rand","price","t","delta","createMockDatafeed","options","basePrice","cache","sym","request","key","last"],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ function d(o) {
2
+ return o.type === "candlestick";
3
+ }
4
+ function f(o) {
5
+ return o.type === "bar";
6
+ }
7
+ function y(o) {
8
+ return o.type === "heatmap";
9
+ }
10
+ function h(o) {
11
+ const a = {
12
+ color: o.color ?? "#ff0055",
13
+ width: o.width ?? 1.5
14
+ };
15
+ return y(o) ? {
16
+ id: o.id,
17
+ type: "heatmap",
18
+ data: o.data,
19
+ style: a,
20
+ visible: o.visible ?? !0,
21
+ name: o.name
22
+ } : d(o) ? {
23
+ id: o.id,
24
+ type: "candlestick",
25
+ data: {
26
+ x: o.x,
27
+ y: o.close,
28
+ open: o.open,
29
+ high: o.high,
30
+ low: o.low,
31
+ close: o.close
32
+ },
33
+ style: a,
34
+ visible: o.visible ?? !0,
35
+ name: o.name
36
+ } : f(o) ? {
37
+ id: o.id,
38
+ type: "bar",
39
+ data: { x: o.x, y: o.y },
40
+ style: a,
41
+ visible: o.visible ?? !0,
42
+ name: o.name
43
+ } : {
44
+ id: o.id,
45
+ type: "line",
46
+ data: { x: o.x, y: o.y },
47
+ style: a,
48
+ visible: o.visible ?? !0,
49
+ name: o.name
50
+ };
51
+ }
52
+ function g(o, a) {
53
+ return o.type !== a.type ? !0 : y(o) && y(a) ? o.data.xValues !== a.data.xValues || o.data.yValues !== a.data.yValues || o.data.zValues !== a.data.zValues : d(o) && d(a) ? o.x !== a.x || o.open !== a.open || o.high !== a.high || o.low !== a.low || o.close !== a.close : f(o) && f(a) || "x" in o && "y" in o && "x" in a && "y" in a ? o.x !== a.x || o.y !== a.y : !0;
54
+ }
55
+ function b(o) {
56
+ return y(o) ? {
57
+ x: o.data.xValues,
58
+ y: o.data.yValues
59
+ } : d(o) ? {
60
+ x: o.x,
61
+ open: o.open,
62
+ high: o.high,
63
+ low: o.low,
64
+ close: o.close
65
+ } : f(o) ? { x: o.x, y: o.y } : { x: o.x, y: o.y };
66
+ }
67
+ function s(o, a, n) {
68
+ const t = new Map(a.map((i) => [i.id, i]));
69
+ return n.forEach((i, u) => {
70
+ t.has(u) || o.removeSeries(u);
71
+ }), t.forEach((i, u) => {
72
+ var c;
73
+ const l = n.get(u);
74
+ l ? g(l, i) && o.updateSeries(u, b(i)) : (o.addSeries(h(i)), t.size === 1 && ((c = o.autoScale) == null || c.call(o)));
75
+ }), t;
76
+ }
77
+ const e = [
78
+ "xAxis",
79
+ "yAxis",
80
+ "theme",
81
+ "background",
82
+ "showLegend",
83
+ "layout",
84
+ "responsive",
85
+ "colorScheme",
86
+ "showControls",
87
+ "toolbar",
88
+ "animations"
89
+ ];
90
+ function m(o, a) {
91
+ if (o === a) return !0;
92
+ if (o == null || a == null || typeof o != "object" || typeof a != "object") return !1;
93
+ const n = o, t = a, i = Object.keys(n), u = Object.keys(t);
94
+ return i.length !== u.length ? !1 : i.every((l) => n[l] === t[l]);
95
+ }
96
+ function w(o, a) {
97
+ return e.some((n) => !m(o[n], a[n]));
98
+ }
99
+ function r(o, a, n) {
100
+ a.xAxis !== n.xAxis && n.xAxis && o.updateXAxis(n.xAxis), a.yAxis !== n.yAxis && n.yAxis && (Array.isArray(n.yAxis) ? n.yAxis : [n.yAxis]).forEach((i) => {
101
+ i.id && o.updateYAxis(i.id, i);
102
+ }), a.theme !== n.theme && n.theme !== void 0 && o.setTheme(n.theme), a.background !== n.background && n.background && o.setTheme({ backgroundColor: n.background }), a.showLegend !== n.showLegend && n.showLegend !== void 0 && "setShowLegend" in o && typeof o.setShowLegend == "function" && o.setShowLegend(
103
+ n.showLegend
104
+ ), (a.layout !== n.layout || a.responsive !== n.responsive) && o.resize();
105
+ }
106
+ function A(o) {
107
+ const a = {};
108
+ for (const n of e)
109
+ o[n] !== void 0 && (a[n] = o[n]);
110
+ return a;
111
+ }
112
+ export {
113
+ s as d,
114
+ w as o,
115
+ A as p,
116
+ r as s,
117
+ h as v
118
+ };
119
+ //# sourceMappingURL=optionsSync-QUiN4Inw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optionsSync-QUiN4Inw.js","sources":["../src/bindings/shared/seriesDiff.ts","../src/bindings/shared/optionsSync.ts"],"sourcesContent":["/**\n * Series diffing for declarative bindings.\n */\n\nimport type { SeriesOptions, SeriesUpdateData } from \"../../types\";\nimport type {\n ChartSeriesActions,\n VeloPlotSeries,\n VeloPlotCandlestickSeries,\n VeloPlotBarSeries,\n VeloPlotHeatmapSeries,\n} from \"./types\";\n\nfunction isCandlestick(s: VeloPlotSeries): s is VeloPlotCandlestickSeries {\n return s.type === \"candlestick\";\n}\n\nfunction isBar(s: VeloPlotSeries): s is VeloPlotBarSeries {\n return s.type === \"bar\";\n}\n\nfunction isHeatmap(s: VeloPlotSeries): s is VeloPlotHeatmapSeries {\n return s.type === \"heatmap\";\n}\n\nexport function veloPlotSeriesToOptions(series: VeloPlotSeries): SeriesOptions {\n const style = {\n color: series.color ?? \"#ff0055\",\n width: series.width ?? 1.5,\n };\n\n if (isHeatmap(series)) {\n return {\n id: series.id,\n type: \"heatmap\",\n data: series.data as unknown as import(\"../../types\").SeriesData,\n style,\n visible: series.visible ?? true,\n name: series.name,\n };\n }\n\n if (isCandlestick(series)) {\n return {\n id: series.id,\n type: \"candlestick\",\n data: {\n x: series.x,\n y: series.close,\n open: series.open,\n high: series.high,\n low: series.low,\n close: series.close,\n },\n style,\n visible: series.visible ?? true,\n name: series.name,\n };\n }\n\n if (isBar(series)) {\n return {\n id: series.id,\n type: \"bar\",\n data: { x: series.x, y: series.y },\n style,\n visible: series.visible ?? true,\n name: series.name,\n };\n }\n\n return {\n id: series.id,\n type: \"line\",\n data: { x: series.x, y: series.y },\n style,\n visible: series.visible ?? true,\n name: series.name,\n };\n}\n\nfunction seriesDataChanged(\n prev: VeloPlotSeries,\n next: VeloPlotSeries,\n): boolean {\n if (prev.type !== next.type) return true;\n\n if (isHeatmap(prev) && isHeatmap(next)) {\n return (\n prev.data.xValues !== next.data.xValues ||\n prev.data.yValues !== next.data.yValues ||\n prev.data.zValues !== next.data.zValues\n );\n }\n\n if (isCandlestick(prev) && isCandlestick(next)) {\n return (\n prev.x !== next.x ||\n prev.open !== next.open ||\n prev.high !== next.high ||\n prev.low !== next.low ||\n prev.close !== next.close\n );\n }\n\n if (isBar(prev) && isBar(next)) {\n return prev.x !== next.x || prev.y !== next.y;\n }\n\n if (\"x\" in prev && \"y\" in prev && \"x\" in next && \"y\" in next) {\n return prev.x !== next.x || prev.y !== next.y;\n }\n\n return true;\n}\n\nfunction toUpdateData(series: VeloPlotSeries): SeriesUpdateData {\n if (isHeatmap(series)) {\n return {\n x: series.data.xValues as Float32Array,\n y: series.data.yValues as Float32Array,\n };\n }\n if (isCandlestick(series)) {\n return {\n x: series.x,\n open: series.open,\n high: series.high,\n low: series.low,\n close: series.close,\n };\n }\n if (isBar(series)) {\n return { x: series.x, y: series.y };\n }\n return { x: series.x, y: series.y };\n}\n\nexport function diffSeries(\n chart: ChartSeriesActions,\n current: VeloPlotSeries[],\n previous: Map<string, VeloPlotSeries>,\n): Map<string, VeloPlotSeries> {\n const currentMap = new Map(current.map((s) => [s.id, s]));\n\n previous.forEach((_, id) => {\n if (!currentMap.has(id)) {\n chart.removeSeries(id);\n }\n });\n\n currentMap.forEach((seriesData, id) => {\n const prev = previous.get(id);\n if (!prev) {\n chart.addSeries(veloPlotSeriesToOptions(seriesData));\n if (currentMap.size === 1) {\n chart.autoScale?.();\n }\n } else if (seriesDataChanged(prev, seriesData)) {\n chart.updateSeries(id, toUpdateData(seriesData));\n }\n });\n\n return currentMap;\n}\n\nexport function serializePaneIds(panes: { id: string }[]): string {\n return panes.map((p) => p.id).join(\",\");\n}\n","/**\n * Apply chart option changes without remounting.\n */\n\nimport type { Chart } from \"../../core/chart/types\";\nimport type { ChartOptions } from \"../../types\";\n\nexport type SyncableChartOptions = Omit<ChartOptions, \"container\">;\n\nconst SYNC_KEYS: (keyof SyncableChartOptions)[] = [\n \"xAxis\",\n \"yAxis\",\n \"theme\",\n \"background\",\n \"showLegend\",\n \"layout\",\n \"responsive\",\n \"colorScheme\",\n \"showControls\",\n \"toolbar\",\n \"animations\",\n];\n\nfunction shallowEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== \"object\" || typeof b !== \"object\") return false;\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((k) => aObj[k] === bObj[k]);\n}\n\nexport function optionsChanged(\n prev: SyncableChartOptions,\n next: SyncableChartOptions,\n): boolean {\n return SYNC_KEYS.some((key) => !shallowEqual(prev[key], next[key]));\n}\n\nexport function syncChartOptions(\n chart: Chart,\n prev: SyncableChartOptions,\n next: SyncableChartOptions,\n): void {\n if (prev.xAxis !== next.xAxis && next.xAxis) {\n chart.updateXAxis(next.xAxis);\n }\n\n if (prev.yAxis !== next.yAxis && next.yAxis) {\n const axes = Array.isArray(next.yAxis) ? next.yAxis : [next.yAxis];\n axes.forEach((axis) => {\n if (axis.id) {\n chart.updateYAxis(axis.id, axis);\n }\n });\n }\n\n if (prev.theme !== next.theme && next.theme !== undefined) {\n chart.setTheme(next.theme);\n }\n\n if (prev.background !== next.background && next.background) {\n chart.setTheme({ backgroundColor: next.background } as object);\n }\n\n if (\n prev.showLegend !== next.showLegend &&\n next.showLegend !== undefined &&\n \"setShowLegend\" in chart &&\n typeof (chart as { setShowLegend?: (v: boolean) => void }).setShowLegend ===\n \"function\"\n ) {\n (chart as { setShowLegend: (v: boolean) => void }).setShowLegend(\n next.showLegend,\n );\n }\n\n if (prev.layout !== next.layout || prev.responsive !== next.responsive) {\n chart.resize();\n }\n}\n\nexport function pickSyncableOptions(\n options: SyncableChartOptions,\n): SyncableChartOptions {\n const picked: SyncableChartOptions = {};\n for (const key of SYNC_KEYS) {\n if (options[key] !== undefined) {\n (picked as Record<string, unknown>)[key] = options[key];\n }\n }\n return picked;\n}\n"],"names":["isCandlestick","s","isBar","isHeatmap","veloPlotSeriesToOptions","series","style","seriesDataChanged","prev","next","toUpdateData","diffSeries","chart","current","previous","currentMap","_","id","seriesData","_a","SYNC_KEYS","shallowEqual","a","b","aObj","bObj","aKeys","bKeys","k","optionsChanged","key","syncChartOptions","axis","pickSyncableOptions","options","picked"],"mappings":"AAaA,SAASA,EAAcC,GAAmD;AACxE,SAAOA,EAAE,SAAS;AACpB;AAEA,SAASC,EAAMD,GAA2C;AACxD,SAAOA,EAAE,SAAS;AACpB;AAEA,SAASE,EAAUF,GAA+C;AAChE,SAAOA,EAAE,SAAS;AACpB;AAEO,SAASG,EAAwBC,GAAuC;AAC7E,QAAMC,IAAQ;AAAA,IACZ,OAAOD,EAAO,SAAS;AAAA,IACvB,OAAOA,EAAO,SAAS;AAAA,EAAA;AAGzB,SAAIF,EAAUE,CAAM,IACX;AAAA,IACL,IAAIA,EAAO;AAAA,IACX,MAAM;AAAA,IACN,MAAMA,EAAO;AAAA,IACb,OAAAC;AAAA,IACA,SAASD,EAAO,WAAW;AAAA,IAC3B,MAAMA,EAAO;AAAA,EAAA,IAIbL,EAAcK,CAAM,IACf;AAAA,IACL,IAAIA,EAAO;AAAA,IACX,MAAM;AAAA,IACN,MAAM;AAAA,MACJ,GAAGA,EAAO;AAAA,MACV,GAAGA,EAAO;AAAA,MACV,MAAMA,EAAO;AAAA,MACb,MAAMA,EAAO;AAAA,MACb,KAAKA,EAAO;AAAA,MACZ,OAAOA,EAAO;AAAA,IAAA;AAAA,IAEhB,OAAAC;AAAA,IACA,SAASD,EAAO,WAAW;AAAA,IAC3B,MAAMA,EAAO;AAAA,EAAA,IAIbH,EAAMG,CAAM,IACP;AAAA,IACL,IAAIA,EAAO;AAAA,IACX,MAAM;AAAA,IACN,MAAM,EAAE,GAAGA,EAAO,GAAG,GAAGA,EAAO,EAAA;AAAA,IAC/B,OAAAC;AAAA,IACA,SAASD,EAAO,WAAW;AAAA,IAC3B,MAAMA,EAAO;AAAA,EAAA,IAIV;AAAA,IACL,IAAIA,EAAO;AAAA,IACX,MAAM;AAAA,IACN,MAAM,EAAE,GAAGA,EAAO,GAAG,GAAGA,EAAO,EAAA;AAAA,IAC/B,OAAAC;AAAA,IACA,SAASD,EAAO,WAAW;AAAA,IAC3B,MAAMA,EAAO;AAAA,EAAA;AAEjB;AAEA,SAASE,EACPC,GACAC,GACS;AACT,SAAID,EAAK,SAASC,EAAK,OAAa,KAEhCN,EAAUK,CAAI,KAAKL,EAAUM,CAAI,IAEjCD,EAAK,KAAK,YAAYC,EAAK,KAAK,WAChCD,EAAK,KAAK,YAAYC,EAAK,KAAK,WAChCD,EAAK,KAAK,YAAYC,EAAK,KAAK,UAIhCT,EAAcQ,CAAI,KAAKR,EAAcS,CAAI,IAEzCD,EAAK,MAAMC,EAAK,KAChBD,EAAK,SAASC,EAAK,QACnBD,EAAK,SAASC,EAAK,QACnBD,EAAK,QAAQC,EAAK,OAClBD,EAAK,UAAUC,EAAK,QAIpBP,EAAMM,CAAI,KAAKN,EAAMO,CAAI,KAIzB,OAAOD,KAAQ,OAAOA,KAAQ,OAAOC,KAAQ,OAAOA,IAC/CD,EAAK,MAAMC,EAAK,KAAKD,EAAK,MAAMC,EAAK,IAGvC;AACT;AAEA,SAASC,EAAaL,GAA0C;AAC9D,SAAIF,EAAUE,CAAM,IACX;AAAA,IACL,GAAGA,EAAO,KAAK;AAAA,IACf,GAAGA,EAAO,KAAK;AAAA,EAAA,IAGfL,EAAcK,CAAM,IACf;AAAA,IACL,GAAGA,EAAO;AAAA,IACV,MAAMA,EAAO;AAAA,IACb,MAAMA,EAAO;AAAA,IACb,KAAKA,EAAO;AAAA,IACZ,OAAOA,EAAO;AAAA,EAAA,IAGdH,EAAMG,CAAM,IACP,EAAE,GAAGA,EAAO,GAAG,GAAGA,EAAO,EAAA,IAE3B,EAAE,GAAGA,EAAO,GAAG,GAAGA,EAAO,EAAA;AAClC;AAEO,SAASM,EACdC,GACAC,GACAC,GAC6B;AAC7B,QAAMC,IAAa,IAAI,IAAIF,EAAQ,IAAI,CAACZ,MAAM,CAACA,EAAE,IAAIA,CAAC,CAAC,CAAC;AAExD,SAAAa,EAAS,QAAQ,CAACE,GAAGC,MAAO;AAC1B,IAAKF,EAAW,IAAIE,CAAE,KACpBL,EAAM,aAAaK,CAAE;AAAA,EAEzB,CAAC,GAEDF,EAAW,QAAQ,CAACG,GAAYD,MAAO;AA1IzC,QAAAE;AA2II,UAAMX,IAAOM,EAAS,IAAIG,CAAE;AAC5B,IAAKT,IAKMD,EAAkBC,GAAMU,CAAU,KAC3CN,EAAM,aAAaK,GAAIP,EAAaQ,CAAU,CAAC,KAL/CN,EAAM,UAAUR,EAAwBc,CAAU,CAAC,GAC/CH,EAAW,SAAS,OACtBI,IAAAP,EAAM,cAAN,QAAAO,EAAA,KAAAP;AAAA,EAKN,CAAC,GAEMG;AACT;AC3JA,MAAMK,IAA4C;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAASC,EAAaC,GAAYC,GAAqB;AACrD,MAAID,MAAMC,EAAG,QAAO;AAEpB,MADID,KAAK,QAAQC,KAAK,QAClB,OAAOD,KAAM,YAAY,OAAOC,KAAM,SAAU,QAAO;AAC3D,QAAMC,IAAOF,GACPG,IAAOF,GACPG,IAAQ,OAAO,KAAKF,CAAI,GACxBG,IAAQ,OAAO,KAAKF,CAAI;AAC9B,SAAIC,EAAM,WAAWC,EAAM,SAAe,KACnCD,EAAM,MAAM,CAACE,MAAMJ,EAAKI,CAAC,MAAMH,EAAKG,CAAC,CAAC;AAC/C;AAEO,SAASC,EACdrB,GACAC,GACS;AACT,SAAOW,EAAU,KAAK,CAACU,MAAQ,CAACT,EAAab,EAAKsB,CAAG,GAAGrB,EAAKqB,CAAG,CAAC,CAAC;AACpE;AAEO,SAASC,EACdnB,GACAJ,GACAC,GACM;AACN,EAAID,EAAK,UAAUC,EAAK,SAASA,EAAK,SACpCG,EAAM,YAAYH,EAAK,KAAK,GAG1BD,EAAK,UAAUC,EAAK,SAASA,EAAK,UACvB,MAAM,QAAQA,EAAK,KAAK,IAAIA,EAAK,QAAQ,CAACA,EAAK,KAAK,GAC5D,QAAQ,CAACuB,MAAS;AACrB,IAAIA,EAAK,MACPpB,EAAM,YAAYoB,EAAK,IAAIA,CAAI;AAAA,EAEnC,CAAC,GAGCxB,EAAK,UAAUC,EAAK,SAASA,EAAK,UAAU,UAC9CG,EAAM,SAASH,EAAK,KAAK,GAGvBD,EAAK,eAAeC,EAAK,cAAcA,EAAK,cAC9CG,EAAM,SAAS,EAAE,iBAAiBH,EAAK,YAAsB,GAI7DD,EAAK,eAAeC,EAAK,cACzBA,EAAK,eAAe,UACpB,mBAAmBG,KACnB,OAAQA,EAAmD,iBACzD,cAEDA,EAAkD;AAAA,IACjDH,EAAK;AAAA,EAAA,IAILD,EAAK,WAAWC,EAAK,UAAUD,EAAK,eAAeC,EAAK,eAC1DG,EAAM,OAAA;AAEV;AAEO,SAASqB,EACdC,GACsB;AACtB,QAAMC,IAA+B,CAAA;AACrC,aAAWL,KAAOV;AAChB,IAAIc,EAAQJ,CAAG,MAAM,WAClBK,EAAmCL,CAAG,IAAII,EAAQJ,CAAG;AAG1D,SAAOK;AACT;"}
@@ -1,6 +1,6 @@
1
1
  import { ChartPlugin } from '../types';
2
2
  /**
3
- * SciPlot Engine - 3D Visualization Plugin
3
+ * VeloPlot Engine - 3D Visualization Plugin
4
4
  *
5
5
  * This plugin provides 3D rendering capabilities including:
6
6
  * - Line3D, Area3D, Bubble3D, Impulse3D renderers
@@ -42,7 +42,7 @@ export interface Plugin3DConfig {
42
42
  enableOrbitControls?: boolean;
43
43
  }
44
44
  /**
45
- * SciPlot 3D Plugin
45
+ * VeloPlot 3D Plugin
46
46
  *
47
47
  * Provides interactive 3D charts, surfaces, and meshes.
48
48
  */
@@ -1,3 +1,3 @@
1
1
  export * from './3d/index'
2
- import SciPlot from './3d/index'
3
- export default SciPlot
2
+ import VeloPlot from './3d/index'
3
+ export default VeloPlot