@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
@@ -0,0 +1,32 @@
1
+ import { Point } from '@tradecanvas/commons';
2
+ export type AxisScaleCallback = (factor: number) => void;
3
+ export type AxisResetCallback = () => void;
4
+ /**
5
+ * Drag-to-scale handler for price + time axes (TradingView style).
6
+ *
7
+ * Price axis: drag down compresses (factor > 1, expand price range);
8
+ * drag up expands (factor < 1, compress price range).
9
+ * Time axis: drag right compresses (zoom out);
10
+ * drag left expands (zoom in).
11
+ *
12
+ * Sensitivity is logarithmic so the gesture feels natural and stays bounded
13
+ * regardless of drag distance. A small drag threshold (~3px) avoids treating
14
+ * stray clicks as drags so `dblclick` keeps working for axis reset.
15
+ */
16
+ export declare class AxisDragHandler {
17
+ private onPriceScale;
18
+ private onTimeScale;
19
+ private dragging;
20
+ private axis;
21
+ private startPos;
22
+ private lastPos;
23
+ private moved;
24
+ private readonly threshold;
25
+ private readonly sensitivity;
26
+ constructor(onPriceScale: AxisScaleCallback, onTimeScale: AxisScaleCallback);
27
+ begin(axis: 'price' | 'time', pos: Point): void;
28
+ move(pos: Point): boolean;
29
+ end(): boolean;
30
+ isActive(): boolean;
31
+ }
32
+ //# sourceMappingURL=AxisDragHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AxisDragHandler.d.ts","sourceRoot":"","sources":["../../src/interaction/AxisDragHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AACzD,MAAM,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC;AAE3C;;;;;;;;;;;GAWG;AACH,qBAAa,eAAe;IAUxB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,WAAW;IAVrB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAAiC;IAC7C,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAK;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAG3B,YAAY,EAAE,iBAAiB,EAC/B,WAAW,EAAE,iBAAiB;IAGxC,KAAK,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI;IAQ/C,IAAI,CAAC,GAAG,EAAE,KAAK,GAAG,OAAO;IAwBzB,GAAG,IAAI,OAAO;IAQd,QAAQ,IAAI,OAAO;CAGpB"}
@@ -24,6 +24,15 @@ export declare class CrosshairHandler {
24
24
  onPointerMove(pos: Point): void;
25
25
  onPointerLeave(): void;
26
26
  render(ctx: CanvasRenderingContext2D, viewport: ViewportState, theme: Theme): void;
27
+ /**
28
+ * Render the axis hover labels — price pill on the right, time pill on the
29
+ * bottom. Called on the UI pass (after the axes) so the badges always sit
30
+ * on top of the static axis labels. TradingView-style with a small notch.
31
+ *
32
+ * `timeAxisY` lets the host place the bottom label at the actual time axis
33
+ * baseline (which moves when bottom panels are open).
34
+ */
35
+ renderAxisLabels(ctx: CanvasRenderingContext2D, viewport: ViewportState, theme: Theme, data: DataSeries, timeAxisY?: number): void;
27
36
  /** Fire callback outside of render frame via microtask */
28
37
  private scheduleCallback;
29
38
  private flushCallback;
@@ -1 +1 @@
1
- {"version":3,"file":"CrosshairHandler.d.ts","sourceRoot":"","sources":["../../src/interaction/CrosshairHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIpF,MAAM,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC;AAEvF,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3D,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,IAAI,CAA2B;IACvC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,MAAM,CAAW;IAGzB,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,oBAAoB,CAAM;IAElC,WAAW,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI;IAIxC,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAI/B,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKrC,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAKlC,OAAO,IAAI,aAAa;IAIxB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI1C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,WAAW,IAAI,KAAK,GAAG,IAAI;IAI3B,aAAa,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI;IAI/B,cAAc,IAAI,IAAI;IAQtB,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAqDlF,0DAA0D;IAC1D,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,aAAa;CAGtB"}
1
+ {"version":3,"file":"CrosshairHandler.d.ts","sourceRoot":"","sources":["../../src/interaction/CrosshairHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIpF,MAAM,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC;AAEvF,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3D,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,IAAI,CAA2B;IACvC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,MAAM,CAAW;IAGzB,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,oBAAoB,CAAM;IAElC,WAAW,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI;IAIxC,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAI/B,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKrC,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAKlC,OAAO,IAAI,aAAa;IAIxB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI1C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,WAAW,IAAI,KAAK,GAAG,IAAI;IAI3B,aAAa,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI;IAI/B,cAAc,IAAI,IAAI;IAQtB,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAqDlF;;;;;;;OAOG;IACH,gBAAgB,CACd,GAAG,EAAE,wBAAwB,EAC7B,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,UAAU,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI;IA6CP,0DAA0D;IAC1D,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,aAAa;CAGtB"}
@@ -1,7 +1,8 @@
1
- import { ViewportState } from '@tradecanvas/commons';
1
+ import { Point, ViewportState } from '@tradecanvas/commons';
2
2
  import { PanHandler } from './PanHandler.js';
3
3
  import { ZoomHandler } from './ZoomHandler.js';
4
4
  import { CrosshairHandler } from './CrosshairHandler.js';
5
+ import { AxisDragHandler } from './AxisDragHandler.js';
5
6
  import { DrawingManager } from '../drawings/DrawingManager.js';
6
7
  import { TradingManager } from '../trading/TradingManager.js';
7
8
  export declare class InteractionManager {
@@ -9,6 +10,13 @@ export declare class InteractionManager {
9
10
  private panHandler;
10
11
  private zoomHandler;
11
12
  private crosshairHandler;
13
+ private axisDragHandler;
14
+ private axisViewportGetter;
15
+ private onAxisDoubleClick;
16
+ private measureHandlers;
17
+ private measuring;
18
+ private onAltClick;
19
+ private onEscape;
12
20
  private drawingManager;
13
21
  private tradingManager;
14
22
  private viewportGetter;
@@ -23,6 +31,29 @@ export declare class InteractionManager {
23
31
  setPanHandler(handler: PanHandler): void;
24
32
  setZoomHandler(handler: ZoomHandler): void;
25
33
  setCrosshairHandler(handler: CrosshairHandler): void;
34
+ /**
35
+ * Enable drag-to-scale on the price + time axis regions. The viewport getter
36
+ * lets us hit-test the chartRect on every pointer event (cheap), so this
37
+ * picks up panel/layout changes for free.
38
+ */
39
+ /**
40
+ * Shift-drag measure tool. The handlers are simple position callbacks; the
41
+ * Chart converts pos → bar index + price internally.
42
+ */
43
+ /**
44
+ * Alt/Option+click on the chart area. Used by the pinned-tooltip feature
45
+ * so the gesture doesn't collide with drawing tools (plain click) or with
46
+ * the trading context menu (right-click).
47
+ */
48
+ setAltClickHandler(handler: (pos: Point) => void): void;
49
+ /** Wire an `Escape` keydown to the host — used to unpin tooltips, etc. */
50
+ setEscapeHandler(handler: () => void): void;
51
+ setMeasureHandlers(handlers: {
52
+ begin: (pos: Point) => void;
53
+ move: (pos: Point) => void;
54
+ end: () => void;
55
+ }): void;
56
+ setAxisDragHandler(handler: AxisDragHandler, viewportGetter: () => ViewportState, onDoubleClick?: (axis: 'price' | 'time') => void): void;
26
57
  setDrawingManager(manager: DrawingManager, viewportGetter: () => ViewportState): void;
27
58
  setTradingManager(manager: TradingManager, viewportGetter: () => ViewportState): void;
28
59
  attach(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"InteractionManager.d.ts","sourceRoot":"","sources":["../../src/interaction/InteractionManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,qBAAa,kBAAkB;IAmBjB,OAAO,CAAC,OAAO;IAlB3B,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,cAAc,CAAsC;IAC5D,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,aAAa,CAAsB;IAG3C,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,WAAW,CAAS;IAI5B,OAAO,CAAC,UAAU,CAAwB;gBAEtB,OAAO,EAAE,WAAW;IAExC,uBAAuB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAE7C,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IACxC,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAC1C,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAEpD,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,GAAG,IAAI;IAKrF,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,GAAG,IAAI;IAKrF,MAAM,IAAI,IAAI;IAiKd,MAAM,IAAI,IAAI;IAMd,mEAAmE;IACnE,cAAc,IAAI,IAAI;IAItB,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,gBAAgB;CAOzB"}
1
+ {"version":3,"file":"InteractionManager.d.ts","sourceRoot":"","sources":["../../src/interaction/InteractionManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,qBAAa,kBAAkB;IA8BjB,OAAO,CAAC,OAAO;IA7B3B,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,kBAAkB,CAAsC;IAChE,OAAO,CAAC,iBAAiB,CAAmD;IAC5E,OAAO,CAAC,eAAe,CAIP;IAChB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,cAAc,CAAsC;IAC5D,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,aAAa,CAAsB;IAG3C,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,WAAW,CAAS;IAI5B,OAAO,CAAC,UAAU,CAAwB;gBAEtB,OAAO,EAAE,WAAW;IAExC,uBAAuB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAE7C,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IACxC,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAC1C,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAEpD;;;;OAIG;IACH;;;OAGG;IACH;;;;OAIG;IACH,kBAAkB,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAIvD,0EAA0E;IAC1E,gBAAgB,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAI3C,kBAAkB,CAAC,QAAQ,EAAE;QAC3B,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;QAC5B,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;QAC3B,GAAG,EAAE,MAAM,IAAI,CAAC;KACjB,GAAG,IAAI;IAIR,kBAAkB,CAChB,OAAO,EAAE,eAAe,EACxB,cAAc,EAAE,MAAM,aAAa,EACnC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,GAC/C,IAAI;IAMP,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,GAAG,IAAI;IAKrF,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,GAAG,IAAI;IAKrF,MAAM,IAAI,IAAI;IAsPd,MAAM,IAAI,IAAI;IAMd,mEAAmE;IACnE,cAAc,IAAI,IAAI;IAItB,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,gBAAgB;CAOzB"}
@@ -0,0 +1,39 @@
1
+ import { OHLCBar, Theme, ViewportState } from '@tradecanvas/commons';
2
+ /**
3
+ * Pinned OHLC tooltip — a second DOM tooltip anchored to a specific bar index.
4
+ *
5
+ * Designed to work alongside the live `CrosshairTooltip`: user pins bar A
6
+ * (Alt+click), then hovers bar B → the live tooltip shows bar B, the pinned
7
+ * tooltip stays on bar A, and the delta strip on the pinned tooltip shows
8
+ * price / time / bar-count differences between the two.
9
+ *
10
+ * Implementation notes:
11
+ * - DOM rather than canvas so the same styling pipeline as the live
12
+ * tooltip is reused (and text remains selectable for screen readers).
13
+ * - Positioning is driven externally via `reposition()` so the Chart can
14
+ * batch it inside its sync loop instead of paying for a per-frame DOM
15
+ * read.
16
+ * - Uses `transform: translate(...)` for repositioning to stay on the
17
+ * compositor layer.
18
+ */
19
+ export declare class PinnedTooltip {
20
+ private el;
21
+ private deltaEl;
22
+ private timeEl;
23
+ private ohlcEl;
24
+ private pinnedBar;
25
+ private pinnedIndex;
26
+ create(container: HTMLElement): void;
27
+ pin(bar: OHLCBar, barIndex: number, theme: Theme): void;
28
+ unpin(): void;
29
+ isPinned(): boolean;
30
+ getPinnedIndex(): number;
31
+ /**
32
+ * Reposition the tooltip at the pinned bar's screen X, and refresh the
33
+ * delta strip against the bar currently under the crosshair. Called by
34
+ * the Chart on every viewport sync (cheap — only DOM writes).
35
+ */
36
+ reposition(viewport: ViewportState, hoverBar: OHLCBar | null, hoverIndex: number | null, theme: Theme): void;
37
+ destroy(): void;
38
+ }
39
+ //# sourceMappingURL=PinnedTooltip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PinnedTooltip.d.ts","sourceRoot":"","sources":["../../src/interaction/PinnedTooltip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1E;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAA4B;IACtC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,WAAW,CAAM;IAEzB,MAAM,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;IA4CpC,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IA+BvD,KAAK,IAAI,IAAI;IAMb,QAAQ,IAAI,OAAO;IAInB,cAAc,IAAI,MAAM;IAIxB;;;;OAIG;IACH,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAiC5G,OAAO,IAAI,IAAI;CAShB"}
@@ -1,8 +1,10 @@
1
1
  export { InteractionManager } from './InteractionManager.js';
2
2
  export { PanHandler } from './PanHandler.js';
3
3
  export { ZoomHandler } from './ZoomHandler.js';
4
+ export { AxisDragHandler } from './AxisDragHandler.js';
4
5
  export { CrosshairHandler } from './CrosshairHandler.js';
5
6
  export type { CrosshairMode } from './CrosshairHandler.js';
6
7
  export { KeyboardHandler } from './KeyboardHandler.js';
7
8
  export { CrosshairTooltip } from './CrosshairTooltip.js';
9
+ export { PinnedTooltip } from './PinnedTooltip.js';
8
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interaction/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interaction/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
@@ -21,14 +21,19 @@ export interface SessionBreakConfig {
21
21
  export declare class SessionBreaks {
22
22
  private config;
23
23
  private cachedBreaks;
24
+ private cachedBreaksTyped;
24
25
  private lastDataLength;
25
26
  setConfig(config: Partial<SessionBreakConfig>): void;
26
27
  isVisible(): boolean;
27
28
  setVisible(visible: boolean): void;
28
29
  /**
29
- * Find bar indices where a new trading day begins.
30
- * Uses date change detection from bar timestamps.
30
+ * Find bar indices where a new trading day begins. Each entry also carries
31
+ * the strength of the break: 'day' < 'week' < 'month' < 'year'. Renderer
32
+ * uses this to draw progressively heavier separators + labels.
31
33
  */
34
+ private computeBreaksTyped;
35
+ private toMs;
36
+ /** Legacy (kept for compatibility) — returns just the indices. */
32
37
  private computeBreaks;
33
38
  /** Get a day key from a timestamp (seconds or milliseconds) */
34
39
  private getDayKey;
@@ -1 +1 @@
1
- {"version":3,"file":"SessionBreaks.d.ts","sourceRoot":"","sources":["../../src/ui/SessionBreaks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAG7E,MAAM,WAAW,kBAAkB;IACjC,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,2FAA2F;IAC3F,YAAY,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,cAAc,CAAK;IAE3B,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,IAAI;IAIpD,SAAS,IAAI,OAAO;IAIpB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC;;;OAGG;IACH,OAAO,CAAC,aAAa;IAwBrB,+DAA+D;IAC/D,OAAO,CAAC,SAAS;IAOjB,MAAM,CACJ,GAAG,EAAE,wBAAwB,EAC7B,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,UAAU,GACf,IAAI;IAqCP,yCAAyC;IACzC,eAAe,IAAI,IAAI;CAIxB"}
1
+ {"version":3,"file":"SessionBreaks.d.ts","sourceRoot":"","sources":["../../src/ui/SessionBreaks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAG7E,MAAM,WAAW,kBAAkB;IACjC,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,2FAA2F;IAC3F,YAAY,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,iBAAiB,CAA8E;IACvG,OAAO,CAAC,cAAc,CAAK;IAE3B,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,IAAI;IAIpD,SAAS,IAAI,OAAO;IAIpB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IA+B1B,OAAO,CAAC,IAAI;IAIZ,kEAAkE;IAClE,OAAO,CAAC,aAAa;IAIrB,+DAA+D;IAC/D,OAAO,CAAC,SAAS;IAOjB,MAAM,CACJ,GAAG,EAAE,wBAAwB,EAC7B,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,UAAU,GACf,IAAI;IAqEP,yCAAyC;IACzC,eAAe,IAAI,IAAI;CAKxB"}
@@ -16,6 +16,12 @@ export declare class Viewport {
16
16
  setChartRect(rect: Rect): void;
17
17
  updateData(data: DataSeries, autoScale: boolean): void;
18
18
  setPriceRange(min: number, max: number): void;
19
+ /**
20
+ * Multiply the visible price range by `factor` around its midpoint.
21
+ * `factor > 1` expands (zooms out vertically), `< 1` compresses.
22
+ * Used by drag-on-price-axis scaling.
23
+ */
24
+ scalePriceRange(factor: number): void;
19
25
  scrollBy(deltaPixels: number): void;
20
26
  /** Returns true if the viewport is scrolled to show the latest bars. */
21
27
  isAtEnd(): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"Viewport.d.ts","sourceRoot":"","sources":["../../src/viewport/Viewport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAI5E,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAS;gBAG9B,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,EACvB,WAAW,SAAI,EACf,WAAW,SAAK,EAChB,eAAe,SAAI;IAgBrB,0DAA0D;IAC1D,QAAQ,IAAI,aAAa;IAYzB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAInC,UAAU,IAAI,OAAO;IAIrB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIlC,OAAO,CAAC,gBAAgB;IASxB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAK3C,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAW9B,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI;IAiBtD,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7C,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAMnC,wEAAwE;IACxE,OAAO,IAAI,OAAO;IAUlB,WAAW,IAAI,IAAI;IAYnB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAoB1C,OAAO,CAAC,WAAW;IA+BnB,OAAO,CAAC,kBAAkB;CAQ3B"}
1
+ {"version":3,"file":"Viewport.d.ts","sourceRoot":"","sources":["../../src/viewport/Viewport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAI5E,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAS;gBAG9B,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,EACvB,WAAW,SAAI,EACf,WAAW,SAAK,EAChB,eAAe,SAAI;IAgBrB,0DAA0D;IAC1D,QAAQ,IAAI,aAAa;IAYzB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAInC,UAAU,IAAI,OAAO;IAIrB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIlC,OAAO,CAAC,gBAAgB;IASxB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAK3C,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAW9B,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI;IAiBtD,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7C;;;;OAIG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IASrC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAMnC,wEAAwE;IACxE,OAAO,IAAI,OAAO;IAUlB,WAAW,IAAI,IAAI;IAYnB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAoB1C,OAAO,CAAC,WAAW;IA+BnB,OAAO,CAAC,kBAAkB;CAQ3B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tradecanvas/core",
3
- "version": "0.8.1",
3
+ "version": "0.9.0",
4
4
  "type": "module",
5
5
  "description": "Canvas rendering engine for @tradecanvas/chart",
6
6
  "license": "MIT",
@@ -34,7 +34,7 @@
34
34
  "README.md"
35
35
  ],
36
36
  "dependencies": {
37
- "@tradecanvas/commons": "0.8.1"
37
+ "@tradecanvas/commons": "0.9.0"
38
38
  },
39
39
  "devDependencies": {
40
40
  "vitest": "^2.1.8"