velo-plot 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (265) hide show
  1. package/README.md +15 -8
  2. package/dist/{ChartCore-BhQ4j7f5.js → ChartCore-BpzRvN4Y.js} +998 -855
  3. package/dist/ChartCore-BpzRvN4Y.js.map +1 -0
  4. package/dist/a11y-Bw6urYpr.js +105 -0
  5. package/dist/a11y-Bw6urYpr.js.map +1 -0
  6. package/dist/angular/hooks-entry.d.ts +1 -0
  7. package/dist/angular/hooks.d.ts +26 -0
  8. package/dist/angular/index.d.ts +8 -0
  9. package/dist/angular/velo-plot.component.d.ts +46 -0
  10. package/dist/angular-hooks.d.ts +1 -0
  11. package/dist/angular-hooks.js +9 -0
  12. package/dist/angular-hooks.js.map +1 -0
  13. package/dist/angular.d.ts +1 -0
  14. package/dist/angular.js +166 -0
  15. package/dist/angular.js.map +1 -0
  16. package/dist/assets/indicator.worker-bv0zC4EX.js.map +1 -1
  17. package/dist/astro/StackedPlot.astro +19 -0
  18. package/dist/astro/VeloPlot.astro +23 -0
  19. package/dist/{axisFormat-SPX-CD5s.js → axisFormat-CzumxpCL.js} +3 -3
  20. package/dist/axisFormat-CzumxpCL.js.map +1 -0
  21. package/dist/bindings/shared/a11y.d.ts +26 -0
  22. package/dist/bindings/shared/chartLifecycle.d.ts +16 -0
  23. package/dist/bindings/shared/chartSyncBridge.d.ts +8 -0
  24. package/dist/bindings/shared/dimensions.d.ts +1 -0
  25. package/dist/bindings/shared/index.d.ts +9 -0
  26. package/dist/bindings/shared/indicatorBridge.d.ts +11 -0
  27. package/dist/bindings/shared/optionsSync.d.ts +7 -0
  28. package/dist/bindings/shared/seriesDiff.d.ts +8 -0
  29. package/dist/bindings/shared/stackedSync.d.ts +9 -0
  30. package/dist/bindings/shared/types.d.ts +46 -0
  31. package/dist/bindings/test-utils/index.d.ts +35 -0
  32. package/dist/bindings/test-utils/mockLifecycle.d.ts +120 -0
  33. package/dist/bindings/test-utils/vitestSveltePlugin.d.ts +3 -0
  34. package/dist/chartSyncBridge-DbWrwtyP.js +57 -0
  35. package/dist/chartSyncBridge-DbWrwtyP.js.map +1 -0
  36. package/dist/core/Chart.d.ts +1 -1
  37. package/dist/core/InteractionManager.d.ts +7 -1
  38. package/dist/core/OverlayRenderer.d.ts +5 -0
  39. package/dist/core/annotations/types.d.ts +1 -1
  40. package/dist/core/chart/ChartAxisManager.d.ts +2 -0
  41. package/dist/core/chart/ChartCore.d.ts +17 -2
  42. package/dist/core/chart/ChartPluginBridge.d.ts +1 -0
  43. package/dist/core/chart/ChartRenderLoop.d.ts +2 -0
  44. package/dist/core/chart/ChartStateManager.d.ts +2 -0
  45. package/dist/core/chart/types.d.ts +6 -1
  46. package/dist/core/clipboard/index.d.ts +1 -1
  47. package/dist/core/debug/index.d.ts +1 -1
  48. package/dist/core/keybindings/index.d.ts +1 -1
  49. package/dist/core/loading/index.d.ts +1 -1
  50. package/dist/core/locale/index.d.ts +1 -1
  51. package/dist/core/stacked/paneResize.d.ts +3 -0
  52. package/dist/core/stacked/types.d.ts +10 -0
  53. package/dist/core/sync/index.d.ts +0 -1
  54. package/dist/core/theme-editor/index.d.ts +1 -1
  55. package/dist/createStackedChart-Dm-YqUT7.js +756 -0
  56. package/dist/createStackedChart-Dm-YqUT7.js.map +1 -0
  57. package/dist/examples/PluginDemonstration.d.ts +1 -1
  58. package/dist/gpuRenderer-BpaMYz-k.js.map +1 -1
  59. package/dist/hooks-CYPCxoZx.js +69 -0
  60. package/dist/hooks-CYPCxoZx.js.map +1 -0
  61. package/dist/{index-D7dTq6VB.js → index-0InEyj0q.js} +130 -134
  62. package/dist/index-0InEyj0q.js.map +1 -0
  63. package/dist/index-BMiZoKmm.js.map +1 -1
  64. package/dist/{index-DoYxf1cV.js → index-CWxIHdwX.js} +38 -98
  65. package/dist/index-CWxIHdwX.js.map +1 -0
  66. package/dist/{index-CUGS98p4.js → index-CaXWSOTk.js} +3 -6
  67. package/dist/index-CaXWSOTk.js.map +1 -0
  68. package/dist/index-Dag88bW4.js.map +1 -1
  69. package/dist/index-qhscKTDy.js.map +1 -1
  70. package/dist/{index-CWipqOLP.js → index-qunX30Xu.js} +2 -2
  71. package/dist/index-qunX30Xu.js.map +1 -0
  72. package/dist/index-x4stH3jD.js.map +1 -1
  73. package/dist/{index.core-fpZ1dYN0.js → index.core-BmZe2jRQ.js} +30 -29
  74. package/dist/index.core-BmZe2jRQ.js.map +1 -0
  75. package/dist/index.core.d.ts +1 -1
  76. package/dist/index.d.ts +3 -3
  77. package/dist/indicators--eJGmVox.js.map +1 -1
  78. package/dist/{mockDatafeed-Cdg5hKEo.js → mockDatafeed-DHIDPcpX.js} +150 -146
  79. package/dist/mockDatafeed-DHIDPcpX.js.map +1 -0
  80. package/dist/optionsSync-QUiN4Inw.js +119 -0
  81. package/dist/optionsSync-QUiN4Inw.js.map +1 -0
  82. package/dist/plugins/3d/index.d.ts +2 -2
  83. package/dist/plugins/3d.d.ts +2 -2
  84. package/dist/plugins/3d.js.map +1 -1
  85. package/dist/plugins/analysis/contours.d.ts +31 -0
  86. package/dist/plugins/analysis/index.d.ts +1 -1
  87. package/dist/plugins/analysis/indicators.d.ts +1 -1
  88. package/dist/plugins/analysis.d.ts +2 -2
  89. package/dist/plugins/analysis.js +495 -408
  90. package/dist/plugins/analysis.js.map +1 -1
  91. package/dist/plugins/annotations/index.d.ts +1 -1
  92. package/dist/plugins/annotations.d.ts +2 -2
  93. package/dist/plugins/annotations.js.map +1 -1
  94. package/dist/plugins/anomaly-detection.js +1 -1
  95. package/dist/plugins/anomaly-detection.js.map +1 -1
  96. package/dist/plugins/broken-axis.d.ts +2 -2
  97. package/dist/plugins/broken-axis.js +170 -181
  98. package/dist/plugins/broken-axis.js.map +1 -1
  99. package/dist/plugins/builtins/crosshair/CrosshairPlugin.d.ts +1 -1
  100. package/dist/plugins/builtins/index.d.ts +1 -1
  101. package/dist/plugins/caching.d.ts +2 -2
  102. package/dist/plugins/clipboard/index.d.ts +2 -2
  103. package/dist/plugins/clipboard.d.ts +2 -2
  104. package/dist/plugins/clipboard.js.map +1 -1
  105. package/dist/plugins/context-menu/index.d.ts +1 -1
  106. package/dist/plugins/context-menu.d.ts +2 -2
  107. package/dist/plugins/context-menu.js +1 -1
  108. package/dist/plugins/context-menu.js.map +1 -1
  109. package/dist/plugins/data-export/index.d.ts +1 -1
  110. package/dist/plugins/data-export.d.ts +2 -2
  111. package/dist/plugins/data-export.js +2 -2
  112. package/dist/plugins/data-export.js.map +1 -1
  113. package/dist/plugins/data-transform.d.ts +2 -2
  114. package/dist/plugins/data-transform.js +19 -19
  115. package/dist/plugins/data-transform.js.map +1 -1
  116. package/dist/plugins/debug/index.d.ts +2 -2
  117. package/dist/plugins/debug.d.ts +2 -2
  118. package/dist/plugins/debug.js +2 -2
  119. package/dist/plugins/debug.js.map +1 -1
  120. package/dist/plugins/forecasting/algorithms.d.ts +7 -2
  121. package/dist/plugins/forecasting/index.d.ts +1 -1
  122. package/dist/plugins/forecasting/types.d.ts +13 -3
  123. package/dist/plugins/forecasting.js +355 -175
  124. package/dist/plugins/forecasting.js.map +1 -1
  125. package/dist/plugins/gpu/index.d.ts +2 -2
  126. package/dist/plugins/gpu.d.ts +2 -2
  127. package/dist/plugins/gpu.js.map +1 -1
  128. package/dist/plugins/i18n/index.d.ts +2 -2
  129. package/dist/plugins/i18n.d.ts +2 -2
  130. package/dist/plugins/i18n.js.map +1 -1
  131. package/dist/plugins/index.d.ts +1 -1
  132. package/dist/plugins/keyboard.d.ts +2 -2
  133. package/dist/plugins/keyboard.js +65 -5
  134. package/dist/plugins/keyboard.js.map +1 -1
  135. package/dist/plugins/latex/symbols.d.ts +50 -0
  136. package/dist/plugins/latex/types.d.ts +13 -1
  137. package/dist/plugins/latex.js +351 -331
  138. package/dist/plugins/latex.js.map +1 -1
  139. package/dist/plugins/lazy-load.d.ts +2 -2
  140. package/dist/plugins/loading/index.d.ts +1 -1
  141. package/dist/plugins/loading.d.ts +2 -2
  142. package/dist/plugins/ml-integration/native-algorithms.d.ts +24 -4
  143. package/dist/plugins/ml-integration/types.d.ts +19 -0
  144. package/dist/plugins/ml-integration.d.ts +2 -2
  145. package/dist/plugins/ml-integration.js +190 -139
  146. package/dist/plugins/ml-integration.js.map +1 -1
  147. package/dist/plugins/offscreen.d.ts +2 -2
  148. package/dist/plugins/pattern-recognition/types.d.ts +28 -1
  149. package/dist/plugins/pattern-recognition.d.ts +2 -2
  150. package/dist/plugins/pattern-recognition.js +417 -344
  151. package/dist/plugins/pattern-recognition.js.map +1 -1
  152. package/dist/plugins/radar.d.ts +2 -2
  153. package/dist/plugins/regression.d.ts +2 -2
  154. package/dist/plugins/regression.js +1 -1
  155. package/dist/plugins/regression.js.map +1 -1
  156. package/dist/plugins/roi.js +9 -9
  157. package/dist/plugins/roi.js.map +1 -1
  158. package/dist/plugins/snapshot/index.d.ts +1 -1
  159. package/dist/plugins/snapshot/types.d.ts +1 -1
  160. package/dist/plugins/snapshot.d.ts +2 -2
  161. package/dist/plugins/snapshot.js +36 -36
  162. package/dist/plugins/snapshot.js.map +1 -1
  163. package/dist/plugins/streaming/index.d.ts +2 -2
  164. package/dist/plugins/streaming.d.ts +2 -2
  165. package/dist/plugins/sync/index.d.ts +3 -2
  166. package/dist/plugins/sync.d.ts +2 -2
  167. package/dist/plugins/sync.js +1 -1
  168. package/dist/plugins/sync.js.map +1 -1
  169. package/dist/plugins/theme-editor/index.d.ts +1 -1
  170. package/dist/plugins/theme-editor.d.ts +2 -2
  171. package/dist/plugins/tools/index.d.ts +1 -1
  172. package/dist/plugins/tools/tooltip/index.d.ts +1 -1
  173. package/dist/plugins/tools.d.ts +2 -2
  174. package/dist/plugins/tools.js +1 -1
  175. package/dist/plugins/types.d.ts +1 -1
  176. package/dist/plugins/video-recorder.d.ts +2 -2
  177. package/dist/plugins/virtualization.d.ts +2 -2
  178. package/dist/plugins/virtualization.js +1 -1
  179. package/dist/pool-DZ8shSqv.js +109 -0
  180. package/dist/pool-DZ8shSqv.js.map +1 -0
  181. package/dist/react/StackedPlot.d.ts +31 -0
  182. package/dist/react/VeloPlot.d.ts +29 -0
  183. package/dist/react/index.d.ts +25 -3
  184. package/dist/react/useChartSync.d.ts +8 -0
  185. package/dist/react/useIndicator.d.ts +12 -0
  186. package/dist/react/useVeloPlot.d.ts +19 -0
  187. package/dist/react.js +328 -24
  188. package/dist/react.js.map +1 -1
  189. package/dist/scientific/index.d.ts +48 -0
  190. package/dist/scientific.d.ts +1 -0
  191. package/dist/scientific.js +91 -0
  192. package/dist/scientific.js.map +1 -0
  193. package/dist/solid/VeloPlot.d.ts +16 -0
  194. package/dist/solid/index.d.ts +13 -0
  195. package/dist/solid/useChartSync.d.ts +6 -0
  196. package/dist/solid/useIndicator.d.ts +11 -0
  197. package/dist/solid/useStackedPlot.d.ts +14 -0
  198. package/dist/solid/useVeloPlot.d.ts +18 -0
  199. package/dist/solid.d.ts +1 -0
  200. package/dist/solid.js +172 -0
  201. package/dist/solid.js.map +1 -0
  202. package/dist/stackedSync-tnrunZMt.js +100 -0
  203. package/dist/stackedSync-tnrunZMt.js.map +1 -0
  204. package/dist/svelte/StackedPlot.svelte +29 -0
  205. package/dist/svelte/StackedPlot.test.ts +114 -0
  206. package/dist/svelte/VeloPlot.svelte +44 -0
  207. package/dist/svelte/VeloPlot.test.ts +105 -0
  208. package/dist/svelte/index.d.ts +11 -0
  209. package/dist/svelte/index.test.ts +20 -0
  210. package/dist/svelte/index.ts +15 -0
  211. package/dist/svelte/useChartSync.d.ts +8 -0
  212. package/dist/svelte/useChartSync.test.ts +49 -0
  213. package/dist/svelte/useChartSync.ts +29 -0
  214. package/dist/svelte/useIndicator.d.ts +13 -0
  215. package/dist/svelte/useIndicator.test.ts +67 -0
  216. package/dist/svelte/useIndicator.ts +43 -0
  217. package/dist/svelte/useStackedPlot.d.ts +16 -0
  218. package/dist/svelte/useStackedPlot.test.ts +76 -0
  219. package/dist/svelte/useStackedPlot.ts +54 -0
  220. package/dist/svelte/useVeloPlot.d.ts +21 -0
  221. package/dist/svelte/useVeloPlot.test.ts +100 -0
  222. package/dist/svelte/useVeloPlot.ts +81 -0
  223. package/dist/svelte.d.ts +1 -0
  224. package/dist/svelte.js +143 -0
  225. package/dist/svelte.js.map +1 -0
  226. package/dist/symbols-DT0eLlpW.js +568 -0
  227. package/dist/symbols-DT0eLlpW.js.map +1 -0
  228. package/dist/testing/index.d.ts +1 -1
  229. package/dist/theme/index.d.ts +2 -1
  230. package/dist/trading.js +7 -7
  231. package/dist/types.d.ts +1 -1
  232. package/dist/{utils-BK5UUXxj.js → utils-Dx0h0bgQ.js} +9 -9
  233. package/dist/{utils-BK5UUXxj.js.map → utils-Dx0h0bgQ.js.map} +1 -1
  234. package/dist/velo-plot.full.js +444 -433
  235. package/dist/velo-plot.full.js.map +1 -1
  236. package/dist/velo-plot.js +15 -15
  237. package/dist/vue/StackedPlot.vue.d.ts +48 -0
  238. package/dist/vue/VeloPlot.vue.d.ts +64 -0
  239. package/dist/vue/index.d.ts +250 -0
  240. package/dist/vue/useChartSync.d.ts +52 -0
  241. package/dist/vue/useIndicator.d.ts +23 -0
  242. package/dist/vue/useStackedPlot.d.ts +15 -0
  243. package/dist/vue/useVeloPlot.d.ts +20 -0
  244. package/dist/vue.d.ts +1 -0
  245. package/dist/vue.js +312 -0
  246. package/dist/vue.js.map +1 -0
  247. package/dist/workers/indicatorsAsync.d.ts +26 -0
  248. package/dist/workers/pool.d.ts +9 -0
  249. package/package.json +88 -10
  250. package/dist/ChartCore-BhQ4j7f5.js.map +0 -1
  251. package/dist/SciPlot-GJvw7GJo.js +0 -463
  252. package/dist/SciPlot-GJvw7GJo.js.map +0 -1
  253. package/dist/axisFormat-SPX-CD5s.js.map +0 -1
  254. package/dist/createStackedChart-DJSmqerD.js +0 -706
  255. package/dist/createStackedChart-DJSmqerD.js.map +0 -1
  256. package/dist/index-CUGS98p4.js.map +0 -1
  257. package/dist/index-CWipqOLP.js.map +0 -1
  258. package/dist/index-D7dTq6VB.js.map +0 -1
  259. package/dist/index-DoYxf1cV.js.map +0 -1
  260. package/dist/index.core-fpZ1dYN0.js.map +0 -1
  261. package/dist/mockDatafeed-Cdg5hKEo.js.map +0 -1
  262. package/dist/pool-15HMCNv8.js +0 -88
  263. package/dist/pool-15HMCNv8.js.map +0 -1
  264. package/dist/react/SciPlot.d.ts +0 -60
  265. package/dist/react/useSciPlot.d.ts +0 -56
