minerva-design 1.6.0 → 1.7.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 (120) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/charts/engine/data.cjs +1 -1
  3. package/dist/charts/engine/data.cjs.map +1 -1
  4. package/dist/charts/engine/data.d.cts +2 -0
  5. package/dist/charts/engine/data.d.ts +2 -0
  6. package/dist/charts/engine/data.js +6 -4
  7. package/dist/charts/engine/data.js.map +1 -1
  8. package/dist/charts/engine/defaults.cjs +1 -1
  9. package/dist/charts/engine/defaults.cjs.map +1 -1
  10. package/dist/charts/engine/defaults.js +22 -18
  11. package/dist/charts/engine/defaults.js.map +1 -1
  12. package/dist/charts/engine/graph/chart.cjs +1 -1
  13. package/dist/charts/engine/graph/chart.cjs.map +1 -1
  14. package/dist/charts/engine/graph/chart.js +532 -493
  15. package/dist/charts/engine/graph/chart.js.map +1 -1
  16. package/dist/charts/engine/graph/geometry.cjs +1 -1
  17. package/dist/charts/engine/graph/geometry.cjs.map +1 -1
  18. package/dist/charts/engine/graph/geometry.d.cts +12 -2
  19. package/dist/charts/engine/graph/geometry.d.ts +12 -2
  20. package/dist/charts/engine/graph/geometry.js +35 -31
  21. package/dist/charts/engine/graph/geometry.js.map +1 -1
  22. package/dist/charts/engine/model.cjs +1 -1
  23. package/dist/charts/engine/model.cjs.map +1 -1
  24. package/dist/charts/engine/model.js +95 -74
  25. package/dist/charts/engine/model.js.map +1 -1
  26. package/dist/charts/engine/orderbook/field.cjs +1 -1
  27. package/dist/charts/engine/orderbook/field.cjs.map +1 -1
  28. package/dist/charts/engine/orderbook/field.d.cts +15 -2
  29. package/dist/charts/engine/orderbook/field.d.ts +15 -2
  30. package/dist/charts/engine/orderbook/field.js +21 -9
  31. package/dist/charts/engine/orderbook/field.js.map +1 -1
  32. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  33. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  34. package/dist/charts/engine/orderbook/heatmap.d.cts +29 -0
  35. package/dist/charts/engine/orderbook/heatmap.d.ts +29 -0
  36. package/dist/charts/engine/orderbook/heatmap.js +576 -453
  37. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  38. package/dist/charts/engine/orderbook/types.d.cts +36 -11
  39. package/dist/charts/engine/orderbook/types.d.ts +36 -11
  40. package/dist/charts/engine/presets.cjs +1 -1
  41. package/dist/charts/engine/presets.cjs.map +1 -1
  42. package/dist/charts/engine/presets.d.cts +16 -3
  43. package/dist/charts/engine/presets.d.ts +16 -3
  44. package/dist/charts/engine/presets.js +42 -32
  45. package/dist/charts/engine/presets.js.map +1 -1
  46. package/dist/charts/engine/scene.cjs +1 -1
  47. package/dist/charts/engine/scene.cjs.map +1 -1
  48. package/dist/charts/engine/scene.d.cts +4 -2
  49. package/dist/charts/engine/scene.d.ts +4 -2
  50. package/dist/charts/engine/scene.js +185 -107
  51. package/dist/charts/engine/scene.js.map +1 -1
  52. package/dist/charts/engine/three-d/oit.cjs +119 -34
  53. package/dist/charts/engine/three-d/oit.cjs.map +1 -1
  54. package/dist/charts/engine/three-d/oit.d.cts +65 -10
  55. package/dist/charts/engine/three-d/oit.d.ts +65 -10
  56. package/dist/charts/engine/three-d/oit.js +119 -34
  57. package/dist/charts/engine/three-d/oit.js.map +1 -1
  58. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  59. package/dist/charts/engine/three-d/render-types.d.cts +19 -0
  60. package/dist/charts/engine/three-d/render-types.d.ts +19 -0
  61. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  62. package/dist/charts/engine/three-d/shaders.cjs +14 -6
  63. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  64. package/dist/charts/engine/three-d/shaders.d.cts +6 -1
  65. package/dist/charts/engine/three-d/shaders.d.ts +6 -1
  66. package/dist/charts/engine/three-d/shaders.js +40 -26
  67. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  68. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  69. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  70. package/dist/charts/engine/three-d/webgl.js +167 -125
  71. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  72. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  73. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  74. package/dist/charts/engine/three-d/webgpu.js +169 -140
  75. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  76. package/dist/charts/engine/trading/chart.cjs +1 -1
  77. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  78. package/dist/charts/engine/trading/chart.js +1149 -1023
  79. package/dist/charts/engine/trading/chart.js.map +1 -1
  80. package/dist/charts/engine/trading/labels.cjs +1 -1
  81. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  82. package/dist/charts/engine/trading/labels.js +12 -0
  83. package/dist/charts/engine/trading/labels.js.map +1 -1
  84. package/dist/charts/engine/trading/layout.cjs +2 -0
  85. package/dist/charts/engine/trading/layout.cjs.map +1 -0
  86. package/dist/charts/engine/trading/layout.d.cts +37 -0
  87. package/dist/charts/engine/trading/layout.d.ts +37 -0
  88. package/dist/charts/engine/trading/layout.js +63 -0
  89. package/dist/charts/engine/trading/layout.js.map +1 -0
  90. package/dist/charts/engine/trading/types.d.cts +24 -7
  91. package/dist/charts/engine/trading/types.d.ts +24 -7
  92. package/dist/charts/engine/types.d.cts +21 -8
  93. package/dist/charts/engine/types.d.ts +21 -8
  94. package/dist/core/contracts.cjs +1 -1
  95. package/dist/core/contracts.cjs.map +1 -1
  96. package/dist/core/contracts.js +1 -1
  97. package/dist/core/contracts.js.map +1 -1
  98. package/dist/native/charts/src/engine/data.cjs +1 -1
  99. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  100. package/dist/native/charts/src/engine/data.js +6 -4
  101. package/dist/native/charts/src/engine/data.js.map +1 -1
  102. package/dist/native/charts/src/engine/model.cjs +1 -1
  103. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  104. package/dist/native/charts/src/engine/model.js +104 -83
  105. package/dist/native/charts/src/engine/model.js.map +1 -1
  106. package/dist/native/charts/src/engine/presets.cjs +1 -1
  107. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  108. package/dist/native/charts/src/engine/presets.js +42 -32
  109. package/dist/native/charts/src/engine/presets.js.map +1 -1
  110. package/dist/native/charts/src/engine/scene.cjs +1 -1
  111. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  112. package/dist/native/charts/src/engine/scene.js +185 -107
  113. package/dist/native/charts/src/engine/scene.js.map +1 -1
  114. package/dist/taro/index.js +1263 -1152
  115. package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +11 -0
  116. package/dist/vue/components/Chart/orderbook.d.ts +7 -0
  117. package/dist/vue/components/Chart/orderbook.js +2 -0
  118. package/dist/vue/components/Chart/orderbook.js.map +1 -1
  119. package/dist/weapp/charts/canvas.js +234 -58
  120. package/package.json +1 -1
@@ -1,36 +1,59 @@
1
- import { luminance as e, mixOklab as t, oklabRamp as n, toCss as r } from "../color.js";
2
- import { localeLabels as i } from "../locale.js";
3
- import { linearTicks as a } from "../scale.js";
4
- import { followDefaultRenderer as o } from "../renderers/follow.js";
5
- import { timeTicks as s } from "../time.js";
6
- import { createOrderBookStore as c, decimalsOf as l, inferPriceDecimals as u, inferSizeDecimals as d, inferTickSize as f, roundToStep as p } from "./book.js";
7
- import { clamp as m, createFormatters as h, ease as g, fontOf as ee, formatClock as te, roundRect as _, sideColors as ne } from "./format.js";
8
- import { createEmitter as v, createHost as re, localPoint as ie, tooltipHtml as ae } from "./host.js";
9
- import { HEAT_TABLE_SIZE as y, buildHeatGrid as oe, createHeatFieldRenderer as b, heatTable as x, paintHeatGrid as S, percentile as se } from "./field.js";
10
- import { fineCeil as ce, fitPriceRange as le, fitTimeRange as ue, layoutAxisLabels as de } from "./layout.js";
1
+ import { fromOklab as e, luminance as t, mixOklab as n, oklabRamp as r, packColor as i, parseColor as a, toCss as o, toOklab as s } from "../color.js";
2
+ import { localeLabels as c } from "../locale.js";
3
+ import { linearTicks as l } from "../scale.js";
4
+ import { followDefaultRenderer as u } from "../renderers/follow.js";
5
+ import { timeTicks as d } from "../time.js";
6
+ import { createOrderBookStore as f, decimalsOf as p, inferPriceDecimals as m, inferSizeDecimals as h, inferTickSize as g, roundToStep as _ } from "./book.js";
7
+ import { clamp as v, createFormatters as y, ease as b, fontOf as x, formatClock as ee, roundRect as te, sideColors as S } from "./format.js";
8
+ import { createEmitter as ne, createHost as C, localPoint as w, tooltipHtml as T } from "./host.js";
9
+ import { HEAT_TABLE_SIZE as E, buildHeatGrid as D, createHeatFieldRenderer as O, heatTable as k, paintHeatGrid as re, percentile as A } from "./field.js";
10
+ import { fineCeil as j, fitPriceRange as ie, fitTimeRange as ae, layoutAxisLabels as oe } from "./layout.js";
11
11
  //#region src/engine/orderbook/heatmap.ts
