velo-plot 2.20.0 → 3.1.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.
- package/README.md +26 -12
- package/dist/ChartCore-AnR_3Xkb.js +7338 -0
- package/dist/ChartCore-AnR_3Xkb.js.map +1 -0
- package/dist/GpuChartRenderer-Dxc0hrQA.js +75 -0
- package/dist/GpuChartRenderer-Dxc0hrQA.js.map +1 -0
- package/dist/{index.core-COREBDNq.js → PluginRegistry-CzMHebYP.js} +24 -38
- package/dist/PluginRegistry-CzMHebYP.js.map +1 -0
- package/dist/a11y-Bw6urYpr.js +105 -0
- package/dist/a11y-Bw6urYpr.js.map +1 -0
- package/dist/angular/hooks-entry.d.ts +1 -0
- package/dist/angular/hooks.d.ts +26 -0
- package/dist/angular/index.d.ts +8 -0
- package/dist/angular/velo-plot.component.d.ts +46 -0
- package/dist/angular-hooks.d.ts +1 -0
- package/dist/angular-hooks.js +9 -0
- package/dist/angular-hooks.js.map +1 -0
- package/dist/angular.d.ts +1 -0
- package/dist/angular.js +166 -0
- package/dist/angular.js.map +1 -0
- package/dist/assets/indicator.worker-bv0zC4EX.js.map +1 -1
- package/dist/astro/StackedPlot.astro +19 -0
- package/dist/astro/VeloPlot.astro +23 -0
- package/dist/{axisFormat-CzumxpCL.js → axisFormat-Sz4WIJfQ.js} +2 -2
- package/dist/{axisFormat-CzumxpCL.js.map → axisFormat-Sz4WIJfQ.js.map} +1 -1
- package/dist/bindings/shared/a11y.d.ts +26 -0
- package/dist/bindings/shared/chartLifecycle.d.ts +16 -0
- package/dist/bindings/shared/chartSyncBridge.d.ts +8 -0
- package/dist/bindings/shared/dimensions.d.ts +1 -0
- package/dist/bindings/shared/index.d.ts +9 -0
- package/dist/bindings/shared/indicatorBridge.d.ts +11 -0
- package/dist/bindings/shared/optionsSync.d.ts +7 -0
- package/dist/bindings/shared/seriesDiff.d.ts +8 -0
- package/dist/bindings/shared/stackedSync.d.ts +9 -0
- package/dist/bindings/shared/types.d.ts +46 -0
- package/dist/bindings/test-utils/index.d.ts +35 -0
- package/dist/bindings/test-utils/mockLifecycle.d.ts +120 -0
- package/dist/bindings/test-utils/vitestSveltePlugin.d.ts +3 -0
- package/dist/chartSyncBridge-D_rCtbFq.js +58 -0
- package/dist/chartSyncBridge-D_rCtbFq.js.map +1 -0
- package/dist/core/Chart.d.ts +1 -1
- package/dist/core/ChartStatistics.d.ts +1 -1
- package/dist/core/InteractionManager.d.ts +7 -1
- package/dist/core/OverlayRenderer.d.ts +5 -0
- package/dist/core/annotations/types.d.ts +1 -1
- package/dist/core/chart/ChartCore.d.ts +14 -19
- package/dist/core/chart/ChartFeatureHooks.d.ts +7 -0
- package/dist/core/chart/chartExportPatch.d.ts +2 -0
- package/dist/core/chart/overlaySeriesRegistry.d.ts +7 -0
- package/dist/core/chart/series/SeriesActions.d.ts +1 -0
- package/dist/core/chart/series/SeriesBufferLite.d.ts +13 -0
- package/dist/core/chart/series/seriesOptionsRegistry.d.ts +8 -0
- package/dist/core/chart/series/seriesTypeRegistry.d.ts +5 -0
- package/dist/core/chart/types.d.ts +1 -1
- package/dist/core/clipboard/index.d.ts +1 -1
- package/dist/core/debug/index.d.ts +1 -1
- package/dist/core/keybindings/index.d.ts +1 -1
- package/dist/core/loading/index.d.ts +1 -1
- package/dist/core/locale/index.d.ts +1 -1
- package/dist/core/stacked/paneResize.d.ts +3 -0
- package/dist/core/stacked/types.d.ts +10 -0
- package/dist/core/theme-editor/index.d.ts +1 -1
- package/dist/createStackedChart-DqcLCFGS.js +1338 -0
- package/dist/createStackedChart-DqcLCFGS.js.map +1 -0
- package/dist/examples/PluginDemonstration.d.ts +1 -1
- package/dist/hooks-DH-3bewj.js +69 -0
- package/dist/hooks-DH-3bewj.js.map +1 -0
- package/dist/{index-BBpJwOct.js → index-0InEyj0q.js} +119 -121
- package/dist/index-0InEyj0q.js.map +1 -0
- package/dist/{index-qunX30Xu.js → index-B7PTX94B.js} +2133 -2133
- package/dist/index-B7PTX94B.js.map +1 -0
- package/dist/{index-BMiZoKmm.js → index-BgrvqltV.js} +67 -67
- package/dist/index-BgrvqltV.js.map +1 -0
- package/dist/{index-DoYxf1cV.js → index-CWxIHdwX.js} +38 -98
- package/dist/index-CWxIHdwX.js.map +1 -0
- package/dist/index-CaXWSOTk.js.map +1 -1
- package/dist/{mockDatafeed-927foCM4.js → index-Cv6ZDLWf.js} +227 -217
- package/dist/index-Cv6ZDLWf.js.map +1 -0
- package/dist/index-Dag88bW4.js.map +1 -1
- package/dist/index-qhscKTDy.js.map +1 -1
- package/dist/index.core.d.ts +9 -7
- package/dist/index.d.ts +2 -15
- package/dist/indicators--eJGmVox.js.map +1 -1
- package/dist/optionsSync-QUiN4Inw.js +119 -0
- package/dist/optionsSync-QUiN4Inw.js.map +1 -0
- package/dist/plugins/3d/index.d.ts +2 -2
- package/dist/plugins/3d.d.ts +2 -2
- package/dist/plugins/3d.js +3 -1
- package/dist/plugins/3d.js.map +1 -1
- package/dist/plugins/analysis/index.d.ts +1 -1
- package/dist/plugins/analysis/indicators.d.ts +1 -1
- package/dist/plugins/analysis.d.ts +2 -2
- package/dist/plugins/analysis.js +2 -2
- package/dist/plugins/analysis.js.map +1 -1
- package/dist/plugins/annotations/index.d.ts +1 -1
- package/dist/plugins/annotations.d.ts +2 -2
- package/dist/plugins/annotations.js.map +1 -1
- package/dist/plugins/anomaly-detection.js +1 -1
- package/dist/plugins/anomaly-detection.js.map +1 -1
- package/dist/plugins/broken-axis.d.ts +2 -2
- package/dist/plugins/builtins/crosshair/CrosshairPlugin.d.ts +1 -1
- package/dist/plugins/builtins/index.d.ts +1 -1
- package/dist/plugins/caching.d.ts +2 -2
- package/dist/plugins/clipboard/index.d.ts +2 -2
- package/dist/plugins/clipboard.d.ts +2 -2
- package/dist/plugins/clipboard.js.map +1 -1
- package/dist/plugins/context-menu/index.d.ts +1 -1
- package/dist/plugins/context-menu.d.ts +2 -2
- package/dist/plugins/context-menu.js +1 -1
- package/dist/plugins/context-menu.js.map +1 -1
- package/dist/plugins/createPlugin.d.ts +8 -0
- package/dist/plugins/data-export/index.d.ts +1 -1
- package/dist/plugins/data-export.d.ts +2 -2
- package/dist/plugins/data-export.js +2 -2
- package/dist/plugins/data-export.js.map +1 -1
- package/dist/plugins/data-transform.d.ts +2 -2
- package/dist/plugins/data-transform.js +19 -19
- package/dist/plugins/data-transform.js.map +1 -1
- package/dist/plugins/debug/index.d.ts +2 -2
- package/dist/plugins/debug.d.ts +2 -2
- package/dist/plugins/debug.js +33 -33
- package/dist/plugins/debug.js.map +1 -1
- package/dist/plugins/forecasting/index.d.ts +1 -1
- package/dist/plugins/forecasting.js.map +1 -1
- package/dist/plugins/gpu/index.d.ts +2 -2
- package/dist/plugins/gpu.d.ts +2 -2
- package/dist/plugins/gpu.js +2033 -209
- package/dist/plugins/gpu.js.map +1 -1
- package/dist/plugins/i18n/index.d.ts +2 -2
- package/dist/plugins/i18n.d.ts +2 -2
- package/dist/plugins/i18n.js +286 -23
- package/dist/plugins/i18n.js.map +1 -1
- package/dist/plugins/index.d.ts +1 -1
- package/dist/plugins/keyboard.d.ts +2 -2
- package/dist/plugins/keyboard.js +65 -5
- package/dist/plugins/keyboard.js.map +1 -1
- package/dist/plugins/latex.js +766 -207
- package/dist/plugins/latex.js.map +1 -1
- package/dist/plugins/lazy-load.d.ts +2 -2
- package/dist/plugins/loading/index.d.ts +2 -3
- package/dist/plugins/loading.d.ts +2 -2
- package/dist/plugins/loading.js +3 -4
- package/dist/plugins/ml-integration.d.ts +2 -2
- package/dist/plugins/ml-integration.js +5 -5
- package/dist/plugins/ml-integration.js.map +1 -1
- package/dist/plugins/offscreen.d.ts +2 -2
- package/dist/plugins/offscreen.js +11 -10
- package/dist/plugins/offscreen.js.map +1 -1
- package/dist/plugins/pattern-recognition.d.ts +2 -2
- package/dist/plugins/pattern-recognition.js +1 -1
- package/dist/plugins/pattern-recognition.js.map +1 -1
- package/dist/plugins/radar.d.ts +2 -2
- package/dist/plugins/regression.d.ts +2 -2
- package/dist/plugins/regression.js +255 -257
- package/dist/plugins/regression.js.map +1 -1
- package/dist/plugins/roi.js +9 -9
- package/dist/plugins/roi.js.map +1 -1
- package/dist/plugins/snapshot/index.d.ts +1 -1
- package/dist/plugins/snapshot/types.d.ts +1 -1
- package/dist/plugins/snapshot.d.ts +2 -2
- package/dist/plugins/snapshot.js.map +1 -1
- package/dist/plugins/streaming/index.d.ts +2 -2
- package/dist/plugins/streaming.d.ts +2 -2
- package/dist/plugins/streaming.js +1 -1
- package/dist/plugins/sync/index.d.ts +3 -2
- package/dist/plugins/sync.d.ts +2 -2
- package/dist/plugins/sync.js.map +1 -1
- package/dist/plugins/theme-editor/index.d.ts +1 -1
- package/dist/plugins/theme-editor.d.ts +2 -2
- package/dist/plugins/tools/index.d.ts +1 -1
- package/dist/plugins/tools/tooltip/index.d.ts +1 -1
- package/dist/plugins/tools.d.ts +2 -2
- package/dist/plugins/tools.js +1 -1
- package/dist/plugins/types.d.ts +1 -1
- package/dist/plugins/video-recorder.d.ts +2 -2
- package/dist/plugins/virtualization.d.ts +2 -2
- package/dist/plugins/virtualization.js +1 -1
- package/dist/pool-DZ8shSqv.js +109 -0
- package/dist/pool-DZ8shSqv.js.map +1 -0
- package/dist/react/StackedPlot.d.ts +31 -0
- package/dist/react/VeloPlot.d.ts +29 -0
- package/dist/react/index.d.ts +25 -3
- package/dist/react/useChartSync.d.ts +8 -0
- package/dist/react/useIndicator.d.ts +12 -0
- package/dist/react/useVeloPlot.d.ts +19 -0
- package/dist/react.js +325 -24
- package/dist/react.js.map +1 -1
- package/dist/renderer/NativeWebGLRenderer.d.ts +2 -1
- package/dist/renderer/native/NativeWebGLRenderer.d.ts +5 -1
- package/dist/renderer/native/draw.d.ts +2 -47
- package/dist/renderer/native/drawCore.d.ts +27 -0
- package/dist/renderer/native/drawExtended.d.ts +29 -0
- package/dist/renderer/native/frameRenderExtended.d.ts +1 -0
- package/dist/renderer/native/frameRenderRegistry.d.ts +27 -0
- package/dist/renderer/native/programFactoryCore.d.ts +6 -0
- package/dist/renderer/native/programFactoryExtended.d.ts +4 -0
- package/dist/renderer/native/utils.d.ts +3 -29
- package/dist/renderer/native/utilsCore.d.ts +14 -0
- package/dist/renderer/native/utilsExtended.d.ts +17 -0
- package/dist/renderer/overlaySeriesExtended.d.ts +1 -0
- package/dist/renderer/registerExtendedSeries.d.ts +1 -0
- package/dist/renderer/registerWebGPU.d.ts +2 -0
- package/dist/renderer/seriesBufferExtended.d.ts +4 -0
- package/dist/scientific/index.d.ts +44 -0
- package/dist/scientific/registerScientific.d.ts +1 -0
- package/dist/scientific.d.ts +1 -0
- package/dist/scientific.js +91 -0
- package/dist/scientific.js.map +1 -0
- package/dist/solid/VeloPlot.d.ts +16 -0
- package/dist/solid/index.d.ts +13 -0
- package/dist/solid/useChartSync.d.ts +6 -0
- package/dist/solid/useIndicator.d.ts +11 -0
- package/dist/solid/useStackedPlot.d.ts +14 -0
- package/dist/solid/useVeloPlot.d.ts +18 -0
- package/dist/solid.d.ts +1 -0
- package/dist/solid.js +169 -0
- package/dist/solid.js.map +1 -0
- package/dist/stackedSync-tnrunZMt.js +100 -0
- package/dist/stackedSync-tnrunZMt.js.map +1 -0
- package/dist/svelte/StackedPlot.svelte +29 -0
- package/dist/svelte/StackedPlot.test.ts +114 -0
- package/dist/svelte/VeloPlot.svelte +44 -0
- package/dist/svelte/VeloPlot.test.ts +105 -0
- package/dist/svelte/index.d.ts +11 -0
- package/dist/svelte/index.test.ts +20 -0
- package/dist/svelte/index.ts +15 -0
- package/dist/svelte/useChartSync.d.ts +8 -0
- package/dist/svelte/useChartSync.test.ts +49 -0
- package/dist/svelte/useChartSync.ts +29 -0
- package/dist/svelte/useIndicator.d.ts +13 -0
- package/dist/svelte/useIndicator.test.ts +67 -0
- package/dist/svelte/useIndicator.ts +43 -0
- package/dist/svelte/useStackedPlot.d.ts +16 -0
- package/dist/svelte/useStackedPlot.test.ts +76 -0
- package/dist/svelte/useStackedPlot.ts +54 -0
- package/dist/svelte/useVeloPlot.d.ts +21 -0
- package/dist/svelte/useVeloPlot.test.ts +100 -0
- package/dist/svelte/useVeloPlot.ts +81 -0
- package/dist/svelte.d.ts +1 -0
- package/dist/svelte.js +140 -0
- package/dist/svelte.js.map +1 -0
- package/dist/testing/index.d.ts +1 -1
- package/dist/theme/index.d.ts +2 -1
- package/dist/trading/index.d.ts +1 -4
- package/dist/trading/registerTrading.d.ts +3 -0
- package/dist/trading.js +42 -42
- package/dist/types.d.ts +4 -4
- package/dist/{utils-BK5UUXxj.js → utils-Dx0h0bgQ.js} +9 -9
- package/dist/{utils-BK5UUXxj.js.map → utils-Dx0h0bgQ.js.map} +1 -1
- package/dist/velo-plot.full.js +2216 -1346
- package/dist/velo-plot.full.js.map +1 -1
- package/dist/velo-plot.js +33 -28
- package/dist/velo-plot.js.map +1 -1
- package/dist/vue/StackedPlot.vue.d.ts +48 -0
- package/dist/vue/VeloPlot.vue.d.ts +64 -0
- package/dist/vue/index.d.ts +250 -0
- package/dist/vue/useChartSync.d.ts +52 -0
- package/dist/vue/useIndicator.d.ts +23 -0
- package/dist/vue/useStackedPlot.d.ts +15 -0
- package/dist/vue/useVeloPlot.d.ts +20 -0
- package/dist/vue.d.ts +1 -0
- package/dist/vue.js +309 -0
- package/dist/vue.js.map +1 -0
- package/dist/workers/indicatorsAsync.d.ts +2 -0
- package/dist/workers/pool.d.ts +9 -0
- package/package.json +96 -10
- package/dist/ChartCore-ivzLqxVb.js +0 -8350
- package/dist/ChartCore-ivzLqxVb.js.map +0 -1
- package/dist/SciPlot-CEU4ApgD.js +0 -463
- package/dist/SciPlot-CEU4ApgD.js.map +0 -1
- package/dist/createStackedChart-DxNW0VkF.js +0 -705
- package/dist/createStackedChart-DxNW0VkF.js.map +0 -1
- package/dist/gpuRenderer-BpaMYz-k.js +0 -1848
- package/dist/gpuRenderer-BpaMYz-k.js.map +0 -1
- package/dist/index-BBpJwOct.js.map +0 -1
- package/dist/index-BMiZoKmm.js.map +0 -1
- package/dist/index-DoYxf1cV.js.map +0 -1
- package/dist/index-qunX30Xu.js.map +0 -1
- package/dist/index-x4stH3jD.js +0 -282
- package/dist/index-x4stH3jD.js.map +0 -1
- package/dist/index.core-COREBDNq.js.map +0 -1
- package/dist/mockDatafeed-927foCM4.js.map +0 -1
- package/dist/pool-15HMCNv8.js +0 -88
- package/dist/pool-15HMCNv8.js.map +0 -1
- package/dist/react/SciPlot.d.ts +0 -60
- package/dist/react/useSciPlot.d.ts +0 -56
- package/dist/symbols-DT0eLlpW.js +0 -568
- package/dist/symbols-DT0eLlpW.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-CaXWSOTk.js","sources":["../src/core/sync/index.ts"],"sourcesContent":["/**\n * Sci Plot - Chart Synchronization Module\n *\n * @module sync\n */\n\nimport type { Bounds, Range } from \"../../types\";\n\nexport type SyncAxis = 'x' | 'y' | 'xy' | 'none';\n\nexport interface SyncOptions {\n axis?: SyncAxis;\n syncCursor?: boolean;\n syncSelection?: boolean;\n syncZoom?: boolean;\n syncPan?: boolean;\n debounce?: number;\n bidirectional?: boolean;\n /** When set, used for fitAll; with bidirectional sync any pane can drive pan/zoom */\n masterId?: string;\n}\n\nexport interface ChartLike {\n getId(): string;\n getViewBounds(): Bounds;\n zoom(options: { x?: Range; y?: Range; animate?: boolean }): void;\n pan(dx: number, dy: number): void;\n fit?(options?: { x?: Range; y?: Range; padding?: number | { x?: number; y?: number } }): void;\n getCursorPosition?(): { x: number; y: number } | null;\n setExternalCursor?(x: number, y: number): void;\n clearExternalCursor?(): void;\n getSelectedPoints?(): { seriesId: string; indices: number[] }[];\n selectPoints?(points: { seriesId: string; indices: number[] }[]): void;\n clearSelection?(): void;\n on(event: string, callback: (...args: unknown[]) => void): void;\n off(event: string, callback: (...args: unknown[]) => void): void;\n}\n\nexport interface SyncEvent {\n sourceId: string;\n type: 'zoom' | 'pan' | 'cursor' | 'selection' | 'bounds';\n data: unknown;\n}\n\ntype RequiredSyncOptions = Required<Omit<SyncOptions, 'masterId'>> & Pick<SyncOptions, 'masterId'>;\n\nexport class ChartGroup {\n private charts: Map<string, ChartLike> = new Map();\n private options: RequiredSyncOptions;\n private eventHandlers: Map<string, Map<string, (...args: unknown[]) => void>> = new Map();\n private isUpdating: boolean = false;\n private debounceTimers: Map<string, number> = new Map();\n private rafTimers: Map<string, number> = new Map();\n\n constructor(options?: SyncOptions) {\n this.options = {\n axis: 'x',\n syncCursor: true,\n syncSelection: false,\n syncZoom: true,\n syncPan: true,\n debounce: 0,\n bidirectional: true,\n masterId: undefined,\n ...options,\n };\n }\n\n add(chart: ChartLike): this {\n const chartId = chart.getId();\n if (this.charts.has(chartId)) {\n console.warn(`[ChartGroup] Chart ${chartId} is already in the group`);\n return this;\n }\n this.charts.set(chartId, chart);\n this.attachEventHandlers(chart);\n return this;\n }\n\n addAll(...charts: ChartLike[]): this {\n for (const chart of charts) this.add(chart);\n return this;\n }\n\n remove(chart: ChartLike): this {\n const chartId = chart.getId();\n if (!this.charts.has(chartId)) return this;\n this.detachEventHandlers(chart);\n this.charts.delete(chartId);\n return this;\n }\n\n getCharts(): ChartLike[] {\n return Array.from(this.charts.values());\n }\n\n size(): number {\n return this.charts.size;\n }\n\n has(chart: ChartLike): boolean {\n return this.charts.has(chart.getId());\n }\n\n syncAxis(axis: SyncAxis): this {\n this.options.axis = axis;\n return this;\n }\n\n syncZoom(enabled: boolean): this {\n if (this.options.syncZoom === enabled) return this;\n return this.updateOptions({ syncZoom: enabled });\n }\n\n syncPan(enabled: boolean): this {\n if (this.options.syncPan === enabled) return this;\n return this.updateOptions({ syncPan: enabled });\n }\n\n syncCursor(enabled: boolean): this {\n this.options.syncCursor = enabled;\n return this;\n }\n\n syncSelection(enabled: boolean): this {\n this.options.syncSelection = enabled;\n return this;\n }\n\n /** Update sync options and re-bind event handlers on all charts */\n updateOptions(partial: Partial<SyncOptions>): this {\n Object.assign(this.options, partial);\n for (const chart of this.charts.values()) {\n this.detachEventHandlers(chart);\n this.attachEventHandlers(chart);\n }\n return this;\n }\n\n getOptions(): Readonly<SyncOptions> {\n return { ...this.options };\n }\n\n syncTo(bounds: Partial<Bounds>, excludeChartId?: string): void {\n this.propagateZoom(excludeChartId || '', bounds);\n }\n\n resetAll(): void {\n this.batch(() => {\n for (const chart of this.charts.values()) {\n if (chart.fit) chart.fit();\n else chart.zoom({ x: undefined, y: undefined });\n }\n });\n }\n\n fitAll(options?: { x?: Range; padding?: number }): void {\n this.batch(() => {\n let sharedX: Range | undefined = options?.x;\n const masterId = this.options.masterId;\n const master = masterId ? this.charts.get(masterId) : this.charts.values().next().value;\n\n if (!sharedX && master?.fit) {\n master.fit({ padding: options?.padding });\n const b = master.getViewBounds();\n if (this.hasValidViewBounds(b)) sharedX = [b.xMin, b.xMax];\n }\n\n for (const [chartId, chart] of this.charts.entries()) {\n if (!chart.fit) continue;\n if (chartId === masterId) continue;\n chart.fit(\n sharedX\n ? { x: sharedX, padding: options?.padding }\n : { padding: options?.padding },\n );\n }\n });\n }\n\n batch<T>(fn: () => T): T {\n const prev = this.isUpdating;\n this.isUpdating = true;\n try {\n return fn();\n } finally {\n this.isUpdating = prev;\n }\n }\n\n clearAllSelections(): void {\n for (const chart of this.charts.values()) {\n chart.clearSelection?.();\n }\n }\n\n destroy(): void {\n for (const chart of this.charts.values()) {\n this.detachEventHandlers(chart);\n }\n this.charts.clear();\n this.eventHandlers.clear();\n for (const timerId of this.debounceTimers.values()) clearTimeout(timerId);\n this.debounceTimers.clear();\n for (const rafId of this.rafTimers.values()) cancelAnimationFrame(rafId);\n this.rafTimers.clear();\n }\n\n private isSyncSource(chartId: string): boolean {\n if (this.options.bidirectional) return true;\n if (this.options.masterId) return chartId === this.options.masterId;\n return true;\n }\n\n private hasValidViewBounds(bounds: Bounds): boolean {\n const xSpan = bounds.xMax - bounds.xMin;\n const ySpan = bounds.yMax - bounds.yMin;\n if (!Number.isFinite(xSpan) || !Number.isFinite(ySpan)) return false;\n if (xSpan <= 0 && ySpan <= 0) return false;\n return true;\n }\n\n private attachEventHandlers(chart: ChartLike): void {\n const chartId = chart.getId();\n const handlers = new Map<string, (...args: unknown[]) => void>();\n\n if (this.options.syncZoom && this.isSyncSource(chartId)) {\n const zoomHandler = (...args: unknown[]) => {\n this.handleZoom(chartId, args[0] as { x: Range; y: Range });\n };\n chart.on('zoom', zoomHandler);\n handlers.set('zoom', zoomHandler);\n }\n\n if (this.options.syncPan && this.isSyncSource(chartId)) {\n const panHandler = (...args: unknown[]) => {\n this.handlePan(chartId, args[0] as { deltaX: number; deltaY: number });\n };\n chart.on('pan', panHandler);\n handlers.set('pan', panHandler);\n }\n\n if (this.options.syncCursor) {\n const hoverHandler = (...args: unknown[]) => {\n this.handleCursor(chartId, args[0] as { point?: { x: number; y: number } } | null);\n };\n chart.on('hover', hoverHandler);\n handlers.set('hover', hoverHandler);\n }\n\n if (this.options.syncSelection) {\n const selectionHandler = (...args: unknown[]) => {\n this.handleSelection(chartId, args[0] as { selected: unknown[] });\n };\n chart.on('selectionChange', selectionHandler);\n handlers.set('selectionChange', selectionHandler);\n }\n\n this.eventHandlers.set(chartId, handlers);\n }\n\n private detachEventHandlers(chart: ChartLike): void {\n const chartId = chart.getId();\n const handlers = this.eventHandlers.get(chartId);\n if (!handlers) return;\n for (const [event, handler] of handlers.entries()) {\n chart.off(event, handler);\n }\n this.eventHandlers.delete(chartId);\n }\n\n private handleZoom(sourceId: string, event: { x: Range; y: Range }): void {\n if (this.isUpdating) return;\n // No canPropagateFrom guard needed: zoom handlers are only attached to sync\n // sources (see attachEventHandlers + isSyncSource), which use identical logic.\n\n const sourceChart = this.charts.get(sourceId);\n if (sourceChart && !this.hasValidViewBounds(sourceChart.getViewBounds())) return;\n\n const bounds: Partial<Bounds> = {};\n if (this.options.axis === 'x' || this.options.axis === 'xy') {\n bounds.xMin = event.x[0];\n bounds.xMax = event.x[1];\n }\n if (this.options.axis === 'y' || this.options.axis === 'xy') {\n bounds.yMin = event.y[0];\n bounds.yMax = event.y[1];\n }\n\n if (bounds.xMin !== undefined && bounds.xMax !== undefined) {\n const xSpan = bounds.xMax - bounds.xMin;\n if (!Number.isFinite(xSpan) || xSpan <= 0) return;\n }\n\n this.scheduleSyncAction(`zoom-${sourceId}`, () => {\n this.propagateZoom(sourceId, bounds);\n });\n }\n\n private handlePan(sourceId: string, event: { deltaX: number; deltaY: number }): void {\n if (this.isUpdating) return;\n // Pan handlers are only attached to sync sources (see attachEventHandlers).\n\n const dx = (this.options.axis === 'x' || this.options.axis === 'xy') ? event.deltaX : 0;\n const dy = (this.options.axis === 'y' || this.options.axis === 'xy') ? event.deltaY : 0;\n if (dx === 0 && dy === 0) return;\n\n this.scheduleSyncAction(`pan-${sourceId}`, () => {\n this.propagatePan(sourceId, dx, dy);\n });\n }\n\n private handleCursor(sourceId: string, event: { point?: { x: number; y: number } } | null): void {\n if (this.isUpdating) return;\n for (const [chartId, chart] of this.charts.entries()) {\n if (chartId === sourceId) continue;\n if (event?.point) chart.setExternalCursor?.(event.point.x, event.point.y);\n else chart.clearExternalCursor?.();\n }\n }\n\n private handleSelection(sourceId: string, event: { selected: unknown[] }): void {\n if (this.isUpdating || !this.options.syncSelection) return;\n\n const sourceChart = this.charts.get(sourceId);\n if (!sourceChart) return;\n\n const selected =\n (event?.selected as { seriesId: string; indices: number[] }[]) ??\n sourceChart.getSelectedPoints?.() ??\n [];\n\n this.isUpdating = true;\n try {\n for (const [chartId, chart] of this.charts.entries()) {\n if (chartId === sourceId) continue;\n if (selected.length === 0) {\n chart.clearSelection?.();\n } else {\n chart.selectPoints?.(selected);\n }\n }\n } finally {\n this.isUpdating = false;\n }\n }\n\n private propagateZoom(sourceId: string, bounds: Partial<Bounds>): void {\n if (this.isUpdating) return;\n this.isUpdating = true;\n try {\n for (const [chartId, chart] of this.charts.entries()) {\n if (chartId === sourceId) continue;\n const zoomOptions: { x?: Range; y?: Range; animate?: boolean } = { animate: false };\n if (bounds.xMin !== undefined && bounds.xMax !== undefined) {\n zoomOptions.x = [bounds.xMin, bounds.xMax];\n }\n if (bounds.yMin !== undefined && bounds.yMax !== undefined) {\n zoomOptions.y = [bounds.yMin, bounds.yMax];\n }\n chart.zoom(zoomOptions);\n }\n } finally {\n this.isUpdating = false;\n }\n }\n\n private propagatePan(sourceId: string, _dx: number, _dy: number): void {\n if (this.isUpdating) return;\n this.isUpdating = true;\n try {\n const sourceChart = this.charts.get(sourceId);\n if (!sourceChart || !this.hasValidViewBounds(sourceChart.getViewBounds())) return;\n\n const masterBounds = sourceChart.getViewBounds();\n\n for (const [chartId, chart] of this.charts.entries()) {\n if (chartId === sourceId) continue;\n\n const zoomOptions: { x?: Range; y?: Range; animate?: boolean } = { animate: false };\n\n if (this.options.axis === 'x' || this.options.axis === 'xy') {\n zoomOptions.x = [masterBounds.xMin, masterBounds.xMax];\n }\n\n if (this.options.axis === 'y' || this.options.axis === 'xy') {\n zoomOptions.y = [masterBounds.yMin, masterBounds.yMax];\n }\n\n if (zoomOptions.x || zoomOptions.y) {\n chart.zoom(zoomOptions);\n }\n }\n } finally {\n this.isUpdating = false;\n }\n }\n\n private scheduleSyncAction(key: string, action: () => void): void {\n if (this.options.debounce > 0) {\n this.debounceAction(key, action);\n return;\n }\n if (this.rafTimers.has(key)) return;\n const rafId = requestAnimationFrame(() => {\n this.rafTimers.delete(key);\n action();\n });\n this.rafTimers.set(key, rafId);\n }\n\n private debounceAction(key: string, action: () => void): void {\n const existingTimer = this.debounceTimers.get(key);\n if (existingTimer) clearTimeout(existingTimer);\n const timerId = window.setTimeout(() => {\n this.debounceTimers.delete(key);\n action();\n }, this.options.debounce);\n this.debounceTimers.set(key, timerId);\n }\n}\n\nexport function createChartGroup(charts: ChartLike[], options?: SyncOptions): ChartGroup {\n const group = new ChartGroup(options);\n group.addAll(...charts);\n return group;\n}\n\nexport function linkCharts(chart1: ChartLike, chart2: ChartLike, options?: SyncOptions): ChartGroup {\n return createChartGroup([chart1, chart2], options);\n}\n\nexport function createMasterSlave(\n master: ChartLike,\n slave: ChartLike,\n axis: SyncAxis = 'x',\n): ChartGroup {\n return createChartGroup([master, slave], {\n axis,\n bidirectional: false,\n masterId: master.getId(),\n syncCursor: true,\n syncZoom: true,\n syncPan: true,\n });\n}\n"],"names":["ChartGroup","options","__publicField","chart","chartId","charts","axis","enabled","partial","bounds","excludeChartId","sharedX","masterId","master","b","fn","prev","_a","timerId","rafId","xSpan","ySpan","handlers","zoomHandler","args","panHandler","hoverHandler","selectionHandler","event","handler","sourceId","sourceChart","dx","dy","_b","_c","selected","zoomOptions","_dx","_dy","masterBounds","key","action","existingTimer","createChartGroup","group","linkCharts","chart1","chart2","createMasterSlave","slave"],"mappings":";;;AA8CO,MAAMA,EAAW;AAAA,EAQtB,YAAYC,GAAuB;AAP3B,IAAAC,EAAA,oCAAqC,IAAA;AACrC,IAAAA,EAAA;AACA,IAAAA,EAAA,2CAA4E,IAAA;AAC5E,IAAAA,EAAA,oBAAsB;AACtB,IAAAA,EAAA,4CAA0C,IAAA;AAC1C,IAAAA,EAAA,uCAAqC,IAAA;AAG3C,SAAK,UAAU;AAAA,MACb,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,UAAU;AAAA,MACV,SAAS;AAAA,MACT,UAAU;AAAA,MACV,eAAe;AAAA,MACf,UAAU;AAAA,MACV,GAAGD;AAAA,IAAA;AAAA,EAEP;AAAA,EAEA,IAAIE,GAAwB;AAC1B,UAAMC,IAAUD,EAAM,MAAA;AACtB,WAAI,KAAK,OAAO,IAAIC,CAAO,KACzB,QAAQ,KAAK,sBAAsBA,CAAO,0BAA0B,GAC7D,SAET,KAAK,OAAO,IAAIA,GAASD,CAAK,GAC9B,KAAK,oBAAoBA,CAAK,GACvB;AAAA,EACT;AAAA,EAEA,UAAUE,GAA2B;AACnC,eAAWF,KAASE,EAAQ,MAAK,IAAIF,CAAK;AAC1C,WAAO;AAAA,EACT;AAAA,EAEA,OAAOA,GAAwB;AAC7B,UAAMC,IAAUD,EAAM,MAAA;AACtB,WAAK,KAAK,OAAO,IAAIC,CAAO,KAC5B,KAAK,oBAAoBD,CAAK,GAC9B,KAAK,OAAO,OAAOC,CAAO,GACnB,QAH+B;AAAA,EAIxC;AAAA,EAEA,YAAyB;AACvB,WAAO,MAAM,KAAK,KAAK,OAAO,QAAQ;AAAA,EACxC;AAAA,EAEA,OAAe;AACb,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAID,GAA2B;AAC7B,WAAO,KAAK,OAAO,IAAIA,EAAM,OAAO;AAAA,EACtC;AAAA,EAEA,SAASG,GAAsB;AAC7B,gBAAK,QAAQ,OAAOA,GACb;AAAA,EACT;AAAA,EAEA,SAASC,GAAwB;AAC/B,WAAI,KAAK,QAAQ,aAAaA,IAAgB,OACvC,KAAK,cAAc,EAAE,UAAUA,GAAS;AAAA,EACjD;AAAA,EAEA,QAAQA,GAAwB;AAC9B,WAAI,KAAK,QAAQ,YAAYA,IAAgB,OACtC,KAAK,cAAc,EAAE,SAASA,GAAS;AAAA,EAChD;AAAA,EAEA,WAAWA,GAAwB;AACjC,gBAAK,QAAQ,aAAaA,GACnB;AAAA,EACT;AAAA,EAEA,cAAcA,GAAwB;AACpC,gBAAK,QAAQ,gBAAgBA,GACtB;AAAA,EACT;AAAA;AAAA,EAGA,cAAcC,GAAqC;AACjD,WAAO,OAAO,KAAK,SAASA,CAAO;AACnC,eAAWL,KAAS,KAAK,OAAO,OAAA;AAC9B,WAAK,oBAAoBA,CAAK,GAC9B,KAAK,oBAAoBA,CAAK;AAEhC,WAAO;AAAA,EACT;AAAA,EAEA,aAAoC;AAClC,WAAO,EAAE,GAAG,KAAK,QAAA;AAAA,EACnB;AAAA,EAEA,OAAOM,GAAyBC,GAA+B;AAC7D,SAAK,cAAcA,KAAkB,IAAID,CAAM;AAAA,EACjD;AAAA,EAEA,WAAiB;AACf,SAAK,MAAM,MAAM;AACf,iBAAWN,KAAS,KAAK,OAAO,OAAA;AAC9B,QAAIA,EAAM,MAAKA,EAAM,IAAA,MACV,KAAK,EAAE,GAAG,QAAW,GAAG,QAAW;AAAA,IAElD,CAAC;AAAA,EACH;AAAA,EAEA,OAAOF,GAAiD;AACtD,SAAK,MAAM,MAAM;AACf,UAAIU,IAA6BV,KAAA,gBAAAA,EAAS;AAC1C,YAAMW,IAAW,KAAK,QAAQ,UACxBC,IAASD,IAAW,KAAK,OAAO,IAAIA,CAAQ,IAAI,KAAK,OAAO,SAAS,KAAA,EAAO;AAElF,UAAI,CAACD,MAAWE,KAAA,QAAAA,EAAQ,MAAK;AAC3B,QAAAA,EAAO,IAAI,EAAE,SAASZ,KAAA,gBAAAA,EAAS,SAAS;AACxC,cAAMa,IAAID,EAAO,cAAA;AACjB,QAAI,KAAK,mBAAmBC,CAAC,UAAa,CAACA,EAAE,MAAMA,EAAE,IAAI;AAAA,MAC3D;AAEA,iBAAW,CAACV,GAASD,CAAK,KAAK,KAAK,OAAO;AACzC,QAAKA,EAAM,OACPC,MAAYQ,KAChBT,EAAM;AAAA,UACJQ,IACI,EAAE,GAAGA,GAAS,SAASV,KAAA,gBAAAA,EAAS,YAChC,EAAE,SAASA,KAAA,gBAAAA,EAAS,QAAA;AAAA,QAAQ;AAAA,IAGtC,CAAC;AAAA,EACH;AAAA,EAEA,MAASc,GAAgB;AACvB,UAAMC,IAAO,KAAK;AAClB,SAAK,aAAa;AAClB,QAAI;AACF,aAAOD,EAAA;AAAA,IACT,UAAA;AACE,WAAK,aAAaC;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,qBAA2B;AAhJtB,QAAAC;AAiJH,eAAWd,KAAS,KAAK,OAAO,OAAA;AAC9B,OAAAc,IAAAd,EAAM,mBAAN,QAAAc,EAAA,KAAAd;AAAA,EAEJ;AAAA,EAEA,UAAgB;AACd,eAAWA,KAAS,KAAK,OAAO,OAAA;AAC9B,WAAK,oBAAoBA,CAAK;AAEhC,SAAK,OAAO,MAAA,GACZ,KAAK,cAAc,MAAA;AACnB,eAAWe,KAAW,KAAK,eAAe,OAAA,gBAAuBA,CAAO;AACxE,SAAK,eAAe,MAAA;AACpB,eAAWC,KAAS,KAAK,UAAU,OAAA,wBAA+BA,CAAK;AACvE,SAAK,UAAU,MAAA;AAAA,EACjB;AAAA,EAEQ,aAAaf,GAA0B;AAC7C,WAAI,KAAK,QAAQ,gBAAsB,KACnC,KAAK,QAAQ,WAAiBA,MAAY,KAAK,QAAQ,WACpD;AAAA,EACT;AAAA,EAEQ,mBAAmBK,GAAyB;AAClD,UAAMW,IAAQX,EAAO,OAAOA,EAAO,MAC7BY,IAAQZ,EAAO,OAAOA,EAAO;AAEnC,WADI,GAAC,OAAO,SAASW,CAAK,KAAK,CAAC,OAAO,SAASC,CAAK,KACjDD,KAAS,KAAKC,KAAS;AAAA,EAE7B;AAAA,EAEQ,oBAAoBlB,GAAwB;AAClD,UAAMC,IAAUD,EAAM,MAAA,GAChBmB,wBAAe,IAAA;AAErB,QAAI,KAAK,QAAQ,YAAY,KAAK,aAAalB,CAAO,GAAG;AACvD,YAAMmB,IAAc,IAAIC,MAAoB;AAC1C,aAAK,WAAWpB,GAASoB,EAAK,CAAC,CAA2B;AAAA,MAC5D;AACA,MAAArB,EAAM,GAAG,QAAQoB,CAAW,GAC5BD,EAAS,IAAI,QAAQC,CAAW;AAAA,IAClC;AAEA,QAAI,KAAK,QAAQ,WAAW,KAAK,aAAanB,CAAO,GAAG;AACtD,YAAMqB,IAAa,IAAID,MAAoB;AACzC,aAAK,UAAUpB,GAASoB,EAAK,CAAC,CAAuC;AAAA,MACvE;AACA,MAAArB,EAAM,GAAG,OAAOsB,CAAU,GAC1BH,EAAS,IAAI,OAAOG,CAAU;AAAA,IAChC;AAEA,QAAI,KAAK,QAAQ,YAAY;AAC3B,YAAMC,IAAe,IAAIF,MAAoB;AAC3C,aAAK,aAAapB,GAASoB,EAAK,CAAC,CAAgD;AAAA,MACnF;AACA,MAAArB,EAAM,GAAG,SAASuB,CAAY,GAC9BJ,EAAS,IAAI,SAASI,CAAY;AAAA,IACpC;AAEA,QAAI,KAAK,QAAQ,eAAe;AAC9B,YAAMC,IAAmB,IAAIH,MAAoB;AAC/C,aAAK,gBAAgBpB,GAASoB,EAAK,CAAC,CAA4B;AAAA,MAClE;AACA,MAAArB,EAAM,GAAG,mBAAmBwB,CAAgB,GAC5CL,EAAS,IAAI,mBAAmBK,CAAgB;AAAA,IAClD;AAEA,SAAK,cAAc,IAAIvB,GAASkB,CAAQ;AAAA,EAC1C;AAAA,EAEQ,oBAAoBnB,GAAwB;AAClD,UAAMC,IAAUD,EAAM,MAAA,GAChBmB,IAAW,KAAK,cAAc,IAAIlB,CAAO;AAC/C,QAAKkB,GACL;AAAA,iBAAW,CAACM,GAAOC,CAAO,KAAKP,EAAS;AACtC,QAAAnB,EAAM,IAAIyB,GAAOC,CAAO;AAE1B,WAAK,cAAc,OAAOzB,CAAO;AAAA;AAAA,EACnC;AAAA,EAEQ,WAAW0B,GAAkBF,GAAqC;AACxE,QAAI,KAAK,WAAY;AAIrB,UAAMG,IAAc,KAAK,OAAO,IAAID,CAAQ;AAC5C,QAAIC,KAAe,CAAC,KAAK,mBAAmBA,EAAY,cAAA,CAAe,EAAG;AAE1E,UAAMtB,IAA0B,CAAA;AAUhC,SATI,KAAK,QAAQ,SAAS,OAAO,KAAK,QAAQ,SAAS,UACrDA,EAAO,OAAOmB,EAAM,EAAE,CAAC,GACvBnB,EAAO,OAAOmB,EAAM,EAAE,CAAC,KAErB,KAAK,QAAQ,SAAS,OAAO,KAAK,QAAQ,SAAS,UACrDnB,EAAO,OAAOmB,EAAM,EAAE,CAAC,GACvBnB,EAAO,OAAOmB,EAAM,EAAE,CAAC,IAGrBnB,EAAO,SAAS,UAAaA,EAAO,SAAS,QAAW;AAC1D,YAAMW,IAAQX,EAAO,OAAOA,EAAO;AACnC,UAAI,CAAC,OAAO,SAASW,CAAK,KAAKA,KAAS,EAAG;AAAA,IAC7C;AAEA,SAAK,mBAAmB,QAAQU,CAAQ,IAAI,MAAM;AAChD,WAAK,cAAcA,GAAUrB,CAAM;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EAEQ,UAAUqB,GAAkBF,GAAiD;AACnF,QAAI,KAAK,WAAY;AAGrB,UAAMI,IAAM,KAAK,QAAQ,SAAS,OAAO,KAAK,QAAQ,SAAS,OAAQJ,EAAM,SAAS,GAChFK,IAAM,KAAK,QAAQ,SAAS,OAAO,KAAK,QAAQ,SAAS,OAAQL,EAAM,SAAS;AACtF,IAAII,MAAO,KAAKC,MAAO,KAEvB,KAAK,mBAAmB,OAAOH,CAAQ,IAAI,MAAM;AAC/C,WAAK,aAAaA,GAAUE,GAAIC,CAAE;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EAEQ,aAAaH,GAAkBF,GAA0D;AA1Q5F,QAAAX,GAAAiB;AA2QH,QAAI,MAAK;AACT,iBAAW,CAAC9B,GAASD,CAAK,KAAK,KAAK,OAAO;AACzC,QAAIC,MAAY0B,MACZF,KAAA,QAAAA,EAAO,SAAOX,IAAAd,EAAM,sBAAN,QAAAc,EAAA,KAAAd,GAA0ByB,EAAM,MAAM,GAAGA,EAAM,MAAM,YAC5D;EAEf;AAAA,EAEQ,gBAAgBE,GAAkBF,GAAsC;AAnR3E,QAAAX,GAAAiB,GAAAC;AAoRH,QAAI,KAAK,cAAc,CAAC,KAAK,QAAQ,cAAe;AAEpD,UAAMJ,IAAc,KAAK,OAAO,IAAID,CAAQ;AAC5C,QAAI,CAACC,EAAa;AAElB,UAAMK,KACHR,KAAA,gBAAAA,EAAO,eACRX,IAAAc,EAAY,sBAAZ,gBAAAd,EAAA,KAAAc,OACA,CAAA;AAEF,SAAK,aAAa;AAClB,QAAI;AACF,iBAAW,CAAC3B,GAASD,CAAK,KAAK,KAAK,OAAO;AACzC,QAAIC,MAAY0B,MACZM,EAAS,WAAW,KACtBF,IAAA/B,EAAM,mBAAN,QAAA+B,EAAA,KAAA/B,MAEAgC,IAAAhC,EAAM,iBAAN,QAAAgC,EAAA,KAAAhC,GAAqBiC;AAAA,IAG3B,UAAA;AACE,WAAK,aAAa;AAAA,IACpB;AAAA,EACF;AAAA,EAEQ,cAAcN,GAAkBrB,GAA+B;AACrE,QAAI,MAAK,YACT;AAAA,WAAK,aAAa;AAClB,UAAI;AACF,mBAAW,CAACL,GAASD,CAAK,KAAK,KAAK,OAAO,WAAW;AACpD,cAAIC,MAAY0B,EAAU;AAC1B,gBAAMO,IAA2D,EAAE,SAAS,GAAA;AAC5E,UAAI5B,EAAO,SAAS,UAAaA,EAAO,SAAS,WAC/C4B,EAAY,IAAI,CAAC5B,EAAO,MAAMA,EAAO,IAAI,IAEvCA,EAAO,SAAS,UAAaA,EAAO,SAAS,WAC/C4B,EAAY,IAAI,CAAC5B,EAAO,MAAMA,EAAO,IAAI,IAE3CN,EAAM,KAAKkC,CAAW;AAAA,QACxB;AAAA,MACF,UAAA;AACE,aAAK,aAAa;AAAA,MACpB;AAAA;AAAA,EACF;AAAA,EAEQ,aAAaP,GAAkBQ,GAAaC,GAAmB;AACrE,QAAI,MAAK,YACT;AAAA,WAAK,aAAa;AAClB,UAAI;AACF,cAAMR,IAAc,KAAK,OAAO,IAAID,CAAQ;AAC5C,YAAI,CAACC,KAAe,CAAC,KAAK,mBAAmBA,EAAY,cAAA,CAAe,EAAG;AAE3E,cAAMS,IAAeT,EAAY,cAAA;AAEjC,mBAAW,CAAC3B,GAASD,CAAK,KAAK,KAAK,OAAO,WAAW;AACpD,cAAIC,MAAY0B,EAAU;AAE1B,gBAAMO,IAA2D,EAAE,SAAS,GAAA;AAE5E,WAAI,KAAK,QAAQ,SAAS,OAAO,KAAK,QAAQ,SAAS,UACrDA,EAAY,IAAI,CAACG,EAAa,MAAMA,EAAa,IAAI,KAGnD,KAAK,QAAQ,SAAS,OAAO,KAAK,QAAQ,SAAS,UACrDH,EAAY,IAAI,CAACG,EAAa,MAAMA,EAAa,IAAI,KAGnDH,EAAY,KAAKA,EAAY,MAC/BlC,EAAM,KAAKkC,CAAW;AAAA,QAE1B;AAAA,MACF,UAAA;AACE,aAAK,aAAa;AAAA,MACpB;AAAA;AAAA,EACF;AAAA,EAEQ,mBAAmBI,GAAaC,GAA0B;AAChE,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B,WAAK,eAAeD,GAAKC,CAAM;AAC/B;AAAA,IACF;AACA,QAAI,KAAK,UAAU,IAAID,CAAG,EAAG;AAC7B,UAAMtB,IAAQ,sBAAsB,MAAM;AACxC,WAAK,UAAU,OAAOsB,CAAG,GACzBC,EAAA;AAAA,IACF,CAAC;AACD,SAAK,UAAU,IAAID,GAAKtB,CAAK;AAAA,EAC/B;AAAA,EAEQ,eAAesB,GAAaC,GAA0B;AAC5D,UAAMC,IAAgB,KAAK,eAAe,IAAIF,CAAG;AACjD,IAAIE,kBAA4BA,CAAa;AAC7C,UAAMzB,IAAU,OAAO,WAAW,MAAM;AACtC,WAAK,eAAe,OAAOuB,CAAG,GAC9BC,EAAA;AAAA,IACF,GAAG,KAAK,QAAQ,QAAQ;AACxB,SAAK,eAAe,IAAID,GAAKvB,CAAO;AAAA,EACtC;AACF;AAEO,SAAS0B,EAAiBvC,GAAqBJ,GAAmC;AACvF,QAAM4C,IAAQ,IAAI7C,EAAWC,CAAO;AACpC,SAAA4C,EAAM,OAAO,GAAGxC,CAAM,GACfwC;AACT;AAEO,SAASC,EAAWC,GAAmBC,GAAmB/C,GAAmC;AAClG,SAAO2C,EAAiB,CAACG,GAAQC,CAAM,GAAG/C,CAAO;AACnD;AAEO,SAASgD,EACdpC,GACAqC,GACA5C,IAAiB,KACL;AACZ,SAAOsC,EAAiB,CAAC/B,GAAQqC,CAAK,GAAG;AAAA,IACvC,MAAA5C;AAAA,IACA,eAAe;AAAA,IACf,UAAUO,EAAO,MAAA;AAAA,IACjB,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,SAAS;AAAA,EAAA,CACV;AACH;"}
|
|
1
|
+
{"version":3,"file":"index-CaXWSOTk.js","sources":["../src/core/sync/index.ts"],"sourcesContent":["/**\n * Velo Plot - Chart Synchronization Module\n *\n * @module sync\n */\n\nimport type { Bounds, Range } from \"../../types\";\n\nexport type SyncAxis = 'x' | 'y' | 'xy' | 'none';\n\nexport interface SyncOptions {\n axis?: SyncAxis;\n syncCursor?: boolean;\n syncSelection?: boolean;\n syncZoom?: boolean;\n syncPan?: boolean;\n debounce?: number;\n bidirectional?: boolean;\n /** When set, used for fitAll; with bidirectional sync any pane can drive pan/zoom */\n masterId?: string;\n}\n\nexport interface ChartLike {\n getId(): string;\n getViewBounds(): Bounds;\n zoom(options: { x?: Range; y?: Range; animate?: boolean }): void;\n pan(dx: number, dy: number): void;\n fit?(options?: { x?: Range; y?: Range; padding?: number | { x?: number; y?: number } }): void;\n getCursorPosition?(): { x: number; y: number } | null;\n setExternalCursor?(x: number, y: number): void;\n clearExternalCursor?(): void;\n getSelectedPoints?(): { seriesId: string; indices: number[] }[];\n selectPoints?(points: { seriesId: string; indices: number[] }[]): void;\n clearSelection?(): void;\n on(event: string, callback: (...args: unknown[]) => void): void;\n off(event: string, callback: (...args: unknown[]) => void): void;\n}\n\nexport interface SyncEvent {\n sourceId: string;\n type: 'zoom' | 'pan' | 'cursor' | 'selection' | 'bounds';\n data: unknown;\n}\n\ntype RequiredSyncOptions = Required<Omit<SyncOptions, 'masterId'>> & Pick<SyncOptions, 'masterId'>;\n\nexport class ChartGroup {\n private charts: Map<string, ChartLike> = new Map();\n private options: RequiredSyncOptions;\n private eventHandlers: Map<string, Map<string, (...args: unknown[]) => void>> = new Map();\n private isUpdating: boolean = false;\n private debounceTimers: Map<string, number> = new Map();\n private rafTimers: Map<string, number> = new Map();\n\n constructor(options?: SyncOptions) {\n this.options = {\n axis: 'x',\n syncCursor: true,\n syncSelection: false,\n syncZoom: true,\n syncPan: true,\n debounce: 0,\n bidirectional: true,\n masterId: undefined,\n ...options,\n };\n }\n\n add(chart: ChartLike): this {\n const chartId = chart.getId();\n if (this.charts.has(chartId)) {\n console.warn(`[ChartGroup] Chart ${chartId} is already in the group`);\n return this;\n }\n this.charts.set(chartId, chart);\n this.attachEventHandlers(chart);\n return this;\n }\n\n addAll(...charts: ChartLike[]): this {\n for (const chart of charts) this.add(chart);\n return this;\n }\n\n remove(chart: ChartLike): this {\n const chartId = chart.getId();\n if (!this.charts.has(chartId)) return this;\n this.detachEventHandlers(chart);\n this.charts.delete(chartId);\n return this;\n }\n\n getCharts(): ChartLike[] {\n return Array.from(this.charts.values());\n }\n\n size(): number {\n return this.charts.size;\n }\n\n has(chart: ChartLike): boolean {\n return this.charts.has(chart.getId());\n }\n\n syncAxis(axis: SyncAxis): this {\n this.options.axis = axis;\n return this;\n }\n\n syncZoom(enabled: boolean): this {\n if (this.options.syncZoom === enabled) return this;\n return this.updateOptions({ syncZoom: enabled });\n }\n\n syncPan(enabled: boolean): this {\n if (this.options.syncPan === enabled) return this;\n return this.updateOptions({ syncPan: enabled });\n }\n\n syncCursor(enabled: boolean): this {\n this.options.syncCursor = enabled;\n return this;\n }\n\n syncSelection(enabled: boolean): this {\n this.options.syncSelection = enabled;\n return this;\n }\n\n /** Update sync options and re-bind event handlers on all charts */\n updateOptions(partial: Partial<SyncOptions>): this {\n Object.assign(this.options, partial);\n for (const chart of this.charts.values()) {\n this.detachEventHandlers(chart);\n this.attachEventHandlers(chart);\n }\n return this;\n }\n\n getOptions(): Readonly<SyncOptions> {\n return { ...this.options };\n }\n\n syncTo(bounds: Partial<Bounds>, excludeChartId?: string): void {\n this.propagateZoom(excludeChartId || '', bounds);\n }\n\n resetAll(): void {\n this.batch(() => {\n for (const chart of this.charts.values()) {\n if (chart.fit) chart.fit();\n else chart.zoom({ x: undefined, y: undefined });\n }\n });\n }\n\n fitAll(options?: { x?: Range; padding?: number }): void {\n this.batch(() => {\n let sharedX: Range | undefined = options?.x;\n const masterId = this.options.masterId;\n const master = masterId ? this.charts.get(masterId) : this.charts.values().next().value;\n\n if (!sharedX && master?.fit) {\n master.fit({ padding: options?.padding });\n const b = master.getViewBounds();\n if (this.hasValidViewBounds(b)) sharedX = [b.xMin, b.xMax];\n }\n\n for (const [chartId, chart] of this.charts.entries()) {\n if (!chart.fit) continue;\n if (chartId === masterId) continue;\n chart.fit(\n sharedX\n ? { x: sharedX, padding: options?.padding }\n : { padding: options?.padding },\n );\n }\n });\n }\n\n batch<T>(fn: () => T): T {\n const prev = this.isUpdating;\n this.isUpdating = true;\n try {\n return fn();\n } finally {\n this.isUpdating = prev;\n }\n }\n\n clearAllSelections(): void {\n for (const chart of this.charts.values()) {\n chart.clearSelection?.();\n }\n }\n\n destroy(): void {\n for (const chart of this.charts.values()) {\n this.detachEventHandlers(chart);\n }\n this.charts.clear();\n this.eventHandlers.clear();\n for (const timerId of this.debounceTimers.values()) clearTimeout(timerId);\n this.debounceTimers.clear();\n for (const rafId of this.rafTimers.values()) cancelAnimationFrame(rafId);\n this.rafTimers.clear();\n }\n\n private isSyncSource(chartId: string): boolean {\n if (this.options.bidirectional) return true;\n if (this.options.masterId) return chartId === this.options.masterId;\n return true;\n }\n\n private hasValidViewBounds(bounds: Bounds): boolean {\n const xSpan = bounds.xMax - bounds.xMin;\n const ySpan = bounds.yMax - bounds.yMin;\n if (!Number.isFinite(xSpan) || !Number.isFinite(ySpan)) return false;\n if (xSpan <= 0 && ySpan <= 0) return false;\n return true;\n }\n\n private attachEventHandlers(chart: ChartLike): void {\n const chartId = chart.getId();\n const handlers = new Map<string, (...args: unknown[]) => void>();\n\n if (this.options.syncZoom && this.isSyncSource(chartId)) {\n const zoomHandler = (...args: unknown[]) => {\n this.handleZoom(chartId, args[0] as { x: Range; y: Range });\n };\n chart.on('zoom', zoomHandler);\n handlers.set('zoom', zoomHandler);\n }\n\n if (this.options.syncPan && this.isSyncSource(chartId)) {\n const panHandler = (...args: unknown[]) => {\n this.handlePan(chartId, args[0] as { deltaX: number; deltaY: number });\n };\n chart.on('pan', panHandler);\n handlers.set('pan', panHandler);\n }\n\n if (this.options.syncCursor) {\n const hoverHandler = (...args: unknown[]) => {\n this.handleCursor(chartId, args[0] as { point?: { x: number; y: number } } | null);\n };\n chart.on('hover', hoverHandler);\n handlers.set('hover', hoverHandler);\n }\n\n if (this.options.syncSelection) {\n const selectionHandler = (...args: unknown[]) => {\n this.handleSelection(chartId, args[0] as { selected: unknown[] });\n };\n chart.on('selectionChange', selectionHandler);\n handlers.set('selectionChange', selectionHandler);\n }\n\n this.eventHandlers.set(chartId, handlers);\n }\n\n private detachEventHandlers(chart: ChartLike): void {\n const chartId = chart.getId();\n const handlers = this.eventHandlers.get(chartId);\n if (!handlers) return;\n for (const [event, handler] of handlers.entries()) {\n chart.off(event, handler);\n }\n this.eventHandlers.delete(chartId);\n }\n\n private handleZoom(sourceId: string, event: { x: Range; y: Range }): void {\n if (this.isUpdating) return;\n // No canPropagateFrom guard needed: zoom handlers are only attached to sync\n // sources (see attachEventHandlers + isSyncSource), which use identical logic.\n\n const sourceChart = this.charts.get(sourceId);\n if (sourceChart && !this.hasValidViewBounds(sourceChart.getViewBounds())) return;\n\n const bounds: Partial<Bounds> = {};\n if (this.options.axis === 'x' || this.options.axis === 'xy') {\n bounds.xMin = event.x[0];\n bounds.xMax = event.x[1];\n }\n if (this.options.axis === 'y' || this.options.axis === 'xy') {\n bounds.yMin = event.y[0];\n bounds.yMax = event.y[1];\n }\n\n if (bounds.xMin !== undefined && bounds.xMax !== undefined) {\n const xSpan = bounds.xMax - bounds.xMin;\n if (!Number.isFinite(xSpan) || xSpan <= 0) return;\n }\n\n this.scheduleSyncAction(`zoom-${sourceId}`, () => {\n this.propagateZoom(sourceId, bounds);\n });\n }\n\n private handlePan(sourceId: string, event: { deltaX: number; deltaY: number }): void {\n if (this.isUpdating) return;\n // Pan handlers are only attached to sync sources (see attachEventHandlers).\n\n const dx = (this.options.axis === 'x' || this.options.axis === 'xy') ? event.deltaX : 0;\n const dy = (this.options.axis === 'y' || this.options.axis === 'xy') ? event.deltaY : 0;\n if (dx === 0 && dy === 0) return;\n\n this.scheduleSyncAction(`pan-${sourceId}`, () => {\n this.propagatePan(sourceId, dx, dy);\n });\n }\n\n private handleCursor(sourceId: string, event: { point?: { x: number; y: number } } | null): void {\n if (this.isUpdating) return;\n for (const [chartId, chart] of this.charts.entries()) {\n if (chartId === sourceId) continue;\n if (event?.point) chart.setExternalCursor?.(event.point.x, event.point.y);\n else chart.clearExternalCursor?.();\n }\n }\n\n private handleSelection(sourceId: string, event: { selected: unknown[] }): void {\n if (this.isUpdating || !this.options.syncSelection) return;\n\n const sourceChart = this.charts.get(sourceId);\n if (!sourceChart) return;\n\n const selected =\n (event?.selected as { seriesId: string; indices: number[] }[]) ??\n sourceChart.getSelectedPoints?.() ??\n [];\n\n this.isUpdating = true;\n try {\n for (const [chartId, chart] of this.charts.entries()) {\n if (chartId === sourceId) continue;\n if (selected.length === 0) {\n chart.clearSelection?.();\n } else {\n chart.selectPoints?.(selected);\n }\n }\n } finally {\n this.isUpdating = false;\n }\n }\n\n private propagateZoom(sourceId: string, bounds: Partial<Bounds>): void {\n if (this.isUpdating) return;\n this.isUpdating = true;\n try {\n for (const [chartId, chart] of this.charts.entries()) {\n if (chartId === sourceId) continue;\n const zoomOptions: { x?: Range; y?: Range; animate?: boolean } = { animate: false };\n if (bounds.xMin !== undefined && bounds.xMax !== undefined) {\n zoomOptions.x = [bounds.xMin, bounds.xMax];\n }\n if (bounds.yMin !== undefined && bounds.yMax !== undefined) {\n zoomOptions.y = [bounds.yMin, bounds.yMax];\n }\n chart.zoom(zoomOptions);\n }\n } finally {\n this.isUpdating = false;\n }\n }\n\n private propagatePan(sourceId: string, _dx: number, _dy: number): void {\n if (this.isUpdating) return;\n this.isUpdating = true;\n try {\n const sourceChart = this.charts.get(sourceId);\n if (!sourceChart || !this.hasValidViewBounds(sourceChart.getViewBounds())) return;\n\n const masterBounds = sourceChart.getViewBounds();\n\n for (const [chartId, chart] of this.charts.entries()) {\n if (chartId === sourceId) continue;\n\n const zoomOptions: { x?: Range; y?: Range; animate?: boolean } = { animate: false };\n\n if (this.options.axis === 'x' || this.options.axis === 'xy') {\n zoomOptions.x = [masterBounds.xMin, masterBounds.xMax];\n }\n\n if (this.options.axis === 'y' || this.options.axis === 'xy') {\n zoomOptions.y = [masterBounds.yMin, masterBounds.yMax];\n }\n\n if (zoomOptions.x || zoomOptions.y) {\n chart.zoom(zoomOptions);\n }\n }\n } finally {\n this.isUpdating = false;\n }\n }\n\n private scheduleSyncAction(key: string, action: () => void): void {\n if (this.options.debounce > 0) {\n this.debounceAction(key, action);\n return;\n }\n if (this.rafTimers.has(key)) return;\n const rafId = requestAnimationFrame(() => {\n this.rafTimers.delete(key);\n action();\n });\n this.rafTimers.set(key, rafId);\n }\n\n private debounceAction(key: string, action: () => void): void {\n const existingTimer = this.debounceTimers.get(key);\n if (existingTimer) clearTimeout(existingTimer);\n const timerId = window.setTimeout(() => {\n this.debounceTimers.delete(key);\n action();\n }, this.options.debounce);\n this.debounceTimers.set(key, timerId);\n }\n}\n\nexport function createChartGroup(charts: ChartLike[], options?: SyncOptions): ChartGroup {\n const group = new ChartGroup(options);\n group.addAll(...charts);\n return group;\n}\n\nexport function linkCharts(chart1: ChartLike, chart2: ChartLike, options?: SyncOptions): ChartGroup {\n return createChartGroup([chart1, chart2], options);\n}\n\nexport function createMasterSlave(\n master: ChartLike,\n slave: ChartLike,\n axis: SyncAxis = 'x',\n): ChartGroup {\n return createChartGroup([master, slave], {\n axis,\n bidirectional: false,\n masterId: master.getId(),\n syncCursor: true,\n syncZoom: true,\n syncPan: true,\n });\n}\n"],"names":["ChartGroup","options","__publicField","chart","chartId","charts","axis","enabled","partial","bounds","excludeChartId","sharedX","masterId","master","b","fn","prev","_a","timerId","rafId","xSpan","ySpan","handlers","zoomHandler","args","panHandler","hoverHandler","selectionHandler","event","handler","sourceId","sourceChart","dx","dy","_b","_c","selected","zoomOptions","_dx","_dy","masterBounds","key","action","existingTimer","createChartGroup","group","linkCharts","chart1","chart2","createMasterSlave","slave"],"mappings":"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"}
|