@@ -1 +1 @@
1
- {"version":3,"file":"index-x4stH3jD.js","sources":["../src/core/locale/index.ts"],"sourcesContent":["/**\n * Sci Plot - Internationalization (i18n) Module\n * \n * Provides locale-aware formatting for numbers, dates, and chart UI.\n * Supports custom format functions and predefined locales.\n * \n * @module locale\n */\n\n// ============================================\n// Types\n// ============================================\n\nexport interface LocaleConfig {\n /** Locale identifier (e.g., 'en-US', 'es-ES', 'de-DE') */\n locale: string;\n /** Decimal separator override (auto-detected if not specified) */\n decimalSeparator?: string;\n /** Thousands separator override (auto-detected if not specified) */\n thousandsSeparator?: string;\n /** Date format pattern (e.g., 'DD/MM/YYYY', 'MM/DD/YYYY', 'YYYY-MM-DD') */\n dateFormat?: string;\n /** Time format pattern (e.g., 'HH:mm:ss', 'hh:mm:ss a') */\n timeFormat?: string;\n /** Custom number formatter */\n numberFormatter?: (value: number, decimals?: number) => string;\n /** Custom date formatter */\n dateFormatter?: (date: Date) => string;\n /** Short form labels (used in axis labels) */\n shortLabels?: {\n time?: string;\n value?: string;\n points?: string;\n };\n /** Full form labels (used in tooltips/panels) */\n labels?: {\n start?: string;\n pause?: string;\n reset?: string;\n export?: string;\n autoScale?: string;\n pan?: string;\n zoom?: string;\n select?: string;\n legend?: string;\n fps?: string;\n points?: string;\n loading?: string;\n noData?: string;\n error?: string;\n };\n}\n\nexport interface LocaleFormatter {\n /** Format a number with the locale settings */\n formatNumber(value: number, decimals?: number): string;\n /** Format a date with the locale settings */\n formatDate(date: Date): string;\n /** Format a time with the locale settings */\n formatTime(date: Date): string;\n /** Format a date and time with the locale settings */\n formatDateTime(date: Date): string;\n /** Format a number with SI prefix (k, M, G, etc.) */\n formatWithPrefix(value: number, unit?: string): string;\n /** Format a number in scientific notation */\n formatScientific(value: number, decimals?: number): string;\n /** Get a localized label */\n getLabel(key: keyof NonNullable<LocaleConfig['labels']>): string;\n}\n\n// ============================================\n// Predefined Locales\n// ============================================\n\nexport const LOCALE_EN_US: LocaleConfig = {\n locale: 'en-US',\n decimalSeparator: '.',\n thousandsSeparator: ',',\n dateFormat: 'MM/DD/YYYY',\n timeFormat: 'hh:mm:ss a',\n labels: {\n start: 'Start',\n pause: 'Pause',\n reset: 'Reset',\n export: 'Export',\n autoScale: 'Auto Scale',\n pan: 'Pan',\n zoom: 'Zoom',\n select: 'Select',\n legend: 'Legend',\n fps: 'FPS',\n points: 'points',\n loading: 'Loading...',\n noData: 'No data',\n error: 'Error',\n },\n};\n\nexport const LOCALE_ES_ES: LocaleConfig = {\n locale: 'es-ES',\n decimalSeparator: ',',\n thousandsSeparator: '.',\n dateFormat: 'DD/MM/YYYY',\n timeFormat: 'HH:mm:ss',\n labels: {\n start: 'Iniciar',\n pause: 'Pausar',\n reset: 'Reiniciar',\n export: 'Exportar',\n autoScale: 'Auto Escala',\n pan: 'Mover',\n zoom: 'Zoom',\n select: 'Seleccionar',\n legend: 'Leyenda',\n fps: 'FPS',\n points: 'puntos',\n loading: 'Cargando...',\n noData: 'Sin datos',\n error: 'Error',\n },\n};\n\nexport const LOCALE_DE_DE: LocaleConfig = {\n locale: 'de-DE',\n decimalSeparator: ',',\n thousandsSeparator: '.',\n dateFormat: 'DD.MM.YYYY',\n timeFormat: 'HH:mm:ss',\n labels: {\n start: 'Start',\n pause: 'Pause',\n reset: 'Zurücksetzen',\n export: 'Exportieren',\n autoScale: 'Auto-Skalierung',\n pan: 'Verschieben',\n zoom: 'Zoom',\n select: 'Auswählen',\n legend: 'Legende',\n fps: 'FPS',\n points: 'Punkte',\n loading: 'Laden...',\n noData: 'Keine Daten',\n error: 'Fehler',\n },\n};\n\nexport const LOCALE_FR_FR: LocaleConfig = {\n locale: 'fr-FR',\n decimalSeparator: ',',\n thousandsSeparator: ' ',\n dateFormat: 'DD/MM/YYYY',\n timeFormat: 'HH:mm:ss',\n labels: {\n start: 'Démarrer',\n pause: 'Pause',\n reset: 'Réinitialiser',\n export: 'Exporter',\n autoScale: 'Échelle auto',\n pan: 'Déplacer',\n zoom: 'Zoom',\n select: 'Sélectionner',\n legend: 'Légende',\n fps: 'FPS',\n points: 'points',\n loading: 'Chargement...',\n noData: 'Aucune donnée',\n error: 'Erreur',\n },\n};\n\nexport const LOCALE_PT_BR: LocaleConfig = {\n locale: 'pt-BR',\n decimalSeparator: ',',\n thousandsSeparator: '.',\n dateFormat: 'DD/MM/YYYY',\n timeFormat: 'HH:mm:ss',\n labels: {\n start: 'Iniciar',\n pause: 'Pausar',\n reset: 'Reiniciar',\n export: 'Exportar',\n autoScale: 'Escala Auto',\n pan: 'Mover',\n zoom: 'Zoom',\n select: 'Selecionar',\n legend: 'Legenda',\n fps: 'FPS',\n points: 'pontos',\n loading: 'Carregando...',\n noData: 'Sem dados',\n error: 'Erro',\n },\n};\n\nexport const LOCALE_ZH_CN: LocaleConfig = {\n locale: 'zh-CN',\n decimalSeparator: '.',\n thousandsSeparator: ',',\n dateFormat: 'YYYY/MM/DD',\n timeFormat: 'HH:mm:ss',\n labels: {\n start: '开始',\n pause: '暂停',\n reset: '重置',\n export: '导出',\n autoScale: '自动缩放',\n pan: '平移',\n zoom: '缩放',\n select: '选择',\n legend: '图例',\n fps: 'FPS',\n points: '点',\n loading: '加载中...',\n noData: '无数据',\n error: '错误',\n },\n};\n\nexport const LOCALE_JA_JP: LocaleConfig = {\n locale: 'ja-JP',\n decimalSeparator: '.',\n thousandsSeparator: ',',\n dateFormat: 'YYYY/MM/DD',\n timeFormat: 'HH:mm:ss',\n labels: {\n start: '開始',\n pause: '一時停止',\n reset: 'リセット',\n export: 'エクスポート',\n autoScale: '自動スケール',\n pan: 'パン',\n zoom: 'ズーム',\n select: '選択',\n legend: '凡例',\n fps: 'FPS',\n points: 'ポイント',\n loading: '読み込み中...',\n noData: 'データなし',\n error: 'エラー',\n },\n};\n\n// Predefined locales map\nconst PREDEFINED_LOCALES: Record<string, LocaleConfig> = {\n 'en-US': LOCALE_EN_US,\n 'en': LOCALE_EN_US,\n 'es-ES': LOCALE_ES_ES,\n 'es': LOCALE_ES_ES,\n 'de-DE': LOCALE_DE_DE,\n 'de': LOCALE_DE_DE,\n 'fr-FR': LOCALE_FR_FR,\n 'fr': LOCALE_FR_FR,\n 'pt-BR': LOCALE_PT_BR,\n 'pt': LOCALE_PT_BR,\n 'zh-CN': LOCALE_ZH_CN,\n 'zh': LOCALE_ZH_CN,\n 'ja-JP': LOCALE_JA_JP,\n 'ja': LOCALE_JA_JP,\n};\n\n// ============================================\n// SI Prefixes\n// ============================================\n\nconst SI_PREFIXES = [\n { value: 1e-15, symbol: 'f' },\n { value: 1e-12, symbol: 'p' },\n { value: 1e-9, symbol: 'n' },\n { value: 1e-6, symbol: 'µ' },\n { value: 1e-3, symbol: 'm' },\n { value: 1, symbol: '' },\n { value: 1e3, symbol: 'k' },\n { value: 1e6, symbol: 'M' },\n { value: 1e9, symbol: 'G' },\n { value: 1e12, symbol: 'T' },\n { value: 1e15, symbol: 'P' },\n];\n\n// ============================================\n// Locale Manager\n// ============================================\n\n/** Current global locale */\nlet currentLocale: LocaleConfig = LOCALE_EN_US;\n\n/**\n * Set the global locale for all charts\n */\nexport function setGlobalLocale(localeOrConfig: string | LocaleConfig): void {\n if (typeof localeOrConfig === 'string') {\n const predefined = PREDEFINED_LOCALES[localeOrConfig];\n if (predefined) {\n currentLocale = predefined;\n } else {\n // Try to create a basic locale from the string\n currentLocale = { ...LOCALE_EN_US, locale: localeOrConfig };\n }\n } else {\n currentLocale = { ...LOCALE_EN_US, ...localeOrConfig };\n }\n}\n\n/**\n * Get the current global locale\n */\nexport function getGlobalLocale(): LocaleConfig {\n return currentLocale;\n}\n\n/**\n * Get a predefined locale by name\n */\nexport function getLocale(name: string): LocaleConfig | undefined {\n return PREDEFINED_LOCALES[name];\n}\n\n/**\n * Register a custom locale\n */\nexport function registerLocale(name: string, config: LocaleConfig): void {\n PREDEFINED_LOCALES[name] = config;\n}\n\n// ============================================\n// Locale Formatter Implementation\n// ============================================\n\n/**\n * Create a locale formatter from a configuration\n */\nexport function createLocaleFormatter(config?: LocaleConfig | string): LocaleFormatter {\n let localeConfig: LocaleConfig;\n \n if (!config) {\n localeConfig = currentLocale;\n } else if (typeof config === 'string') {\n localeConfig = PREDEFINED_LOCALES[config] || { ...LOCALE_EN_US, locale: config };\n } else {\n localeConfig = { ...LOCALE_EN_US, ...config };\n }\n\n const decSep = localeConfig.decimalSeparator || '.';\n const thousandsSep = localeConfig.thousandsSeparator || ',';\n const labels = { ...LOCALE_EN_US.labels, ...localeConfig.labels };\n\n return {\n formatNumber(value: number, decimals: number = 2): string {\n if (localeConfig.numberFormatter) {\n return localeConfig.numberFormatter(value, decimals);\n }\n\n if (!isFinite(value)) {\n return value.toString();\n }\n\n // Format the number\n const parts = Math.abs(value).toFixed(decimals).split('.');\n const integerPart = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandsSep);\n const decimalPart = parts[1];\n\n let result = integerPart;\n if (decimalPart) {\n result += decSep + decimalPart;\n }\n\n return value < 0 ? '-' + result : result;\n },\n\n formatDate(date: Date): string {\n if (localeConfig.dateFormatter) {\n return localeConfig.dateFormatter(date);\n }\n\n const format = localeConfig.dateFormat || 'YYYY-MM-DD';\n const day = String(date.getDate()).padStart(2, '0');\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const year = String(date.getFullYear());\n\n return format\n .replace('YYYY', year)\n .replace('MM', month)\n .replace('DD', day);\n },\n\n formatTime(date: Date): string {\n const format = localeConfig.timeFormat || 'HH:mm:ss';\n const hours24 = date.getHours();\n const hours12 = hours24 % 12 || 12;\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n const ampm = hours24 >= 12 ? 'PM' : 'AM';\n\n return format\n .replace('HH', String(hours24).padStart(2, '0'))\n .replace('hh', String(hours12).padStart(2, '0'))\n .replace('mm', minutes)\n .replace('ss', seconds)\n .replace('a', ampm.toLowerCase())\n .replace('A', ampm);\n },\n\n formatDateTime(date: Date): string {\n return this.formatDate(date) + ' ' + this.formatTime(date);\n },\n\n formatWithPrefix(value: number, unit: string = ''): string {\n if (value === 0) return '0' + (unit ? ' ' + unit : '');\n\n const absValue = Math.abs(value);\n \n // Find appropriate prefix\n let selectedPrefix = SI_PREFIXES[5]; // Default to '' (1)\n for (let i = SI_PREFIXES.length - 1; i >= 0; i--) {\n if (absValue >= SI_PREFIXES[i].value * 0.9999) {\n selectedPrefix = SI_PREFIXES[i];\n break;\n }\n }\n\n const scaledValue = value / selectedPrefix.value;\n const formatted = this.formatNumber(scaledValue, 2);\n \n const suffix = selectedPrefix.symbol + unit;\n return formatted + (suffix ? ' ' + suffix : '');\n },\n\n formatScientific(value: number, decimals: number = 2): string {\n if (value === 0) return '0';\n if (!isFinite(value)) return value.toString();\n\n const exp = Math.floor(Math.log10(Math.abs(value)));\n const mantissa = value / Math.pow(10, exp);\n \n return this.formatNumber(mantissa, decimals) + ' × 10' + formatSuperscript(exp);\n },\n\n getLabel(key: keyof NonNullable<LocaleConfig['labels']>): string {\n return labels[key] || key;\n },\n };\n}\n\n/**\n * Format a number as superscript for scientific notation\n */\nfunction formatSuperscript(num: number): string {\n const superscripts: Record<string, string> = {\n '-': '⁻',\n '0': '⁰',\n '1': '¹',\n '2': '²',\n '3': '³',\n '4': '⁴',\n '5': '⁵',\n '6': '⁶',\n '7': '⁷',\n '8': '⁸',\n '9': '⁹',\n };\n return String(num).split('').map(c => superscripts[c] || c).join('');\n}\n\n// ============================================\n// Default Export\n// ============================================\n\nexport const defaultFormatter = createLocaleFormatter();\n"],"names":["LOCALE_EN_US","LOCALE_ES_ES","LOCALE_DE_DE","LOCALE_FR_FR","LOCALE_PT_BR","LOCALE_ZH_CN","LOCALE_JA_JP","PREDEFINED_LOCALES","SI_PREFIXES","currentLocale","setGlobalLocale","localeOrConfig","predefined","getGlobalLocale","getLocale","name","registerLocale","config","createLocaleFormatter","localeConfig","decSep","thousandsSep","labels","value","decimals","parts","integerPart","decimalPart","result","date","format","day","month","year","hours24","hours12","minutes","seconds","ampm","unit","absValue","selectedPrefix","i","scaledValue","formatted","suffix","exp","mantissa","formatSuperscript","key","num","superscripts","c","defaultFormatter"],"mappings":"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"}
1
+ {"version":3,"file":"index-x4stH3jD.js","sources":["../src/core/locale/index.ts"],"sourcesContent":["/**\n * Velo Plot - Internationalization (i18n) Module\n * \n * Provides locale-aware formatting for numbers, dates, and chart UI.\n * Supports custom format functions and predefined locales.\n * \n * @module locale\n */\n\n// ============================================\n// Types\n// ============================================\n\nexport interface LocaleConfig {\n /** Locale identifier (e.g., 'en-US', 'es-ES', 'de-DE') */\n locale: string;\n /** Decimal separator override (auto-detected if not specified) */\n decimalSeparator?: string;\n /** Thousands separator override (auto-detected if not specified) */\n thousandsSeparator?: string;\n /** Date format pattern (e.g., 'DD/MM/YYYY', 'MM/DD/YYYY', 'YYYY-MM-DD') */\n dateFormat?: string;\n /** Time format pattern (e.g., 'HH:mm:ss', 'hh:mm:ss a') */\n timeFormat?: string;\n /** Custom number formatter */\n numberFormatter?: (value: number, decimals?: number) => string;\n /** Custom date formatter */\n dateFormatter?: (date: Date) => string;\n /** Short form labels (used in axis labels) */\n shortLabels?: {\n time?: string;\n value?: string;\n points?: string;\n };\n /** Full form labels (used in tooltips/panels) */\n labels?: {\n start?: string;\n pause?: string;\n reset?: string;\n export?: string;\n autoScale?: string;\n pan?: string;\n zoom?: string;\n select?: string;\n legend?: string;\n fps?: string;\n points?: string;\n loading?: string;\n noData?: string;\n error?: string;\n };\n}\n\nexport interface LocaleFormatter {\n /** Format a number with the locale settings */\n formatNumber(value: number, decimals?: number): string;\n /** Format a date with the locale settings */\n formatDate(date: Date): string;\n /** Format a time with the locale settings */\n formatTime(date: Date): string;\n /** Format a date and time with the locale settings */\n formatDateTime(date: Date): string;\n /** Format a number with SI prefix (k, M, G, etc.) */\n formatWithPrefix(value: number, unit?: string): string;\n /** Format a number in scientific notation */\n formatScientific(value: number, decimals?: number): string;\n /** Get a localized label */\n getLabel(key: keyof NonNullable<LocaleConfig['labels']>): string;\n}\n\n// ============================================\n// Predefined Locales\n// ============================================\n\nexport const LOCALE_EN_US: LocaleConfig = {\n locale: 'en-US',\n decimalSeparator: '.',\n thousandsSeparator: ',',\n dateFormat: 'MM/DD/YYYY',\n timeFormat: 'hh:mm:ss a',\n labels: {\n start: 'Start',\n pause: 'Pause',\n reset: 'Reset',\n export: 'Export',\n autoScale: 'Auto Scale',\n pan: 'Pan',\n zoom: 'Zoom',\n select: 'Select',\n legend: 'Legend',\n fps: 'FPS',\n points: 'points',\n loading: 'Loading...',\n noData: 'No data',\n error: 'Error',\n },\n};\n\nexport const LOCALE_ES_ES: LocaleConfig = {\n locale: 'es-ES',\n decimalSeparator: ',',\n thousandsSeparator: '.',\n dateFormat: 'DD/MM/YYYY',\n timeFormat: 'HH:mm:ss',\n labels: {\n start: 'Iniciar',\n pause: 'Pausar',\n reset: 'Reiniciar',\n export: 'Exportar',\n autoScale: 'Auto Escala',\n pan: 'Mover',\n zoom: 'Zoom',\n select: 'Seleccionar',\n legend: 'Leyenda',\n fps: 'FPS',\n points: 'puntos',\n loading: 'Cargando...',\n noData: 'Sin datos',\n error: 'Error',\n },\n};\n\nexport const LOCALE_DE_DE: LocaleConfig = {\n locale: 'de-DE',\n decimalSeparator: ',',\n thousandsSeparator: '.',\n dateFormat: 'DD.MM.YYYY',\n timeFormat: 'HH:mm:ss',\n labels: {\n start: 'Start',\n pause: 'Pause',\n reset: 'Zurücksetzen',\n export: 'Exportieren',\n autoScale: 'Auto-Skalierung',\n pan: 'Verschieben',\n zoom: 'Zoom',\n select: 'Auswählen',\n legend: 'Legende',\n fps: 'FPS',\n points: 'Punkte',\n loading: 'Laden...',\n noData: 'Keine Daten',\n error: 'Fehler',\n },\n};\n\nexport const LOCALE_FR_FR: LocaleConfig = {\n locale: 'fr-FR',\n decimalSeparator: ',',\n thousandsSeparator: ' ',\n dateFormat: 'DD/MM/YYYY',\n timeFormat: 'HH:mm:ss',\n labels: {\n start: 'Démarrer',\n pause: 'Pause',\n reset: 'Réinitialiser',\n export: 'Exporter',\n autoScale: 'Échelle auto',\n pan: 'Déplacer',\n zoom: 'Zoom',\n select: 'Sélectionner',\n legend: 'Légende',\n fps: 'FPS',\n points: 'points',\n loading: 'Chargement...',\n noData: 'Aucune donnée',\n error: 'Erreur',\n },\n};\n\nexport const LOCALE_PT_BR: LocaleConfig = {\n locale: 'pt-BR',\n decimalSeparator: ',',\n thousandsSeparator: '.',\n dateFormat: 'DD/MM/YYYY',\n timeFormat: 'HH:mm:ss',\n labels: {\n start: 'Iniciar',\n pause: 'Pausar',\n reset: 'Reiniciar',\n export: 'Exportar',\n autoScale: 'Escala Auto',\n pan: 'Mover',\n zoom: 'Zoom',\n select: 'Selecionar',\n legend: 'Legenda',\n fps: 'FPS',\n points: 'pontos',\n loading: 'Carregando...',\n noData: 'Sem dados',\n error: 'Erro',\n },\n};\n\nexport const LOCALE_ZH_CN: LocaleConfig = {\n locale: 'zh-CN',\n decimalSeparator: '.',\n thousandsSeparator: ',',\n dateFormat: 'YYYY/MM/DD',\n timeFormat: 'HH:mm:ss',\n labels: {\n start: '开始',\n pause: '暂停',\n reset: '重置',\n export: '导出',\n autoScale: '自动缩放',\n pan: '平移',\n zoom: '缩放',\n select: '选择',\n legend: '图例',\n fps: 'FPS',\n points: '点',\n loading: '加载中...',\n noData: '无数据',\n error: '错误',\n },\n};\n\nexport const LOCALE_JA_JP: LocaleConfig = {\n locale: 'ja-JP',\n decimalSeparator: '.',\n thousandsSeparator: ',',\n dateFormat: 'YYYY/MM/DD',\n timeFormat: 'HH:mm:ss',\n labels: {\n start: '開始',\n pause: '一時停止',\n reset: 'リセット',\n export: 'エクスポート',\n autoScale: '自動スケール',\n pan: 'パン',\n zoom: 'ズーム',\n select: '選択',\n legend: '凡例',\n fps: 'FPS',\n points: 'ポイント',\n loading: '読み込み中...',\n noData: 'データなし',\n error: 'エラー',\n },\n};\n\n// Predefined locales map\nconst PREDEFINED_LOCALES: Record<string, LocaleConfig> = {\n 'en-US': LOCALE_EN_US,\n 'en': LOCALE_EN_US,\n 'es-ES': LOCALE_ES_ES,\n 'es': LOCALE_ES_ES,\n 'de-DE': LOCALE_DE_DE,\n 'de': LOCALE_DE_DE,\n 'fr-FR': LOCALE_FR_FR,\n 'fr': LOCALE_FR_FR,\n 'pt-BR': LOCALE_PT_BR,\n 'pt': LOCALE_PT_BR,\n 'zh-CN': LOCALE_ZH_CN,\n 'zh': LOCALE_ZH_CN,\n 'ja-JP': LOCALE_JA_JP,\n 'ja': LOCALE_JA_JP,\n};\n\n// ============================================\n// SI Prefixes\n// ============================================\n\nconst SI_PREFIXES = [\n { value: 1e-15, symbol: 'f' },\n { value: 1e-12, symbol: 'p' },\n { value: 1e-9, symbol: 'n' },\n { value: 1e-6, symbol: 'µ' },\n { value: 1e-3, symbol: 'm' },\n { value: 1, symbol: '' },\n { value: 1e3, symbol: 'k' },\n { value: 1e6, symbol: 'M' },\n { value: 1e9, symbol: 'G' },\n { value: 1e12, symbol: 'T' },\n { value: 1e15, symbol: 'P' },\n];\n\n// ============================================\n// Locale Manager\n// ============================================\n\n/** Current global locale */\nlet currentLocale: LocaleConfig = LOCALE_EN_US;\n\n/**\n * Set the global locale for all charts\n */\nexport function setGlobalLocale(localeOrConfig: string | LocaleConfig): void {\n if (typeof localeOrConfig === 'string') {\n const predefined = PREDEFINED_LOCALES[localeOrConfig];\n if (predefined) {\n currentLocale = predefined;\n } else {\n // Try to create a basic locale from the string\n currentLocale = { ...LOCALE_EN_US, locale: localeOrConfig };\n }\n } else {\n currentLocale = { ...LOCALE_EN_US, ...localeOrConfig };\n }\n}\n\n/**\n * Get the current global locale\n */\nexport function getGlobalLocale(): LocaleConfig {\n return currentLocale;\n}\n\n/**\n * Get a predefined locale by name\n */\nexport function getLocale(name: string): LocaleConfig | undefined {\n return PREDEFINED_LOCALES[name];\n}\n\n/**\n * Register a custom locale\n */\nexport function registerLocale(name: string, config: LocaleConfig): void {\n PREDEFINED_LOCALES[name] = config;\n}\n\n// ============================================\n// Locale Formatter Implementation\n// ============================================\n\n/**\n * Create a locale formatter from a configuration\n */\nexport function createLocaleFormatter(config?: LocaleConfig | string): LocaleFormatter {\n let localeConfig: LocaleConfig;\n \n if (!config) {\n localeConfig = currentLocale;\n } else if (typeof config === 'string') {\n localeConfig = PREDEFINED_LOCALES[config] || { ...LOCALE_EN_US, locale: config };\n } else {\n localeConfig = { ...LOCALE_EN_US, ...config };\n }\n\n const decSep = localeConfig.decimalSeparator || '.';\n const thousandsSep = localeConfig.thousandsSeparator || ',';\n const labels = { ...LOCALE_EN_US.labels, ...localeConfig.labels };\n\n return {\n formatNumber(value: number, decimals: number = 2): string {\n if (localeConfig.numberFormatter) {\n return localeConfig.numberFormatter(value, decimals);\n }\n\n if (!isFinite(value)) {\n return value.toString();\n }\n\n // Format the number\n const parts = Math.abs(value).toFixed(decimals).split('.');\n const integerPart = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandsSep);\n const decimalPart = parts[1];\n\n let result = integerPart;\n if (decimalPart) {\n result += decSep + decimalPart;\n }\n\n return value < 0 ? '-' + result : result;\n },\n\n formatDate(date: Date): string {\n if (localeConfig.dateFormatter) {\n return localeConfig.dateFormatter(date);\n }\n\n const format = localeConfig.dateFormat || 'YYYY-MM-DD';\n const day = String(date.getDate()).padStart(2, '0');\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const year = String(date.getFullYear());\n\n return format\n .replace('YYYY', year)\n .replace('MM', month)\n .replace('DD', day);\n },\n\n formatTime(date: Date): string {\n const format = localeConfig.timeFormat || 'HH:mm:ss';\n const hours24 = date.getHours();\n const hours12 = hours24 % 12 || 12;\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n const ampm = hours24 >= 12 ? 'PM' : 'AM';\n\n return format\n .replace('HH', String(hours24).padStart(2, '0'))\n .replace('hh', String(hours12).padStart(2, '0'))\n .replace('mm', minutes)\n .replace('ss', seconds)\n .replace('a', ampm.toLowerCase())\n .replace('A', ampm);\n },\n\n formatDateTime(date: Date): string {\n return this.formatDate(date) + ' ' + this.formatTime(date);\n },\n\n formatWithPrefix(value: number, unit: string = ''): string {\n if (value === 0) return '0' + (unit ? ' ' + unit : '');\n\n const absValue = Math.abs(value);\n \n // Find appropriate prefix\n let selectedPrefix = SI_PREFIXES[5]; // Default to '' (1)\n for (let i = SI_PREFIXES.length - 1; i >= 0; i--) {\n if (absValue >= SI_PREFIXES[i].value * 0.9999) {\n selectedPrefix = SI_PREFIXES[i];\n break;\n }\n }\n\n const scaledValue = value / selectedPrefix.value;\n const formatted = this.formatNumber(scaledValue, 2);\n \n const suffix = selectedPrefix.symbol + unit;\n return formatted + (suffix ? ' ' + suffix : '');\n },\n\n formatScientific(value: number, decimals: number = 2): string {\n if (value === 0) return '0';\n if (!isFinite(value)) return value.toString();\n\n const exp = Math.floor(Math.log10(Math.abs(value)));\n const mantissa = value / Math.pow(10, exp);\n \n return this.formatNumber(mantissa, decimals) + ' × 10' + formatSuperscript(exp);\n },\n\n getLabel(key: keyof NonNullable<LocaleConfig['labels']>): string {\n return labels[key] || key;\n },\n };\n}\n\n/**\n * Format a number as superscript for scientific notation\n */\nfunction formatSuperscript(num: number): string {\n const superscripts: Record<string, string> = {\n '-': '⁻',\n '0': '⁰',\n '1': '¹',\n '2': '²',\n '3': '³',\n '4': '⁴',\n '5': '⁵',\n '6': '⁶',\n '7': '⁷',\n '8': '⁸',\n '9': '⁹',\n };\n return String(num).split('').map(c => superscripts[c] || c).join('');\n}\n\n// ============================================\n// Default Export\n// ============================================\n\nexport const defaultFormatter = createLocaleFormatter();\n"],"names":["LOCALE_EN_US","LOCALE_ES_ES","LOCALE_DE_DE","LOCALE_FR_FR","LOCALE_PT_BR","LOCALE_ZH_CN","LOCALE_JA_JP","PREDEFINED_LOCALES","SI_PREFIXES","currentLocale","setGlobalLocale","localeOrConfig","predefined","getGlobalLocale","getLocale","name","registerLocale","config","createLocaleFormatter","localeConfig","decSep","thousandsSep","labels","value","decimals","parts","integerPart","decimalPart","result","date","format","day","month","year","hours24","hours12","minutes","seconds","ampm","unit","absValue","selectedPrefix","i","scaledValue","formatted","suffix","exp","mantissa","formatSuperscript","key","num","superscripts","c","defaultFormatter"],"mappings":"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"}
@@ -1,13 +1,14 @@
1
- var l = Object.defineProperty;
2
- var g = (i, e, r) => e in i ? l(i, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : i[e] = r;
1
+ var c = Object.defineProperty;
2
+ var g = (i, e, r) => e in i ? c(i, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : i[e] = r;
3
3
  var u = (i, e, r) => g(i, typeof e != "symbol" ? e + "" : e, r);
4
- import { N as f } from "./ChartCore-BhQ4j7f5.js";
5
- import "./axisFormat-SPX-CD5s.js";
4
+ import { N as f } from "./ChartCore-BpzRvN4Y.js";
5
+ import "./axisFormat-CzumxpCL.js";
6
6
  import "./index-x4stH3jD.js";
7
- function b(i) {
7
+ import "./symbols-DT0eLlpW.js";
8
+ function w(i) {
8
9
  return new f(i);
9
10
  }
10
- class d {
11
+ class p {
11
12
  constructor() {
12
13
  u(this, "entries", /* @__PURE__ */ new Map());
13
14
  }
@@ -17,7 +18,7 @@ class d {
17
18
  register(e) {
18
19
  const r = e.manifest.name;
19
20
  this.entries.has(r) && console.warn(
20
- `[SciPlot Registry] Plugin "${r}" is already registered, overwriting`
21
+ `[VeloPlot Registry] Plugin "${r}" is already registered, overwriting`
21
22
  ), this.entries.set(r, e);
22
23
  }
23
24
  /**
@@ -57,7 +58,7 @@ class d {
57
58
  const r = [], n = e.toLowerCase();
58
59
  return this.entries.forEach((s) => {
59
60
  var o;
60
- (o = s.manifest.tags) != null && o.some((c) => c.toLowerCase().includes(n)) && r.push(s.manifest);
61
+ (o = s.manifest.tags) != null && o.some((l) => l.toLowerCase().includes(n)) && r.push(s.manifest);
61
62
  }), r;
62
63
  }
63
64
  /**
@@ -81,9 +82,9 @@ class d {
81
82
  }
82
83
  let t = null;
83
84
  function a() {
84
- return t || (t = new d()), t;
85
+ return t || (t = new p()), t;
85
86
  }
86
- function p(i) {
87
+ function d(i) {
87
88
  a().register(i);
88
89
  }
89
90
  function h(i, e) {
@@ -92,19 +93,19 @@ function h(i, e) {
92
93
  manifest: i
93
94
  });
94
95
  }
95
- function w(i, e) {
96
+ function $(i, e) {
96
97
  const r = h(i, e);
97
- return p({ manifest: i, factory: r }), r;
98
+ return d({ manifest: i, factory: r }), r;
98
99
  }
99
- async function $(i, e) {
100
+ async function C(i, e) {
100
101
  const r = a().get(i);
101
102
  if (!r) {
102
- console.warn(`[SciPlot] Plugin "${i}" not found in registry`);
103
+ console.warn(`[VeloPlot] Plugin "${i}" not found in registry`);
103
104
  return;
104
105
  }
105
106
  return r(e);
106
107
  }
107
- function C() {
108
+ function z() {
108
109
  const i = a(), e = [
109
110
  "analysis",
110
111
  "visualization",
@@ -119,13 +120,13 @@ function C() {
119
120
  r[n] = i.findByCapability(n);
120
121
  }), r;
121
122
  }
122
- function z(i) {
123
+ function A(i) {
123
124
  const e = [];
124
125
  return i.name ? /^[@a-z0-9-]+\/[a-z0-9-]+$|^[a-z0-9-]+$/.test(i.name) || e.push(
125
126
  'Invalid name format. Use lowercase with hyphens, optionally scoped (e.g., "@org/name")'
126
127
  ) : e.push("Missing required field: name"), i.version ? /^\d+\.\d+\.\d+$/.test(i.version) || e.push("Invalid version format. Use semantic versioning (e.g., 1.0.0)") : e.push("Missing required field: version"), i.dependencies && (Array.isArray(i.dependencies) || e.push("dependencies must be an array")), i.provides && (Array.isArray(i.provides) || e.push("provides must be an array")), e;
127
128
  }
128
- function A(i, e) {
129
+ function M(i, e) {
129
130
  const r = [];
130
131
  if (i.engineVersion) {
131
132
  const [n] = i.engineVersion.split(".").map(Number), [s] = e.split(".").map(Number);
@@ -142,26 +143,26 @@ function A(i, e) {
142
143
  }
143
144
  return { compatible: !0, warnings: r };
144
145
  }
145
- function M(i) {
146
+ function R(i) {
146
147
  return i;
147
148
  }
148
- function R(i, e) {
149
+ function V(i, e) {
149
150
  return (r) => ({
150
151
  ...e(r),
151
152
  manifest: i
152
153
  });
153
154
  }
154
155
  export {
155
- w as a,
156
- C as b,
157
- b as c,
156
+ $ as a,
157
+ z as b,
158
+ w as c,
158
159
  h as d,
159
- A as e,
160
- M as f,
160
+ M as e,
161
+ R as f,
161
162
  a as g,
162
- R as h,
163
- $ as l,
164
- p as r,
165
- z as v
163
+ V as h,
164
+ C as l,
165
+ d as r,
166
+ A as v
166
167
  };
167
- //# sourceMappingURL=index.core-fpZ1dYN0.js.map
168
+ //# sourceMappingURL=index.core-BmZe2jRQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.core-BmZe2jRQ.js","sources":["../src/renderer/RendererInterface.ts","../src/plugins/PluginRegistry.ts","../src/plugins/index.ts"],"sourcesContent":["/**\n * WebGL Renderer Interface & Factory\n *\n * This module provides a common interface for WebGL rendering.\n * Currently optimized for NativeWebGLRenderer (zero dependencies).\n */\n\nimport type { Bounds } from '../types';\nimport { NativeWebGLRenderer } from './NativeWebGLRenderer';\n\n// ============================================\n// Common Types\n// ============================================\n\nexport interface SeriesRenderData {\n id: string;\n buffer: WebGLBuffer;\n count: number;\n style: any;\n visible: boolean;\n type: string;\n zBounds?: { min: number; max: number };\n colormapTexture?: WebGLTexture;\n}\n\nexport interface RenderOptions {\n bounds: Bounds;\n backgroundColor?: [number, number, number, number];\n}\n\n// ============================================\n// Renderer Interface\n// ============================================\n\n/**\n * Common interface for all WebGL renderer implementations\n */\nexport interface IWebGLRenderer {\n /** Check if WebGL is available and initialized */\n readonly available: boolean;\n\n /**\n * Create or update a GPU buffer with interleaved X,Y data\n * @param id - Unique buffer identifier\n * @param data - Interleaved Float32Array [x0, y0, x1, y1, ...]\n */\n createBuffer(id: string, data: Float32Array): void;\n\n /**\n * Get a buffer by ID\n */\n getBuffer(id: string): WebGLBuffer | undefined;\n\n /**\n * Delete a buffer and free GPU memory\n */\n deleteBuffer(id: string): void;\n \n /** \n * Create a 1D texture for heatmaps \n */\n createColormapTexture(id: string, data: Uint8Array): WebGLTexture;\n\n /**\n * Render a frame with all visible series\n */\n render(series: SeriesRenderData[], options: RenderOptions): void;\n\n /**\n * Handle canvas resize\n */\n resize(): void;\n\n /**\n * Get WebGL capabilities/limits\n */\n getLimits(): Record<string, unknown>;\n\n /**\n * Cleanup and destroy all GPU resources\n */\n destroy(): void;\n}\n\n// ============================================\n// Factory Functions\n// ============================================\n\n/**\n * Create a WebGL renderer (Native WebGL)\n *\n * @param canvas - Target canvas element\n */\nexport function createRenderer(canvas: HTMLCanvasElement): IWebGLRenderer {\n return new NativeWebGLRenderer(canvas);\n}\n\n/**\n * Create a renderer synchronously (native only)\n */\nexport { NativeWebGLRenderer as createNativeRenderer } from './NativeWebGLRenderer';\n","/**\n * Velo Plot - Global Plugin Registry\n * \n * Provides a global registry for third-party plugins that can be\n * discovered and loaded by name without explicit imports.\n * \n * @module plugins/PluginRegistry\n */\n\nimport type {\n PluginFactory,\n PluginManifest,\n PluginCapability,\n PluginRegistry,\n PluginRegistryEntry,\n} from \"./types\";\n\n// ============================================\n// Global Registry Implementation\n// ============================================\n\nclass PluginRegistryImpl implements PluginRegistry {\n private entries = new Map<string, PluginRegistryEntry>();\n\n /**\n * Register a plugin globally\n */\n register(entry: PluginRegistryEntry): void {\n const name = entry.manifest.name;\n\n if (this.entries.has(name)) {\n console.warn(\n `[VeloPlot Registry] Plugin \"${name}\" is already registered, overwriting`\n );\n }\n\n this.entries.set(name, entry);\n }\n\n /**\n * Unregister a plugin\n */\n unregister(name: string): boolean {\n const existed = this.entries.has(name);\n this.entries.delete(name);\n return existed;\n }\n\n /**\n * Get a registered plugin factory by name\n */\n get(name: string): PluginFactory | undefined {\n return this.entries.get(name)?.factory;\n }\n\n /**\n * List all registered plugins\n */\n list(): PluginManifest[] {\n return Array.from(this.entries.values()).map((e) => e.manifest);\n }\n\n /**\n * Search plugins by capability\n */\n findByCapability(capability: PluginCapability): PluginManifest[] {\n const results: PluginManifest[] = [];\n\n this.entries.forEach((entry) => {\n if (entry.manifest.provides?.includes(capability)) {\n results.push(entry.manifest);\n }\n });\n\n return results;\n }\n\n /**\n * Search plugins by tag\n */\n findByTag(tag: string): PluginManifest[] {\n const results: PluginManifest[] = [];\n const lowerTag = tag.toLowerCase();\n\n this.entries.forEach((entry) => {\n if (entry.manifest.tags?.some((t) => t.toLowerCase().includes(lowerTag))) {\n results.push(entry.manifest);\n }\n });\n\n return results;\n }\n\n /**\n * Check if a plugin is registered\n */\n has(name: string): boolean {\n return this.entries.has(name);\n }\n\n /**\n * Get plugin count\n */\n get size(): number {\n return this.entries.size;\n }\n\n /**\n * Clear all registrations\n */\n clear(): void {\n this.entries.clear();\n }\n}\n\n// ============================================\n// Singleton Instance\n// ============================================\n\nlet registryInstance: PluginRegistryImpl | null = null;\n\n/**\n * Get the global plugin registry singleton\n */\nexport function getPluginRegistry(): PluginRegistry {\n if (!registryInstance) {\n registryInstance = new PluginRegistryImpl();\n }\n return registryInstance;\n}\n\n/**\n * Register a plugin in the global registry\n * Shorthand for getPluginRegistry().register()\n */\nexport function registerPlugin(entry: PluginRegistryEntry): void {\n getPluginRegistry().register(entry);\n}\n\n/**\n * Create a plugin factory with manifest validation\n */\nexport function definePlugin<TConfig = unknown>(\n manifest: PluginManifest,\n factory: (config?: TConfig) => Omit<import(\"./types\").ChartPlugin<TConfig>, \"manifest\">\n): PluginFactory<TConfig> {\n return (config?: TConfig) => {\n const plugin = factory(config);\n return {\n ...plugin,\n manifest,\n };\n };\n}\n\n/**\n * Register a plugin from definition\n */\nexport function defineAndRegister<TConfig = unknown>(\n manifest: PluginManifest,\n factory: (config?: TConfig) => Omit<import(\"./types\").ChartPlugin<TConfig>, \"manifest\">\n): PluginFactory<TConfig> {\n const pluginFactory = definePlugin(manifest, factory);\n registerPlugin({ manifest, factory: pluginFactory as PluginFactory });\n return pluginFactory;\n}\n\n// ============================================\n// Plugin Discovery Helpers\n// ============================================\n\n/**\n * Load a plugin from the registry by name\n */\nexport async function loadPlugin<TConfig = unknown>(\n name: string,\n config?: TConfig\n): Promise<import(\"./types\").ChartPlugin<TConfig> | undefined> {\n const factory = getPluginRegistry().get(name);\n if (!factory) {\n console.warn(`[VeloPlot] Plugin \"${name}\" not found in registry`);\n return undefined;\n }\n return factory(config) as import(\"./types\").ChartPlugin<TConfig>;\n}\n\n/**\n * List available plugins by category\n */\nexport function listPluginsByCategory(): Record<PluginCapability, PluginManifest[]> {\n const registry = getPluginRegistry();\n const categories: PluginCapability[] = [\n \"analysis\",\n \"visualization\",\n \"interaction\",\n \"data-source\",\n \"export\",\n \"ui\",\n \"annotation\",\n \"theme\",\n ];\n\n const result: Record<string, PluginManifest[]> = {};\n categories.forEach((cat) => {\n result[cat] = registry.findByCapability(cat);\n });\n\n return result as Record<PluginCapability, PluginManifest[]>;\n}\n\n// ============================================\n// Plugin Validation\n// ============================================\n\n/**\n * Validate a plugin manifest\n */\nexport function validateManifest(manifest: PluginManifest): string[] {\n const errors: string[] = [];\n\n if (!manifest.name) {\n errors.push(\"Missing required field: name\");\n } else if (!/^[@a-z0-9-]+\\/[a-z0-9-]+$|^[a-z0-9-]+$/.test(manifest.name)) {\n errors.push(\n 'Invalid name format. Use lowercase with hyphens, optionally scoped (e.g., \"@org/name\")'\n );\n }\n\n if (!manifest.version) {\n errors.push(\"Missing required field: version\");\n } else if (!/^\\d+\\.\\d+\\.\\d+$/.test(manifest.version)) {\n errors.push(\"Invalid version format. Use semantic versioning (e.g., 1.0.0)\");\n }\n\n if (manifest.dependencies) {\n if (!Array.isArray(manifest.dependencies)) {\n errors.push(\"dependencies must be an array\");\n }\n }\n\n if (manifest.provides) {\n if (!Array.isArray(manifest.provides)) {\n errors.push(\"provides must be an array\");\n }\n }\n\n return errors;\n}\n\n/**\n * Validate a plugin for compatibility\n */\nexport function checkPluginCompatibility(\n manifest: PluginManifest,\n engineVersion: string\n): { compatible: boolean; warnings: string[] } {\n const warnings: string[] = [];\n\n if (manifest.engineVersion) {\n const [reqMajor] = manifest.engineVersion.split(\".\").map(Number);\n const [curMajor] = engineVersion.split(\".\").map(Number);\n\n if (reqMajor > curMajor) {\n return {\n compatible: false,\n warnings: [\n `Plugin requires engine v${manifest.engineVersion}, current is v${engineVersion}`,\n ],\n };\n }\n\n if (reqMajor < curMajor) {\n warnings.push(\n `Plugin was built for engine v${manifest.engineVersion}, may have compatibility issues`\n );\n }\n }\n\n return { compatible: true, warnings };\n}\n","/**\n * Velo Plot - Plugin System\n * \n * Comprehensive plugin architecture for extending chart functionality.\n * \n * Features:\n * - Complete lifecycle hooks (init, render, data, view, interaction, destroy)\n * - Rich plugin context with access to all chart internals\n * - Plugin storage for persistent state\n * - Dependency management between plugins\n * - Global registry for third-party plugins\n * - Built-in plugins for common use cases\n * \n * @packageDocumentation\n * @module plugins\n */\n\n// ============================================\n// Core Types\n// ============================================\nexport type {\n // Manifest & Metadata\n PluginVersion,\n PluginCapability,\n PluginManifest,\n\n // Context Types\n PluginContext,\n RenderContext,\n CoordinateContext,\n DataContext,\n UIContext,\n EventContext,\n PluginStorage,\n PluginLogger,\n OverlayOptions,\n NotificationOptions,\n PickResult,\n\n // Hook Event Types\n BeforeRenderEvent,\n AfterRenderEvent,\n InteractionEvent,\n ViewChangeEvent,\n SeriesChangeEvent,\n DataUpdateEvent,\n\n // Plugin Types\n ChartPlugin,\n PluginFactory,\n TypedPlugin,\n\n // Manager Types\n PluginManager,\n PluginRegistry,\n PluginRegistryEntry,\n} from \"./types\";\n\n// ============================================\n// Core Implementation\n// ============================================\nexport { createPluginContext } from \"./PluginContext\";\nexport type { ContextDependencies } from \"./PluginContext\";\n\nexport { PluginManagerImpl } from \"./PluginManager\";\n\n// ============================================\n// Registry\n// ============================================\nexport {\n getPluginRegistry,\n registerPlugin,\n definePlugin,\n defineAndRegister,\n loadPlugin,\n listPluginsByCategory,\n validateManifest,\n checkPluginCompatibility,\n} from \"./PluginRegistry\";\n\n// ============================================\n// Built-in Plugins\n// ============================================\nexport {\n // Individual plugins\n CrosshairPlugin,\n StatsPlugin,\n WatermarkPlugin,\n GridHighlightPlugin,\n DataLoggerPlugin,\n DirectionIndicatorPlugin,\n\n // Plugin collection\n BuiltinPlugins,\n\n // Plugin configs\n type CrosshairPluginConfig,\n type StatsPluginConfig,\n type WatermarkPluginConfig,\n type GridHighlightConfig,\n type DataLoggerConfig,\n type DirectionIndicatorConfig,\n} from \"./builtins\";\n\n// ============================================\n// Modular Plugins\n// ============================================\nexport { Plugin3D, type Plugin3DConfig } from \"./3d\";\nexport { PluginGpu, type PluginGpuConfig } from \"./gpu\";\nexport { PluginAnalysis, type PluginAnalysisConfig } from \"./analysis\";\nexport { PluginTools, type PluginToolsConfig } from \"./tools\";\nexport { PluginAnnotations, type PluginAnnotationsConfig } from \"./annotations\";\nexport { PluginStreaming, type PluginStreamingConfig } from \"./streaming\";\nexport { PluginThemeEditor, type PluginThemeEditorConfig } from \"./theme-editor\";\nexport { PluginI18n, type PluginI18nConfig } from \"./i18n\";\nexport { PluginKeyboard, type PluginKeyboardConfig } from \"./keyboard\";\nexport { PluginClipboard, type PluginClipboardConfig } from \"./clipboard\";\nexport { PluginSync, type PluginSyncConfig } from \"./sync\";\nexport { PluginDebug, type PluginDebugConfig } from \"./debug\";\nexport { PluginLoading, type PluginLoadingConfig } from \"./loading\";\nexport { PluginDataExport, type PluginDataExportConfig } from \"./data-export\";\nexport { PluginContextMenu, type PluginContextMenuConfig } from \"./context-menu\";\nexport { PluginAnomalyDetection, type PluginAnomalyDetectionConfig, type AnomalyDetectionResult, type AnomalyPoint, type AnomalyMethod } from \"./anomaly-detection\";\nexport { PluginMLIntegration, type PluginMLIntegrationConfig, type MLIntegrationAPI, type MLModelAPI, type PredictionResult, type VisualizationConfig } from \"./ml-integration\";\nexport { PluginPatternRecognition, type PluginPatternRecognitionConfig, type PatternRecognitionAPI, type PatternMatch, type PatternDetectionResult } from \"./pattern-recognition\";\nexport { PluginRegression, type PluginRegressionConfig, type RegressionAPI, type RegressionResult, type RegressionData } from \"./regression\";\nexport { PluginRadar, type PluginRadarConfig, type RadarAPI, type RadarSeriesData, type RadarPoint } from \"./radar\";\nexport { PluginSnapshot, type PluginSnapshotConfig, type SnapshotExportAPI, type SnapshotExportOptions, type SnapshotResolution, type SnapshotFormat } from \"./snapshot\";\nexport { PluginDataTransform, type PluginDataTransformConfig, type DataTransformAPI, type TransformOp, type TransformType } from \"./data-transform\";\nexport { PluginLaTeX, type PluginLaTeXConfig, type LaTeXPluginAPI, type LaTeXDimensions } from \"./latex\";\nexport * from \"./forecasting\";\n\n// Drag & Drop Editing\nexport { PluginDragEdit, type PluginDragEditConfig, type DragEditAPI, type DragEditEvent } from \"./drag-edit\";\n\n// Caching\nexport { PluginCaching, type PluginCachingConfig, type CachingAPI, type CacheStats } from \"./caching\";\n\n// Lazy Loading\nexport { PluginLazyLoad, type PluginLazyLoadConfig, type LazyLoadAPI, type DataProvider } from \"./lazy-load\";\n\n// Broken Axis\nexport { PluginBrokenAxis, type PluginBrokenAxisConfig, type BrokenAxisAPI, type AxisBreak } from \"./broken-axis\";\n\n// Video Recorder\nexport { PluginVideoRecorder, type PluginVideoRecorderConfig, type VideoRecorderAPI, type VideoRecorderOptions } from \"./video-recorder\";\n\n// Offscreen Rendering\nexport { PluginOffscreen, type PluginOffscreenConfig, type OffscreenAPI, type OffscreenStats, type OffscreenMode, type OffscreenTransferMode, type OffscreenFallbackMode } from \"./offscreen\";\n\n// Virtualization\nexport { PluginVirtualization, type PluginVirtualizationConfig, type VirtualizationAPI, type VirtualizationStats, type VirtualizationMode, type VirtualizationStrategy } from \"./virtualization\";\n\n// Stage 2 — Trading\nexport { PluginDrawingTools, type PluginDrawingToolsConfig, type DrawingToolsAPI, type DrawingMode } from \"./drawing-tools\";\nexport { PluginReplay, type PluginReplayConfig, type ReplayAPI } from \"./replay\";\n\n// ROI\nexport { PluginROI, type PluginROIConfig, type RoiAPI, type RoiRegion, type RoiPoint, type RoiMaskResult, type RoiTool, type RoiEvent, type RoiSelectedEvent } from \"./roi\";\n\n// ============================================\n// Helper for creating typed plugins\n// ============================================\n\n/**\n * Helper function to create a plugin with proper typing\n * \n * @example\n * ```typescript\n * const MyPlugin = createPlugin({\n * manifest: {\n * name: 'my-plugin',\n * version: '1.0.0',\n * provides: ['analysis'],\n * },\n * onInit(ctx) {\n * ctx.log.info('Plugin initialized!');\n * },\n * onAfterRender(ctx, event) {\n * // Custom rendering\n * },\n * api: {\n * doSomething() { return 'done'; }\n * }\n * });\n * \n * chart.use(MyPlugin);\n * ```\n */\nexport function createPlugin<TConfig = void, TApi extends Record<string, unknown> = {}>(\n definition: import(\"./types\").ChartPlugin<TConfig> & { api?: TApi }\n): import(\"./types\").ChartPlugin<TConfig> & { api: TApi } {\n return definition as import(\"./types\").ChartPlugin<TConfig> & { api: TApi };\n}\n\n/**\n * Helper function to create a configurable plugin factory\n * \n * @example\n * ```typescript\n * interface MyConfig {\n * color: string;\n * enabled: boolean;\n * }\n * \n * const MyPlugin = createConfigurablePlugin<MyConfig>(\n * {\n * name: 'my-plugin',\n * version: '1.0.0',\n * },\n * (config) => ({\n * onInit(ctx) {\n * ctx.log.info(`Color: ${config?.color}`);\n * }\n * })\n * );\n * \n * chart.use(MyPlugin({ color: 'red', enabled: true }));\n * ```\n */\nexport function createConfigurablePlugin<TConfig = void>(\n manifest: import(\"./types\").PluginManifest,\n factory: (config?: TConfig) => Omit<import(\"./types\").ChartPlugin<TConfig>, \"manifest\">\n): import(\"./types\").PluginFactory<TConfig> {\n return (config?: TConfig) => ({\n ...factory(config),\n manifest,\n });\n}\n"],"names":["createRenderer","canvas","NativeWebGLRenderer","PluginRegistryImpl","__publicField","entry","name","existed","_a","capability","results","tag","lowerTag","t","registryInstance","getPluginRegistry","registerPlugin","definePlugin","manifest","factory","config","defineAndRegister","pluginFactory","loadPlugin","listPluginsByCategory","registry","categories","result","cat","validateManifest","errors","checkPluginCompatibility","engineVersion","warnings","reqMajor","curMajor","createPlugin","definition","createConfigurablePlugin"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Sci Plot - Core Bundle
2
+ * Velo Plot - Core Bundle
3
3
  *
4
4
  * Minimal bundle containing only the essential features for 2D charts.
5
5
  * Achieve ~60KB gzipped by excluding optional plugins.
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Sci Plot - High-Performance Scientific Charting
2
+ * Velo Plot - High-Performance Scientific Charting
3
3
  *
4
4
  * A WebGL-based charting engine designed for scientific data visualization
5
5
  * and high-performance rendering of large datasets.
@@ -36,9 +36,9 @@ export { downsampleAsync, ohlcDownsampleAsync, destroyDownsamplePool, getDownsam
36
36
  export { rsiAsync, smaAsync, emaAsync, macdAsync, bollingerBandsAsync, destroyIndicatorPool, } from './workers/indicatorsAsync';
37
37
  export { WorkerPool, nextTaskId } from './workers/pool';
38
38
  export type { WorkerPoolOptions } from './workers/pool';
39
- export { formatWithPrefix, formatValue, formatScientific, getBestPrefix, detectCycles, generateCycleColors, detectPeaks, validateData, calculateStats, movingAverage, downsampleLTTB, subtractBaseline, integrate, derivative, cumulativeIntegral, calculateR2, solveLinearSystem, fft, ifft, analyzeSpectrum, powerSpectrum, dominantFrequency, analyzeComplexSpectrum, fftFromComplexInput, hanningWindow, hammingWindow, blackmanWindow, nextPowerOf2, complexToArrays, arraysToComplex, ifftFromArrays, ifftComplex, getPositiveFrequencies, lowPassFilter, highPassFilter, bandPassFilter, bandStopFilter, butterworth, exponentialMovingAverage, gaussianSmooth, savitzkyGolay, medianFilter, singleFrequencyFilter, crossCorrelation, autoCorrelation, detectAnomalies, trapezoidalIntegration, simpsonsIntegration, tTest, type CycleInfo, type Peak, type PrefixInfo, type ValidationResult, type DataStats, type FFTResult, type ComplexFFTResult, type PowerSpectrumResult, type FilterOptions, type ButterworthOptions, type SingleFrequencyFilterOptions, } from './plugins/analysis';
39
+ export { formatWithPrefix, formatValue, formatScientific, getBestPrefix, detectCycles, generateCycleColors, detectPeaks, validateData, calculateStats, movingAverage, downsampleLTTB, subtractBaseline, integrate, derivative, cumulativeIntegral, calculateR2, solveLinearSystem, fft, ifft, analyzeSpectrum, powerSpectrum, dominantFrequency, analyzeComplexSpectrum, fftFromComplexInput, hanningWindow, hammingWindow, blackmanWindow, nextPowerOf2, complexToArrays, arraysToComplex, ifftFromArrays, ifftComplex, getPositiveFrequencies, lowPassFilter, highPassFilter, bandPassFilter, bandStopFilter, butterworth, exponentialMovingAverage, gaussianSmooth, savitzkyGolay, medianFilter, singleFrequencyFilter, crossCorrelation, autoCorrelation, detectAnomalies, trapezoidalIntegration, simpsonsIntegration, tTest, generateContours, joinSegments, type ContourLine, type ContourPoint, type ContourLabel, type ContourOptions, type CycleInfo, type Peak, type PrefixInfo, type ValidationResult, type DataStats, type FFTResult, type ComplexFFTResult, type PowerSpectrumResult, type FilterOptions, type ButterworthOptions, type SingleFrequencyFilterOptions, } from './plugins/analysis';
40
40
  export { createWebSocketStream, connectStreamToChart, createMessageParser, createMockStream, type WebSocketStream, type WebSocketStreamConfig, type DataPoint, type StreamStats, type WebSocketState, } from './streaming';
41
- export { SciPlot, useSciPlot, type SciPlotProps, type SciPlotRef, type SciPlotSeries, type UseSciPlotOptions, type UseSciPlotReturn, } from './react';
41
+ export { VeloPlot, StackedPlot, useVeloPlot, useStackedPlot, useIndicator, useChartSync, useChartGroup, SciPlot, SciChart, useSciPlot, useSciChart, type VeloPlotProps, type VeloPlotRef, type VeloPlotSeries, type StackedPlotProps, type StackedPlotRef, type UseVeloPlotOptions, type UseVeloPlotReturn, type UseStackedPlotOptions, type UseStackedPlotReturn, type UseIndicatorReturn, type UseChartSyncReturn, type SciPlotProps, type SciPlotRef, type SciPlotSeries, type SciChartProps, type SciChartRef, type SciChartSeries, type UseSciPlotOptions, type UseSciPlotReturn, type UseSciChartOptions, type UseSciChartReturn, } from './react';
42
42
  export { WebGPUBackend, WebGLBackend, GpuRenderer, createGpuRenderer, SeriesAdapter, parseColorToRGBA, PipelineCache, BaseBufferStore, BaseTextureStore, GpuBenchmark, GpuCompute, } from './gpu';
43
43
  export type { GpuBackendType, RGBA, GpuViewport, GpuBackend, BufferId, TextureId, FrameUniforms, DrawKind, DrawCall, DrawList, PointSymbol, SeriesData as GpuSeriesData, Bounds as GpuBounds, GpuRenderOptions, GpuRendererOptions, BackendPreference, WebGPUBackendOptions, BenchmarkResult, BenchmarkOptions, DataStats as GpuDataStats, DataBounds as GpuDataBounds, Peak as GpuPeak, GpuComputeOptions, } from './gpu';
44
44
  export { setGlobalLocale, getGlobalLocale, getLocale, registerLocale, createLocaleFormatter, LOCALE_EN_US, LOCALE_ES_ES, LOCALE_DE_DE, LOCALE_FR_FR, LOCALE_PT_BR, LOCALE_ZH_CN, LOCALE_JA_JP, type LocaleConfig, type LocaleFormatter, } from './core/locale';
@@ -1 +1 @@
1
- {"version":3,"file":"indicators--eJGmVox.js","sources":["../src/plugins/analysis/indicators.ts"],"sourcesContent":["/**\n * Sci Plot - Financial/Technical Indicators Module\n * \n * Provides common financial and technical analysis indicators:\n * - Moving Averages (SMA, EMA, WMA)\n * - Momentum Indicators (RSI, MACD, Stochastic)\n * - Volatility (Bollinger Bands, ATR)\n * - Volume (VWAP, OBV)\n * - Trend (ADX, Aroon)\n * \n * @module indicators\n */\n\n// ============================================\n// Types\n// ============================================\n\nexport interface IndicatorResult {\n /** Indicator values (NaN for insufficient data) */\n values: Float32Array;\n /** Additional line (e.g., signal line for MACD) */\n signal?: Float32Array;\n /** Upper band (e.g., Bollinger upper) */\n upper?: Float32Array;\n /** Lower band (e.g., Bollinger lower) */\n lower?: Float32Array;\n /** Histogram (e.g., MACD histogram) */\n histogram?: Float32Array;\n}\n\nexport interface OHLCData {\n open: Float32Array | Float64Array;\n high: Float32Array | Float64Array;\n low: Float32Array | Float64Array;\n close: Float32Array | Float64Array;\n volume?: Float32Array | Float64Array;\n}\n\n// ============================================\n// Moving Averages\n// ============================================\n\n/**\n * Simple Moving Average (SMA)\n * @param data Input data array\n * @param period Number of periods\n */\nexport function sma(data: Float32Array | Float64Array | number[], period: number): Float32Array {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const result = new Float32Array(input.length);\n \n if (period < 1 || period > input.length) {\n result.fill(NaN);\n return result;\n }\n\n // Fill initial values with NaN\n for (let i = 0; i < period - 1; i++) {\n result[i] = NaN;\n }\n\n // Calculate first SMA\n let sum = 0;\n for (let i = 0; i < period; i++) {\n sum += input[i];\n }\n result[period - 1] = sum / period;\n\n // Calculate remaining SMAs using sliding window\n for (let i = period; i < input.length; i++) {\n sum = sum - input[i - period] + input[i];\n result[i] = sum / period;\n }\n\n return result;\n}\n\n/**\n * Exponential Moving Average (EMA)\n * @param data Input data array\n * @param period Number of periods\n */\nexport function ema(data: Float32Array | Float64Array | number[], period: number): Float32Array {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const result = new Float32Array(input.length);\n \n if (period < 1 || period > input.length) {\n result.fill(NaN);\n return result;\n }\n\n const multiplier = 2 / (period + 1);\n\n // Fill initial values with NaN\n for (let i = 0; i < period - 1; i++) {\n result[i] = NaN;\n }\n\n // First EMA is SMA\n let sum = 0;\n for (let i = 0; i < period; i++) {\n sum += input[i];\n }\n result[period - 1] = sum / period;\n\n // Calculate remaining EMAs\n for (let i = period; i < input.length; i++) {\n result[i] = (input[i] - result[i - 1]) * multiplier + result[i - 1];\n }\n\n return result;\n}\n\n/**\n * Weighted Moving Average (WMA)\n * @param data Input data array\n * @param period Number of periods\n */\nexport function wma(data: Float32Array | Float64Array | number[], period: number): Float32Array {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const result = new Float32Array(input.length);\n \n if (period < 1 || period > input.length) {\n result.fill(NaN);\n return result;\n }\n\n const weightSum = (period * (period + 1)) / 2;\n\n // Fill initial values with NaN\n for (let i = 0; i < period - 1; i++) {\n result[i] = NaN;\n }\n\n // Calculate WMAs\n for (let i = period - 1; i < input.length; i++) {\n let weightedSum = 0;\n for (let j = 0; j < period; j++) {\n weightedSum += input[i - period + 1 + j] * (j + 1);\n }\n result[i] = weightedSum / weightSum;\n }\n\n return result;\n}\n\n/**\n * Double Exponential Moving Average (DEMA)\n * @param data Input data array\n * @param period Number of periods\n */\nexport function dema(data: Float32Array | Float64Array | number[], period: number): Float32Array {\n const ema1 = ema(data, period);\n const ema2 = ema(ema1, period);\n const result = new Float32Array(data.length);\n\n for (let i = 0; i < data.length; i++) {\n result[i] = 2 * ema1[i] - ema2[i];\n }\n\n return result;\n}\n\n/**\n * Triple Exponential Moving Average (TEMA)\n * @param data Input data array\n * @param period Number of periods\n */\nexport function tema(data: Float32Array | Float64Array | number[], period: number): Float32Array {\n const ema1 = ema(data, period);\n const ema2 = ema(ema1, period);\n const ema3 = ema(ema2, period);\n const result = new Float32Array(data.length);\n\n for (let i = 0; i < data.length; i++) {\n result[i] = 3 * ema1[i] - 3 * ema2[i] + ema3[i];\n }\n\n return result;\n}\n\n// ============================================\n// Momentum Indicators\n// ============================================\n\n/**\n * Relative Strength Index (RSI)\n * @param data Close prices\n * @param period RSI period (default: 14)\n */\nexport function rsi(data: Float32Array | Float64Array | number[], period: number = 14): Float32Array {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const result = new Float32Array(input.length);\n \n if (period < 1 || input.length < period + 1) {\n result.fill(NaN);\n return result;\n }\n\n // Fill initial values with NaN\n for (let i = 0; i < period; i++) {\n result[i] = NaN;\n }\n\n // Calculate initial average gain/loss\n let avgGain = 0;\n let avgLoss = 0;\n\n for (let i = 1; i <= period; i++) {\n const change = input[i] - input[i - 1];\n if (change > 0) {\n avgGain += change;\n } else {\n avgLoss += Math.abs(change);\n }\n }\n\n avgGain /= period;\n avgLoss /= period;\n\n // First RSI value\n if (avgLoss === 0) {\n result[period] = 100;\n } else {\n const rs = avgGain / avgLoss;\n result[period] = 100 - (100 / (1 + rs));\n }\n\n // Calculate remaining RSI values using smoothed averages\n for (let i = period + 1; i < input.length; i++) {\n const change = input[i] - input[i - 1];\n let gain = 0;\n let loss = 0;\n\n if (change > 0) {\n gain = change;\n } else {\n loss = Math.abs(change);\n }\n\n avgGain = (avgGain * (period - 1) + gain) / period;\n avgLoss = (avgLoss * (period - 1) + loss) / period;\n\n if (avgLoss === 0) {\n result[i] = 100;\n } else {\n const rs = avgGain / avgLoss;\n result[i] = 100 - (100 / (1 + rs));\n }\n }\n\n return result;\n}\n\n/**\n * Moving Average Convergence Divergence (MACD)\n * @param data Close prices\n * @param fastPeriod Fast EMA period (default: 12)\n * @param slowPeriod Slow EMA period (default: 26)\n * @param signalPeriod Signal line period (default: 9)\n */\nexport function macd(\n data: Float32Array | Float64Array | number[],\n fastPeriod: number = 12,\n slowPeriod: number = 26,\n signalPeriod: number = 9\n): IndicatorResult {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n \n const fastEma = ema(input, fastPeriod);\n const slowEma = ema(input, slowPeriod);\n \n // MACD Line = Fast EMA - Slow EMA\n const macdLine = new Float32Array(input.length);\n for (let i = 0; i < input.length; i++) {\n macdLine[i] = fastEma[i] - slowEma[i];\n }\n \n // Signal Line = EMA of MACD Line\n const signal = ema(macdLine, signalPeriod);\n \n // Histogram = MACD Line - Signal Line\n const histogram = new Float32Array(input.length);\n for (let i = 0; i < input.length; i++) {\n histogram[i] = macdLine[i] - signal[i];\n }\n\n return {\n values: macdLine,\n signal,\n histogram,\n };\n}\n\n/**\n * Stochastic Oscillator\n * @param ohlc OHLC data\n * @param kPeriod %K period (default: 14)\n * @param dPeriod %D smoothing period (default: 3)\n */\nexport function stochastic(\n ohlc: OHLCData,\n kPeriod: number = 14,\n dPeriod: number = 3\n): IndicatorResult {\n const { high, low, close } = ohlc;\n const length = close.length;\n const kValues = new Float32Array(length);\n \n // Calculate %K\n for (let i = 0; i < length; i++) {\n if (i < kPeriod - 1) {\n kValues[i] = NaN;\n continue;\n }\n \n let highest = -Infinity;\n let lowest = Infinity;\n \n for (let j = i - kPeriod + 1; j <= i; j++) {\n if (high[j] > highest) highest = high[j];\n if (low[j] < lowest) lowest = low[j];\n }\n \n const range = highest - lowest;\n if (range === 0) {\n kValues[i] = 50; // Neutral when no range\n } else {\n kValues[i] = ((close[i] - lowest) / range) * 100;\n }\n }\n \n // %D is SMA of %K\n const dValues = sma(kValues, dPeriod);\n\n return {\n values: kValues, // %K\n signal: dValues, // %D\n };\n}\n\n/**\n * Rate of Change (ROC)\n * @param data Close prices\n * @param period ROC period (default: 10)\n */\nexport function roc(data: Float32Array | Float64Array | number[], period: number = 10): Float32Array {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const result = new Float32Array(input.length);\n \n for (let i = 0; i < period; i++) {\n result[i] = NaN;\n }\n \n for (let i = period; i < input.length; i++) {\n const pastValue = input[i - period];\n if (pastValue === 0) {\n result[i] = NaN;\n } else {\n result[i] = ((input[i] - pastValue) / pastValue) * 100;\n }\n }\n\n return result;\n}\n\n/**\n * Momentum\n * @param data Close prices\n * @param period Momentum period (default: 10)\n */\nexport function momentum(data: Float32Array | Float64Array | number[], period: number = 10): Float32Array {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const result = new Float32Array(input.length);\n \n for (let i = 0; i < period; i++) {\n result[i] = NaN;\n }\n \n for (let i = period; i < input.length; i++) {\n result[i] = input[i] - input[i - period];\n }\n\n return result;\n}\n\n// ============================================\n// Volatility Indicators\n// ============================================\n\n/**\n * Bollinger Bands\n * @param data Close prices\n * @param period SMA period (default: 20)\n * @param stdDev Standard deviation multiplier (default: 2)\n */\nexport function bollingerBands(\n data: Float32Array | Float64Array | number[],\n period: number = 20,\n stdDev: number = 2\n): IndicatorResult {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const middle = sma(input, period);\n const upper = new Float32Array(input.length);\n const lower = new Float32Array(input.length);\n\n for (let i = 0; i < input.length; i++) {\n if (i < period - 1) {\n upper[i] = NaN;\n lower[i] = NaN;\n continue;\n }\n\n // Calculate standard deviation\n let sumSquares = 0;\n for (let j = i - period + 1; j <= i; j++) {\n const diff = input[j] - middle[i];\n sumSquares += diff * diff;\n }\n const std = Math.sqrt(sumSquares / period);\n\n upper[i] = middle[i] + stdDev * std;\n lower[i] = middle[i] - stdDev * std;\n }\n\n return {\n values: middle,\n upper,\n lower,\n };\n}\n\n/**\n * Average True Range (ATR)\n * @param ohlc OHLC data\n * @param period ATR period (default: 14)\n */\nexport function atr(ohlc: OHLCData, period: number = 14): Float32Array {\n const { high, low, close } = ohlc;\n const length = close.length;\n const tr = new Float32Array(length);\n \n // True Range calculation\n tr[0] = high[0] - low[0];\n \n for (let i = 1; i < length; i++) {\n const hl = high[i] - low[i];\n const hc = Math.abs(high[i] - close[i - 1]);\n const lc = Math.abs(low[i] - close[i - 1]);\n tr[i] = Math.max(hl, hc, lc);\n }\n\n // ATR is smoothed average of True Range\n return ema(tr, period);\n}\n\n/**\n * Standard Deviation\n * @param data Input data\n * @param period Period for calculation (default: 20)\n */\nexport function standardDeviation(data: Float32Array | Float64Array | number[], period: number = 20): Float32Array {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const result = new Float32Array(input.length);\n const avg = sma(input, period);\n\n for (let i = 0; i < input.length; i++) {\n if (i < period - 1) {\n result[i] = NaN;\n continue;\n }\n\n let sumSquares = 0;\n for (let j = i - period + 1; j <= i; j++) {\n const diff = input[j] - avg[i];\n sumSquares += diff * diff;\n }\n result[i] = Math.sqrt(sumSquares / period);\n }\n\n return result;\n}\n\n// ============================================\n// Volume Indicators\n// ============================================\n\n/**\n * Volume Weighted Average Price (VWAP)\n * @param ohlc OHLC data with volume\n */\nexport function vwap(ohlc: OHLCData): Float32Array {\n const { high, low, close, volume } = ohlc;\n \n if (!volume) {\n throw new Error('VWAP requires volume data');\n }\n\n const length = close.length;\n const result = new Float32Array(length);\n \n let cumulativeTPV = 0; // Cumulative Typical Price * Volume\n let cumulativeVolume = 0;\n\n for (let i = 0; i < length; i++) {\n const typicalPrice = (high[i] + low[i] + close[i]) / 3;\n cumulativeTPV += typicalPrice * volume[i];\n cumulativeVolume += volume[i];\n \n if (cumulativeVolume === 0) {\n result[i] = typicalPrice;\n } else {\n result[i] = cumulativeTPV / cumulativeVolume;\n }\n }\n\n return result;\n}\n\n/**\n * On-Balance Volume (OBV)\n * @param close Close prices\n * @param volume Volume data\n */\nexport function obv(\n close: Float32Array | Float64Array | number[],\n volume: Float32Array | Float64Array | number[]\n): Float32Array {\n const closeInput = close instanceof Float32Array || close instanceof Float64Array ? close : Float32Array.from(close);\n const volumeInput = volume instanceof Float32Array || volume instanceof Float64Array ? volume : Float32Array.from(volume);\n \n const result = new Float32Array(closeInput.length);\n result[0] = volumeInput[0];\n\n for (let i = 1; i < closeInput.length; i++) {\n if (closeInput[i] > closeInput[i - 1]) {\n result[i] = result[i - 1] + volumeInput[i];\n } else if (closeInput[i] < closeInput[i - 1]) {\n result[i] = result[i - 1] - volumeInput[i];\n } else {\n result[i] = result[i - 1];\n }\n }\n\n return result;\n}\n\n// ============================================\n// Trend Indicators\n// ============================================\n\n/**\n * Average Directional Index (ADX)\n * @param ohlc OHLC data\n * @param period ADX period (default: 14)\n */\nexport function adx(ohlc: OHLCData, period: number = 14): IndicatorResult {\n const { high, low, close } = ohlc;\n const length = close.length;\n \n const plusDM = new Float32Array(length);\n const minusDM = new Float32Array(length);\n const tr = new Float32Array(length);\n \n // Calculate +DM, -DM, TR\n tr[0] = high[0] - low[0];\n plusDM[0] = 0;\n minusDM[0] = 0;\n\n for (let i = 1; i < length; i++) {\n const upMove = high[i] - high[i - 1];\n const downMove = low[i - 1] - low[i];\n \n plusDM[i] = upMove > downMove && upMove > 0 ? upMove : 0;\n minusDM[i] = downMove > upMove && downMove > 0 ? downMove : 0;\n \n const hl = high[i] - low[i];\n const hc = Math.abs(high[i] - close[i - 1]);\n const lc = Math.abs(low[i] - close[i - 1]);\n tr[i] = Math.max(hl, hc, lc);\n }\n\n // Smooth with EMA\n const smoothedTR = ema(tr, period);\n const smoothedPlusDM = ema(plusDM, period);\n const smoothedMinusDM = ema(minusDM, period);\n\n // Calculate +DI and -DI\n const plusDI = new Float32Array(length);\n const minusDI = new Float32Array(length);\n const dx = new Float32Array(length);\n\n for (let i = 0; i < length; i++) {\n if (smoothedTR[i] === 0 || isNaN(smoothedTR[i])) {\n plusDI[i] = NaN;\n minusDI[i] = NaN;\n dx[i] = NaN;\n } else {\n plusDI[i] = (smoothedPlusDM[i] / smoothedTR[i]) * 100;\n minusDI[i] = (smoothedMinusDM[i] / smoothedTR[i]) * 100;\n \n const diSum = plusDI[i] + minusDI[i];\n dx[i] = diSum === 0 ? 0 : (Math.abs(plusDI[i] - minusDI[i]) / diSum) * 100;\n }\n }\n\n // ADX is smoothed DX\n const adxValues = ema(dx, period);\n\n return {\n values: adxValues,\n upper: plusDI, // +DI\n lower: minusDI, // -DI\n };\n}\n\n/**\n * Aroon Indicator\n * @param ohlc OHLC data\n * @param period Aroon period (default: 25)\n */\nexport function aroon(ohlc: OHLCData, period: number = 25): IndicatorResult {\n const { high, low } = ohlc;\n const length = high.length;\n \n const aroonUp = new Float32Array(length);\n const aroonDown = new Float32Array(length);\n\n for (let i = 0; i < length; i++) {\n if (i < period) {\n aroonUp[i] = NaN;\n aroonDown[i] = NaN;\n continue;\n }\n\n let highestIdx = i;\n let lowestIdx = i;\n let highest = -Infinity;\n let lowest = Infinity;\n\n for (let j = i - period; j <= i; j++) {\n if (high[j] > highest) {\n highest = high[j];\n highestIdx = j;\n }\n if (low[j] < lowest) {\n lowest = low[j];\n lowestIdx = j;\n }\n }\n\n aroonUp[i] = ((period - (i - highestIdx)) / period) * 100;\n aroonDown[i] = ((period - (i - lowestIdx)) / period) * 100;\n }\n\n // Aroon Oscillator = Aroon Up - Aroon Down\n const oscillator = new Float32Array(length);\n for (let i = 0; i < length; i++) {\n oscillator[i] = aroonUp[i] - aroonDown[i];\n }\n\n return {\n values: oscillator,\n upper: aroonUp,\n lower: aroonDown,\n };\n}\n\n// ============================================\n// Utility Functions\n// ============================================\n\n/**\n * Calculate percentage change\n */\nexport function percentChange(data: Float32Array | Float64Array | number[], period: number = 1): Float32Array {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const result = new Float32Array(input.length);\n \n for (let i = 0; i < period; i++) {\n result[i] = NaN;\n }\n \n for (let i = period; i < input.length; i++) {\n const prev = input[i - period];\n if (prev === 0) {\n result[i] = NaN;\n } else {\n result[i] = ((input[i] - prev) / prev) * 100;\n }\n }\n\n return result;\n}\n\n/**\n * Calculate cumulative sum\n */\nexport function cumsum(data: Float32Array | Float64Array | number[]): Float32Array {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const result = new Float32Array(input.length);\n \n result[0] = input[0];\n for (let i = 1; i < input.length; i++) {\n result[i] = result[i - 1] + input[i];\n }\n\n return result;\n}\n\n/**\n * Normalize data to 0-100 range\n */\nexport function normalize(data: Float32Array | Float64Array | number[]): Float32Array {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const result = new Float32Array(input.length);\n \n let min = Infinity;\n let max = -Infinity;\n \n for (let i = 0; i < input.length; i++) {\n if (!isNaN(input[i])) {\n if (input[i] < min) min = input[i];\n if (input[i] > max) max = input[i];\n }\n }\n\n const range = max - min;\n if (range === 0) {\n result.fill(50);\n } else {\n for (let i = 0; i < input.length; i++) {\n result[i] = ((input[i] - min) / range) * 100;\n }\n }\n\n return result;\n}\n"],"names":["sma","data","period","input","result","i","sum","ema","multiplier","wma","weightSum","weightedSum","j","dema","ema1","ema2","tema","ema3","rsi","avgGain","avgLoss","change","rs","gain","loss","macd","fastPeriod","slowPeriod","signalPeriod","fastEma","slowEma","macdLine","signal","histogram","stochastic","ohlc","kPeriod","dPeriod","high","low","close","length","kValues","highest","lowest","range","dValues","roc","pastValue","momentum","bollingerBands","stdDev","middle","upper","lower","sumSquares","diff","std","atr","tr","hl","hc","lc","standardDeviation","avg","vwap","volume","cumulativeTPV","cumulativeVolume","typicalPrice","obv","closeInput","volumeInput","adx","plusDM","minusDM","upMove","downMove","smoothedTR","smoothedPlusDM","smoothedMinusDM","plusDI","minusDI","dx","diSum","aroon","aroonUp","aroonDown","highestIdx","lowestIdx","oscillator","percentChange","prev","cumsum","normalize","min","max"],"mappings":"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"}
1
+ {"version":3,"file":"indicators--eJGmVox.js","sources":["../src/plugins/analysis/indicators.ts"],"sourcesContent":["/**\n * Velo Plot - Financial/Technical Indicators Module\n * \n * Provides common financial and technical analysis indicators:\n * - Moving Averages (SMA, EMA, WMA)\n * - Momentum Indicators (RSI, MACD, Stochastic)\n * - Volatility (Bollinger Bands, ATR)\n * - Volume (VWAP, OBV)\n * - Trend (ADX, Aroon)\n * \n * @module indicators\n */\n\n// ============================================\n// Types\n// ============================================\n\nexport interface IndicatorResult {\n /** Indicator values (NaN for insufficient data) */\n values: Float32Array;\n /** Additional line (e.g., signal line for MACD) */\n signal?: Float32Array;\n /** Upper band (e.g., Bollinger upper) */\n upper?: Float32Array;\n /** Lower band (e.g., Bollinger lower) */\n lower?: Float32Array;\n /** Histogram (e.g., MACD histogram) */\n histogram?: Float32Array;\n}\n\nexport interface OHLCData {\n open: Float32Array | Float64Array;\n high: Float32Array | Float64Array;\n low: Float32Array | Float64Array;\n close: Float32Array | Float64Array;\n volume?: Float32Array | Float64Array;\n}\n\n// ============================================\n// Moving Averages\n// ============================================\n\n/**\n * Simple Moving Average (SMA)\n * @param data Input data array\n * @param period Number of periods\n */\nexport function sma(data: Float32Array | Float64Array | number[], period: number): Float32Array {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const result = new Float32Array(input.length);\n \n if (period < 1 || period > input.length) {\n result.fill(NaN);\n return result;\n }\n\n // Fill initial values with NaN\n for (let i = 0; i < period - 1; i++) {\n result[i] = NaN;\n }\n\n // Calculate first SMA\n let sum = 0;\n for (let i = 0; i < period; i++) {\n sum += input[i];\n }\n result[period - 1] = sum / period;\n\n // Calculate remaining SMAs using sliding window\n for (let i = period; i < input.length; i++) {\n sum = sum - input[i - period] + input[i];\n result[i] = sum / period;\n }\n\n return result;\n}\n\n/**\n * Exponential Moving Average (EMA)\n * @param data Input data array\n * @param period Number of periods\n */\nexport function ema(data: Float32Array | Float64Array | number[], period: number): Float32Array {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const result = new Float32Array(input.length);\n \n if (period < 1 || period > input.length) {\n result.fill(NaN);\n return result;\n }\n\n const multiplier = 2 / (period + 1);\n\n // Fill initial values with NaN\n for (let i = 0; i < period - 1; i++) {\n result[i] = NaN;\n }\n\n // First EMA is SMA\n let sum = 0;\n for (let i = 0; i < period; i++) {\n sum += input[i];\n }\n result[period - 1] = sum / period;\n\n // Calculate remaining EMAs\n for (let i = period; i < input.length; i++) {\n result[i] = (input[i] - result[i - 1]) * multiplier + result[i - 1];\n }\n\n return result;\n}\n\n/**\n * Weighted Moving Average (WMA)\n * @param data Input data array\n * @param period Number of periods\n */\nexport function wma(data: Float32Array | Float64Array | number[], period: number): Float32Array {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const result = new Float32Array(input.length);\n \n if (period < 1 || period > input.length) {\n result.fill(NaN);\n return result;\n }\n\n const weightSum = (period * (period + 1)) / 2;\n\n // Fill initial values with NaN\n for (let i = 0; i < period - 1; i++) {\n result[i] = NaN;\n }\n\n // Calculate WMAs\n for (let i = period - 1; i < input.length; i++) {\n let weightedSum = 0;\n for (let j = 0; j < period; j++) {\n weightedSum += input[i - period + 1 + j] * (j + 1);\n }\n result[i] = weightedSum / weightSum;\n }\n\n return result;\n}\n\n/**\n * Double Exponential Moving Average (DEMA)\n * @param data Input data array\n * @param period Number of periods\n */\nexport function dema(data: Float32Array | Float64Array | number[], period: number): Float32Array {\n const ema1 = ema(data, period);\n const ema2 = ema(ema1, period);\n const result = new Float32Array(data.length);\n\n for (let i = 0; i < data.length; i++) {\n result[i] = 2 * ema1[i] - ema2[i];\n }\n\n return result;\n}\n\n/**\n * Triple Exponential Moving Average (TEMA)\n * @param data Input data array\n * @param period Number of periods\n */\nexport function tema(data: Float32Array | Float64Array | number[], period: number): Float32Array {\n const ema1 = ema(data, period);\n const ema2 = ema(ema1, period);\n const ema3 = ema(ema2, period);\n const result = new Float32Array(data.length);\n\n for (let i = 0; i < data.length; i++) {\n result[i] = 3 * ema1[i] - 3 * ema2[i] + ema3[i];\n }\n\n return result;\n}\n\n// ============================================\n// Momentum Indicators\n// ============================================\n\n/**\n * Relative Strength Index (RSI)\n * @param data Close prices\n * @param period RSI period (default: 14)\n */\nexport function rsi(data: Float32Array | Float64Array | number[], period: number = 14): Float32Array {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const result = new Float32Array(input.length);\n \n if (period < 1 || input.length < period + 1) {\n result.fill(NaN);\n return result;\n }\n\n // Fill initial values with NaN\n for (let i = 0; i < period; i++) {\n result[i] = NaN;\n }\n\n // Calculate initial average gain/loss\n let avgGain = 0;\n let avgLoss = 0;\n\n for (let i = 1; i <= period; i++) {\n const change = input[i] - input[i - 1];\n if (change > 0) {\n avgGain += change;\n } else {\n avgLoss += Math.abs(change);\n }\n }\n\n avgGain /= period;\n avgLoss /= period;\n\n // First RSI value\n if (avgLoss === 0) {\n result[period] = 100;\n } else {\n const rs = avgGain / avgLoss;\n result[period] = 100 - (100 / (1 + rs));\n }\n\n // Calculate remaining RSI values using smoothed averages\n for (let i = period + 1; i < input.length; i++) {\n const change = input[i] - input[i - 1];\n let gain = 0;\n let loss = 0;\n\n if (change > 0) {\n gain = change;\n } else {\n loss = Math.abs(change);\n }\n\n avgGain = (avgGain * (period - 1) + gain) / period;\n avgLoss = (avgLoss * (period - 1) + loss) / period;\n\n if (avgLoss === 0) {\n result[i] = 100;\n } else {\n const rs = avgGain / avgLoss;\n result[i] = 100 - (100 / (1 + rs));\n }\n }\n\n return result;\n}\n\n/**\n * Moving Average Convergence Divergence (MACD)\n * @param data Close prices\n * @param fastPeriod Fast EMA period (default: 12)\n * @param slowPeriod Slow EMA period (default: 26)\n * @param signalPeriod Signal line period (default: 9)\n */\nexport function macd(\n data: Float32Array | Float64Array | number[],\n fastPeriod: number = 12,\n slowPeriod: number = 26,\n signalPeriod: number = 9\n): IndicatorResult {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n \n const fastEma = ema(input, fastPeriod);\n const slowEma = ema(input, slowPeriod);\n \n // MACD Line = Fast EMA - Slow EMA\n const macdLine = new Float32Array(input.length);\n for (let i = 0; i < input.length; i++) {\n macdLine[i] = fastEma[i] - slowEma[i];\n }\n \n // Signal Line = EMA of MACD Line\n const signal = ema(macdLine, signalPeriod);\n \n // Histogram = MACD Line - Signal Line\n const histogram = new Float32Array(input.length);\n for (let i = 0; i < input.length; i++) {\n histogram[i] = macdLine[i] - signal[i];\n }\n\n return {\n values: macdLine,\n signal,\n histogram,\n };\n}\n\n/**\n * Stochastic Oscillator\n * @param ohlc OHLC data\n * @param kPeriod %K period (default: 14)\n * @param dPeriod %D smoothing period (default: 3)\n */\nexport function stochastic(\n ohlc: OHLCData,\n kPeriod: number = 14,\n dPeriod: number = 3\n): IndicatorResult {\n const { high, low, close } = ohlc;\n const length = close.length;\n const kValues = new Float32Array(length);\n \n // Calculate %K\n for (let i = 0; i < length; i++) {\n if (i < kPeriod - 1) {\n kValues[i] = NaN;\n continue;\n }\n \n let highest = -Infinity;\n let lowest = Infinity;\n \n for (let j = i - kPeriod + 1; j <= i; j++) {\n if (high[j] > highest) highest = high[j];\n if (low[j] < lowest) lowest = low[j];\n }\n \n const range = highest - lowest;\n if (range === 0) {\n kValues[i] = 50; // Neutral when no range\n } else {\n kValues[i] = ((close[i] - lowest) / range) * 100;\n }\n }\n \n // %D is SMA of %K\n const dValues = sma(kValues, dPeriod);\n\n return {\n values: kValues, // %K\n signal: dValues, // %D\n };\n}\n\n/**\n * Rate of Change (ROC)\n * @param data Close prices\n * @param period ROC period (default: 10)\n */\nexport function roc(data: Float32Array | Float64Array | number[], period: number = 10): Float32Array {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const result = new Float32Array(input.length);\n \n for (let i = 0; i < period; i++) {\n result[i] = NaN;\n }\n \n for (let i = period; i < input.length; i++) {\n const pastValue = input[i - period];\n if (pastValue === 0) {\n result[i] = NaN;\n } else {\n result[i] = ((input[i] - pastValue) / pastValue) * 100;\n }\n }\n\n return result;\n}\n\n/**\n * Momentum\n * @param data Close prices\n * @param period Momentum period (default: 10)\n */\nexport function momentum(data: Float32Array | Float64Array | number[], period: number = 10): Float32Array {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const result = new Float32Array(input.length);\n \n for (let i = 0; i < period; i++) {\n result[i] = NaN;\n }\n \n for (let i = period; i < input.length; i++) {\n result[i] = input[i] - input[i - period];\n }\n\n return result;\n}\n\n// ============================================\n// Volatility Indicators\n// ============================================\n\n/**\n * Bollinger Bands\n * @param data Close prices\n * @param period SMA period (default: 20)\n * @param stdDev Standard deviation multiplier (default: 2)\n */\nexport function bollingerBands(\n data: Float32Array | Float64Array | number[],\n period: number = 20,\n stdDev: number = 2\n): IndicatorResult {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const middle = sma(input, period);\n const upper = new Float32Array(input.length);\n const lower = new Float32Array(input.length);\n\n for (let i = 0; i < input.length; i++) {\n if (i < period - 1) {\n upper[i] = NaN;\n lower[i] = NaN;\n continue;\n }\n\n // Calculate standard deviation\n let sumSquares = 0;\n for (let j = i - period + 1; j <= i; j++) {\n const diff = input[j] - middle[i];\n sumSquares += diff * diff;\n }\n const std = Math.sqrt(sumSquares / period);\n\n upper[i] = middle[i] + stdDev * std;\n lower[i] = middle[i] - stdDev * std;\n }\n\n return {\n values: middle,\n upper,\n lower,\n };\n}\n\n/**\n * Average True Range (ATR)\n * @param ohlc OHLC data\n * @param period ATR period (default: 14)\n */\nexport function atr(ohlc: OHLCData, period: number = 14): Float32Array {\n const { high, low, close } = ohlc;\n const length = close.length;\n const tr = new Float32Array(length);\n \n // True Range calculation\n tr[0] = high[0] - low[0];\n \n for (let i = 1; i < length; i++) {\n const hl = high[i] - low[i];\n const hc = Math.abs(high[i] - close[i - 1]);\n const lc = Math.abs(low[i] - close[i - 1]);\n tr[i] = Math.max(hl, hc, lc);\n }\n\n // ATR is smoothed average of True Range\n return ema(tr, period);\n}\n\n/**\n * Standard Deviation\n * @param data Input data\n * @param period Period for calculation (default: 20)\n */\nexport function standardDeviation(data: Float32Array | Float64Array | number[], period: number = 20): Float32Array {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const result = new Float32Array(input.length);\n const avg = sma(input, period);\n\n for (let i = 0; i < input.length; i++) {\n if (i < period - 1) {\n result[i] = NaN;\n continue;\n }\n\n let sumSquares = 0;\n for (let j = i - period + 1; j <= i; j++) {\n const diff = input[j] - avg[i];\n sumSquares += diff * diff;\n }\n result[i] = Math.sqrt(sumSquares / period);\n }\n\n return result;\n}\n\n// ============================================\n// Volume Indicators\n// ============================================\n\n/**\n * Volume Weighted Average Price (VWAP)\n * @param ohlc OHLC data with volume\n */\nexport function vwap(ohlc: OHLCData): Float32Array {\n const { high, low, close, volume } = ohlc;\n \n if (!volume) {\n throw new Error('VWAP requires volume data');\n }\n\n const length = close.length;\n const result = new Float32Array(length);\n \n let cumulativeTPV = 0; // Cumulative Typical Price * Volume\n let cumulativeVolume = 0;\n\n for (let i = 0; i < length; i++) {\n const typicalPrice = (high[i] + low[i] + close[i]) / 3;\n cumulativeTPV += typicalPrice * volume[i];\n cumulativeVolume += volume[i];\n \n if (cumulativeVolume === 0) {\n result[i] = typicalPrice;\n } else {\n result[i] = cumulativeTPV / cumulativeVolume;\n }\n }\n\n return result;\n}\n\n/**\n * On-Balance Volume (OBV)\n * @param close Close prices\n * @param volume Volume data\n */\nexport function obv(\n close: Float32Array | Float64Array | number[],\n volume: Float32Array | Float64Array | number[]\n): Float32Array {\n const closeInput = close instanceof Float32Array || close instanceof Float64Array ? close : Float32Array.from(close);\n const volumeInput = volume instanceof Float32Array || volume instanceof Float64Array ? volume : Float32Array.from(volume);\n \n const result = new Float32Array(closeInput.length);\n result[0] = volumeInput[0];\n\n for (let i = 1; i < closeInput.length; i++) {\n if (closeInput[i] > closeInput[i - 1]) {\n result[i] = result[i - 1] + volumeInput[i];\n } else if (closeInput[i] < closeInput[i - 1]) {\n result[i] = result[i - 1] - volumeInput[i];\n } else {\n result[i] = result[i - 1];\n }\n }\n\n return result;\n}\n\n// ============================================\n// Trend Indicators\n// ============================================\n\n/**\n * Average Directional Index (ADX)\n * @param ohlc OHLC data\n * @param period ADX period (default: 14)\n */\nexport function adx(ohlc: OHLCData, period: number = 14): IndicatorResult {\n const { high, low, close } = ohlc;\n const length = close.length;\n \n const plusDM = new Float32Array(length);\n const minusDM = new Float32Array(length);\n const tr = new Float32Array(length);\n \n // Calculate +DM, -DM, TR\n tr[0] = high[0] - low[0];\n plusDM[0] = 0;\n minusDM[0] = 0;\n\n for (let i = 1; i < length; i++) {\n const upMove = high[i] - high[i - 1];\n const downMove = low[i - 1] - low[i];\n \n plusDM[i] = upMove > downMove && upMove > 0 ? upMove : 0;\n minusDM[i] = downMove > upMove && downMove > 0 ? downMove : 0;\n \n const hl = high[i] - low[i];\n const hc = Math.abs(high[i] - close[i - 1]);\n const lc = Math.abs(low[i] - close[i - 1]);\n tr[i] = Math.max(hl, hc, lc);\n }\n\n // Smooth with EMA\n const smoothedTR = ema(tr, period);\n const smoothedPlusDM = ema(plusDM, period);\n const smoothedMinusDM = ema(minusDM, period);\n\n // Calculate +DI and -DI\n const plusDI = new Float32Array(length);\n const minusDI = new Float32Array(length);\n const dx = new Float32Array(length);\n\n for (let i = 0; i < length; i++) {\n if (smoothedTR[i] === 0 || isNaN(smoothedTR[i])) {\n plusDI[i] = NaN;\n minusDI[i] = NaN;\n dx[i] = NaN;\n } else {\n plusDI[i] = (smoothedPlusDM[i] / smoothedTR[i]) * 100;\n minusDI[i] = (smoothedMinusDM[i] / smoothedTR[i]) * 100;\n \n const diSum = plusDI[i] + minusDI[i];\n dx[i] = diSum === 0 ? 0 : (Math.abs(plusDI[i] - minusDI[i]) / diSum) * 100;\n }\n }\n\n // ADX is smoothed DX\n const adxValues = ema(dx, period);\n\n return {\n values: adxValues,\n upper: plusDI, // +DI\n lower: minusDI, // -DI\n };\n}\n\n/**\n * Aroon Indicator\n * @param ohlc OHLC data\n * @param period Aroon period (default: 25)\n */\nexport function aroon(ohlc: OHLCData, period: number = 25): IndicatorResult {\n const { high, low } = ohlc;\n const length = high.length;\n \n const aroonUp = new Float32Array(length);\n const aroonDown = new Float32Array(length);\n\n for (let i = 0; i < length; i++) {\n if (i < period) {\n aroonUp[i] = NaN;\n aroonDown[i] = NaN;\n continue;\n }\n\n let highestIdx = i;\n let lowestIdx = i;\n let highest = -Infinity;\n let lowest = Infinity;\n\n for (let j = i - period; j <= i; j++) {\n if (high[j] > highest) {\n highest = high[j];\n highestIdx = j;\n }\n if (low[j] < lowest) {\n lowest = low[j];\n lowestIdx = j;\n }\n }\n\n aroonUp[i] = ((period - (i - highestIdx)) / period) * 100;\n aroonDown[i] = ((period - (i - lowestIdx)) / period) * 100;\n }\n\n // Aroon Oscillator = Aroon Up - Aroon Down\n const oscillator = new Float32Array(length);\n for (let i = 0; i < length; i++) {\n oscillator[i] = aroonUp[i] - aroonDown[i];\n }\n\n return {\n values: oscillator,\n upper: aroonUp,\n lower: aroonDown,\n };\n}\n\n// ============================================\n// Utility Functions\n// ============================================\n\n/**\n * Calculate percentage change\n */\nexport function percentChange(data: Float32Array | Float64Array | number[], period: number = 1): Float32Array {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const result = new Float32Array(input.length);\n \n for (let i = 0; i < period; i++) {\n result[i] = NaN;\n }\n \n for (let i = period; i < input.length; i++) {\n const prev = input[i - period];\n if (prev === 0) {\n result[i] = NaN;\n } else {\n result[i] = ((input[i] - prev) / prev) * 100;\n }\n }\n\n return result;\n}\n\n/**\n * Calculate cumulative sum\n */\nexport function cumsum(data: Float32Array | Float64Array | number[]): Float32Array {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const result = new Float32Array(input.length);\n \n result[0] = input[0];\n for (let i = 1; i < input.length; i++) {\n result[i] = result[i - 1] + input[i];\n }\n\n return result;\n}\n\n/**\n * Normalize data to 0-100 range\n */\nexport function normalize(data: Float32Array | Float64Array | number[]): Float32Array {\n const input = data instanceof Float32Array || data instanceof Float64Array ? data : Float32Array.from(data);\n const result = new Float32Array(input.length);\n \n let min = Infinity;\n let max = -Infinity;\n \n for (let i = 0; i < input.length; i++) {\n if (!isNaN(input[i])) {\n if (input[i] < min) min = input[i];\n if (input[i] > max) max = input[i];\n }\n }\n\n const range = max - min;\n if (range === 0) {\n result.fill(50);\n } else {\n for (let i = 0; i < input.length; i++) {\n result[i] = ((input[i] - min) / range) * 100;\n }\n }\n\n return result;\n}\n"],"names":["sma","data","period","input","result","i","sum","ema","multiplier","wma","weightSum","weightedSum","j","dema","ema1","ema2","tema","ema3","rsi","avgGain","avgLoss","change","rs","gain","loss","macd","fastPeriod","slowPeriod","signalPeriod","fastEma","slowEma","macdLine","signal","histogram","stochastic","ohlc","kPeriod","dPeriod","high","low","close","length","kValues","highest","lowest","range","dValues","roc","pastValue","momentum","bollingerBands","stdDev","middle","upper","lower","sumSquares","diff","std","atr","tr","hl","hc","lc","standardDeviation","avg","vwap","volume","cumulativeTPV","cumulativeVolume","typicalPrice","obv","closeInput","volumeInput","adx","plusDM","minusDM","upMove","downMove","smoothedTR","smoothedPlusDM","smoothedMinusDM","plusDI","minusDI","dx","diSum","aroon","aroonUp","aroonDown","highestIdx","lowestIdx","oscillator","percentChange","prev","cumsum","normalize","min","max"],"mappings":"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"}