@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.
- package/README.md +7 -6
- package/dist/axis/PriceAxis.d.ts.map +1 -1
- package/dist/axis/TimeAxis.d.ts.map +1 -1
- package/dist/charts/VolumeProfileRenderer.d.ts +36 -0
- package/dist/charts/VolumeProfileRenderer.d.ts.map +1 -0
- package/dist/charts/index.d.ts +1 -0
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/engine/RenderEngine.d.ts +2 -0
- package/dist/engine/RenderEngine.d.ts.map +1 -1
- package/dist/features/MeasureOverlay.d.ts +27 -0
- package/dist/features/MeasureOverlay.d.ts.map +1 -0
- package/dist/features/ReplayManager.d.ts +5 -0
- package/dist/features/ReplayManager.d.ts.map +1 -1
- package/dist/features/index.d.ts +1 -0
- package/dist/features/index.d.ts.map +1 -1
- package/dist/index.cjs +8 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +821 -389
- package/dist/index.js.map +1 -1
- package/dist/interaction/AxisDragHandler.d.ts +32 -0
- package/dist/interaction/AxisDragHandler.d.ts.map +1 -0
- package/dist/interaction/CrosshairHandler.d.ts +9 -0
- package/dist/interaction/CrosshairHandler.d.ts.map +1 -1
- package/dist/interaction/InteractionManager.d.ts +32 -1
- package/dist/interaction/InteractionManager.d.ts.map +1 -1
- package/dist/interaction/PinnedTooltip.d.ts +39 -0
- package/dist/interaction/PinnedTooltip.d.ts.map +1 -0
- package/dist/interaction/index.d.ts +2 -0
- package/dist/interaction/index.d.ts.map +1 -1
- package/dist/ui/SessionBreaks.d.ts +7 -2
- package/dist/ui/SessionBreaks.d.ts.map +1 -1
- package/dist/viewport/Viewport.d.ts +6 -0
- package/dist/viewport/Viewport.d.ts.map +1 -1
- 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,
|
|
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
|
-
*
|
|
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
|
|
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.
|
|
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.
|
|
37
|
+
"@tradecanvas/commons": "0.9.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"vitest": "^2.1.8"
|