@forgecharts/sdk 1.5.34 → 1.5.36

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.
@@ -1 +1 @@
1
- {"version":3,"file":"PixiLastPriceRenderer.d.ts","sourceRoot":"","sources":["../../src/pixi/PixiLastPriceRenderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AA+B7C;;;;;;GAMG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAO;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAO;IACtC,OAAO,CAAC,QAAQ,CAAK;IACrB,yDAAyD;IACzD,cAAc,EAAE,MAAM,GAAG,SAAS,CAAa;IAC/C,2CAA2C;IAC3C,aAAa,UAAQ;gBAET,KAAK,EAAE,SAAS;IAyB5B,OAAO,IAAI,IAAI;IAOf;;;;OAIG;IACH,IAAI,CACF,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,SAAS,EAAE,cAAc,EACzB,QAAQ,EAAE,SAAS,GAClB,OAAO;IAuEV,6EAA6E;IAC7E,WAAW,IAAI,OAAO;CAIvB"}
1
+ {"version":3,"file":"PixiLastPriceRenderer.d.ts","sourceRoot":"","sources":["../../src/pixi/PixiLastPriceRenderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AA+B7C;;;;;;GAMG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAO;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAO;IACtC,OAAO,CAAC,QAAQ,CAAK;IACrB,yDAAyD;IACzD,cAAc,EAAE,MAAM,GAAG,SAAS,CAAa;IAC/C,2CAA2C;IAC3C,aAAa,UAAQ;gBAET,KAAK,EAAE,SAAS;IAyB5B,OAAO,IAAI,IAAI;IAOf;;;;OAIG;IACH,IAAI,CACF,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,SAAS,EAAE,cAAc,EACzB,QAAQ,EAAE,SAAS,GAClB,OAAO;IA8EV,6EAA6E;IAC7E,WAAW,IAAI,OAAO;CAIvB"}
@@ -116,8 +116,16 @@ export type ChartCanvasProps = {
116
116
  /** Called whenever the user selects a pointer tool, so the parent can persist the choice. */
117
117
  onPointerToolChange?: (tool: PointerToolType) => void;
118
118
  /**
119
- * Initial magnet snap mode. Defaults to `'snap-xy'`.
120
- * Provided by the parent for workspace persistence.
119
+ * Initial magnet snap mode. Defaults to `'snap-x'` ("Snap to bar").
120
+ *
121
+ * Snapping to the bar alone is the safer default: it aligns a drawing to a
122
+ * real time coordinate without also moving it in price, so a level lands
123
+ * where the user put it. 'snap-xy' additionally pulls the price to the
124
+ * nearest OHLC value, which silently relocates a level the user placed
125
+ * deliberately between them.
126
+ *
127
+ * Provided by the parent for workspace persistence — pair with
128
+ * onMagnetModeChange to make the choice stick.
121
129
  */
122
130
  initialMagnetMode?: import('@forgecharts/types').MagnetMode;
123
131
  /** Called when the user changes the magnet mode, so the parent can persist the choice. */
@@ -1 +1 @@
1
- {"version":3,"file":"ChartCanvas.d.ts","sourceRoot":"","sources":["../../../src/react/canvas/ChartCanvas.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChartCanvas.d.ts","sourceRoot":"","sources":["../../../src/react/canvas/ChartCanvas.tsx"],"names":[],"mappings":"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"}
@@ -5,6 +5,103 @@ import ReactDOM from 'react-dom';
5
5
 
6
6
  // src/react/canvas/ChartCanvas.tsx
7
7
 
8
+ // ../shared/src/time/timeframeRegistry.ts
9
+ function isCalendarTimeframe(key) {
10
+ return key === "1w" || key === "1M" || key === "3M" || key === "6M" || key === "12M";
11
+ }
12
+ function isTickTimeframe(key) {
13
+ return /^\d+t$/i.test(key);
14
+ }
15
+
16
+ // ../shared/src/time/timeUtils.ts
17
+ var MONDAY_EPOCH_OFFSET_MS = 3456e5;
18
+ var WEEK_MS = 6048e5;
19
+ function timeframeToMs(tf) {
20
+ if (isCalendarTimeframe(tf)) return null;
21
+ if (isTickTimeframe(tf)) return null;
22
+ const secs = parseTfSeconds(tf);
23
+ return secs !== null ? secs * 1e3 : null;
24
+ }
25
+ function parseTfSeconds(tf) {
26
+ const m = /^(\d+)(s|m|h|d|w|M)$/.exec(tf);
27
+ if (!m) return null;
28
+ const n = parseInt(m[1], 10);
29
+ const unit = m[2];
30
+ const UNIT_SECONDS = {
31
+ s: 1,
32
+ m: 60,
33
+ h: 3600,
34
+ d: 86400,
35
+ w: 604800,
36
+ M: 2592e3
37
+ };
38
+ const unitSec = UNIT_SECONDS[unit];
39
+ return unitSec !== void 0 ? n * unitSec : null;
40
+ }
41
+ function getBucketStart(timeMs, timeframe) {
42
+ if (timeframe === "1w") return getWeekBucketStart(timeMs);
43
+ if (timeframe === "1M") return getMonthBucketStart(timeMs);
44
+ if (timeframe === "3M") return getQuarterBucketStart(timeMs);
45
+ if (timeframe === "6M") return getHalfYearBucketStart(timeMs);
46
+ if (timeframe === "12M") return getYearBucketStart(timeMs);
47
+ const secs = parseTfSeconds(timeframe);
48
+ if (secs && secs > 0) return Math.floor(timeMs / (secs * 1e3)) * (secs * 1e3);
49
+ return Math.floor(timeMs / 6e4) * 6e4;
50
+ }
51
+ function getWeekBucketStart(timeMs) {
52
+ return Math.floor((timeMs - MONDAY_EPOCH_OFFSET_MS) / WEEK_MS) * WEEK_MS + MONDAY_EPOCH_OFFSET_MS;
53
+ }
54
+ function getMonthBucketStart(timeMs) {
55
+ const d = new Date(timeMs);
56
+ return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), 1);
57
+ }
58
+ function getQuarterBucketStart(timeMs) {
59
+ const d = new Date(timeMs);
60
+ const quarterMonth = Math.floor(d.getUTCMonth() / 3) * 3;
61
+ return Date.UTC(d.getUTCFullYear(), quarterMonth, 1);
62
+ }
63
+ function getHalfYearBucketStart(timeMs) {
64
+ const d = new Date(timeMs);
65
+ const halfMonth = d.getUTCMonth() < 6 ? 0 : 6;
66
+ return Date.UTC(d.getUTCFullYear(), halfMonth, 1);
67
+ }
68
+ function getYearBucketStart(timeMs) {
69
+ return Date.UTC(new Date(timeMs).getUTCFullYear(), 0, 1);
70
+ }
71
+
72
+ // ../shared/src/marketHours.ts
73
+ function isGLBXWeekend(nowMs = Date.now()) {
74
+ const d = new Date(nowMs);
75
+ const day = d.getUTCDay();
76
+ const hour = d.getUTCHours();
77
+ if (day === 6) return true;
78
+ if (day === 0 && hour < 22) return true;
79
+ if (day === 5 && hour >= 21) return true;
80
+ return false;
81
+ }
82
+ function centralParts(nowMs) {
83
+ const parts = new Intl.DateTimeFormat("en-US", {
84
+ timeZone: "America/Chicago",
85
+ weekday: "short",
86
+ hour: "2-digit",
87
+ minute: "2-digit",
88
+ // h23 rather than hour12:false — the latter yields '24' for midnight in
89
+ // some ICU builds, which would parse as an hour that never matches.
90
+ hourCycle: "h23"
91
+ }).formatToParts(new Date(nowMs));
92
+ const get = (t) => parts.find((p) => p.type === t)?.value ?? "";
93
+ return {
94
+ weekday: get("weekday"),
95
+ hour: parseInt(get("hour"), 10),
96
+ minute: parseInt(get("minute"), 10)
97
+ };
98
+ }
99
+ function isGLBXDailyBreak(nowMs = Date.now()) {
100
+ const { weekday, hour } = centralParts(nowMs);
101
+ if (hour !== 16) return false;
102
+ return weekday === "Mon" || weekday === "Tue" || weekday === "Wed" || weekday === "Thu";
103
+ }
104
+
8
105
  // src/core/CanvasLayer.ts
9
106
  var CanvasLayer = class {
10
107
  canvas;
@@ -98,81 +195,6 @@ function computeTicks(min, max, targetCount) {
98
195
  return ticks;
99
196
  }
100
197
 
101
- // ../shared/src/time/timeframeRegistry.ts
102
- function isCalendarTimeframe(key) {
103
- return key === "1w" || key === "1M" || key === "3M" || key === "6M" || key === "12M";
104
- }
105
- function isTickTimeframe(key) {
106
- return /^\d+t$/i.test(key);
107
- }
108
-
109
- // ../shared/src/time/timeUtils.ts
110
- var MONDAY_EPOCH_OFFSET_MS = 3456e5;
111
- var WEEK_MS = 6048e5;
112
- function timeframeToMs(tf) {
113
- if (isCalendarTimeframe(tf)) return null;
114
- if (isTickTimeframe(tf)) return null;
115
- const secs = parseTfSeconds(tf);
116
- return secs !== null ? secs * 1e3 : null;
117
- }
118
- function parseTfSeconds(tf) {
119
- const m = /^(\d+)(s|m|h|d|w|M)$/.exec(tf);
120
- if (!m) return null;
121
- const n = parseInt(m[1], 10);
122
- const unit = m[2];
123
- const UNIT_SECONDS = {
124
- s: 1,
125
- m: 60,
126
- h: 3600,
127
- d: 86400,
128
- w: 604800,
129
- M: 2592e3
130
- };
131
- const unitSec = UNIT_SECONDS[unit];
132
- return unitSec !== void 0 ? n * unitSec : null;
133
- }
134
- function getBucketStart(timeMs, timeframe) {
135
- if (timeframe === "1w") return getWeekBucketStart(timeMs);
136
- if (timeframe === "1M") return getMonthBucketStart(timeMs);
137
- if (timeframe === "3M") return getQuarterBucketStart(timeMs);
138
- if (timeframe === "6M") return getHalfYearBucketStart(timeMs);
139
- if (timeframe === "12M") return getYearBucketStart(timeMs);
140
- const secs = parseTfSeconds(timeframe);
141
- if (secs && secs > 0) return Math.floor(timeMs / (secs * 1e3)) * (secs * 1e3);
142
- return Math.floor(timeMs / 6e4) * 6e4;
143
- }
144
- function getWeekBucketStart(timeMs) {
145
- return Math.floor((timeMs - MONDAY_EPOCH_OFFSET_MS) / WEEK_MS) * WEEK_MS + MONDAY_EPOCH_OFFSET_MS;
146
- }
147
- function getMonthBucketStart(timeMs) {
148
- const d = new Date(timeMs);
149
- return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), 1);
150
- }
151
- function getQuarterBucketStart(timeMs) {
152
- const d = new Date(timeMs);
153
- const quarterMonth = Math.floor(d.getUTCMonth() / 3) * 3;
154
- return Date.UTC(d.getUTCFullYear(), quarterMonth, 1);
155
- }
156
- function getHalfYearBucketStart(timeMs) {
157
- const d = new Date(timeMs);
158
- const halfMonth = d.getUTCMonth() < 6 ? 0 : 6;
159
- return Date.UTC(d.getUTCFullYear(), halfMonth, 1);
160
- }
161
- function getYearBucketStart(timeMs) {
162
- return Date.UTC(new Date(timeMs).getUTCFullYear(), 0, 1);
163
- }
164
-
165
- // ../shared/src/marketHours.ts
166
- function isGLBXWeekend(nowMs = Date.now()) {
167
- const d = new Date(nowMs);
168
- const day = d.getUTCDay();
169
- const hour = d.getUTCHours();
170
- if (day === 6) return true;
171
- if (day === 0 && hour < 22) return true;
172
- if (day === 5 && hour >= 21) return true;
173
- return false;
174
- }
175
-
176
198
  // ../utils/src/time.ts
177
199
  function parseTimeframeSeconds(tf) {
178
200
  return parseTfSeconds(tf);
@@ -5137,7 +5159,7 @@ var Chart = class {
5137
5159
  const tfSecs = _tfToSeconds(this._interval);
5138
5160
  const now = Math.floor(exchangeNow() / 1e3);
5139
5161
  const remaining = tfSecs - now % tfSecs;
5140
- const showCd = this._options.showCountdown !== false;
5162
+ const showCd = this._options.showCountdown !== false && !isGLBXDailyBreak(now * 1e3);
5141
5163
  const priceLabel = _formatLastPrice(price, this._options.pricePrecision);
5142
5164
  const lineH = 15;
5143
5165
  const boxH = showCd ? lineH * 2 + 1 : lineH;
@@ -7659,9 +7681,10 @@ var PixiLastPriceRenderer = class {
7659
7681
  cx += dashLen + gapLen;
7660
7682
  }
7661
7683
  this._lineGfx.stroke();
7662
- const showCd = this.showCountdown;
7663
- const tfSecs = tfToSeconds(interval);
7664
7684
  const now = Math.floor(exchangeNow() / 1e3);
7685
+ const halted = isGLBXDailyBreak(now * 1e3);
7686
+ const showCd = this.showCountdown && !halted;
7687
+ const tfSecs = tfToSeconds(interval);
7665
7688
  const remaining = tfSecs - now % tfSecs;
7666
7689
  this._lastSec = now;
7667
7690
  const lineH = 15;
@@ -19705,7 +19728,7 @@ function LeftToolbar({ activeTool, onSelectTool, drawingFavorites, onDrawingFavo
19705
19728
  /* @__PURE__ */ jsx(
19706
19729
  MagnetTool,
19707
19730
  {
19708
- mode: magnetMode ?? "snap-xy",
19731
+ mode: magnetMode ?? "snap-x",
19709
19732
  ...onMagnetModeChange ? { onChange: onMagnetModeChange } : {}
19710
19733
  }
19711
19734
  ),
@@ -22736,7 +22759,7 @@ var ChartCanvas = forwardRef(
22736
22759
  const [indicators, setIndicators] = useState([]);
22737
22760
  const [totalHeight, setTotalHeight] = useState(600);
22738
22761
  const [activeTool, setActiveTool] = useState(initialActiveTool ?? "cursor");
22739
- const [magnetMode, setMagnetMode] = useState(initialMagnetMode ?? "snap-xy");
22762
+ const [magnetMode, setMagnetMode] = useState(initialMagnetMode ?? "snap-x");
22740
22763
  const [drawingFavorites, setDrawingFavorites] = useState(drawingFavoritesProp ?? []);
22741
22764
  const [ctxMenu, setCtxMenu] = useState(null);
22742
22765
  const [chartCtxMenu, setChartCtxMenu] = useState(null);
@@ -23016,7 +23039,7 @@ var ChartCanvas = forwardRef(
23016
23039
  const initTool = initialActiveTool ?? "cursor";
23017
23040
  chart.setCrosshairEnabled(initTool === "crosshair");
23018
23041
  chart.setNativeCursorHidden(initTool !== "cursor");
23019
- chart.setMagnetMode(initialMagnetMode ?? "snap-xy");
23042
+ chart.setMagnetMode(initialMagnetMode ?? "snap-x");
23020
23043
  syncChartState();
23021
23044
  return () => {
23022
23045
  chart.destroy();
@@ -24344,14 +24367,22 @@ function TabBar({ tabs, activeId, onSelect, onAdd, onClose, onRename, showAddTab
24344
24367
  setCanScrollLeft(el.scrollLeft > 0);
24345
24368
  setCanScrollRight(el.scrollLeft + el.clientWidth < el.scrollWidth - 1);
24346
24369
  }, []);
24370
+ const tabsKey = tabs.map((t) => t.id).join("|");
24347
24371
  useEffect(() => {
24348
24372
  updateArrows();
24349
24373
  const el = scrollRef.current;
24350
24374
  if (!el) return;
24351
- const ro = new ResizeObserver(updateArrows);
24375
+ let frame = 0;
24376
+ const ro = new ResizeObserver(() => {
24377
+ cancelAnimationFrame(frame);
24378
+ frame = requestAnimationFrame(updateArrows);
24379
+ });
24352
24380
  ro.observe(el);
24353
- return () => ro.disconnect();
24354
- }, [tabs, updateArrows]);
24381
+ return () => {
24382
+ cancelAnimationFrame(frame);
24383
+ ro.disconnect();
24384
+ };
24385
+ }, [tabsKey, updateArrows]);
24355
24386
  useEffect(() => {
24356
24387
  const el = scrollRef.current;
24357
24388
  if (!el) return;
@@ -26551,7 +26582,7 @@ function _guessFrontMonth(product, months) {
26551
26582
  }
26552
26583
 
26553
26584
  // src/version.ts
26554
- var FORGECHARTS_VERSION = "1.5.34" ;
26585
+ var FORGECHARTS_VERSION = "1.5.36" ;
26555
26586
  var TIMEZONE_OPTIONS = [
26556
26587
  { label: "UTC", value: "UTC" },
26557
26588
  { label: "Exchange", value: "exchange" },