12
- var fe = 256, C = 4096, w = .98, pe = 1.4, me = [
13
- "#0a1830",
14
- "#0f2c57",
15
- "#134a8a",
16
- "#1670b4",
17
- "#1aa0bf",
18
- "#2fc3a0",
19
- "#8ad65a",
20
- "#e8dc3f",
21
- "#ffa733",
22
- "#ff5a2e"
23
- ], he = [
24
- "#eef4fb",
25
- "#cfe1f6",
26
- "#9fc2ee",
27
- "#679ee2",
28
- "#3a73cf",
29
- "#3f4bb0",
30
- "#62309a",
31
- "#9c2783",
32
- "#d12c52"
33
- ], ge = 16, _e = 6, ve = {
12
+ var M = 256, se = 4096, ce = .99, N = 2, le = [
13
+ [0, "#0b1322"],
14
+ [.3, "#0d1a2e"],
15
+ [.5, "#102a4e"],
16
+ [.65, "#154a8a"],
17
+ [.76, "#1b86b8"],
18
+ [.85, "#3fc3c0"],
19
+ [.91, "#e8d84a"],
20
+ [.96, "#ff8c2b"],
21
+ [1, "#ffe6c2"]
22
+ ], ue = [
23
+ [0, "#fbfcfe"],
24
+ [.3, "#f3f6fc"],
25
+ [.5, "#dde7f7"],
26
+ [.65, "#a8c4ec"],
27
+ [.76, "#5b8bd6"],
28
+ [.85, "#2f4fb0"],
29
+ [.93, "#6a2a9c"],
30
+ [1, "#c4173f"]
31
+ ], de = 16, fe = 6, pe = 14, P = 3, me = (t, n = M) => {
32
+ let r = new Uint32Array(n);
33
+ if (!t.length) return r;
34
+ let a = t.map(([, e]) => s(e)), o = 0;
35
+ for (let s = 0; s < n; s++) {
36
+ let c = s / Math.max(1, n - 1);
37
+ for (; o + 1 < t.length - 1 && c > t[o + 1][0];) o++;
38
+ let [l] = t[o], u = Math.min(t.length - 1, o + 1), [d] = t[u], f = d > l ? Math.min(1, Math.max(0, (c - l) / (d - l))) : 0, p = a[o], m = a[u];
39
+ r[s] = i(e([
40
+ p[0] + (m[0] - p[0]) * f,
41
+ p[1] + (m[1] - p[1]) * f,
42
+ p[2] + (m[2] - p[2]) * f,
43
+ 1
44
+ ]));
45
+ }
46
+ return r;
47
+ }, he = (e) => {
48
+ if (!(e > 0) || e >= N) return 1;
49
+ let t = N / e;
50
+ for (let e = 1; e < 0xe8d4a51000; e *= 10) for (let n of [
51
+ 1,
52
+ 2,
53
+ 5
54
+ ]) if (n * e >= t) return n * e;
55
+ return 1;
56
+ }, ge = {
34
57
  en: {
35
58
  time: "Time",
36
59
  price: "Price",
@@ -41,6 +64,7 @@ var fe = 256, C = 4096, w = .98, pe = 1.4, me = [
41
64
  ask: "Ask",
42
65
  bidSide: "Bid side",
43
66
  askSide: "Ask side",
67
+ bubbleHint: "Bubble area = trade size",
44
68
  name: "Liquidity heatmap"
45
69
  },
46
70
  zh: {
@@ -53,6 +77,7 @@ var fe = 256, C = 4096, w = .98, pe = 1.4, me = [
53
77
  ask: "卖一",
54
78
  bidSide: "买盘",
55
79
  askSide: "卖盘",
80
+ bubbleHint: "气泡面积 = 成交量",
56
81
  name: "订单簿热力图"
57
82
  },
58
83
  ja: {
@@ -65,6 +90,7 @@ var fe = 256, C = 4096, w = .98, pe = 1.4, me = [
65
90
  ask: "最良売気配",
66
91
  bidSide: "買い板",
67
92
  askSide: "売り板",
93
+ bubbleHint: "バブル面積 = 出来高",
68
94
  name: "板ヒートマップ"
69
95
  },
70
96
  fr: {
@@ -77,18 +103,50 @@ var fe = 256, C = 4096, w = .98, pe = 1.4, me = [
77
103
  ask: "Meilleure vente",
78
104
  bidSide: "Côté achat",
79
105
  askSide: "Côté vente",
106
+ bubbleHint: "Aire de la bulle = volume",
80
107
  name: "Carte de chaleur de la liquidité"
81
108
  }
82
- }, ye = (e, t, n, r) => {
109
+ }, _e = (e, t, n, r) => {
83
110
  if (!(e > 0) || !(t > 0)) return 0;
84
111
  let i = Math.min(1, e * r / t);
85
112
  switch (n) {
86
113
  case "linear": return i;
87
- case "sqrt": return Math.sqrt(i);
88
- default: return Math.log10(1 + 9 * i);
114
+ case "log": return Math.log10(1 + 9 * i) ** 1.2;
115
+ default: return Math.sqrt(i);
116
+ }
117
+ }, F = 48, I = (e, t) => {
118
+ if (!(t >= e.min) || !(e.max > e.min)) return 0;
119
+ let n = Math.log(t / e.min) / Math.log(e.max / e.min), r = Math.min(47.999999, Math.max(0, n * F)), i = Math.floor(r), a = r - i, o = e.cdf[i] ?? 0;
120
+ return o + ((e.cdf[i + 1] ?? o) - o) * a;
121
+ }, ve = (e, t = 0) => {
122
+ let n = Infinity, r = 0, i = 0;
123
+ for (let t = 0; t < e.length; t++) {
124
+ let a = e[t];
125
+ a > 0 && (i++, a < n && (n = a), a > r && (r = a));
89
126
  }
90
- }, T = (T, be = {}) => {
91
- let E = be, D = c(), xe = v(), O = h(E, 2, 4), k = {
127
+ if (!i || !(r > n)) return null;
128
+ let a = /* @__PURE__ */ new Float32Array(49), o = Math.log(r / n);
129
+ for (let t = 0; t < e.length; t++) {
130
+ let r = e[t];
131
+ if (!(r > 0)) continue;
132
+ let i = Math.log(r / n) / o;
133
+ a[Math.min(F, Math.floor(i * F))] += 1;
134
+ }
135
+ let s = 0;
136
+ for (let e = 0; e <= F; e++) s += a[e], a[e] = s / i;
137
+ return {
138
+ version: t,
139
+ min: n,
140
+ max: r,
141
+ cdf: a
142
+ };
143
+ }, ye = (e, t, n) => (r) => {
144
+ let i = Math.min(1, Math.max(0, n(r)));
145
+ if (!e || !(t > 0)) return i;
146
+ let a = I(e, r * t);
147
+ return Math.min(1, .55 * i + .45 * a);
148
+ }, L = (e, i = {}) => {
149
+ let s = i, N = f(), F = ne(), I = y(s, 2, 4), L = {
92
150
  up: [
93
151
  0,
94
152
  0,
@@ -101,43 +159,43 @@ var fe = 256, C = 4096, w = .98, pe = 1.4, me = [
101
159
  0,
102
160
  1
103
161
  ]
104
- }, A = new Uint32Array(fe), Se = new Uint32Array(y + 1), j = [
162
+ }, be = new Uint32Array(M), xe = new Uint32Array(E + 1), Se = (e) => Math.sqrt(e), Ce = null, we = [
105
163
  0,
106
164
  0,
107
165
  0,
108
166
  1
109
- ], Ce = !1, M = 0, N = [], we = 0, P = NaN, F = {
167
+ ], Te = !1, R = 0, z = [], Ee = 0, B = NaN, V = {
110
168
  buyVolume: 0,
111
169
  buyNotional: 0,
112
170
  sellVolume: 0,
113
171
  sellNotional: 0
114
- }, Te = null, I = NaN, Ee = 0, L = 0, R = 0, De = -Infinity, Oe = 0, z = 0, B = null, ke = "", Ae = "", V = null, H = null, je = 0, Me = !1, Ne = () => {}, Pe = new Promise((e) => {
115
- Ne = e;
116
- }), Fe = !0, U = NaN, W = [0, 1], G = [0, 1], Ie = !1, K = null, q = NaN, J = NaN, Le = 0, Y = {
172
+ }, De = null, Oe = NaN, ke = 0, H = 0, Ae = 0, je = -Infinity, Me = 0, Ne = 0, U = null, Pe = "", Fe = "", Ie = null, W = null, Le = 0, Re = !1, ze = () => {}, Be = new Promise((e) => {
173
+ ze = e;
174
+ }), Ve = !0, G = NaN, K = [0, 1], q = [0, 1], He = !1, J = null, Ue = NaN, We = NaN, Ge = 0, Y = {
117
175
  x: 0,
118
176
  y: 0,
119
177
  w: 0,
120
178
  h: 0
121
- }, Re = null, ze = "", X = null, Z = re(T, {
179
+ }, Ke = null, qe = "", X = null, Z = C(e, {
122
180
  className: "minerva-orderbook-heatmap",
123
- draw: pt,
181
+ draw: Tt,
124
182
  onTheme: () => {
125
- Je(), Z.invalidate();
183
+ nt(), Z.invalidate();
126
184
  }
127
- }), { root: Q, doc: Be } = Z;
185
+ }), { root: Q, doc: Je } = Z;
128
186
  Q.tabIndex = 0, Q.setAttribute("role", "figure"), Q.style.touchAction = "none";
129
- let Ve = i(ve, E.locale, E.labels), He = () => Ve, Ue = () => {
130
- Ve = i(ve, E.locale, E.labels), Q.setAttribute("aria-label", E.ariaLabel ?? Ve.name);
131
- }, $ = () => Math.max(10, E.interval ?? 100), We = () => Math.max($() * 4, E.history ?? 3e5), Ge = () => Math.max(4, Math.round(E.depth ?? 160)), Ke = () => {
132
- if (!Number.isFinite(I)) return Date.now();
133
- let e = qe() - Ee;
134
- return I + Math.min(Math.max(0, e), $() * 3);
135
- }, qe = () => typeof performance < "u" ? performance.now() : Date.now();
136
- function Je() {
137
- let t = Z.theme;
138
- k = ne(t, E);
139
- let r = (e) => {
140
- let n = t.resolve ? t.resolve(e, t.primary) : t.primary;
187
+ let Ye = c(ge, s.locale, s.labels), Xe = () => Ye, Ze = () => {
188
+ Ye = c(ge, s.locale, s.labels), Q.setAttribute("aria-label", s.ariaLabel ?? Ye.name);
189
+ }, $ = () => Math.max(10, s.interval ?? 100), Qe = () => Math.max($() * 4, s.history ?? 3e5), $e = () => Math.max(4, Math.round(s.depth ?? 160)), et = () => {
190
+ if (!Number.isFinite(Oe)) return Date.now();
191
+ let e = tt() - ke;
192
+ return Oe + Math.min(Math.max(0, e), $() * 3);
193
+ }, tt = () => typeof performance < "u" ? performance.now() : Date.now();
194
+ function nt() {
195
+ let e = Z.theme;
196
+ L = S(e, s);
197
+ let n = (t) => {
198
+ let n = e.resolve ? e.resolve(t, e.primary) : e.primary;
141
199
  return [
142
200
  n[0],
143
201
  n[1],
@@ -145,25 +203,32 @@ var fe = 256, C = 4096, w = .98, pe = 1.4, me = [
145
203
  1
146
204
  ];
147
205
  }, i = [
148
- t.background[0],
149
- t.background[1],
150
- t.background[2],
206
+ e.background[0],
207
+ e.background[1],
208
+ e.background[2],
151
209
  1
152
210
  ];
153
- Ce = t.background[3] > 0 && e(i) < .4;
154
- let a = (E.colors?.length ? E.colors : Ce ? me : he).map(r);
155
- j = a[0] ?? i, A = n(a.length > 1 ? a : [j, j], fe);
156
- let o = E.colorScale ?? "log";
157
- Se = x(A, (e) => ye(e, 1, o, 1) ** pe), Ae = "";
211
+ if (Te = e.background[3] > 0 && t(i) < .4, s.colors?.length) {
212
+ let e = s.colors.map(n);
213
+ we = e[0] ?? i, be = r(e.length > 1 ? e : [we, we], M);
214
+ } else {
215
+ let e = (Te ? le : ue).map(([e, t]) => [e, a(t) ?? i]);
216
+ we = e[0][1], be = me(e, M);
217
+ }
218
+ let o = s.colorScale ?? "sqrt";
219
+ Se = (e) => _e(e, 1, o, 1), xe = k(be, Se), Fe = "";
158
220
  }
159
- let Ye = () => {
160
- O = h(E, M > 0 ? Math.max(l(M), u(D)) : u(D), d(D));
161
- }, Xe = () => {
162
- N = [], B = null, ke = Ae = "", V = null, P = NaN, L = R = 0, De = -Infinity, Oe = 0, z = 0, J = NaN, F.buyVolume = F.buyNotional = F.sellVolume = F.sellNotional = 0;
163
- }, Ze = () => {
164
- if (M > 0) return;
165
- let e = f(D), t = D.mid();
166
- if (E.tickSize && E.tickSize > 0) M = E.tickSize;
221
+ let rt = () => {
222
+ I = y(s, R > 0 ? Math.max(p(R), m(N)) : m(N), h(N));
223
+ }, it = (e) => {
224
+ let t = s.sizeUnit?.trim();
225
+ return t ? `${e} ${t}` : e;
226
+ }, at = () => {
227
+ z = [], U = null, Pe = Fe = "", Ie = null, Ce = null, B = NaN, H = Ae = 0, je = -Infinity, Me = 0, Ne = 0, We = NaN, V.buyVolume = V.buyNotional = V.sellVolume = V.sellNotional = 0;
228
+ }, ot = () => {
229
+ if (R > 0) return;
230
+ let e = g(N), t = N.mid();
231
+ if (s.tickSize && s.tickSize > 0) R = s.tickSize;
167
232
  else if (e > 0 && Number.isFinite(t)) {
168
233
  let n = t * 1e-5 / e, r = 1;
169
234
  for (let e = 1; e <= 1e9 && r < n * .75; e *= 10) for (let t of [
@@ -171,15 +236,15 @@ var fe = 256, C = 4096, w = .98, pe = 1.4, me = [
171
236
  2,
172
237
  5
173
238
  ]) if (r = t * e, r >= n * .75) break;
174
- M = p(e * r, e);
175
- } else M = Number.isFinite(t) ? Math.max(1e-8, t * 1e-5) : 0;
176
- M > 0 && Ye();
177
- }, Qe = () => {
178
- let e = Ge(), t = new Float64Array(e * 2), n = new Float32Array(e * 2), r = 0;
239
+ R = _(e * r, e);
240
+ } else R = Number.isFinite(t) ? Math.max(1e-8, t * 1e-5) : 0;
241
+ R > 0 && rt();
242
+ }, st = () => {
243
+ let e = $e(), t = new Float64Array(e * 2), n = new Float32Array(e * 2), r = 0;
179
244
  for (let i of ["bid", "ask"]) {
180
- let a = D.count(i), o = 0;
245
+ let a = N.count(i), o = 0;
181
246
  for (let s = 0; s < a; s++) {
182
- let a = Math.round(D.priceAt(i, s) / M), c = D.sizeAt(i, s);
247
+ let a = Math.round(N.priceAt(i, s) / R), c = N.sizeAt(i, s);
183
248
  if (r > 0 && t[r - 1] === a && o > 0) {
184
249
  n[r - 1] += c;
185
250
  continue;
@@ -192,111 +257,113 @@ var fe = 256, C = 4096, w = .98, pe = 1.4, me = [
192
257
  bins: t.slice(0, r),
193
258
  sizes: n.slice(0, r)
194
259
  };
195
- }, $e = (e) => {
196
- if (!(M > 0)) return;
197
- let { bins: t, sizes: n } = Qe(), r = {
198
- seq: we++,
260
+ }, ct = (e) => {
261
+ if (!(R > 0)) return;
262
+ let { bins: t, sizes: n } = st(), r = {
263
+ seq: Ee++,
199
264
  time: e,
200
265
  bins: t,
201
266
  sizes: n,
202
- bestBid: D.bestBid(),
203
- bestAsk: D.bestAsk(),
204
- buyVolume: F.buyVolume,
205
- buyNotional: F.buyNotional,
206
- sellVolume: F.sellVolume,
207
- sellNotional: F.sellNotional
267
+ bestBid: N.bestBid(),
268
+ bestAsk: N.bestAsk(),
269
+ buyVolume: V.buyVolume,
270
+ buyNotional: V.buyNotional,
271
+ sellVolume: V.sellVolume,
272
+ sellNotional: V.sellNotional
208
273
  };
209
- F.buyVolume = F.buyNotional = F.sellVolume = F.sellNotional = 0, N.push(r);
210
- let i = e - We(), a = 0;
211
- for (; a < N.length && N[a].time < i;) a++;
212
- a && (N = N.slice(a));
213
- }, et = (e) => {
274
+ V.buyVolume = V.buyNotional = V.sellVolume = V.sellNotional = 0, z.push(r);
275
+ let i = e - Qe(), a = 0;
276
+ for (; a < z.length && z[a].time < i;) a++;
277
+ a && (z = z.slice(a));
278
+ }, lt = (e) => {
214
279
  if (!Number.isFinite(e)) return;
215
280
  let t = $();
216
- if (!Number.isFinite(P)) {
217
- P = Math.floor(e / t) * t;
281
+ if (!Number.isFinite(B)) {
282
+ B = Math.floor(e / t) * t;
218
283
  return;
219
284
  }
220
- if (e - P > We()) {
221
- $e(P), P = Math.floor(e / t) * t;
285
+ if (e - B > Qe()) {
286
+ ct(B), B = Math.floor(e / t) * t;
222
287
  return;
223
288
  }
224
- for (; e >= P + t;) $e(P), P += t;
225
- }, tt = (e) => e === void 0 || !Number.isFinite(e) ? Date.now() : ((!Number.isFinite(I) || e >= I) && (I = e, Ee = qe()), e), nt = (e) => {
226
- if (Number.isFinite(P) && e >= P) return null;
227
- let t = 0, n = N.length;
289
+ for (; e >= B + t;) ct(B), B += t;
290
+ }, ut = (e) => e === void 0 || !Number.isFinite(e) ? Date.now() : ((!Number.isFinite(Oe) || e >= Oe) && (Oe = e, ke = tt()), e), dt = (e) => {
291
+ if (Number.isFinite(B) && e >= B) return null;
292
+ let t = 0, n = z.length;
228
293
  for (; t < n;) {
229
294
  let r = t + n >>> 1;
230
- N[r].time <= e ? t = r + 1 : n = r;
295
+ z[r].time <= e ? t = r + 1 : n = r;
231
296
  }
232
- return t > 0 ? N[t - 1] : null;
233
- }, rt = () => {
234
- if (!Number.isFinite(P) || !(M > 0)) return null;
235
- let e = D.version();
236
- return (!V || V.version !== e) && (V = {
297
+ return t > 0 ? z[t - 1] : null;
298
+ }, ft = () => {
299
+ if (!Number.isFinite(B) || !(R > 0)) return null;
300
+ let e = N.version();
301
+ return (!Ie || Ie.version !== e) && (Ie = {
237
302
  version: e,
238
- ...Qe()
303
+ ...st()
239
304
  }), {
240
- time: P,
241
- bins: V.bins,
242
- sizes: V.sizes
305
+ time: B,
306
+ bins: Ie.bins,
307
+ sizes: Ie.sizes
243
308
  };
244
- }, it = (e, t, n, r, i, a) => {
245
- let o = $(), s = rt(), c = Math.min(C, Math.ceil(Y.w)), l = Math.min(C, Math.ceil(Y.h)), u = N.length ? N[N.length - 1].seq : -1, d = [
309
+ }, pt = (e, t, n, r, i, a) => {
310
+ let o = $(), c = ft(), l = Math.min(se, Math.ceil(Y.w)), u = Math.min(se, Math.ceil(Y.h)), d = he(R / (r - n) * Y.h), f = z.length ? z[z.length - 1].seq : -1, p = [
246
311
  e,
247
312
  t,
248
313
  n,
249
314
  r,
250
315
  Math.floor(i / o),
251
- N.length,
252
- u,
253
- V?.version ?? -1,
254
- c,
316
+ z.length,
317
+ f,
318
+ Ie?.version ?? -1,
255
319
  l,
256
- M
320
+ u,
321
+ d,
322
+ R
257
323
  ].join("|");
258
- if (d !== ke) {
259
- let a = s ? [...N, s] : N;
260
- B = oe({
324
+ if (p !== Pe) {
325
+ let a = c ? [...z, c] : z;
326
+ U = D({
261
327
  sources: a,
262
328
  step: o,
263
- tick: M,
329
+ tick: R,
264
330
  x0: e,
265
331
  x1: t,
266
332
  y0: n,
267
333
  y1: r,
268
334
  end: i,
269
- maxWidth: c,
270
- maxHeight: l
271
- }, B), ke = d, Ae = "";
335
+ maxWidth: l,
336
+ maxHeight: u,
337
+ rowBins: d
338
+ }, U), Pe = p, Fe = "";
272
339
  }
273
- if (!B) return null;
274
- let f = E.maxSize;
275
- if (f !== void 0 && f > 0) L = f;
340
+ if (!U) return null;
341
+ let m = s.maxSize;
342
+ if (m !== void 0 && m > 0) H = m;
276
343
  else {
277
- let e = qe();
278
- if (e - De > 250 || !(R > 0)) {
279
- let t = se(B.cells, w);
280
- t > 0 && (R = t), De = e;
344
+ let e = tt();
345
+ if (e - je > 250 || !(Ae > 0)) {
346
+ let t = A(U.cells, ce);
347
+ t > 0 && (Ae = t), je = e, Ce = ve(U.cells, U.version);
281
348
  }
282
- L > 0 ? R > 0 && Math.abs(R / L - 1) > .001 && (L += (R - L) * g(a, 700)) : L = R;
349
+ H > 0 ? Ae > 0 && Math.abs(Ae / H - 1) > .001 && (H += (Ae - H) * b(a, 700)) : H = Ae;
283
350
  }
284
- let p = Math.max(.01, E.contrast ?? 1), m = L > 0 ? y * p / L : 0;
285
- return `${B.version}|${m}` !== Ae && (S(B, Se, m), Ae = `${B.version}|${m}`), B;
286
- }, at = () => {
287
- let e = $(), t = [], n = 0, r = N.length;
351
+ let h = Math.max(.01, s.contrast ?? 1), g = H > 0 ? E * h / H : 0, _ = `${U.version}|${g}|${Ce?.version ?? -1}`;
352
+ return _ !== Fe && (xe = k(be, ye(Ce, H / h, Se)), re(U, xe, g), Fe = _), U;
353
+ }, mt = () => {
354
+ let e = $(), t = [], n = 0, r = z.length;
288
355
  for (; n < r;) {
289
356
  let t = n + r >>> 1;
290
- N[t].time + e < W[0] ? n = t + 1 : r = t;
357
+ z[t].time + e < K[0] ? n = t + 1 : r = t;
291
358
  }
292
- for (let e = n; e < N.length; e++) {
293
- let n = N[e];
294
- if (n.time > W[1]) break;
359
+ for (let e = n; e < z.length; e++) {
360
+ let n = z[e];
361
+ if (n.time > K[1]) break;
295
362
  t.push(n);
296
363
  }
297
364
  return t;
298
- }, ot = (e, t) => {
299
- let n = $(), r = Math.max(1, Math.ceil(_e / Math.max(1e-6, t))), i = [], a = NaN, o = 0, s = 0, c = {
365
+ }, ht = (e, t) => {
366
+ let n = $(), r = Math.max(1, Math.ceil(fe / Math.max(1e-6, t))), i = [], a = NaN, o = 0, s = 0, c = {
300
367
  bv: 0,
301
368
  bn: 0,
302
369
  sv: 0,
@@ -319,324 +386,380 @@ var fe = 256, C = 4096, w = .98, pe = 1.4, me = [
319
386
  u !== a && (Number.isFinite(a) && l(), a = u, o = t), s = t + n, c.bv += i.buyVolume, c.bn += i.buyNotional, c.sv += i.sellVolume, c.sn += i.sellNotional;
320
387
  };
321
388
  for (let t of e) u(t.seq, t.time, t);
322
- return Number.isFinite(P) && P <= W[1] && u(we, P, F), Number.isFinite(a) && l(), i;
323
- }, st = (e) => {
389
+ return Number.isFinite(B) && B <= K[1] && u(Ee, B, V), Number.isFinite(a) && l(), i;
390
+ }, gt = (e) => {
324
391
  e.save(), e.beginPath(), e.rect(Y.x, Y.y, Y.w, Y.h), e.clip();
325
- }, ct = (e, t, n, i, a) => {
326
- if (E.bestLines === !1) return;
327
- let o = $(), s = t.map((e) => [
392
+ }, _t = (e, t, n, r, i) => {
393
+ if (s.bestLines === !1) return;
394
+ let a = $(), c = t.map((e) => [
328
395
  e.time,
329
- e.time + o,
396
+ e.time + a,
330
397
  e.bestBid,
331
398
  e.bestAsk
332
399
  ]);
333
- if (Number.isFinite(P) && s.push([
334
- P,
335
- P + o,
336
- D.bestBid(),
337
- D.bestAsk()
338
- ]), !s.length) return;
339
- for (let e = 0; e + 1 < s.length; e++) s[e][1] = s[e + 1][0];
340
- let c = a >= 2, l = (e) => {
400
+ if (Number.isFinite(B) && c.push([
401
+ B,
402
+ B + a,
403
+ N.bestBid(),
404
+ N.bestAsk()
405
+ ]), !c.length) return;
406
+ for (let e = 0; e + 1 < c.length; e++) c[e][1] = c[e + 1][0];
407
+ let l = i >= 2, u = (e) => {
341
408
  let t = n(e[0]), r = n(e[1]);
342
- return c ? [t, r] : [(t + r) / 2, (t + r) / 2];
409
+ return l ? [t, r] : [(t + r) / 2, (t + r) / 2];
343
410
  };
344
- st(e), e.beginPath();
345
- let u = [], d = () => {
346
- if (u.length) {
347
- u.forEach((t, n) => {
348
- let [r, a] = l(t), o = i(t[3]);
349
- n ? e.lineTo(r, o) : e.moveTo(r, o), e.lineTo(a, o);
411
+ gt(e), e.beginPath();
412
+ let d = [], f = () => {
413
+ if (d.length) {
414
+ d.forEach((t, n) => {
415
+ let [i, a] = u(t), o = r(t[3]);
416
+ n ? e.lineTo(i, o) : e.moveTo(i, o), e.lineTo(a, o);
350
417
  });
351
- for (let t = u.length - 1; t >= 0; t--) {
352
- let [n, r] = l(u[t]), a = i(u[t][2]);
353
- e.lineTo(r, a), e.lineTo(n, a);
418
+ for (let t = d.length - 1; t >= 0; t--) {
419
+ let [n, i] = u(d[t]), a = r(d[t][2]);
420
+ e.lineTo(i, a), e.lineTo(n, a);
354
421
  }
355
- e.closePath(), u = [];
422
+ e.closePath(), d = [];
356
423
  }
357
424
  };
358
- for (let e of s) {
425
+ for (let e of c) {
359
426
  let [, , t, n] = e;
360
- Number.isFinite(t) && Number.isFinite(n) && n > t ? u.push(e) : d();
427
+ Number.isFinite(t) && Number.isFinite(n) && n > t ? d.push(e) : f();
361
428
  }
362
- d(), e.fillStyle = r(Z.theme.text, Ce ? .08 : .07), e.fill(), e.lineJoin = "round";
363
- for (let [t, n] of [[2, k.up], [3, k.down]]) {
429
+ f(), e.fillStyle = o(Z.theme.text, Te ? .08 : .07), e.fill(), e.lineJoin = "round";
430
+ for (let [t, n] of [[2, L.up], [3, L.down]]) {
364
431
  e.beginPath();
365
- let a = !1;
366
- for (let n of s) {
367
- let r = n[t];
368
- if (!Number.isFinite(r)) {
369
- a = !1;
432
+ let i = !1;
433
+ for (let n of c) {
434
+ let a = n[t];
435
+ if (!Number.isFinite(a)) {
436
+ i = !1;
370
437
  continue;
371
438
  }
372
- let o = i(r), [s, u] = l(n);
373
- a ? e.lineTo(s, o) : e.moveTo(s, o), c && e.lineTo(u, o), a = !0;
439
+ let o = r(a), [s, c] = u(n);
440
+ i ? e.lineTo(s, o) : e.moveTo(s, o), l && e.lineTo(c, o), i = !0;
374
441
  }
375
- e.strokeStyle = r(j, .55), e.lineWidth = 3.5, e.stroke(), e.strokeStyle = r(n), e.lineWidth = 1.5, e.stroke();
442
+ e.strokeStyle = o(we, .55), e.lineWidth = 3.5, e.stroke(), e.strokeStyle = o(n), e.lineWidth = 1.5, e.stroke();
376
443
  }
377
444
  e.restore();
378
- }, lt = (e, n, i, a, o) => {
379
- if (!n.length) return;
380
- let s = 0;
381
- for (let e of n) s = Math.max(s, e.volume);
382
- Oe = Oe > 0 ? Math.max(s, Oe * .995) : s;
383
- let c = E.bubbleVolume ?? Oe, l = Math.max(4, E.bubbleSize ?? 28), u = n.map((e) => ({
445
+ }, vt = (e, t, r, i, a) => {
446
+ if (!t.length) return;
447
+ let c = 0;
448
+ for (let e of t) {
449
+ let t = r(e.time);
450
+ t >= Y.x && t <= Y.x + Y.w && (c = Math.max(c, e.volume));
451
+ }
452
+ c > 0 && (Me = Me > 0 ? Math.max(c, Me * .995) : c);
453
+ let l = s.bubbleVolume ?? Me;
454
+ if (!(l > 0)) return;
455
+ let u = Math.max(P, s.bubbleSize ?? pe), d = Math.min(P, u), f = t.map((e) => ({
384
456
  ...e,
385
- d: m(Math.sqrt(e.volume / c) * l, 3, l)
457
+ d: v(Math.sqrt(e.volume / l) * u, d, u)
386
458
  })).sort((e, t) => e.d - t.d);
387
- st(e), e.lineWidth = 1.25, e.textAlign = "center", e.textBaseline = "middle", e.font = ee(Z.theme, E, 600, Math.max(8, o - 1));
388
- for (let n of u) {
389
- let o = i(n.time), s = a(n.price), c = n.d / 2;
390
- if (o < Y.x - c || o > Y.x + Y.w + c || s < Y.y - c || s > Y.y + Y.h + c) continue;
391
- let l = n.buy ? k.up : k.down;
392
- if (e.beginPath(), e.arc(o, s, c, 0, Math.PI * 2), e.fillStyle = r(l, .62), e.fill(), e.strokeStyle = r(t(l, [
393
- 1,
394
- 1,
395
- 1,
396
- 1
397
- ], .25)), e.stroke(), n.d >= 26) {
398
- let t = O.compact(n.volume);
399
- e.measureText(t).width <= n.d - 6 && (e.fillStyle = "#fff", e.fillText(t, o, s + .5));
459
+ gt(e), e.lineWidth = 1, e.textAlign = "center", e.textBaseline = "middle", e.font = x(Z.theme, s, 600, Math.max(8, a - 1));
460
+ let p = Te ? [
461
+ 1,
462
+ 1,
463
+ 1,
464
+ 1
465
+ ] : [
466
+ 0,
467
+ 0,
468
+ 0,
469
+ 1
470
+ ];
471
+ for (let t of f) {
472
+ let a = r(t.time), s = i(t.price), c = t.d / 2;
473
+ if (a < Y.x - c || a > Y.x + Y.w + c || s < Y.y - c || s > Y.y + Y.h + c) continue;
474
+ let l = t.buy ? L.up : L.down;
475
+ if (e.beginPath(), e.arc(a, s, Math.max(1, c - .5), 0, Math.PI * 2), e.fillStyle = o(l, .35), e.fill(), e.strokeStyle = o(n(l, p, .2), .9), e.stroke(), t.d >= 26) {
476
+ let n = I.compact(t.volume);
477
+ e.measureText(n).width <= t.d - 6 && (e.fillStyle = o(Te ? [
478
+ 1,
479
+ 1,
480
+ 1,
481
+ 1
482
+ ] : [
483
+ .08,
484
+ .08,
485
+ .1,
486
+ 1
487
+ ]), e.fillText(n, a, s + .5));
400
488
  }
401
489
  }
402
490
  e.restore();
403
- }, ut = (e, t, n, i, a) => {
404
- let o = Z.theme, [s, c] = G, l = Math.max(1, M / (c - s) * Y.h), u = 0, d = ["bid", "ask"].map((e) => {
405
- let t = D.levels(e, {
406
- step: M,
407
- limit: Ge()
408
- });
409
- for (let e = 0; e < t.count; e++) {
410
- let n = t.price[e];
411
- n >= s && n <= c && (u = Math.max(u, t.size[e]));
491
+ }, yt = (e, t) => {
492
+ let n = [], r = [], i = N.count(e), a = 0, o = NaN;
493
+ for (let s = 0; s < i; s++) {
494
+ let i = Math.round(N.priceAt(e, s) / R);
495
+ if (i !== o) {
496
+ if (++a > $e()) break;
497
+ o = i;
412
498
  }
413
- return {
414
- side: e,
415
- ...t
416
- };
499
+ let c = Math.floor(i / t), l = N.sizeAt(e, s);
500
+ n.length && n[n.length - 1] === c ? r[r.length - 1] += l : (n.push(c), r.push(l));
501
+ }
502
+ return {
503
+ side: e,
504
+ buckets: n,
505
+ sizes: r
506
+ };
507
+ }, bt = (e, t, n, r, i, a) => {
508
+ let c = Z.theme, [l, u] = q, d = Math.max(1, R * a / (u - l) * Y.h), f = (e) => (e * a - .5) * R, p = (e) => (e * a + a - .5) * R, m = 0, h = ["bid", "ask"].map((e) => {
509
+ let t = yt(e, a);
510
+ return t.buckets.forEach((e, n) => {
511
+ p(e) >= l && f(e) <= u && (m = Math.max(m, t.sizes[n]));
512
+ }), t;
417
513
  });
418
- if ((u > z || u < z * .6 || !(z > 0)) && (z = ce(u)), !(z > 0)) return;
419
- let f = t + 2, p = Math.max(4, n - 6);
420
- e.strokeStyle = r(o.text, .07), e.lineWidth = 1, e.setLineDash([2, 3]), e.beginPath();
514
+ if ((m > Ne || m < Ne * .6 || !(Ne > 0)) && (Ne = j(m)), !(Ne > 0)) return;
515
+ let g = t + 2, _ = Math.max(4, n - 6);
516
+ e.strokeStyle = o(c.text, .07), e.lineWidth = 1, e.setLineDash([2, 3]), e.beginPath();
421
517
  for (let t of [.5, 1]) {
422
- let n = Math.round(f + p * t) - .5;
518
+ let n = Math.round(g + _ * t) - .5;
423
519
  e.moveTo(n, Y.y), e.lineTo(n, Y.y + Y.h);
424
520
  }
425
521
  e.stroke(), e.setLineDash([]), e.save(), e.beginPath(), e.rect(t, Y.y, n, Y.h), e.clip();
426
- let m = +(l >= 4), h = (t, n) => {
427
- let r = Math.round(i(t + M / 2)), a = Math.max(r + 1, Math.round(i(t - M / 2)) - m), o = Math.max(1, Math.min(p, n / z * p));
428
- e.rect(f, r, o, a - r);
522
+ let v = +(d >= 4), y = (t, n) => {
523
+ let i = Math.round(r(p(t))), a = Math.max(i + 1, Math.round(r(f(t))) - v), o = Math.max(1, Math.min(_, n / Ne * _));
524
+ e.rect(g, i, o, a - i);
429
525
  };
430
- for (let { side: t, price: n, size: i, count: a } of d) {
431
- let o = t === "bid" ? k.up : k.down;
526
+ for (let { side: t, buckets: n, sizes: r } of h) {
527
+ let i = t === "bid" ? L.up : L.down;
432
528
  e.beginPath();
433
- for (let e = 1; e < a; e++) {
529
+ for (let e = 1; e < n.length; e++) {
434
530
  let t = n[e];
435
- t >= s - M && t <= c + M && h(t, i[e]);
531
+ p(t) >= l && f(t) <= u && y(t, r[e]);
436
532
  }
437
- e.fillStyle = r(o, Ce ? .62 : .55), e.fill();
438
- let l = n[0];
439
- a && l !== void 0 && l >= s && l <= c && (e.beginPath(), h(l, i[0]), e.fillStyle = r(o), e.fill());
533
+ e.fillStyle = o(i, Te ? .62 : .55), e.fill();
534
+ let a = n[0];
535
+ a !== void 0 && p(a) >= l && f(a) <= u && (e.beginPath(), y(a, r[0]), e.fillStyle = o(i), e.fill());
440
536
  }
441
537
  e.restore();
442
- let g = Math.round(Y.y + Y.h + 4) + .5;
443
- e.strokeStyle = r(o.textMuted, .7), e.beginPath(), e.moveTo(f, g), e.lineTo(f + p, g);
538
+ let b = Math.round(Y.y + Y.h + 4) + .5;
539
+ e.strokeStyle = o(c.textMuted, .7), e.beginPath(), e.moveTo(g, b), e.lineTo(g + _, b);
444
540
  for (let t of [
445
541
  0,
446
542
  .5,
447
543
  1
448
544
  ]) {
449
- let n = Math.round(f + p * t) + .5;
450
- e.moveTo(n, g), e.lineTo(n, g + 3);
451
- }
452
- e.stroke(), e.font = ee(o, E, 400, Math.max(8, a - 1)), e.fillStyle = r(o.textMuted), e.textBaseline = "top";
453
- let te = O.compact(z), _ = e.measureText(te).width;
454
- e.textAlign = "right", e.fillText(te, f + p + 2, g + 4), _ + e.measureText("0").width + 8 < p && (e.textAlign = "left", e.fillText("0", f - 1, g + 4));
455
- }, dt = () => {
456
- if (!Re || E.tooltip === !1 || !(M > 0) || X || !Ie) return null;
457
- let [e, t] = Re;
458
- if (e < Y.x || e > Y.x + Y.w || t < Y.y || t > Y.y + Y.h) return null;
459
- let [n, r] = W, [i, a] = G, o = n + (e - Y.x) / Y.w * (r - n), s = i + (Y.y + Y.h - t) / Y.h * (a - i), c = Math.round(s / M), u = +(c * M).toFixed(Math.min(12, l(M) + 2)), d = nt(o);
545
+ let n = Math.round(g + _ * t) + .5;
546
+ e.moveTo(n, b), e.lineTo(n, b + 3);
547
+ }
548
+ e.stroke(), e.font = x(c, s, 400, Math.max(8, i - 1)), e.fillStyle = o(c.textMuted), e.textBaseline = "top";
549
+ let ee = I.compact(Ne), te = e.measureText(ee).width;
550
+ e.textAlign = "right", e.fillText(ee, g + _ + 2, b + 4), te + e.measureText("0").width + 8 < _ && (e.textAlign = "left", e.fillText("0", g - 1, b + 4));
551
+ }, xt = (e) => {
552
+ if (!Ke || s.tooltip === !1 || !(R > 0) || X || !He) return null;
553
+ let [t, n] = Ke;
554
+ if (t < Y.x || t > Y.x + Y.w || n < Y.y || n > Y.y + Y.h) return null;
555
+ let [r, i] = K, [a, o] = q, c = r + (t - Y.x) / Y.w * (i - r), l = a + (Y.y + Y.h - n) / Y.h * (o - a), u = Math.floor(Math.round(l / R) / e), d = Math.min(12, p(R) + 2), f = +(u * e * R).toFixed(d), m = +((u * e + e - 1) * R).toFixed(d), h = +((f + m) / 2).toFixed(d), g = dt(c);
460
556
  return {
461
- hx: e,
462
- hy: t,
463
- time: o,
464
- start: d ? d.time : Number.isFinite(P) && o >= P ? P : NaN,
465
- column: d,
466
- bin: c,
467
- rowPrice: u
557
+ hx: t,
558
+ hy: n,
559
+ time: c,
560
+ start: g ? g.time : Number.isFinite(B) && c >= B ? B : NaN,
561
+ column: g,
562
+ bucket: u,
563
+ ry: e,
564
+ low: f,
565
+ high: m,
566
+ rowPrice: h
468
567
  };
469
- }, ft = (t, n, i, a, o, s, c, l = "left") => {
470
- let u = Math.min(t.measureText(n).width + 10, o), d = l === "center" ? i - u / 2 : i;
471
- t.fillStyle = r(c ? s : j), _(t, d, a - ge / 2, u, ge, 3), t.fill(), c || (t.strokeStyle = r(s), t.lineWidth = 1, t.stroke()), t.fillStyle = c ? e(s) > .6 ? "#111" : "#fff" : r(s), t.textAlign = l, t.textBaseline = "middle", t.fillText(n, l === "center" ? i : d + 5, a + .5);
568
+ }, St = (e, n, r, i, a, s, c, l = "left") => {
569
+ let u = Math.min(e.measureText(n).width + 10, a), d = l === "center" ? r - u / 2 : r;
570
+ e.fillStyle = o(c ? s : we), te(e, d, i - de / 2, u, de, 3), e.fill(), c || (e.strokeStyle = o(s), e.lineWidth = 1, e.stroke()), e.fillStyle = c ? t(s) > .6 ? "#111" : "#fff" : o(s), e.textAlign = l, e.textBaseline = "middle", e.fillText(n, l === "center" ? r : d + 5, i + .5);
571
+ }, Ct = (e) => `rgb(${e & 255}, ${e >>> 8 & 255}, ${e >>> 16 & 255})`, wt = (e, t) => {
572
+ if (Y.w < 200 || Y.h < 96) return;
573
+ let n = Z.theme, r = Xe(), i = s.sizeUnit?.trim(), a = i ? `${r.liquidity} · ${i}` : r.liquidity, c = x(n, s, 600, t - 1), l = x(n, s, 400, t - 1), u = t - 2, d = H > 0 ? I.size(H) : "–";
574
+ e.font = c;
575
+ let f = e.measureText(a).width;
576
+ e.font = x(n, s, 400, u);
577
+ let p = e.measureText("0").width, m = e.measureText(d).width;
578
+ e.font = l;
579
+ let h = e.measureText(r.bubbleHint).width, g = u + 10, _ = Math.max(76, f, h + g) + 14, v = t - 1, y = 14 + v + 3 + 7 + 2 + u + 6 + v, b = Y.x + 8, ee = Y.y + 8;
580
+ if (b + _ > Y.x + Y.w - 8) return;
581
+ e.fillStyle = o(n.background, Te ? .82 : .88), e.strokeStyle = o(n.axis, .6), e.lineWidth = 1, te(e, b + .5, ee + .5, _, y, 6), e.fill(), e.stroke();
582
+ let S = b + 7;
583
+ e.textAlign = "left", e.textBaseline = "middle", e.font = c, e.fillStyle = o(n.textMuted), e.fillText(a, S, ee + 7 + v / 2);
584
+ let ne = ee + 7 + v + 3, C = e.createLinearGradient(S, ne, S + 76, ne);
585
+ for (let e = 0; e <= 8; e++) {
586
+ let t = e / 8, n = be[Math.round(t * (be.length - 1))] ?? 0;
587
+ C.addColorStop(t, Ct(n));
588
+ }
589
+ e.fillStyle = C, te(e, S, ne, 76, 7, 2), e.fill(), e.font = x(n, s, 400, u), e.fillStyle = o(n.textMuted);
590
+ let w = ne + 7 + 2 + u / 2;
591
+ e.fillText("0", S, w), e.textAlign = "right", e.fillText(d, S + Math.max(76, m + p), w), e.textAlign = "left";
592
+ let T = w + u / 2 + 6 + v / 2, E = u / 2;
593
+ for (let [t, n] of [L.up, L.down].entries()) e.fillStyle = o(n, .9), e.beginPath(), e.arc(S + E + t * (u + 4), T, E, 0, Math.PI * 2), e.fill();
594
+ e.font = l, e.fillStyle = o(n.textMuted), e.fillText(r.bubbleHint, S + g, T);
472
595
  };
473
- function pt(e) {
596
+ function Tt(e) {
474
597
  let t = Z.ctx;
475
598
  if (!t) return !1;
476
- let { width: n, height: i, dpr: o, theme: c } = Z, l = Le ? e - Le : 0;
477
- Le = e;
478
- let u = He(), d = E.fontSize ?? (n < 420 ? 10 : 11), f = ee(c, E, 400, d), p = ee(c, E, 600, d), h = $(), _ = !Number.isFinite(I);
479
- _ && D.count("bid") + D.count("ask") > 0 && et(Date.now());
480
- let ne = Ke();
481
- J = Number.isFinite(J) && ne > J - h * 4 ? Math.max(J, ne) : ne;
482
- let v = J;
483
- t.setTransform(o, 0, 0, o, 0, 0), t.clearRect(0, 0, n, i), Ze();
484
- let re = D.mid();
599
+ let { width: n, height: r, dpr: i, theme: a } = Z, c = Ge ? e - Ge : 0;
600
+ Ge = e;
601
+ let u = Xe(), f = s.fontSize ?? (n < 420 ? 10 : 11), p = x(a, s, 400, f), m = x(a, s, 600, f), h = $(), g = !Number.isFinite(Oe);
602
+ g && N.count("bid") + N.count("ask") > 0 && lt(Date.now());
603
+ let _ = et();
604
+ We = Number.isFinite(We) && _ > We - h * 4 ? Math.max(We, _) : _;
605
+ let y = We;
606
+ t.setTransform(i, 0, 0, i, 0, 0), t.clearRect(0, 0, n, r), ot();
607
+ let te = N.mid();
608
+ t.font = m;
609
+ let S = I.price(Number.isFinite(te) ? te * 1.0001 : 0), ne = Math.ceil(t.measureText(S).width) + 18;
485
610
  t.font = p;
486
- let ie = O.price(Number.isFinite(re) ? re * 1.0001 : 0), ae = Math.ceil(t.measureText(ie).width) + 18;
487
- t.font = f;
488
- let y = E.profile === !1 ? 0 : Math.round(m(n * .12, 56, 120)), oe = d + 12;
611
+ let C = s.profile === !1 ? 0 : Math.round(v(n * .12, 56, 120)), w = f + 12;
489
612
  Y = {
490
613
  x: 0,
491
614
  y: 0,
492
- w: Math.max(10, n - ae - y),
493
- h: Math.max(10, i - oe)
615
+ w: Math.max(10, n - ne - C),
616
+ h: Math.max(10, r - w)
494
617
  };
495
- let b = Y.x + Y.w, x = b + y;
496
- if (Number.isFinite(U) || (U = Math.max(h * 10, E.window ?? 6e4)), Fe) {
497
- let e = N.length ? N[0].time : P;
498
- W = ue(e, v, U, Math.min(U, h * 60));
499
- let t = D.bestBid(), n = D.bestAsk();
500
- for (let e of at()) Number.isFinite(e.bestBid) && !(e.bestBid >= t) && (t = e.bestBid), Number.isFinite(e.bestAsk) && !(e.bestAsk <= n) && (n = e.bestAsk);
618
+ let T = Y.x + Y.w, E = T + C;
619
+ if (Number.isFinite(G) || (G = Math.max(h * 10, s.window ?? 6e4)), Ve) {
620
+ let e = z.length ? z[0].time : B;
621
+ K = ae(e, y, G, Math.min(G, h * 60));
622
+ let t = N.bestBid(), n = N.bestAsk();
623
+ for (let e of mt()) Number.isFinite(e.bestBid) && !(e.bestBid >= t) && (t = e.bestBid), Number.isFinite(e.bestAsk) && !(e.bestAsk <= n) && (n = e.bestAsk);
501
624
  Number.isFinite(t) || (t = n), Number.isFinite(n) || (n = t);
502
- let r = M > 0 ? M * Math.max(40, Y.h / 6) : 0, i = E.priceSpan ?? (Number.isFinite(q) ? q : void 0);
625
+ let r = R > 0 ? R * Math.max(40, Y.h / 6) : 0, i = s.priceSpan ?? (Number.isFinite(Ue) ? Ue : void 0);
503
626
  if (r > 0 || i !== void 0) {
504
- K = le(K, t, n, r, i);
505
- let [e, a] = K;
627
+ J = ie(J, t, n, r, i);
628
+ let [e, a] = J;
506
629
  if (Number.isFinite(e) && Number.isFinite(a)) {
507
- if (!Ie) G = [e, a], Ie = !0;
630
+ if (!He) q = [e, a], He = !0;
508
631
  else {
509
- let t = g(l, 280);
510
- G = [G[0] + (e - G[0]) * t, G[1] + (a - G[1]) * t];
632
+ let t = b(c, 280);
633
+ q = [q[0] + (e - q[0]) * t, q[1] + (a - q[1]) * t];
511
634
  }
512
635
  }
513
636
  }
514
637
  }
515
- let [S, se] = W, [ce, fe] = G, C = (e) => Y.x + (e - S) / (se - S) * Y.w, w = (e) => Y.y + Y.h - (e - ce) / (fe - ce) * Y.h, pe = Ie && M > 0, me = at(), he = h / (se - S) * Y.w, _e = r(j);
516
- if (H) {
517
- let e = H.canvas;
638
+ let [D, O] = K, [k, re] = q, A = (e) => Y.x + (e - D) / (O - D) * Y.w, j = (e) => Y.y + Y.h - (e - k) / (re - k) * Y.h, M = He && R > 0, se = mt(), ce = h / (O - D) * Y.w, le = M ? he(R / (re - k) * Y.h) : 1, ue = o(we);
639
+ if (W) {
640
+ let e = W.canvas;
518
641
  e.style.left = `${Y.x}px`, e.style.top = `${Y.y}px`, e.style.width = `${Y.w}px`, e.style.height = `${Y.h}px`;
519
- let t = Math.max(1, Math.round(Y.w * o)), n = Math.max(1, Math.round(Y.h * o));
520
- (e.width !== t || e.height !== n) && H.resize(t, n);
521
- let r = pe && Number.isFinite(P) ? it(S, se, ce, fe, v, l) : null, i = t / Y.w, a = n / Y.h, s = r ? [
522
- (C(r.t0) - Y.x) * i,
523
- (w(r.p1) - Y.y) * a,
524
- (C(r.t1) - Y.x) * i,
525
- (w(r.p0) - Y.y) * a
642
+ let t = Math.max(1, Math.round(Y.w * i)), n = Math.max(1, Math.round(Y.h * i));
643
+ (e.width !== t || e.height !== n) && W.resize(t, n);
644
+ let r = M && Number.isFinite(B) ? pt(D, O, k, re, y, c) : null;
645
+ r && (le = r.rowBins);
646
+ let a = t / Y.w, o = n / Y.h, s = r ? [
647
+ (A(r.t0) - Y.x) * a,
648
+ (j(r.p1) - Y.y) * o,
649
+ (A(r.t1) - Y.x) * a,
650
+ (j(r.p0) - Y.y) * o
526
651
  ] : [
527
652
  0,
528
653
  0,
529
654
  0,
530
655
  0
531
656
  ];
532
- H.render(r, s, j);
533
- } else t.fillStyle = _e, t.fillRect(Y.x, Y.y, Y.w, Y.h);
534
- let ve = pe ? a(ce, fe, Math.max(2, Math.floor(Y.h / 44))) : [], ye = s(S, se, Math.max(2, Math.floor(Y.w / 75)), void 0, E.timeZone ?? "local");
535
- t.strokeStyle = r(c.text, Ce ? .07 : .09), t.lineWidth = 1, t.beginPath();
536
- for (let e of ve) {
537
- let n = Math.round(w(e)) + .5;
538
- t.moveTo(Y.x, n), t.lineTo(x, n);
539
- }
540
- for (let e of ye.values) {
541
- let n = Math.round(C(e)) + .5;
542
- n <= Y.x + 1 || n >= b - 1 || (t.moveTo(n, Y.y), t.lineTo(n, Y.y + Y.h));
543
- }
544
- t.stroke(), pe && (ct(t, me, C, w, he), E.bubbles !== !1 && lt(t, ot(me, he), C, w, d), y && ut(t, b, y, w, d)), t.strokeStyle = r(c.axis), t.lineWidth = 1, t.beginPath(), t.moveTo(0, Math.round(Y.y + Y.h) + .5), t.lineTo(n, Math.round(Y.y + Y.h) + .5), y && (t.moveTo(Math.round(b) + .5, Y.y), t.lineTo(Math.round(b) + .5, Y.y + Y.h)), t.moveTo(Math.round(x) + .5, Y.y), t.lineTo(Math.round(x) + .5, Y.y + Y.h), t.stroke();
545
- let T = pe ? dt() : null;
546
- t.font = f;
547
- let be = T ? te(Number.isFinite(T.start) ? T.start : T.time, h < 1e3, E.timeZone) : "", xe = T ? t.measureText(be).width / 2 + 8 : 0;
548
- t.fillStyle = r(c.textMuted), t.textAlign = "center", t.textBaseline = "top";
549
- for (let e of ye.values) {
550
- let n = C(e), r = ye.format(e), i = t.measureText(r).width / 2;
551
- n - i < Y.x + 2 || n + i > b - 2 || T && Math.abs(n - T.hx) < xe + i || t.fillText(r, n, Y.y + Y.h + 6);
552
- }
553
- let A = Te, Se = [{
554
- price: D.bestAsk(),
555
- color: k.down,
657
+ W.render(r, s, we);
658
+ } else t.fillStyle = ue, t.fillRect(Y.x, Y.y, Y.w, Y.h);
659
+ let fe = M ? l(k, re, Math.max(2, Math.floor(Y.h / 44))) : [], pe = d(D, O, Math.max(2, Math.floor(Y.w / 75)), void 0, s.timeZone ?? "local");
660
+ t.strokeStyle = o(a.axis), t.lineWidth = 1, t.beginPath();
661
+ for (let e of fe) {
662
+ let n = Math.round(j(e)) + .5;
663
+ t.moveTo(E, n), t.lineTo(E + 4, n);
664
+ }
665
+ for (let e of pe.values) {
666
+ let n = Math.round(A(e)) + .5;
667
+ n <= Y.x + 1 || n >= T - 1 || (t.moveTo(n, Y.y + Y.h), t.lineTo(n, Y.y + Y.h + 4));
668
+ }
669
+ t.stroke(), M && (s.bubbles !== !1 && vt(t, ht(se, ce), A, j, f), _t(t, se, A, j, ce), C && bt(t, T, C, j, f, le)), t.strokeStyle = o(a.axis), t.lineWidth = 1, t.beginPath(), t.moveTo(0, Math.round(Y.y + Y.h) + .5), t.lineTo(n, Math.round(Y.y + Y.h) + .5), C && (t.moveTo(Math.round(T) + .5, Y.y), t.lineTo(Math.round(T) + .5, Y.y + Y.h)), t.moveTo(Math.round(E) + .5, Y.y), t.lineTo(Math.round(E) + .5, Y.y + Y.h), t.stroke(), s.legend !== !1 && wt(t, f);
670
+ let P = M ? xt(le) : null;
671
+ t.font = p;
672
+ let me = P ? ee(Number.isFinite(P.start) ? P.start : P.time, h < 1e3, s.timeZone) : "", ge = P ? t.measureText(me).width / 2 + 8 : 0;
673
+ t.fillStyle = o(a.textMuted), t.textAlign = "center", t.textBaseline = "top";
674
+ for (let e of pe.values) {
675
+ let n = A(e), r = pe.format(e), i = t.measureText(r).width / 2;
676
+ n - i < Y.x + 2 || n + i > T - 2 || P && Math.abs(n - P.hx) < ge + i || t.fillText(r, n, Y.y + Y.h + 6);
677
+ }
678
+ let _e = De, F = [{
679
+ price: N.bestAsk(),
680
+ color: L.down,
556
681
  filled: !0
557
682
  }, {
558
- price: D.bestBid(),
559
- color: k.up,
683
+ price: N.bestBid(),
684
+ color: L.up,
560
685
  filled: !0
561
686
  }];
562
- A && A.price !== D.bestBid() && A.price !== D.bestAsk() && Se.push({
563
- price: A.price,
564
- color: A.side === "buy" ? k.up : k.down,
687
+ _e && _e.price !== N.bestBid() && _e.price !== N.bestAsk() && F.push({
688
+ price: _e.price,
689
+ color: _e.side === "buy" ? L.up : L.down,
565
690
  filled: !1
566
691
  });
567
- let we = pe ? Se.filter((e) => Number.isFinite(e.price) && e.price >= ce && e.price <= fe) : [], F = T ? Math.round(w(T.rowPrice)) + .5 : NaN, L = de(we.map((e) => ({
568
- y: w(e.price),
569
- h: ge
570
- })), T ? {
571
- y: F,
572
- h: ge
573
- } : null, ve.map(w), d + 2, [Y.y, Y.y + Y.h]);
574
- t.fillStyle = r(c.textMuted), t.textAlign = "left", t.textBaseline = "middle", ve.forEach((e, n) => {
575
- L.ticks[n] && t.fillText(O.price(e), x + 6, w(e));
576
- }), t.font = p, we.forEach((e, i) => {
577
- let a = L.pinned[i];
578
- if (a == null) return;
579
- let o = w(e.price);
580
- Math.abs(a - o) > 1 && (t.strokeStyle = r(e.color), t.lineWidth = 1, t.beginPath(), t.moveTo(x - 4, o), t.lineTo(x + 1, a), t.stroke()), ft(t, O.price(e.price), x + 1, a, n - x - 2, e.color, e.filled);
581
- }), mt(t, C, w, x, u, T, F, be), t.font = f, Z.describe(`${E.ariaLabel ?? u.name}. ${u.bid} ${O.price(D.bestBid())}, ${u.ask} ${O.price(D.bestAsk())}.`);
582
- let R = _ || qe() - Ee < 2e3;
583
- return Fe && R && Number.isFinite(P) || Ie && K !== null && Math.abs(G[0] - K[0]) > 1e-9;
692
+ let ve = M ? F.filter((e) => Number.isFinite(e.price) && e.price >= k && e.price <= re) : [], ye = P ? Math.round(j(P.rowPrice)) + .5 : NaN, be = oe(ve.map((e) => ({
693
+ y: j(e.price),
694
+ h: de
695
+ })), P ? {
696
+ y: ye,
697
+ h: de
698
+ } : null, fe.map(j), f + 2, [Y.y, Y.y + Y.h]);
699
+ t.fillStyle = o(a.textMuted), t.textAlign = "left", t.textBaseline = "middle", fe.forEach((e, n) => {
700
+ be.ticks[n] && t.fillText(I.price(e), E + 6, j(e));
701
+ }), t.font = m, ve.forEach((e, r) => {
702
+ let i = be.pinned[r];
703
+ if (i == null) return;
704
+ let a = j(e.price);
705
+ Math.abs(i - a) > 1 && (t.strokeStyle = o(e.color), t.lineWidth = 1, t.beginPath(), t.moveTo(E - 4, a), t.lineTo(E + 1, i), t.stroke()), St(t, I.price(e.price), E + 1, i, n - E - 2, e.color, e.filled);
706
+ }), Et(t, A, j, E, u, P, ye, me), t.font = p, Z.describe(`${s.ariaLabel ?? u.name}. ${u.bid} ${I.price(N.bestBid())}, ${u.ask} ${I.price(N.bestAsk())}.`);
707
+ let xe = g || tt() - ke < 2e3;
708
+ return Ve && xe && Number.isFinite(B) || He && J !== null && Math.abs(q[0] - J[0]) > 1e-9;
584
709
  }
585
- function mt(e, t, n, i, a, o, s, c) {
586
- let { theme: l } = Z;
587
- if (!o) {
588
- Z.tooltip.style.display = "none", ze && (ze = "", xe.emit("hover", null));
710
+ function Et(e, t, n, r, i, a, c, l) {
711
+ let { theme: u } = Z;
712
+ if (!a) {
713
+ Z.tooltip.style.display = "none", qe && (qe = "", F.emit("hover", null));
589
714
  return;
590
715
  }
591
- let { hx: u, hy: d, time: f, start: p, column: h, bin: g, rowPrice: _ } = o, ne = $(), v = 0, re = NaN, ie = NaN, y = 0, oe = 0;
716
+ let { hx: d, hy: f, time: p, start: m, column: h, bucket: g, ry: _, low: y, high: b, rowPrice: te } = a, S = (e) => Math.floor(e / _) === g, ne = $(), C = 0, w = NaN, E = NaN, D = 0, O = 0;
592
717
  if (h) {
593
- for (let e = 0; e < h.bins.length; e++) h.bins[e] === g && (v += h.sizes[e]);
594
- ({bestBid: re, bestAsk: ie, buyVolume: y, sellVolume: oe} = h);
595
- } else if (Number.isFinite(p)) {
596
- let e = ["bid", "ask"].map((e) => D.levels(e, {
597
- step: M,
598
- limit: Ge()
599
- }));
600
- for (let t of e) for (let e = 0; e < t.count; e++) Math.round(t.price[e] / M) === g && (v += t.size[e]);
601
- re = D.bestBid(), ie = D.bestAsk(), y = F.buyVolume, oe = F.sellVolume;
602
- }
603
- let b = _ <= re ? "bid" : _ >= ie ? "ask" : null;
604
- if (e.strokeStyle = r(l.text, .5), e.lineWidth = 1, e.setLineDash([3, 3]), e.beginPath(), e.moveTo(Math.round(u) + .5, Y.y), e.lineTo(Math.round(u) + .5, Y.y + Y.h), e.moveTo(Y.x, s), e.lineTo(i, s), e.stroke(), e.setLineDash([]), Number.isFinite(p)) {
605
- let i = t(p), a = t(p + ne), o = n(_ + M / 2), s = n(_ - M / 2);
606
- e.strokeStyle = r(l.text, .85), e.strokeRect(i, o, Math.max(2, a - i), Math.max(2, s - o));
607
- }
608
- e.font = ee(l, E, 600, E.fontSize ?? (Z.width < 420 ? 10 : 11)), ft(e, O.price(_), i + 1, s, Z.width - i - 2, l.text, !0), ft(e, c, m(u, Y.x + 40, Y.x + Y.w - 40), Y.y + Y.h + ge / 2 + 2, Y.w, l.text, !0, "center");
609
- let x = b === "bid" ? k.up : b === "ask" ? k.down : null;
610
- ae(Be, Z.tooltip, {
611
- text: te(Number.isFinite(p) ? p : f, !0, E.timeZone),
718
+ for (let e = 0; e < h.bins.length; e++) S(h.bins[e]) && (C += h.sizes[e]);
719
+ ({bestBid: w, bestAsk: E, buyVolume: D, sellVolume: O} = h);
720
+ } else if (Number.isFinite(m)) {
721
+ let e = ft();
722
+ if (e) for (let t = 0; t < e.bins.length; t++) S(e.bins[t]) && (C += e.sizes[t]);
723
+ w = N.bestBid(), E = N.bestAsk(), D = V.buyVolume, O = V.sellVolume;
724
+ }
725
+ let k = b <= w ? "bid" : y >= E ? "ask" : null;
726
+ if (e.strokeStyle = o(u.text, .5), e.lineWidth = 1, e.setLineDash([3, 3]), e.beginPath(), e.moveTo(Math.round(d) + .5, Y.y), e.lineTo(Math.round(d) + .5, Y.y + Y.h), e.moveTo(Y.x, c), e.lineTo(r, c), e.stroke(), e.setLineDash([]), Number.isFinite(m)) {
727
+ let r = t(m), i = t(m + ne), a = n((g * _ + _ - .5) * R), s = n((g * _ - .5) * R);
728
+ e.strokeStyle = o(u.text, .85), e.strokeRect(r, a, Math.max(2, i - r), Math.max(2, s - a));
729
+ }
730
+ e.font = x(u, s, 600, s.fontSize ?? (Z.width < 420 ? 10 : 11)), St(e, I.price(te), r + 1, c, Z.width - r - 2, u.text, !0), St(e, l, v(d, Y.x + 40, Y.x + Y.w - 40), Y.y + Y.h + de / 2 + 2, Y.w, u.text, !0, "center");
731
+ let re = k === "bid" ? L.up : k === "ask" ? L.down : null;
732
+ T(Je, Z.tooltip, {
733
+ text: ee(Number.isFinite(m) ? m : p, !0, s.timeZone),
612
734
  color: void 0,
613
- badge: b && x ? {
614
- text: b === "bid" ? a.bidSide : a.askSide,
615
- color: r(x)
735
+ badge: k && re ? {
736
+ text: k === "bid" ? i.bidSide : i.askSide,
737
+ color: o(re)
616
738
  } : void 0
617
739
  }, [
618
- [a.price, O.price(_)],
619
- [a.liquidity, O.size(v)],
620
- [a.buys, O.size(y)],
621
- [a.sells, O.size(oe)]
622
- ]), Z.tooltip.style.display = "block", Z.placeTooltip(Z.tooltip, u, d, u > Y.w * .6 ? "left" : "right");
623
- let S = `${p}|${g}|${v}|${y}|${oe}`;
624
- if (S !== ze) {
625
- ze = S;
740
+ [i.price, _ > 1 ? `${I.price(y)} – ${I.price(b)}` : I.price(te)],
741
+ [i.liquidity, it(I.size(C))],
742
+ [i.buys, it(I.size(D))],
743
+ [i.sells, it(I.size(O))]
744
+ ]), Z.tooltip.style.display = "block", Z.placeTooltip(Z.tooltip, d, f, d > Y.w * .6 ? "left" : "right");
745
+ let A = `${m}|${g}|${_}|${C}|${D}|${O}`;
746
+ if (A !== qe) {
747
+ qe = A;
626
748
  let e = {
627
- time: Number.isFinite(p) ? p : f,
628
- price: _,
629
- size: v,
630
- side: b,
631
- buyVolume: y,
632
- sellVolume: oe
749
+ time: Number.isFinite(m) ? m : p,
750
+ price: y,
751
+ priceHigh: b,
752
+ size: C,
753
+ side: k,
754
+ buyVolume: D,
755
+ sellVolume: O
633
756
  };
634
- xe.emit("hover", e);
757
+ F.emit("hover", e);
635
758
  }
636
759
  }
637
- let ht = async (e = /* @__PURE__ */ new Set()) => {
638
- let t = ++je, n = await b(E.renderer ?? "auto", () => {
639
- let e = Be.createElement("canvas");
760
+ let Dt = async (e = /* @__PURE__ */ new Set()) => {
761
+ let t = ++Le, n = await O(s.renderer ?? "auto", () => {
762
+ let e = Je.createElement("canvas");
640
763
  return Object.assign(e.style, {
641
764
  position: "absolute",
642
765
  left: "0",
@@ -644,151 +767,151 @@ var fe = 256, C = 4096, w = .98, pe = 1.4, me = [
644
767
  pointerEvents: "none"
645
768
  }), e.setAttribute("aria-hidden", "true"), e;
646
769
  }, (t) => {
647
- Me || H?.kind !== t || (H.destroy(), H.canvas.remove(), H = null, ht(/* @__PURE__ */ new Set([...e, t])));
770
+ Re || W?.kind !== t || (W.destroy(), W.canvas.remove(), W = null, Dt(/* @__PURE__ */ new Set([...e, t])));
648
771
  }, e);
649
- if (Me || t !== je) {
772
+ if (Re || t !== Le) {
650
773
  n?.destroy();
651
774
  return;
652
775
  }
653
- H && (H.destroy(), H.canvas.remove()), H = n, n ? (Q.dataset.renderer = n.kind, Q.insertBefore(n.canvas, Z.canvas), xe.emit("renderer", n.kind)) : delete Q.dataset.renderer, Ne(n?.kind ?? null), Z.invalidate();
654
- }, gt = o(() => E.renderer, () => void ht()), _t = (e) => {
655
- Fe !== e && (Fe = e, xe.emit("follow", e));
656
- }, vt = (e) => {
657
- let t = N.length ? N[0].time : P;
776
+ W && (W.destroy(), W.canvas.remove()), W = n, n ? (Q.dataset.renderer = n.kind, Q.insertBefore(n.canvas, Z.canvas), F.emit("renderer", n.kind)) : delete Q.dataset.renderer, ze(n?.kind ?? null), Z.invalidate();
777
+ }, Ot = u(() => s.renderer, () => void Dt()), kt = (e) => {
778
+ Ve !== e && (Ve = e, F.emit("follow", e));
779
+ }, At = (e) => {
780
+ let t = z.length ? z[0].time : B;
658
781
  if (!Number.isFinite(t)) return e;
659
- let n = e[1] - e[0], r = (Number.isFinite(J) ? J : Ke()) + $() + n / 2, i = Math.max(t - n / 2, Math.min(e[0], r - n));
782
+ let n = e[1] - e[0], r = (Number.isFinite(We) ? We : et()) + $() + n / 2, i = Math.max(t - n / 2, Math.min(e[0], r - n));
660
783
  return [i, i + n];
661
- }, yt = (e) => {
662
- if (E.interactive === !1) return;
663
- let [t, n] = ie(Q, e);
784
+ }, jt = (e) => {
785
+ if (s.interactive === !1) return;
786
+ let [t, n] = w(Q, e);
664
787
  Q.setPointerCapture?.(e.pointerId), X = {
665
788
  x: t,
666
789
  y: n,
667
- viewX: [...W],
668
- viewY: [...G],
790
+ viewX: [...K],
791
+ viewY: [...q],
669
792
  axis: t > Y.x + Y.w,
670
- span: G[1] - G[0]
793
+ span: q[1] - q[0]
671
794
  };
672
- }, bt = (e) => {
673
- let [t, n] = ie(Q, e);
674
- if (Re = [t, n], X) {
795
+ }, Mt = (e) => {
796
+ let [t, n] = w(Q, e);
797
+ if (Ke = [t, n], X) {
675
798
  let e = t - X.x, r = n - X.y;
676
799
  if (X.axis) {
677
800
  let e = X.span * Math.exp(r * .006), t = (X.viewY[0] + X.viewY[1]) / 2;
678
- q = e, G = [t - e / 2, t + e / 2], K = [G[0], G[1]];
801
+ Ue = e, q = [t - e / 2, t + e / 2], J = [q[0], q[1]];
679
802
  } else if (Math.abs(e) + Math.abs(r) > 3) {
680
- _t(!1);
803
+ kt(!1);
681
804
  let t = (X.viewX[1] - X.viewX[0]) / Y.w * e, n = (X.viewY[1] - X.viewY[0]) / Y.h * r;
682
- W = vt([X.viewX[0] - t, X.viewX[1] - t]), G = [X.viewY[0] + n, X.viewY[1] + n];
805
+ K = At([X.viewX[0] - t, X.viewX[1] - t]), q = [X.viewY[0] + n, X.viewY[1] + n];
683
806
  }
684
807
  }
685
808
  Z.invalidate();
686
- }, xt = (e) => {
809
+ }, Nt = (e) => {
687
810
  Q.releasePointerCapture?.(e.pointerId), X = null, Z.invalidate();
688
- }, St = () => {
689
- X || (Re = null, Z.invalidate());
690
- }, Ct = (e, t) => {
691
- let [n, r] = W, i = m((Fe ? U : r - n) * e, $() * 10, We());
692
- if (U = i, !Fe) {
811
+ }, Pt = () => {
812
+ X || (Ke = null, Z.invalidate());
813
+ }, Ft = (e, t) => {
814
+ let [n, r] = K, i = v((Ve ? G : r - n) * e, $() * 10, Qe());
815
+ if (G = i, !Ve) {
693
816
  let e = n + (t - Y.x) / Y.w * (r - n), a = (e - n) / (r - n);
694
- W = vt([e - i * a, e + i * (1 - a)]);
817
+ K = At([e - i * a, e + i * (1 - a)]);
695
818
  }
696
819
  Z.invalidate();
697
- }, wt = (e) => {
698
- let t = m((G[1] - G[0]) * e, M * 6 || 1e-9, Infinity), n = (G[0] + G[1]) / 2;
699
- q = t, G = [n - t / 2, n + t / 2], K = [G[0], G[1]], Z.invalidate();
700
- }, Tt = (e) => {
701
- if (E.interactive === !1 || !(e.ctrlKey || e.metaKey)) return;
820
+ }, It = (e) => {
821
+ let t = v((q[1] - q[0]) * e, R * 6 || 1e-9, Infinity), n = (q[0] + q[1]) / 2;
822
+ Ue = t, q = [n - t / 2, n + t / 2], J = [q[0], q[1]], Z.invalidate();
823
+ }, Lt = (e) => {
824
+ if (s.interactive === !1 || !(e.ctrlKey || e.metaKey)) return;
702
825
  e.preventDefault();
703
- let [t] = ie(Q, e), n = Math.exp(e.deltaY * .002);
704
- e.shiftKey || t > Y.x + Y.w ? wt(n) : Ct(n, t);
705
- }, Et = () => {
706
- E.interactive !== !1 && kt.resetView();
707
- }, Dt = (e) => {
708
- if (E.interactive !== !1) {
826
+ let [t] = w(Q, e), n = Math.exp(e.deltaY * .002);
827
+ e.shiftKey || t > Y.x + Y.w ? It(n) : Ft(n, t);
828
+ }, Rt = () => {
829
+ s.interactive !== !1 && Vt.resetView();
830
+ }, zt = (e) => {
831
+ if (s.interactive !== !1) {
709
832
  switch (e.key) {
710
833
  case "+":
711
834
  case "=":
712
- Ct(.8, Y.x + Y.w);
835
+ Ft(.8, Y.x + Y.w);
713
836
  break;
714
837
  case "-":
715
- Ct(1.25, Y.x + Y.w);
838
+ Ft(1.25, Y.x + Y.w);
716
839
  break;
717
840
  case "ArrowUp":
718
841
  case "ArrowDown": {
719
842
  if (e.shiftKey) {
720
- wt(e.key === "ArrowUp" ? .8 : 1.25);
843
+ It(e.key === "ArrowUp" ? .8 : 1.25);
721
844
  break;
722
845
  }
723
- _t(!1);
724
- let t = (G[1] - G[0]) * .1 * (e.key === "ArrowUp" ? 1 : -1);
725
- G = [G[0] + t, G[1] + t], Z.invalidate();
846
+ kt(!1);
847
+ let t = (q[1] - q[0]) * .1 * (e.key === "ArrowUp" ? 1 : -1);
848
+ q = [q[0] + t, q[1] + t], Z.invalidate();
726
849
  break;
727
850
  }
728
851
  case "ArrowLeft":
729
852
  case "ArrowRight": {
730
- _t(!1);
731
- let t = (W[1] - W[0]) * .1 * (e.key === "ArrowLeft" ? -1 : 1);
732
- W = vt([W[0] + t, W[1] + t]), Z.invalidate();
853
+ kt(!1);
854
+ let t = (K[1] - K[0]) * .1 * (e.key === "ArrowLeft" ? -1 : 1);
855
+ K = At([K[0] + t, K[1] + t]), Z.invalidate();
733
856
  break;
734
857
  }
735
858
  case "0":
736
859
  case "Home":
737
- kt.resetView();
860
+ Vt.resetView();
738
861
  break;
739
862
  default: return;
740
863
  }
741
864
  e.preventDefault();
742
865
  }
743
866
  };
744
- Q.addEventListener("pointerdown", yt), Q.addEventListener("pointermove", bt), Q.addEventListener("pointerup", xt), Q.addEventListener("pointercancel", xt), Q.addEventListener("pointerleave", St), Q.addEventListener("wheel", Tt, { passive: !1 }), Q.addEventListener("dblclick", Et), Q.addEventListener("keydown", Dt);
745
- let Ot = (e) => {
746
- let t = tt(e.time);
747
- D.count("bid") + D.count("ask") > 0 && (Ze(), et(t)), D.applyDelta(e);
748
- }, kt = {
867
+ Q.addEventListener("pointerdown", jt), Q.addEventListener("pointermove", Mt), Q.addEventListener("pointerup", Nt), Q.addEventListener("pointercancel", Nt), Q.addEventListener("pointerleave", Pt), Q.addEventListener("wheel", Lt, { passive: !1 }), Q.addEventListener("dblclick", Rt), Q.addEventListener("keydown", zt);
868
+ let Bt = (e) => {
869
+ let t = ut(e.time);
870
+ N.count("bid") + N.count("ask") > 0 && (ot(), lt(t)), N.applyDelta(e);
871
+ }, Vt = {
749
872
  setBook(e) {
750
- let t = tt(e.time);
751
- D.count("bid") + D.count("ask") > 0 && et(t), D.setSnapshot(e), Ze(), Ye(), Number.isFinite(P) || et(t), Z.invalidate();
873
+ let t = ut(e.time);
874
+ N.count("bid") + N.count("ask") > 0 && lt(t), N.setSnapshot(e), ot(), rt(), Number.isFinite(B) || lt(t), Z.invalidate();
752
875
  },
753
876
  applyDeltas(e) {
754
- if (Array.isArray(e)) for (let t of e) Ot(t);
755
- else Ot(e);
756
- !Number.isFinite(P) && M > 0 && et(Ke()), Z.invalidate();
877
+ if (Array.isArray(e)) for (let t of e) Bt(t);
878
+ else Bt(e);
879
+ !Number.isFinite(B) && R > 0 && lt(et()), Z.invalidate();
757
880
  },
758
881
  addTrades(e) {
759
882
  let t = Array.isArray(e) ? e : [e];
760
883
  for (let e of t) {
761
884
  if (!(e.size > 0) || !Number.isFinite(e.price)) continue;
762
- Number.isFinite(I) && (tt(e.time), et(e.time));
763
- let t = !Number.isFinite(P) || e.time >= P ? F : nt(e.time);
764
- t && (e.side === "buy" ? (t.buyVolume += e.size, t.buyNotional += e.size * e.price) : (t.sellVolume += e.size, t.sellNotional += e.size * e.price)), (!Te || e.time >= Te.time) && (Te = e);
885
+ Number.isFinite(Oe) && (ut(e.time), lt(e.time));
886
+ let t = !Number.isFinite(B) || e.time >= B ? V : dt(e.time);
887
+ t && (e.side === "buy" ? (t.buyVolume += e.size, t.buyNotional += e.size * e.price) : (t.sellVolume += e.size, t.sellNotional += e.size * e.price)), (!De || e.time >= De.time) && (De = e);
765
888
  }
766
889
  Z.invalidate();
767
890
  },
768
891
  clear() {
769
- D.clear(), Xe(), Te = null, I = NaN, M = 0, q = NaN, K = null, Ie = !1, Z.invalidate();
892
+ N.clear(), at(), De = null, Oe = NaN, R = 0, Ue = NaN, J = null, He = !1, Z.invalidate();
770
893
  },
771
894
  setOptions(e) {
772
- let t = E;
773
- E = e, Ue(), (e.tickSize !== t.tickSize || (e.interval ?? 100) !== (t.interval ?? 100)) && (Xe(), M = 0, q = NaN, Ze()), e.window !== t.window && (U = NaN), e.priceSpan !== t.priceSpan && (q = NaN), (e.renderer ?? "auto") !== (t.renderer ?? "auto") && ht(), Je(), Ye(), Z.invalidate();
895
+ let t = s;
896
+ s = e, Ze(), (e.tickSize !== t.tickSize || (e.interval ?? 100) !== (t.interval ?? 100)) && (at(), R = 0, Ue = NaN, ot()), e.window !== t.window && (G = NaN), e.priceSpan !== t.priceSpan && (Ue = NaN), (e.renderer ?? "auto") !== (t.renderer ?? "auto") && Dt(), nt(), rt(), Z.invalidate();
774
897
  },
775
898
  resetView() {
776
- U = NaN, q = NaN, K = null, _t(!0), Z.invalidate();
899
+ G = NaN, Ue = NaN, J = null, kt(!0), Z.invalidate();
777
900
  },
778
- getRenderer: () => H?.kind ?? null,
779
- ready: Pe,
780
- getStore: () => D,
781
- on: (e, t) => xe.on(e, t),
901
+ getRenderer: () => W?.kind ?? null,
902
+ ready: Be,
903
+ getStore: () => N,
904
+ on: (e, t) => F.on(e, t),
782
905
  resize() {
783
906
  Z.invalidate();
784
907
  },
785
908
  destroy() {
786
- Me = !0, gt(), Q.removeEventListener("pointerdown", yt), Q.removeEventListener("pointermove", bt), Q.removeEventListener("pointerup", xt), Q.removeEventListener("pointercancel", xt), Q.removeEventListener("pointerleave", St), Q.removeEventListener("wheel", Tt), Q.removeEventListener("dblclick", Et), Q.removeEventListener("keydown", Dt), H?.destroy(), H = null, xe.clear(), Z.destroy(), Ne(null);
909
+ Re = !0, Ot(), Q.removeEventListener("pointerdown", jt), Q.removeEventListener("pointermove", Mt), Q.removeEventListener("pointerup", Nt), Q.removeEventListener("pointercancel", Nt), Q.removeEventListener("pointerleave", Pt), Q.removeEventListener("wheel", Lt), Q.removeEventListener("dblclick", Rt), Q.removeEventListener("keydown", zt), W?.destroy(), W = null, F.clear(), Z.destroy(), ze(null);
787
910
  }
788
911
  };
789
- return Ue(), Je(), ht(), kt;
912
+ return Ze(), nt(), Dt(), Vt;
790
913
  };
791
914
  //#endregion
792
- export { T as createOrderBookHeatmap, ye as heatIntensity };
915
+ export { L as createOrderBookHeatmap, ye as heatCurve, _e as heatIntensity, me as positionedRamp, he as rowBucket, ve as sizeCdf };
793
916
 
794
917
  //# sourceMappingURL=heatmap.js.map