@tradecanvas/core 0.8.1 → 0.9.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 (34) hide show
  1. package/README.md +7 -6
  2. package/dist/axis/PriceAxis.d.ts.map +1 -1
  3. package/dist/axis/TimeAxis.d.ts.map +1 -1
  4. package/dist/charts/VolumeProfileRenderer.d.ts +36 -0
  5. package/dist/charts/VolumeProfileRenderer.d.ts.map +1 -0
  6. package/dist/charts/index.d.ts +1 -0
  7. package/dist/charts/index.d.ts.map +1 -1
  8. package/dist/engine/RenderEngine.d.ts +2 -0
  9. package/dist/engine/RenderEngine.d.ts.map +1 -1
  10. package/dist/features/MeasureOverlay.d.ts +27 -0
  11. package/dist/features/MeasureOverlay.d.ts.map +1 -0
  12. package/dist/features/ReplayManager.d.ts +5 -0
  13. package/dist/features/ReplayManager.d.ts.map +1 -1
  14. package/dist/features/index.d.ts +1 -0
  15. package/dist/features/index.d.ts.map +1 -1
  16. package/dist/index.cjs +8 -3
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.js +821 -389
  19. package/dist/index.js.map +1 -1
  20. package/dist/interaction/AxisDragHandler.d.ts +32 -0
  21. package/dist/interaction/AxisDragHandler.d.ts.map +1 -0
  22. package/dist/interaction/CrosshairHandler.d.ts +9 -0
  23. package/dist/interaction/CrosshairHandler.d.ts.map +1 -1
  24. package/dist/interaction/InteractionManager.d.ts +32 -1
  25. package/dist/interaction/InteractionManager.d.ts.map +1 -1
  26. package/dist/interaction/PinnedTooltip.d.ts +39 -0
  27. package/dist/interaction/PinnedTooltip.d.ts.map +1 -0
  28. package/dist/interaction/index.d.ts +2 -0
  29. package/dist/interaction/index.d.ts.map +1 -1
  30. package/dist/ui/SessionBreaks.d.ts +7 -2
  31. package/dist/ui/SessionBreaks.d.ts.map +1 -1
  32. package/dist/viewport/Viewport.d.ts +6 -0
  33. package/dist/viewport/Viewport.d.ts.map +1 -1
  34. package/package.json +2 -2
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Canvas rendering engine, indicators, drawing tools, trading overlays, and real-time streaming for the [@tradecanvas/chart](https://www.npmjs.com/package/@tradecanvas/chart) library.
4
4
 
5
- **[Live Demo](https://bonguynvan.github.io/tradecanvas/)** | **[GitHub](https://github.com/bonguynvan/tradecanvas)** | **[Documentation](https://bonguynvan.github.io/tradecanvas/#getting-started)**
5
+ **[Live Demo](https://bonguynvan.github.io/tradecanvas/)** | **[GitHub](https://github.com/bonguynvan/tradecanvas)** | **[Documentation](https://bonguynvan.github.io/tradecanvas/docs/getting-started/)**
6
6
 
7
7
  ## Install
8
8
 
@@ -30,9 +30,9 @@ Multi-layer canvas rendering for optimal performance -- only dirty layers repain
30
30
  - `RenderLoop` -- requestAnimationFrame loop with dirty tracking
31
31
  - `DPRManager` -- device pixel ratio handling for crisp rendering
32
32
 
33
- ### Chart Renderers (12 types)
33
+ ### Chart Renderers (17 types)
34
34
 
35
- `CandlestickRenderer`, `HollowCandleRenderer`, `BarRenderer`, `LineRenderer`, `AreaRenderer`, `BaselineRenderer`, `RenkoRenderer`, `KagiRenderer`, `PointAndFigureRenderer`, `VolumeRenderer`, `CompareRenderer`. Range bars reuse `CandlestickRenderer` against transformed data.
35
+ `CandlestickRenderer`, `HollowCandleRenderer`, `BarRenderer`, `LineRenderer`, `AreaRenderer`, `BaselineRenderer`, `RenkoRenderer`, `KagiRenderer`, `PointAndFigureRenderer`, `VolumeRenderer`, `VolumeCandleRenderer`, `EquivolumeRenderer`, `HLCAreaRenderer`, `StepLineRenderer`, `LineWithMarkersRenderer`, `CompareRenderer`. Heikin-Ashi, Line Break, and Range Bars reuse `CandlestickRenderer` against transformed data.
36
36
 
37
37
  Data transforms: `toHeikinAshi`, `toRenko`, `toLineBreak`, `toKagi`, `toPointAndFigure`, `toRangeBars`
38
38
 
@@ -60,9 +60,9 @@ const output = await host.calculate('rsi', config, bars)
60
60
 
61
61
  Pass `null` instead of a worker for synchronous fallback (SSR, tests). The shipped `indicator.worker.js` registers all 33 built-in indicators and supports `calculate` and `ping` requests.
62
62
 
63
- ### Drawing Tools (23)
63
+ ### Drawing Tools (24)
64
64
 
65
- Trendline, Horizontal/Vertical Lines, Ray, Extended Line, Parallel Channel, Fibonacci Retracement/Extension, Rectangle, Ellipse, Triangle, Arrow, Pitchfork, Gann Fan/Box, Elliott Wave, Regression Channel, Date/Price Range, Measure, Anchored VWAP, Volume Profile Range, Text Annotation
65
+ Trendline, Horizontal/Vertical Lines, Ray, Extended Line, Parallel Channel, Fibonacci Retracement / Extension / **Time Zones** *(new in 0.8)*, Rectangle, Ellipse, Triangle, Arrow, Pitchfork, Gann Fan/Box, Elliott Wave, Regression Channel, Date/Price Range, Measure, Anchored VWAP, Volume Profile Range, Text Annotation
66
66
 
67
67
  All tools support magnet snapping, undo/redo, and serialization. Extensible via `DrawingBase`.
68
68
 
@@ -90,7 +90,8 @@ All tools support magnet snapping, undo/redo, and serialization. Extensible via
90
90
  ### Features
91
91
 
92
92
  - `AlertManager` -- price and indicator alerts
93
- - `ReplayManager` -- bar-by-bar historical replay
93
+ - `ReplayManager` -- bar-by-bar historical replay (Chart-tied)
94
+ - `ReplayController` *(new in 0.8)* -- headless replay decoupled from Chart; powers backtest visualization
94
95
  - `ChartStateManager` -- save/load chart state as JSON
95
96
  - `UndoRedoManager` -- undo/redo for drawings
96
97
  - `DataExporter` -- export visible/all data as CSV or JSON
@@ -1 +1 @@
1
- {"version":3,"file":"PriceAxis.d.ts","sourceRoot":"","sources":["../../src/axis/PriceAxis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAGjE,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAW;IAEzB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;CA4CnF"}
1
+ {"version":3,"file":"PriceAxis.d.ts","sourceRoot":"","sources":["../../src/axis/PriceAxis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAGjE,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAW;IAEzB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;CAsDnF"}
@@ -1 +1 @@
1
- {"version":3,"file":"TimeAxis.d.ts","sourceRoot":"","sources":["../../src/axis/TimeAxis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAW7E,qBAAa,QAAQ;IACnB,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;CA8D7H"}
1
+ {"version":3,"file":"TimeAxis.d.ts","sourceRoot":"","sources":["../../src/axis/TimeAxis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAW7E,qBAAa,QAAQ;IACnB,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;CAkE7H"}
@@ -0,0 +1,36 @@
1
+ import { DataSeries, ViewportState, Theme } from '@tradecanvas/commons';
2
+ /**
3
+ * Volume Profile — horizontal histogram of traded volume bucketed by price.
4
+ *
5
+ * Distributes each bar's volume across the price range it covered (low → high)
6
+ * using a simple uniform distribution. The result is a side histogram pinned
7
+ * to the right edge of the chart that shows where the market spent the most
8
+ * volume — the "value area" and "point of control" come from this shape.
9
+ *
10
+ * Tradeoffs (intentional):
11
+ * - Uniform low→high allocation, not VWAP-weighted. Cheaper to compute and
12
+ * close enough for visual reading at chart-zoom scales.
13
+ * - Buckets are computed against the *visible price range*, so the profile
14
+ * rebins on pan/zoom — what you see is always relative to the current
15
+ * viewport.
16
+ * - No look-ahead: only bars currently inside `visibleRange` contribute.
17
+ */
18
+ export declare class VolumeProfileRenderer {
19
+ private visible;
20
+ /** Number of horizontal buckets the visible price range is split into. */
21
+ private buckets;
22
+ /** Profile width as a fraction of chart width. 0.18 ≈ 18%. */
23
+ private widthRatio;
24
+ /** Opacity of the histogram bars. */
25
+ private opacity;
26
+ /** Highlight the highest-volume bucket (point of control). */
27
+ private highlightPoC;
28
+ setVisible(v: boolean): void;
29
+ isVisible(): boolean;
30
+ setBuckets(n: number): void;
31
+ setWidthRatio(r: number): void;
32
+ setOpacity(o: number): void;
33
+ setHighlightPoC(enabled: boolean): void;
34
+ render(ctx: CanvasRenderingContext2D, data: DataSeries, viewport: ViewportState, theme: Theme): void;
35
+ }
36
+ //# sourceMappingURL=VolumeProfileRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VolumeProfileRenderer.d.ts","sourceRoot":"","sources":["../../src/charts/VolumeProfileRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7E;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,OAAO,CAAS;IACxB,0EAA0E;IAC1E,OAAO,CAAC,OAAO,CAAM;IACrB,8DAA8D;IAC9D,OAAO,CAAC,UAAU,CAAQ;IAC1B,qCAAqC;IACrC,OAAO,CAAC,OAAO,CAAQ;IACvB,8DAA8D;IAC9D,OAAO,CAAC,YAAY,CAAQ;IAE5B,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI;IAC5B,SAAS,IAAI,OAAO;IACpB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAC3B,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAC9B,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAC3B,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAEvC,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;CAgGrG"}
@@ -14,6 +14,7 @@ export { HLCAreaRenderer } from './HLCAreaRenderer.js';
14
14
  export { StepLineRenderer } from './StepLineRenderer.js';
15
15
  export { LineWithMarkersRenderer } from './LineWithMarkersRenderer.js';
16
16
  export { VolumeRenderer } from './VolumeRenderer.js';
17
+ export { VolumeProfileRenderer } from './VolumeProfileRenderer.js';
17
18
  export { CompareRenderer } from './CompareRenderer.js';
18
19
  export type { CompareSymbol } from './CompareRenderer.js';
19
20
  export * from './transforms/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/charts/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/charts/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,cAAc,uBAAuB,CAAC"}
@@ -37,12 +37,14 @@ export interface RenderContext {
37
37
  currentPriceLine: CurrentPriceLine | null;
38
38
  chartLegend: ChartLegend | null;
39
39
  volumeRenderer: VolumeRenderer | null;
40
+ volumeProfile: import('../charts/VolumeProfileRenderer.js').VolumeProfileRenderer | null;
40
41
  watermark: Watermark | null;
41
42
  barCountdown: BarCountdown | null;
42
43
  sessionBreaks: SessionBreaks | null;
43
44
  compareRenderer: CompareRenderer | null;
44
45
  alertManager: AlertManager | null;
45
46
  signalMarkerManager: SignalMarkerManager | null;
47
+ measureOverlay: import('../features/MeasureOverlay.js').MeasureOverlay | null;
46
48
  tradeZoneManager: TradeZoneManager | null;
47
49
  panels: PanelRenderInfo[];
48
50
  priceLimits?: {
@@ -1 +1 @@
1
- {"version":3,"file":"RenderEngine.d.ts","sourceRoot":"","sources":["../../src/engine/RenderEngine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RenderEngine.d.ts","sourceRoot":"","sources":["../../src/engine/RenderEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { Point, ViewportState, Theme, DataSeries } from '@tradecanvas/commons';
2
+ /**
3
+ * Transient "measure" overlay (TradingView shift-drag ruler).
4
+ *
5
+ * The tool is owned by the chart but lives outside the persistent drawing
6
+ * system on purpose: it is reset on every mouseup so it never clutters saved
7
+ * state, and it doesn't participate in undo/redo.
8
+ *
9
+ * Coordinates are stored in data space (bar index + price) so the overlay
10
+ * tracks the data correctly during pan/zoom while the user is still holding
11
+ * shift.
12
+ */
13
+ export declare class MeasureOverlay {
14
+ private active;
15
+ private startBar;
16
+ private startPrice;
17
+ private endBar;
18
+ private endPrice;
19
+ private startTime;
20
+ private endTime;
21
+ isActive(): boolean;
22
+ begin(pos: Point, viewport: ViewportState, data: DataSeries): void;
23
+ update(pos: Point, viewport: ViewportState, data: DataSeries): void;
24
+ end(): void;
25
+ render(ctx: CanvasRenderingContext2D, viewport: ViewportState, theme: Theme): void;
26
+ }
27
+ //# sourceMappingURL=MeasureOverlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MeasureOverlay.d.ts","sourceRoot":"","sources":["../../src/features/MeasureOverlay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGpF;;;;;;;;;;GAUG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,OAAO,CAAuB;IAEtC,QAAQ,IAAI,OAAO;IAInB,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI;IAYlE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI;IAQnE,GAAG,IAAI,IAAI;IAIX,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;CA6DnF"}
@@ -30,6 +30,11 @@ export declare class ReplayManager extends Emitter<ReplayEvents> {
30
30
  pause(): void;
31
31
  resume(): void;
32
32
  stop(): void;
33
+ /**
34
+ * Jump to a specific bar. Emits `bar` synchronously so chart consumers can
35
+ * re-render the slice — without this, seeking while paused leaves the chart
36
+ * stuck on whichever bar last fired through the timer.
37
+ */
33
38
  seekTo(index: number): void;
34
39
  setSpeed(speed: number): void;
35
40
  getState(): 'playing' | 'paused' | 'stopped';
@@ -1 +1 @@
1
- {"version":3,"file":"ReplayManager.d.ts","sourceRoot":"","sources":["../../src/features/ReplayManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,YAAY;IACpB,GAAG,EAAE;QAAE,GAAG,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,QAAQ,EAAE,IAAI,CAAC;IACf,WAAW,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC9C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,aAAc,SAAQ,OAAO,CAAC,YAAY,CAAC;IACtD,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,MAAM,CAA6C;IAE3D,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAM5B,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;IAqB1C,KAAK,IAAI,IAAI;IASb,MAAM,IAAI,IAAI;IAMd,IAAI,IAAI,IAAI;IAUZ,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI3B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ7B,QAAQ,IAAI,SAAS,GAAG,QAAQ,GAAG,SAAS;IAI5C,WAAW,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAQlE,OAAO,IAAI,IAAI;CAKhB"}
1
+ {"version":3,"file":"ReplayManager.d.ts","sourceRoot":"","sources":["../../src/features/ReplayManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,YAAY;IACpB,GAAG,EAAE;QAAE,GAAG,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,QAAQ,EAAE,IAAI,CAAC;IACf,WAAW,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC9C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,aAAc,SAAQ,OAAO,CAAC,YAAY,CAAC;IACtD,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,MAAM,CAA6C;IAE3D,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAM5B,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;IAqB1C,KAAK,IAAI,IAAI;IASb,MAAM,IAAI,IAAI;IAMd,IAAI,IAAI,IAAI;IAUZ;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ3B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ7B,QAAQ,IAAI,SAAS,GAAG,QAAQ,GAAG,SAAS;IAI5C,WAAW,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAQlE,OAAO,IAAI,IAAI;CAKhB"}
@@ -9,4 +9,5 @@ export type { UndoableAction } from './UndoRedoManager.js';
9
9
  export { DataExporter } from './DataExporter.js';
10
10
  export { SignalMarkerManager } from './SignalMarkerManager.js';
11
11
  export { TradeZoneManager } from './TradeZoneManager.js';
12
+ export { MeasureOverlay } from './MeasureOverlay.js';
12
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/features/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/features/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}