@forgecharts/sdk 1.5.69 → 1.5.70
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/dist/core/Chart.d.ts +2 -0
- package/dist/core/Chart.d.ts.map +1 -1
- package/dist/core/__tests__/cursorTime.test.d.ts +2 -0
- package/dist/core/__tests__/cursorTime.test.d.ts.map +1 -0
- package/dist/core/cursorTime.d.ts +27 -0
- package/dist/core/cursorTime.d.ts.map +1 -0
- package/dist/index.js +77 -16
- package/dist/index.js.map +1 -1
- package/dist/internal.js +77 -16
- package/dist/internal.js.map +1 -1
- package/dist/pixi/PixiChart.d.ts +2 -0
- package/dist/pixi/PixiChart.d.ts.map +1 -1
- package/dist/pixi/PixiCrosshairRenderer.d.ts +9 -1
- package/dist/pixi/PixiCrosshairRenderer.d.ts.map +1 -1
- package/dist/react/index.js +77 -16
- package/dist/react/index.js.map +1 -1
- package/dist/react/internal.js +77 -16
- package/dist/react/internal.js.map +1 -1
- package/package.json +1 -1
package/dist/pixi/PixiChart.d.ts
CHANGED
|
@@ -149,6 +149,8 @@ export declare class PixiChart implements ChartBackend {
|
|
|
149
149
|
setCrosshairEnabled(enabled: boolean): void;
|
|
150
150
|
setMagnetMode(mode: import('@forgecharts/types').MagnetMode): void;
|
|
151
151
|
setNativeCursorHidden(hidden: boolean): void;
|
|
152
|
+
/** Bucket time for a cursor x — see core/cursorTime.ts for the rule. */
|
|
153
|
+
private _cursorBucketTime;
|
|
152
154
|
snapXToBar(x: number): {
|
|
153
155
|
x: number;
|
|
154
156
|
time: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PixiChart.d.ts","sourceRoot":"","sources":["../../src/pixi/PixiChart.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PixiChart.d.ts","sourceRoot":"","sources":["../../src/pixi/PixiChart.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,15 @@ export declare class PixiCrosshairRenderer {
|
|
|
20
20
|
/** IANA timezone for the time label. Falls back to UTC. */
|
|
21
21
|
timezone: string;
|
|
22
22
|
constructor(layer: Container, _colors: ChartColors);
|
|
23
|
-
|
|
23
|
+
/**
|
|
24
|
+
* The time the chart computed for this cursor position — nearest bar, else
|
|
25
|
+
* floored to the timeframe grid. This renderer must never derive its own:
|
|
26
|
+
* it once did (raw xToTime), and every pointer style's time label showed
|
|
27
|
+
* interpolated minute noise (10:02 on an hourly chart) on any timeframe
|
|
28
|
+
* wider than the interpolation error.
|
|
29
|
+
*/
|
|
30
|
+
private _snapTime;
|
|
31
|
+
update(x: number, y: number, snapTime?: number): void;
|
|
24
32
|
hide(): void;
|
|
25
33
|
draw(transform: CoordTransform): void;
|
|
26
34
|
/** Optional price precision override (decimal count). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PixiCrosshairRenderer.d.ts","sourceRoot":"","sources":["../../src/pixi/PixiCrosshairRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAmB,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAM7D;;;;;;GAMG;AACH,qBAAa,qBAAqB;IAe9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAd1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAO;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAO;IAElC,OAAO,CAAC,EAAE,CAAuB;IACjC,OAAO,CAAC,EAAE,CAAuB;IAEjC,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAQ;IACxB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAS;gBAGvB,KAAK,EAAE,SAAS,EACC,OAAO,EAAE,WAAW;IAevC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"PixiCrosshairRenderer.d.ts","sourceRoot":"","sources":["../../src/pixi/PixiCrosshairRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAmB,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAM7D;;;;;;GAMG;AACH,qBAAa,qBAAqB;IAe9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAd1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAO;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAO;IAElC,OAAO,CAAC,EAAE,CAAuB;IACjC,OAAO,CAAC,EAAE,CAAuB;IAEjC,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAQ;IACxB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAS;gBAGvB,KAAK,EAAE,SAAS,EACC,OAAO,EAAE,WAAW;IAevC;;;;;;OAMG;IACH,OAAO,CAAC,SAAS,CAAuB;IAExC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAMrD,IAAI,IAAI,IAAI;IAKZ,IAAI,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI;IAyErC,yDAAyD;IACzD,cAAc,EAAE,MAAM,GAAG,SAAS,CAAa;IAE/C,OAAO,CAAC,YAAY;IAKpB,OAAO,IAAI,IAAI;IAMf,gDAAgD;IAChD,OAAO,CAAC,SAAS,CAAsM;IAEvN,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,WAAW;IAoBnB,wEAAwE;IACxE,OAAO,CAAC,YAAY;IAWpB,0EAA0E;IAC1E,OAAO,CAAC,YAAY;CAUrB"}
|
package/dist/react/index.js
CHANGED
|
@@ -102,6 +102,36 @@ function isGLBXDailyBreak(nowMs = Date.now()) {
|
|
|
102
102
|
return weekday === "Mon" || weekday === "Tue" || weekday === "Wed" || weekday === "Thu";
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
+
// src/core/cursorTime.ts
|
|
106
|
+
function cursorBucketTime(bars, transform, interval, x) {
|
|
107
|
+
const raw = transform.xToTime(x);
|
|
108
|
+
const tfSec = parseTfSeconds(interval) ?? 0;
|
|
109
|
+
const floored = tfSec > 0 ? Math.floor(raw / tfSec) * tfSec : raw;
|
|
110
|
+
if (!bars || bars.length === 0) return floored;
|
|
111
|
+
let lo = 0, hi = bars.length - 1;
|
|
112
|
+
while (lo < hi) {
|
|
113
|
+
const mid = lo + hi >>> 1;
|
|
114
|
+
if (bars[mid].time < raw) lo = mid + 1;
|
|
115
|
+
else hi = mid;
|
|
116
|
+
}
|
|
117
|
+
let nearest = lo;
|
|
118
|
+
let best = Math.abs(transform.timeToX(bars[lo].time) - x);
|
|
119
|
+
for (const i of [lo - 1, lo + 1]) {
|
|
120
|
+
if (i < 0 || i >= bars.length) continue;
|
|
121
|
+
const d = Math.abs(transform.timeToX(bars[i].time) - x);
|
|
122
|
+
if (d < best) {
|
|
123
|
+
best = d;
|
|
124
|
+
nearest = i;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const first = bars[0].time;
|
|
128
|
+
const last = bars[bars.length - 1].time;
|
|
129
|
+
const halfCol = bars.length > 1 ? Math.abs(transform.timeToX(bars[1].time) - transform.timeToX(first)) / 2 : Infinity;
|
|
130
|
+
const edgeX = raw > last ? transform.timeToX(last) : raw < first ? transform.timeToX(first) : null;
|
|
131
|
+
if (edgeX !== null && Math.abs(x - edgeX) > halfCol) return floored;
|
|
132
|
+
return bars[nearest].time;
|
|
133
|
+
}
|
|
134
|
+
|
|
105
135
|
// src/core/CanvasLayer.ts
|
|
106
136
|
var CanvasLayer = class {
|
|
107
137
|
canvas;
|
|
@@ -4740,10 +4770,7 @@ var Chart = class {
|
|
|
4740
4770
|
onCrosshairMove: (x, y) => {
|
|
4741
4771
|
if (!this._crosshairEnabled) return;
|
|
4742
4772
|
if (this._magnetMode === "off") {
|
|
4743
|
-
|
|
4744
|
-
const rawTime = this._transform.xToTime(x);
|
|
4745
|
-
const flooredTime = Math.floor(rawTime / tfSec) * tfSec;
|
|
4746
|
-
this._crosshair.update(x, y, flooredTime);
|
|
4773
|
+
this._crosshair.update(x, y, this._cursorBucketTime(x));
|
|
4747
4774
|
} else {
|
|
4748
4775
|
const snap = this.snapXToBar(x);
|
|
4749
4776
|
const sy = this._magnetMode === "snap-xy" ? snap.closeY ?? y : y;
|
|
@@ -4784,7 +4811,8 @@ var Chart = class {
|
|
|
4784
4811
|
},
|
|
4785
4812
|
onDrawPointerMove: (x, y) => {
|
|
4786
4813
|
this._drawingCursorPt = {
|
|
4787
|
-
time:
|
|
4814
|
+
// Bucket time, not raw: the label and the stored anchor agree.
|
|
4815
|
+
time: this._cursorBucketTime(x),
|
|
4788
4816
|
price: this._transform.yToPrice(y)
|
|
4789
4817
|
};
|
|
4790
4818
|
this._dirty = true;
|
|
@@ -5057,9 +5085,19 @@ var Chart = class {
|
|
|
5057
5085
|
closeY: this._transform.priceToY(bar.close)
|
|
5058
5086
|
};
|
|
5059
5087
|
}
|
|
5060
|
-
|
|
5061
|
-
|
|
5062
|
-
|
|
5088
|
+
return { x, time: this._cursorBucketTime(x) };
|
|
5089
|
+
}
|
|
5090
|
+
/** Bucket time for a cursor x — see core/cursorTime.ts for the rule. */
|
|
5091
|
+
_cursorBucketTime(x) {
|
|
5092
|
+
let bars = null;
|
|
5093
|
+
for (const s of this._series) {
|
|
5094
|
+
const data = s.data();
|
|
5095
|
+
if (data.length > 0) {
|
|
5096
|
+
bars = data;
|
|
5097
|
+
break;
|
|
5098
|
+
}
|
|
5099
|
+
}
|
|
5100
|
+
return cursorBucketTime(bars, this._transform, this._interval, x);
|
|
5063
5101
|
}
|
|
5064
5102
|
_computeViewport() {
|
|
5065
5103
|
return {
|
|
@@ -5536,7 +5574,7 @@ var Chart = class {
|
|
|
5536
5574
|
const MAGNET_PX = 15;
|
|
5537
5575
|
const t = this._transform;
|
|
5538
5576
|
const price = t.yToPrice(y);
|
|
5539
|
-
const time =
|
|
5577
|
+
const time = this._cursorBucketTime(x);
|
|
5540
5578
|
if (this._magnetMode === "off") return { time, price };
|
|
5541
5579
|
let bestBar = null;
|
|
5542
5580
|
let bestDist = SNAP_PX;
|
|
@@ -6235,7 +6273,16 @@ var PixiCrosshairRenderer = class {
|
|
|
6235
6273
|
interval = "1h";
|
|
6236
6274
|
/** IANA timezone for the time label. Falls back to UTC. */
|
|
6237
6275
|
timezone = "UTC";
|
|
6238
|
-
|
|
6276
|
+
/**
|
|
6277
|
+
* The time the chart computed for this cursor position — nearest bar, else
|
|
6278
|
+
* floored to the timeframe grid. This renderer must never derive its own:
|
|
6279
|
+
* it once did (raw xToTime), and every pointer style's time label showed
|
|
6280
|
+
* interpolated minute noise (10:02 on an hourly chart) on any timeframe
|
|
6281
|
+
* wider than the interpolation error.
|
|
6282
|
+
*/
|
|
6283
|
+
_snapTime = null;
|
|
6284
|
+
update(x, y, snapTime) {
|
|
6285
|
+
this._snapTime = snapTime ?? null;
|
|
6239
6286
|
this._x = x;
|
|
6240
6287
|
this._y = y;
|
|
6241
6288
|
}
|
|
@@ -6277,7 +6324,7 @@ var PixiCrosshairRenderer = class {
|
|
|
6277
6324
|
this._priceLabel.text = priceText;
|
|
6278
6325
|
this._priceLabel.x = pw + 4;
|
|
6279
6326
|
this._priceLabel.y = y - this._priceLabel.height / 2;
|
|
6280
|
-
const time = transform.xToTime(x);
|
|
6327
|
+
const time = this._snapTime ?? transform.xToTime(x);
|
|
6281
6328
|
const timeText = this._formatTime(time);
|
|
6282
6329
|
const tlw = DAILY_INTERVALS.has(this.interval) ? 120 : 170;
|
|
6283
6330
|
const tlh = tsh - 4;
|
|
@@ -8674,11 +8721,11 @@ var PixiChart = class {
|
|
|
8674
8721
|
onCrosshairMove: (x, y) => {
|
|
8675
8722
|
if (!this._crosshairEnabled) return;
|
|
8676
8723
|
if (this._magnetMode === "off") {
|
|
8677
|
-
this._crosshairRenderer.update(x, y);
|
|
8724
|
+
this._crosshairRenderer.update(x, y, this._cursorBucketTime(x));
|
|
8678
8725
|
} else {
|
|
8679
8726
|
const snap = this.snapXToBar(x);
|
|
8680
8727
|
const sy = this._magnetMode === "snap-xy" ? snap.closeY ?? y : y;
|
|
8681
|
-
this._crosshairRenderer.update(snap.x, sy);
|
|
8728
|
+
this._crosshairRenderer.update(snap.x, sy, snap.time);
|
|
8682
8729
|
}
|
|
8683
8730
|
const ah = this._interaction.axisHover;
|
|
8684
8731
|
if (ah !== this._lastAxisHover) {
|
|
@@ -8724,7 +8771,9 @@ var PixiChart = class {
|
|
|
8724
8771
|
},
|
|
8725
8772
|
onDrawPointerMove: (x, y) => {
|
|
8726
8773
|
this._drawingCursorPt = {
|
|
8727
|
-
time:
|
|
8774
|
+
// Bucket time, not raw: what the crosshair label shows is what a
|
|
8775
|
+
// drawing placed here will store.
|
|
8776
|
+
time: this._cursorBucketTime(x),
|
|
8728
8777
|
price: this._transform.yToPrice(y)
|
|
8729
8778
|
};
|
|
8730
8779
|
this._layers.dirty.mark(3 /* Drawing */);
|
|
@@ -9291,6 +9340,18 @@ var PixiChart = class {
|
|
|
9291
9340
|
setNativeCursorHidden(hidden) {
|
|
9292
9341
|
this._interaction.setHideCursor(hidden);
|
|
9293
9342
|
}
|
|
9343
|
+
/** Bucket time for a cursor x — see core/cursorTime.ts for the rule. */
|
|
9344
|
+
_cursorBucketTime(x) {
|
|
9345
|
+
let bars = null;
|
|
9346
|
+
for (const s of this._series) {
|
|
9347
|
+
const data = s.data();
|
|
9348
|
+
if (data.length > 0) {
|
|
9349
|
+
bars = data;
|
|
9350
|
+
break;
|
|
9351
|
+
}
|
|
9352
|
+
}
|
|
9353
|
+
return cursorBucketTime(bars, this._transform, this._interval, x);
|
|
9354
|
+
}
|
|
9294
9355
|
snapXToBar(x) {
|
|
9295
9356
|
const SNAP_PX = 20;
|
|
9296
9357
|
let bars = null;
|
|
@@ -9334,7 +9395,7 @@ var PixiChart = class {
|
|
|
9334
9395
|
closeY: t.priceToY(bar.close)
|
|
9335
9396
|
};
|
|
9336
9397
|
}
|
|
9337
|
-
return { x, time:
|
|
9398
|
+
return { x, time: this._cursorBucketTime(x) };
|
|
9338
9399
|
}
|
|
9339
9400
|
setIndicatorsVisible(v) {
|
|
9340
9401
|
this._indicatorsVisible = v;
|
|
@@ -18058,7 +18119,7 @@ var DEMONSTRATION_STROKE = "rgba(255, 200, 50, 0.7)";
|
|
|
18058
18119
|
var DEMONSTRATION_COLOR = "var(--crosshair-overlay, rgba(255,255,255,0.75))";
|
|
18059
18120
|
|
|
18060
18121
|
// src/version.ts
|
|
18061
|
-
var FORGECHARTS_VERSION = "1.5.
|
|
18122
|
+
var FORGECHARTS_VERSION = "1.5.70" ;
|
|
18062
18123
|
function applyRuntimeConfig(caps, config) {
|
|
18063
18124
|
if (!config) return caps;
|
|
18064
18125
|
const orderEntry = config.enableOrderEntry === false ? false : caps.orderEntry;
|