drizzle-cube 0.4.13 → 0.4.14

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 (116) hide show
  1. package/README.md +1 -0
  2. package/dist/adapters/express/index.cjs +6 -6
  3. package/dist/adapters/express/index.js +73 -72
  4. package/dist/adapters/fastify/index.cjs +5 -5
  5. package/dist/adapters/fastify/index.js +110 -109
  6. package/dist/adapters/{handler-CQkIwtxp.js → handler-DZnCbydH.js} +719 -272
  7. package/dist/adapters/handler-ZDYlokiM.cjs +25 -0
  8. package/dist/adapters/hono/index.cjs +6 -6
  9. package/dist/adapters/hono/index.js +121 -120
  10. package/dist/adapters/nextjs/index.cjs +5 -5
  11. package/dist/adapters/nextjs/index.js +92 -91
  12. package/dist/client/charts.js +67 -59
  13. package/dist/client/charts.js.map +1 -1
  14. package/dist/client/chunks/{RetentionCombinedChart-CEI8KQ3t.js → RetentionCombinedChart-CLq89aOJ.js} +2 -2
  15. package/dist/client/chunks/{RetentionCombinedChart-CEI8KQ3t.js.map → RetentionCombinedChart-CLq89aOJ.js.map} +1 -1
  16. package/dist/client/chunks/{analysis-builder-BMmWeFPr.js → analysis-builder-C5e52Z3p.js} +419 -411
  17. package/dist/client/chunks/analysis-builder-C5e52Z3p.js.map +1 -0
  18. package/dist/client/chunks/{analysis-builder-shared-D56zYeV0.js → analysis-builder-shared-EnM-8plh.js} +2 -2
  19. package/dist/client/chunks/{analysis-builder-shared-D56zYeV0.js.map → analysis-builder-shared-EnM-8plh.js.map} +1 -1
  20. package/dist/client/chunks/{chart-activity-grid-CE7xGFQo.js → chart-activity-grid-CPGcTSuh.js} +2 -2
  21. package/dist/client/chunks/{chart-activity-grid-CE7xGFQo.js.map → chart-activity-grid-CPGcTSuh.js.map} +1 -1
  22. package/dist/client/chunks/{chart-area-BJAgusst.js → chart-area-ByJQ7NZd.js} +3 -3
  23. package/dist/client/chunks/{chart-area-BJAgusst.js.map → chart-area-ByJQ7NZd.js.map} +1 -1
  24. package/dist/client/chunks/{chart-bar-Blypx8O4.js → chart-bar-dj14frMt.js} +2 -2
  25. package/dist/client/chunks/{chart-bar-Blypx8O4.js.map → chart-bar-dj14frMt.js.map} +1 -1
  26. package/dist/client/chunks/chart-box-plot-ZatBpatq.js +322 -0
  27. package/dist/client/chunks/chart-box-plot-ZatBpatq.js.map +1 -0
  28. package/dist/client/chunks/{chart-bubble-Bf42A1-B.js → chart-bubble-CemotLx-.js} +2 -2
  29. package/dist/client/chunks/{chart-bubble-Bf42A1-B.js.map → chart-bubble-CemotLx-.js.map} +1 -1
  30. package/dist/client/chunks/chart-candlestick-BIR4uGGt.js +269 -0
  31. package/dist/client/chunks/chart-candlestick-BIR4uGGt.js.map +1 -0
  32. package/dist/client/chunks/chart-config-box-plot-D_E_SSc2.js +38 -0
  33. package/dist/client/chunks/chart-config-box-plot-D_E_SSc2.js.map +1 -0
  34. package/dist/client/chunks/chart-config-candlestick-CRCpD43-.js +70 -0
  35. package/dist/client/chunks/chart-config-candlestick-CRCpD43-.js.map +1 -0
  36. package/dist/client/chunks/chart-config-gauge-CQx9w3d4.js +64 -0
  37. package/dist/client/chunks/chart-config-gauge-CQx9w3d4.js.map +1 -0
  38. package/dist/client/chunks/chart-config-measure-profile-ZYaMrtws.js +70 -0
  39. package/dist/client/chunks/chart-config-measure-profile-ZYaMrtws.js.map +1 -0
  40. package/dist/client/chunks/chart-config-waterfall-DTyXV_fo.js +60 -0
  41. package/dist/client/chunks/chart-config-waterfall-DTyXV_fo.js.map +1 -0
  42. package/dist/client/chunks/{chart-data-table-Ba_6tuJw.js → chart-data-table-D5G8nMnb.js} +2 -2
  43. package/dist/client/chunks/{chart-data-table-Ba_6tuJw.js.map → chart-data-table-D5G8nMnb.js.map} +1 -1
  44. package/dist/client/chunks/{chart-funnel-C9kenCpp.js → chart-funnel-dofnhD24.js} +2 -2
  45. package/dist/client/chunks/{chart-funnel-C9kenCpp.js.map → chart-funnel-dofnhD24.js.map} +1 -1
  46. package/dist/client/chunks/chart-gauge-CKJJ8m3b.js +374 -0
  47. package/dist/client/chunks/chart-gauge-CKJJ8m3b.js.map +1 -0
  48. package/dist/client/chunks/{chart-heat-map-CYGemyPB.js → chart-heat-map-BVuPUKHT.js} +2 -2
  49. package/dist/client/chunks/{chart-heat-map-CYGemyPB.js.map → chart-heat-map-BVuPUKHT.js.map} +1 -1
  50. package/dist/client/chunks/{chart-kpi-delta-D9XJoKuA.js → chart-kpi-delta-Dgg2eYRl.js} +3 -3
  51. package/dist/client/chunks/{chart-kpi-delta-D9XJoKuA.js.map → chart-kpi-delta-Dgg2eYRl.js.map} +1 -1
  52. package/dist/client/chunks/{chart-kpi-number-C29Vj2g8.js → chart-kpi-number-DkoO99c1.js} +2 -2
  53. package/dist/client/chunks/{chart-kpi-number-C29Vj2g8.js.map → chart-kpi-number-DkoO99c1.js.map} +1 -1
  54. package/dist/client/chunks/{chart-kpi-text-CgjjrurK.js → chart-kpi-text-1O6_lmz7.js} +3 -3
  55. package/dist/client/chunks/{chart-kpi-text-CgjjrurK.js.map → chart-kpi-text-1O6_lmz7.js.map} +1 -1
  56. package/dist/client/chunks/{chart-line-zi6olZet.js → chart-line-DzyZkugh.js} +3 -3
  57. package/dist/client/chunks/{chart-line-zi6olZet.js.map → chart-line-DzyZkugh.js.map} +1 -1
  58. package/dist/client/chunks/chart-measure-profile-C2IkBG3V.js +114 -0
  59. package/dist/client/chunks/chart-measure-profile-C2IkBG3V.js.map +1 -0
  60. package/dist/client/chunks/{chart-pie-C4SuxKSN.js → chart-pie-akbfRfb9.js} +2 -2
  61. package/dist/client/chunks/{chart-pie-C4SuxKSN.js.map → chart-pie-akbfRfb9.js.map} +1 -1
  62. package/dist/client/chunks/{chart-radar-BW3Z_-Ly.js → chart-radar-BaN-Kjww.js} +2 -2
  63. package/dist/client/chunks/{chart-radar-BW3Z_-Ly.js.map → chart-radar-BaN-Kjww.js.map} +1 -1
  64. package/dist/client/chunks/{chart-radial-bar-0Fa3aeP5.js → chart-radial-bar-DpptEL3s.js} +2 -2
  65. package/dist/client/chunks/{chart-radial-bar-0Fa3aeP5.js.map → chart-radial-bar-DpptEL3s.js.map} +1 -1
  66. package/dist/client/chunks/{chart-sankey-DBghfbg1.js → chart-sankey-CG-3hHmX.js} +2 -2
  67. package/dist/client/chunks/{chart-sankey-DBghfbg1.js.map → chart-sankey-CG-3hHmX.js.map} +1 -1
  68. package/dist/client/chunks/{chart-scatter-DOVu1TNq.js → chart-scatter-l_yTVxF3.js} +2 -2
  69. package/dist/client/chunks/{chart-scatter-DOVu1TNq.js.map → chart-scatter-l_yTVxF3.js.map} +1 -1
  70. package/dist/client/chunks/{chart-sunburst-LfNthFlZ.js → chart-sunburst-KhDcKhmZ.js} +2 -2
  71. package/dist/client/chunks/{chart-sunburst-LfNthFlZ.js.map → chart-sunburst-KhDcKhmZ.js.map} +1 -1
  72. package/dist/client/chunks/{chart-tree-map-DZtQPyWX.js → chart-tree-map-CBbiaBXV.js} +2 -2
  73. package/dist/client/chunks/{chart-tree-map-DZtQPyWX.js.map → chart-tree-map-CBbiaBXV.js.map} +1 -1
  74. package/dist/client/chunks/chart-waterfall-CX3vx_lI.js +191 -0
  75. package/dist/client/chunks/chart-waterfall-CX3vx_lI.js.map +1 -0
  76. package/dist/client/chunks/{charts-core-DmGfleFz.js → charts-core-CU9u_HtL.js} +2 -1
  77. package/dist/client/chunks/charts-core-CU9u_HtL.js.map +1 -0
  78. package/dist/client/chunks/{charts-loader-CH0_S06T.js → charts-loader-AW3T1nv5.js} +58 -42
  79. package/dist/client/chunks/charts-loader-AW3T1nv5.js.map +1 -0
  80. package/dist/client/chunks/{components-ClQziOcT.js → components-BkeSy9xv.js} +4 -4
  81. package/dist/client/chunks/components-BkeSy9xv.js.map +1 -0
  82. package/dist/client/components/AgenticNotebook/AgentChatPanel.d.ts +10 -0
  83. package/dist/client/components/AgenticNotebook/ChatMessage.d.ts +2 -0
  84. package/dist/client/components/AgenticNotebook/index.d.ts +11 -1
  85. package/dist/client/components/LoadingIndicator.d.ts +2 -2
  86. package/dist/client/components/charts/BoxPlotChart.config.d.ts +1 -7
  87. package/dist/client/components/charts/CandlestickChart.config.d.ts +5 -0
  88. package/dist/client/components/charts/CandlestickChart.d.ts +4 -0
  89. package/dist/client/components/charts/GaugeChart.config.d.ts +5 -0
  90. package/dist/client/components/charts/GaugeChart.d.ts +4 -0
  91. package/dist/client/components/charts/MeasureProfileChart.config.d.ts +5 -0
  92. package/dist/client/components/charts/MeasureProfileChart.d.ts +4 -0
  93. package/dist/client/components/charts/WaterfallChart.config.d.ts +5 -0
  94. package/dist/client/components/charts/WaterfallChart.d.ts +4 -0
  95. package/dist/client/components/charts/index.d.ts +4 -0
  96. package/dist/client/components.js +1 -1
  97. package/dist/client/hooks/useAgentChat.d.ts +20 -2
  98. package/dist/client/index.js +583 -522
  99. package/dist/client/index.js.map +1 -1
  100. package/dist/client/styles.css +1 -1
  101. package/dist/client/types.d.ts +19 -1
  102. package/dist/client/utils.js +4 -4
  103. package/dist/client-bundle-stats.html +1 -1
  104. package/dist/server/index.cjs +47 -45
  105. package/dist/server/index.d.ts +37 -0
  106. package/dist/server/index.js +1745 -1298
  107. package/package.json +4 -1
  108. package/dist/adapters/handler-dnkqpznh.cjs +0 -23
  109. package/dist/client/chunks/analysis-builder-BMmWeFPr.js.map +0 -1
  110. package/dist/client/chunks/chart-box-plot-Dja4LS3O.js +0 -313
  111. package/dist/client/chunks/chart-box-plot-Dja4LS3O.js.map +0 -1
  112. package/dist/client/chunks/chart-config-box-plot-D3DA7_pr.js +0 -85
  113. package/dist/client/chunks/chart-config-box-plot-D3DA7_pr.js.map +0 -1
  114. package/dist/client/chunks/charts-core-DmGfleFz.js.map +0 -1
  115. package/dist/client/chunks/charts-loader-CH0_S06T.js.map +0 -1
  116. package/dist/client/chunks/components-ClQziOcT.js.map +0 -1
@@ -0,0 +1,374 @@
1
+ import { jsx as v, jsxs as O } from "react/jsx-runtime";
2
+ import Mt, { useRef as _t, useState as At, useLayoutEffect as bt, useMemo as mt } from "react";
3
+ import { u as Nt, f as lt } from "./charts-core-CU9u_HtL.js";
4
+ function k(n) {
5
+ return function() {
6
+ return n;
7
+ };
8
+ }
9
+ const xt = Math.abs, R = Math.atan2, z = Math.cos, wt = Math.max, ct = Math.min, I = Math.sin, H = Math.sqrt, F = 1e-12, Q = Math.PI, nt = Q / 2, Rt = 2 * Q;
10
+ function Lt(n) {
11
+ return n > 1 ? 0 : n < -1 ? Q : Math.acos(n);
12
+ }
13
+ function gt(n) {
14
+ return n >= 1 ? nt : n <= -1 ? -nt : Math.asin(n);
15
+ }
16
+ const dt = Math.PI, ut = 2 * dt, B = 1e-6, Pt = ut - B;
17
+ function yt(n) {
18
+ this._ += n[0];
19
+ for (let t = 1, i = n.length; t < i; ++t)
20
+ this._ += arguments[t] + n[t];
21
+ }
22
+ function Ft(n) {
23
+ let t = Math.floor(n);
24
+ if (!(t >= 0)) throw new Error(`invalid digits: ${n}`);
25
+ if (t > 15) return yt;
26
+ const i = 10 ** t;
27
+ return function(e) {
28
+ this._ += e[0];
29
+ for (let a = 1, f = e.length; a < f; ++a)
30
+ this._ += Math.round(arguments[a] * i) / i + e[a];
31
+ };
32
+ }
33
+ class Tt {
34
+ constructor(t) {
35
+ this._x0 = this._y0 = // start of current subpath
36
+ this._x1 = this._y1 = null, this._ = "", this._append = t == null ? yt : Ft(t);
37
+ }
38
+ moveTo(t, i) {
39
+ this._append`M${this._x0 = this._x1 = +t},${this._y0 = this._y1 = +i}`;
40
+ }
41
+ closePath() {
42
+ this._x1 !== null && (this._x1 = this._x0, this._y1 = this._y0, this._append`Z`);
43
+ }
44
+ lineTo(t, i) {
45
+ this._append`L${this._x1 = +t},${this._y1 = +i}`;
46
+ }
47
+ quadraticCurveTo(t, i, e, a) {
48
+ this._append`Q${+t},${+i},${this._x1 = +e},${this._y1 = +a}`;
49
+ }
50
+ bezierCurveTo(t, i, e, a, f, A) {
51
+ this._append`C${+t},${+i},${+e},${+a},${this._x1 = +f},${this._y1 = +A}`;
52
+ }
53
+ arcTo(t, i, e, a, f) {
54
+ if (t = +t, i = +i, e = +e, a = +a, f = +f, f < 0) throw new Error(`negative radius: ${f}`);
55
+ let A = this._x1, o = this._y1, b = e - t, h = a - i, s = A - t, y = o - i, l = s * s + y * y;
56
+ if (this._x1 === null)
57
+ this._append`M${this._x1 = t},${this._y1 = i}`;
58
+ else if (l > B) if (!(Math.abs(y * b - h * s) > B) || !f)
59
+ this._append`L${this._x1 = t},${this._y1 = i}`;
60
+ else {
61
+ let x = e - A, c = a - o, d = b * b + h * h, u = x * x + c * c, g = Math.sqrt(d), $ = Math.sqrt(l), p = f * Math.tan((dt - Math.acos((d + l - u) / (2 * g * $))) / 2), M = p / $, N = p / g;
62
+ Math.abs(M - 1) > B && this._append`L${t + M * s},${i + M * y}`, this._append`A${f},${f},0,0,${+(y * x > s * c)},${this._x1 = t + N * b},${this._y1 = i + N * h}`;
63
+ }
64
+ }
65
+ arc(t, i, e, a, f, A) {
66
+ if (t = +t, i = +i, e = +e, A = !!A, e < 0) throw new Error(`negative radius: ${e}`);
67
+ let o = e * Math.cos(a), b = e * Math.sin(a), h = t + o, s = i + b, y = 1 ^ A, l = A ? a - f : f - a;
68
+ this._x1 === null ? this._append`M${h},${s}` : (Math.abs(this._x1 - h) > B || Math.abs(this._y1 - s) > B) && this._append`L${h},${s}`, e && (l < 0 && (l = l % ut + ut), l > Pt ? this._append`A${e},${e},0,1,${y},${t - o},${i - b}A${e},${e},0,1,${y},${this._x1 = h},${this._y1 = s}` : l > B && this._append`A${e},${e},0,${+(l >= dt)},${y},${this._x1 = t + e * Math.cos(f)},${this._y1 = i + e * Math.sin(f)}`);
69
+ }
70
+ rect(t, i, e, a) {
71
+ this._append`M${this._x0 = this._x1 = +t},${this._y0 = this._y1 = +i}h${e = +e}v${+a}h${-e}Z`;
72
+ }
73
+ toString() {
74
+ return this._;
75
+ }
76
+ }
77
+ function Et(n) {
78
+ let t = 3;
79
+ return n.digits = function(i) {
80
+ if (!arguments.length) return t;
81
+ if (i == null)
82
+ t = null;
83
+ else {
84
+ const e = Math.floor(i);
85
+ if (!(e >= 0)) throw new RangeError(`invalid digits: ${i}`);
86
+ t = e;
87
+ }
88
+ return n;
89
+ }, () => new Tt(t);
90
+ }
91
+ function Ct(n) {
92
+ return n.innerRadius;
93
+ }
94
+ function St(n) {
95
+ return n.outerRadius;
96
+ }
97
+ function It(n) {
98
+ return n.startAngle;
99
+ }
100
+ function Vt(n) {
101
+ return n.endAngle;
102
+ }
103
+ function Gt(n) {
104
+ return n && n.padAngle;
105
+ }
106
+ function jt(n, t, i, e, a, f, A, o) {
107
+ var b = i - n, h = e - t, s = A - a, y = o - f, l = y * b - s * h;
108
+ if (!(l * l < F))
109
+ return l = (s * (t - f) - y * (n - a)) / l, [n + l * b, t + l * h];
110
+ }
111
+ function X(n, t, i, e, a, f, A) {
112
+ var o = n - i, b = t - e, h = (A ? f : -f) / H(o * o + b * b), s = h * b, y = -h * o, l = n + s, x = t + y, c = i + s, d = e + y, u = (l + c) / 2, g = (x + d) / 2, $ = c - l, p = d - x, M = $ * $ + p * p, N = a - f, T = l * d - c * x, C = (p < 0 ? -1 : 1) * H(wt(0, N * N * M - T * T)), S = (T * p - $ * C) / M, L = (-T * $ - p * C) / M, P = (T * p + $ * C) / M, w = (-T * $ + p * C) / M, _ = S - u, r = L - g, m = P - u, V = w - g;
113
+ return _ * _ + r * r > m * m + V * V && (S = P, L = w), {
114
+ cx: S,
115
+ cy: L,
116
+ x01: -s,
117
+ y01: -y,
118
+ x11: S * (a / N - 1),
119
+ y11: L * (a / N - 1)
120
+ };
121
+ }
122
+ function kt() {
123
+ var n = Ct, t = St, i = k(0), e = null, a = It, f = Vt, A = Gt, o = null, b = Et(h);
124
+ function h() {
125
+ var s, y, l = +n.apply(this, arguments), x = +t.apply(this, arguments), c = a.apply(this, arguments) - nt, d = f.apply(this, arguments) - nt, u = xt(d - c), g = d > c;
126
+ if (o || (o = s = b()), x < l && (y = x, x = l, l = y), !(x > F)) o.moveTo(0, 0);
127
+ else if (u > Rt - F)
128
+ o.moveTo(x * z(c), x * I(c)), o.arc(0, 0, x, c, d, !g), l > F && (o.moveTo(l * z(d), l * I(d)), o.arc(0, 0, l, d, c, g));
129
+ else {
130
+ var $ = c, p = d, M = c, N = d, T = u, C = u, S = A.apply(this, arguments) / 2, L = S > F && (e ? +e.apply(this, arguments) : H(l * l + x * x)), P = ct(xt(x - l) / 2, +i.apply(this, arguments)), w = P, _ = P, r, m;
131
+ if (L > F) {
132
+ var V = gt(L / l * I(S)), W = gt(L / x * I(S));
133
+ (T -= V * 2) > F ? (V *= g ? 1 : -1, M += V, N -= V) : (T = 0, M = N = (c + d) / 2), (C -= W * 2) > F ? (W *= g ? 1 : -1, $ += W, p -= W) : (C = 0, $ = p = (c + d) / 2);
134
+ }
135
+ var G = x * z($), j = x * I($), Y = l * z(N), J = l * I(N);
136
+ if (P > F) {
137
+ var U = x * z(p), Z = x * I(p), K = l * z(M), q = l * I(M), E;
138
+ if (u < Q)
139
+ if (E = jt(G, j, K, q, U, Z, Y, J)) {
140
+ var st = G - E[0], it = j - E[1], at = U - E[0], rt = Z - E[1], ht = 1 / I(Lt((st * at + it * rt) / (H(st * st + it * it) * H(at * at + rt * rt))) / 2), ft = H(E[0] * E[0] + E[1] * E[1]);
141
+ w = ct(P, (l - ft) / (ht - 1)), _ = ct(P, (x - ft) / (ht + 1));
142
+ } else
143
+ w = _ = 0;
144
+ }
145
+ C > F ? _ > F ? (r = X(K, q, G, j, x, _, g), m = X(U, Z, Y, J, x, _, g), o.moveTo(r.cx + r.x01, r.cy + r.y01), _ < P ? o.arc(r.cx, r.cy, _, R(r.y01, r.x01), R(m.y01, m.x01), !g) : (o.arc(r.cx, r.cy, _, R(r.y01, r.x01), R(r.y11, r.x11), !g), o.arc(0, 0, x, R(r.cy + r.y11, r.cx + r.x11), R(m.cy + m.y11, m.cx + m.x11), !g), o.arc(m.cx, m.cy, _, R(m.y11, m.x11), R(m.y01, m.x01), !g))) : (o.moveTo(G, j), o.arc(0, 0, x, $, p, !g)) : o.moveTo(G, j), !(l > F) || !(T > F) ? o.lineTo(Y, J) : w > F ? (r = X(Y, J, U, Z, l, -w, g), m = X(G, j, K, q, l, -w, g), o.lineTo(r.cx + r.x01, r.cy + r.y01), w < P ? o.arc(r.cx, r.cy, w, R(r.y01, r.x01), R(m.y01, m.x01), !g) : (o.arc(r.cx, r.cy, w, R(r.y01, r.x01), R(r.y11, r.x11), !g), o.arc(0, 0, l, R(r.cy + r.y11, r.cx + r.x11), R(m.cy + m.y11, m.cx + m.x11), g), o.arc(m.cx, m.cy, w, R(m.y11, m.x11), R(m.y01, m.x01), !g))) : o.arc(0, 0, l, N, M, g);
146
+ }
147
+ if (o.closePath(), s) return o = null, s + "" || null;
148
+ }
149
+ return h.centroid = function() {
150
+ var s = (+n.apply(this, arguments) + +t.apply(this, arguments)) / 2, y = (+a.apply(this, arguments) + +f.apply(this, arguments)) / 2 - Q / 2;
151
+ return [z(y) * s, I(y) * s];
152
+ }, h.innerRadius = function(s) {
153
+ return arguments.length ? (n = typeof s == "function" ? s : k(+s), h) : n;
154
+ }, h.outerRadius = function(s) {
155
+ return arguments.length ? (t = typeof s == "function" ? s : k(+s), h) : t;
156
+ }, h.cornerRadius = function(s) {
157
+ return arguments.length ? (i = typeof s == "function" ? s : k(+s), h) : i;
158
+ }, h.padRadius = function(s) {
159
+ return arguments.length ? (e = s == null ? null : typeof s == "function" ? s : k(+s), h) : e;
160
+ }, h.startAngle = function(s) {
161
+ return arguments.length ? (a = typeof s == "function" ? s : k(+s), h) : a;
162
+ }, h.endAngle = function(s) {
163
+ return arguments.length ? (f = typeof s == "function" ? s : k(+s), h) : f;
164
+ }, h.padAngle = function(s) {
165
+ return arguments.length ? (A = typeof s == "function" ? s : k(+s), h) : A;
166
+ }, h.context = function(s) {
167
+ return arguments.length ? (o = s ?? null, h) : o;
168
+ }, h;
169
+ }
170
+ const D = -Math.PI * 0.75, et = Math.PI * 0.75, qt = "#e2e8f0", vt = "#6366f1";
171
+ function pt(n) {
172
+ if (n == null) return null;
173
+ const t = typeof n == "number" ? n : parseFloat(String(n));
174
+ return isNaN(t) ? null : t;
175
+ }
176
+ function $t(n, t, i) {
177
+ return Math.max(t, Math.min(i, n));
178
+ }
179
+ function tt(n, t, i) {
180
+ const e = i === t ? 1 : i - t, a = $t((n - t) / e, 0, 1);
181
+ return D + a * (et - D);
182
+ }
183
+ function zt(n, t) {
184
+ const i = [...t].sort((a, f) => a.value - f.value);
185
+ let e = vt;
186
+ for (const a of i)
187
+ n >= a.value && (e = a.color);
188
+ return e;
189
+ }
190
+ function ot(n, t, i, e) {
191
+ return kt()({ innerRadius: n, outerRadius: t, startAngle: i, endAngle: e }) ?? "";
192
+ }
193
+ function Ot({ angle: n, radius: t }) {
194
+ const i = t * 0.72, e = t * 0.06, a = Math.cos(n - Math.PI / 2) * i, f = Math.sin(n - Math.PI / 2) * i;
195
+ return /* @__PURE__ */ O("g", { "data-testid": "gauge-needle", children: [
196
+ /* @__PURE__ */ v("circle", { r: e, fill: "currentColor", className: "text-dc-text-secondary" }),
197
+ /* @__PURE__ */ v(
198
+ "line",
199
+ {
200
+ x1: 0,
201
+ y1: 0,
202
+ x2: a,
203
+ y2: f,
204
+ stroke: "currentColor",
205
+ strokeWidth: 3,
206
+ strokeLinecap: "round",
207
+ className: "text-dc-text-secondary"
208
+ }
209
+ )
210
+ ] });
211
+ }
212
+ const Yt = Mt.memo(function({
213
+ data: t,
214
+ chartConfig: i,
215
+ displayConfig: e = {},
216
+ height: a = "100%"
217
+ }) {
218
+ const f = Nt(), A = _t(null), [o, b] = At({ width: 0, height: 0 });
219
+ bt(() => {
220
+ const c = A.current;
221
+ if (!c) return;
222
+ const d = new ResizeObserver((g) => {
223
+ for (const $ of g) {
224
+ const { width: p, height: M } = $.contentRect;
225
+ p > 0 && M > 0 && b({ width: p, height: M });
226
+ }
227
+ });
228
+ d.observe(c);
229
+ const u = c.getBoundingClientRect();
230
+ return u.width > 0 && u.height > 0 && b({ width: u.width, height: u.height }), () => d.disconnect();
231
+ }, []);
232
+ const { valueField: h, maxField: s, configError: y } = mt(() => {
233
+ const c = Array.isArray(i?.yAxis) ? i.yAxis : [], d = c[0] ?? "", u = c[1] ?? "";
234
+ return d ? { valueField: d, maxField: u, configError: null } : { valueField: d, maxField: u, configError: "Gauge requires at least 1 measure in Y-Axis (current value)" };
235
+ }, [i]), l = mt(() => {
236
+ const c = e?.thresholds;
237
+ let d = null;
238
+ if (Array.isArray(c))
239
+ d = c;
240
+ else if (typeof c == "string" && c.trim())
241
+ try {
242
+ const u = JSON.parse(c);
243
+ Array.isArray(u) && (d = u);
244
+ } catch (u) {
245
+ return console.warn("GaugeChart: invalid threshold JSON", u), [];
246
+ }
247
+ return d ? d.filter(
248
+ (u) => u !== null && typeof u == "object" && typeof u.value == "number" && typeof u.color == "string"
249
+ ) : [];
250
+ }, [e?.thresholds]), x = l.length === 0 ? [] : [...l].sort((c, d) => c.value - d.value).map((c, d, u) => {
251
+ const g = d === 0 ? D : tt(u[d - 1].value, 0, 1), $ = tt(c.value, 0, 1);
252
+ return { color: c.color, start: g, end: $ };
253
+ });
254
+ try {
255
+ if (!t || t.length === 0)
256
+ return /* @__PURE__ */ v("div", { className: "dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted", style: { height: a }, children: /* @__PURE__ */ O("div", { className: "dc:text-center", children: [
257
+ /* @__PURE__ */ v("div", { className: "dc:text-sm dc:font-semibold dc:mb-1", children: "No data available" }),
258
+ /* @__PURE__ */ v("div", { className: "dc:text-xs text-dc-text-secondary", children: "No data points to display in gauge chart" })
259
+ ] }) });
260
+ if (y)
261
+ return /* @__PURE__ */ v("div", { className: "dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning", style: { height: a }, children: /* @__PURE__ */ O("div", { className: "dc:text-center", children: [
262
+ /* @__PURE__ */ v("div", { className: "dc:text-sm dc:font-semibold dc:mb-1", children: "Configuration Error" }),
263
+ /* @__PURE__ */ v("div", { className: "dc:text-xs", children: y })
264
+ ] }) });
265
+ const c = t[0], d = pt(c[h]);
266
+ if (d === null)
267
+ return /* @__PURE__ */ v("div", { className: "dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted", style: { height: a }, children: /* @__PURE__ */ O("div", { className: "dc:text-center", children: [
268
+ /* @__PURE__ */ v("div", { className: "dc:text-sm dc:font-semibold dc:mb-1", children: "No valid data" }),
269
+ /* @__PURE__ */ v("div", { className: "dc:text-xs text-dc-text-secondary", children: "Gauge value is not a valid number" })
270
+ ] }) });
271
+ const u = e?.minValue ?? 0, g = s ? pt(c[s]) : null, $ = e?.maxValue ?? g ?? 100, p = $ === u ? u + 1 : $, M = $t(d, u, p), N = (M - u) / (p - u), T = l.length > 0 ? zt(N, l) : vt, C = e?.showCenterLabel ?? !0, S = e?.showPercentage ?? !1, L = e?.leftYAxisFormat, P = o.width || 300, w = typeof a == "number" ? a : o.height || 200, _ = Math.min(P / 2, w * 0.9) * 0.85, r = _, m = _ * 0.6, V = P / 2, W = w * 0.7, G = ot(m, r, D, et), j = tt(M, u, p), Y = ot(m, r, D, j), J = tt(M, u, p), U = L ? lt(d, L) : d.toLocaleString(), Z = S ? `${(N * 100).toFixed(1)}%` : U, K = f(h);
272
+ return /* @__PURE__ */ v("div", { ref: A, className: "dc:relative dc:w-full", style: { height: a }, children: /* @__PURE__ */ v(
273
+ "svg",
274
+ {
275
+ width: "100%",
276
+ height: "100%",
277
+ viewBox: `0 0 ${P} ${w}`,
278
+ preserveAspectRatio: "xMidYMid meet",
279
+ "data-testid": "gauge-svg",
280
+ children: /* @__PURE__ */ O("g", { transform: `translate(${V}, ${W})`, children: [
281
+ /* @__PURE__ */ v(
282
+ "path",
283
+ {
284
+ d: G,
285
+ fill: qt,
286
+ "data-testid": "gauge-track"
287
+ }
288
+ ),
289
+ x.map((q, E) => /* @__PURE__ */ v(
290
+ "path",
291
+ {
292
+ d: ot(r + 4, r + 8, q.start, q.end),
293
+ fill: q.color,
294
+ "data-testid": `gauge-band-${E}`
295
+ },
296
+ E
297
+ )),
298
+ /* @__PURE__ */ v(
299
+ "path",
300
+ {
301
+ d: Y,
302
+ fill: T,
303
+ "data-testid": "gauge-fill",
304
+ "data-fraction": N.toFixed(4)
305
+ }
306
+ ),
307
+ /* @__PURE__ */ v(Ot, { angle: J, radius: _ }),
308
+ C && /* @__PURE__ */ O("g", { "data-testid": "gauge-label", children: [
309
+ /* @__PURE__ */ v(
310
+ "text",
311
+ {
312
+ textAnchor: "middle",
313
+ dominantBaseline: "middle",
314
+ fontSize: _ * 0.22,
315
+ fontWeight: "bold",
316
+ fill: "currentColor",
317
+ dy: _ * 0.12,
318
+ "data-testid": "gauge-value-text",
319
+ children: Z
320
+ }
321
+ ),
322
+ /* @__PURE__ */ v(
323
+ "text",
324
+ {
325
+ textAnchor: "middle",
326
+ fontSize: _ * 0.13,
327
+ fill: "currentColor",
328
+ className: "text-dc-text-secondary",
329
+ dy: _ * 0.34,
330
+ children: K
331
+ }
332
+ )
333
+ ] }),
334
+ /* @__PURE__ */ v(
335
+ "text",
336
+ {
337
+ x: Math.cos(D - Math.PI / 2) * (r + 14),
338
+ y: Math.sin(D - Math.PI / 2) * (r + 14),
339
+ textAnchor: "middle",
340
+ fontSize: _ * 0.12,
341
+ fill: "currentColor",
342
+ className: "text-dc-text-secondary",
343
+ "data-testid": "gauge-min-label",
344
+ children: L ? lt(u, L) : u.toLocaleString()
345
+ }
346
+ ),
347
+ /* @__PURE__ */ v(
348
+ "text",
349
+ {
350
+ x: Math.cos(et - Math.PI / 2) * (r + 14),
351
+ y: Math.sin(et - Math.PI / 2) * (r + 14),
352
+ textAnchor: "middle",
353
+ fontSize: _ * 0.12,
354
+ fill: "currentColor",
355
+ className: "text-dc-text-secondary",
356
+ "data-testid": "gauge-max-label",
357
+ children: L ? lt(p, L) : p.toLocaleString()
358
+ }
359
+ )
360
+ ] })
361
+ }
362
+ ) });
363
+ } catch (c) {
364
+ return /* @__PURE__ */ v("div", { className: "dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full text-dc-error dc:p-4", style: { height: a }, children: /* @__PURE__ */ O("div", { className: "dc:text-center", children: [
365
+ /* @__PURE__ */ v("div", { className: "dc:text-sm dc:font-semibold dc:mb-1", children: "Gauge Chart Error" }),
366
+ /* @__PURE__ */ v("div", { className: "dc:text-xs dc:mb-2", children: c instanceof Error ? c.message : "Unknown rendering error" }),
367
+ /* @__PURE__ */ v("div", { className: "dc:text-xs text-dc-text-muted", children: "Check the data and configuration" })
368
+ ] }) });
369
+ }
370
+ });
371
+ export {
372
+ Yt as default
373
+ };
374
+ //# sourceMappingURL=chart-gauge-CKJJ8m3b.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-gauge-CKJJ8m3b.js","sources":["../../../node_modules/d3-shape/src/constant.js","../../../node_modules/d3-shape/src/math.js","../../../node_modules/d3-path/src/path.js","../../../node_modules/d3-shape/src/path.js","../../../node_modules/d3-shape/src/arc.js","../../../src/client/components/charts/GaugeChart.tsx"],"sourcesContent":["export default function(x) {\n return function constant() {\n return x;\n };\n}\n","export const abs = Math.abs;\nexport const atan2 = Math.atan2;\nexport const cos = Math.cos;\nexport const max = Math.max;\nexport const min = Math.min;\nexport const sin = Math.sin;\nexport const sqrt = Math.sqrt;\n\nexport const epsilon = 1e-12;\nexport const pi = Math.PI;\nexport const halfPi = pi / 2;\nexport const tau = 2 * pi;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n","const pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction append(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += arguments[i] + strings[i];\n }\n}\n\nfunction appendRound(digits) {\n let d = Math.floor(digits);\n if (!(d >= 0)) throw new Error(`invalid digits: ${digits}`);\n if (d > 15) return append;\n const k = 10 ** d;\n return function(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += Math.round(arguments[i] * k) / k + strings[i];\n }\n };\n}\n\nexport class Path {\n constructor(digits) {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n this._append = digits == null ? append : appendRound(digits);\n }\n moveTo(x, y) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`;\n }\n closePath() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._append`Z`;\n }\n }\n lineTo(x, y) {\n this._append`L${this._x1 = +x},${this._y1 = +y}`;\n }\n quadraticCurveTo(x1, y1, x, y) {\n this._append`Q${+x1},${+y1},${this._x1 = +x},${this._y1 = +y}`;\n }\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this._append`C${+x1},${+y1},${+x2},${+y2},${this._x1 = +x},${this._y1 = +y}`;\n }\n arcTo(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._append`M${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._append`L${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Otherwise, draw an arc!\n else {\n let x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._append`L${x1 + t01 * x01},${y1 + t01 * y01}`;\n }\n\n this._append`A${r},${r},0,0,${+(y01 * x20 > x01 * y20)},${this._x1 = x1 + t21 * x21},${this._y1 = y1 + t21 * y21}`;\n }\n }\n arc(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r, ccw = !!ccw;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._append`M${x0},${y0}`;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._append`L${x0},${y0}`;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._append`A${r},${r},0,1,${cw},${x - dx},${y - dy}A${r},${r},0,1,${cw},${this._x1 = x0},${this._y1 = y0}`;\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._append`A${r},${r},0,${+(da >= pi)},${cw},${this._x1 = x + r * Math.cos(a1)},${this._y1 = y + r * Math.sin(a1)}`;\n }\n }\n rect(x, y, w, h) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${w = +w}v${+h}h${-w}Z`;\n }\n toString() {\n return this._;\n }\n}\n\nexport function path() {\n return new Path;\n}\n\n// Allow instanceof d3.path\npath.prototype = Path.prototype;\n\nexport function pathRound(digits = 3) {\n return new Path(+digits);\n}\n","import {Path} from \"d3-path\";\n\nexport function withPath(shape) {\n let digits = 3;\n\n shape.digits = function(_) {\n if (!arguments.length) return digits;\n if (_ == null) {\n digits = null;\n } else {\n const d = Math.floor(_);\n if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);\n digits = d;\n }\n return shape;\n };\n\n return () => new Path(digits);\n}\n","import constant from \"./constant.js\";\nimport {abs, acos, asin, atan2, cos, epsilon, halfPi, max, min, pi, sin, sqrt, tau} from \"./math.js\";\nimport {withPath} from \"./path.js\";\n\nfunction arcInnerRadius(d) {\n return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n var x10 = x1 - x0, y10 = y1 - y0,\n x32 = x3 - x2, y32 = y3 - y2,\n t = y32 * x10 - x32 * y10;\n if (t * t < epsilon) return;\n t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n return [x0 + t * x10, y0 + t * y10];\n}\n\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n var x01 = x0 - x1,\n y01 = y0 - y1,\n lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n ox = lo * y01,\n oy = -lo * x01,\n x11 = x0 + ox,\n y11 = y0 + oy,\n x10 = x1 + ox,\n y10 = y1 + oy,\n x00 = (x11 + x10) / 2,\n y00 = (y11 + y10) / 2,\n dx = x10 - x11,\n dy = y10 - y11,\n d2 = dx * dx + dy * dy,\n r = r1 - rc,\n D = x11 * y10 - x10 * y11,\n d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)),\n cx0 = (D * dy - dx * d) / d2,\n cy0 = (-D * dx - dy * d) / d2,\n cx1 = (D * dy + dx * d) / d2,\n cy1 = (-D * dx + dy * d) / d2,\n dx0 = cx0 - x00,\n dy0 = cy0 - y00,\n dx1 = cx1 - x00,\n dy1 = cy1 - y00;\n\n // Pick the closer of the two intersection points.\n // TODO Is there a faster way to determine which intersection to use?\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\n return {\n cx: cx0,\n cy: cy0,\n x01: -ox,\n y01: -oy,\n x11: cx0 * (r1 / r - 1),\n y11: cy0 * (r1 / r - 1)\n };\n}\n\nexport default function() {\n var innerRadius = arcInnerRadius,\n outerRadius = arcOuterRadius,\n cornerRadius = constant(0),\n padRadius = null,\n startAngle = arcStartAngle,\n endAngle = arcEndAngle,\n padAngle = arcPadAngle,\n context = null,\n path = withPath(arc);\n\n function arc() {\n var buffer,\n r,\n r0 = +innerRadius.apply(this, arguments),\n r1 = +outerRadius.apply(this, arguments),\n a0 = startAngle.apply(this, arguments) - halfPi,\n a1 = endAngle.apply(this, arguments) - halfPi,\n da = abs(a1 - a0),\n cw = a1 > a0;\n\n if (!context) context = buffer = path();\n\n // Ensure that the outer radius is always larger than the inner radius.\n if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\n // Is it a point?\n if (!(r1 > epsilon)) context.moveTo(0, 0);\n\n // Or is it a circle or annulus?\n else if (da > tau - epsilon) {\n context.moveTo(r1 * cos(a0), r1 * sin(a0));\n context.arc(0, 0, r1, a0, a1, !cw);\n if (r0 > epsilon) {\n context.moveTo(r0 * cos(a1), r0 * sin(a1));\n context.arc(0, 0, r0, a1, a0, cw);\n }\n }\n\n // Or is it a circular or annular sector?\n else {\n var a01 = a0,\n a11 = a1,\n a00 = a0,\n a10 = a1,\n da0 = da,\n da1 = da,\n ap = padAngle.apply(this, arguments) / 2,\n rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n rc0 = rc,\n rc1 = rc,\n t0,\n t1;\n\n // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n if (rp > epsilon) {\n var p0 = asin(rp / r0 * sin(ap)),\n p1 = asin(rp / r1 * sin(ap));\n if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n }\n\n var x01 = r1 * cos(a01),\n y01 = r1 * sin(a01),\n x10 = r0 * cos(a10),\n y10 = r0 * sin(a10);\n\n // Apply rounded corners?\n if (rc > epsilon) {\n var x11 = r1 * cos(a11),\n y11 = r1 * sin(a11),\n x00 = r0 * cos(a00),\n y00 = r0 * sin(a00),\n oc;\n\n // Restrict the corner radius according to the sector angle. If this\n // intersection fails, it’s probably because the arc is too small, so\n // disable the corner radius entirely.\n if (da < pi) {\n if (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10)) {\n var ax = x01 - oc[0],\n ay = y01 - oc[1],\n bx = x11 - oc[0],\n by = y11 - oc[1],\n kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = min(rc, (r0 - lc) / (kc - 1));\n rc1 = min(rc, (r1 - lc) / (kc + 1));\n } else {\n rc0 = rc1 = 0;\n }\n }\n }\n\n // Is the sector collapsed to a line?\n if (!(da1 > epsilon)) context.moveTo(x01, y01);\n\n // Does the sector’s outer ring have rounded corners?\n else if (rc1 > epsilon) {\n t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\n context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the outer ring just a circular arc?\n else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\n // Is there no inner ring, and it’s a circular sector?\n // Or perhaps it’s an annular sector collapsed due to padding?\n if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);\n\n // Does the sector’s inner ring (or point) have rounded corners?\n else if (rc0 > epsilon) {\n t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\n context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the inner ring just a circular arc?\n else context.arc(0, 0, r0, a10, a00, cw);\n }\n\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n return [cos(a) * r, sin(a) * r];\n };\n\n arc.innerRadius = function(_) {\n return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : innerRadius;\n };\n\n arc.outerRadius = function(_) {\n return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : outerRadius;\n };\n\n arc.cornerRadius = function(_) {\n return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : cornerRadius;\n };\n\n arc.padRadius = function(_) {\n return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), arc) : padRadius;\n };\n\n arc.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : startAngle;\n };\n\n arc.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : endAngle;\n };\n\n arc.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : padAngle;\n };\n\n arc.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n };\n\n return arc;\n}\n","import React, { useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { arc } from 'd3-shape'\nimport { formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport type { ChartProps, ThresholdBand } from '../../types'\n\nconst START_ANGLE = -Math.PI * 0.75\nconst END_ANGLE = Math.PI * 0.75\nconst TRACK_COLOR = '#e2e8f0'\nconst DEFAULT_FILL = '#6366f1'\n\nfunction parseNum(v: unknown): number | null {\n if (v === undefined || v === null) return null\n const n = typeof v === 'number' ? v : parseFloat(String(v))\n return isNaN(n) ? null : n\n}\n\nfunction clamp(v: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, v))\n}\n\nfunction valueToAngle(value: number, min: number, max: number): number {\n const span = max === min ? 1 : max - min\n const t = clamp((value - min) / span, 0, 1)\n return START_ANGLE + t * (END_ANGLE - START_ANGLE)\n}\n\nfunction resolveColor(fraction: number, thresholds: ThresholdBand[]): string {\n const sorted = [...thresholds].sort((a, b) => a.value - b.value)\n let color = DEFAULT_FILL\n for (const t of sorted) {\n if (fraction >= t.value) color = t.color\n }\n return color\n}\n\nfunction buildArcPath(\n innerRadius: number,\n outerRadius: number,\n startAngle: number,\n endAngle: number\n): string {\n const pathFn = arc()\n return pathFn({ innerRadius, outerRadius, startAngle, endAngle }) ?? ''\n}\n\nfunction Needle({ angle, radius }: { angle: number; radius: number }) {\n const needleLen = radius * 0.72\n const needleBase = radius * 0.06\n const x = Math.cos(angle - Math.PI / 2) * needleLen\n const y = Math.sin(angle - Math.PI / 2) * needleLen\n return (\n <g data-testid=\"gauge-needle\">\n <circle r={needleBase} fill=\"currentColor\" className=\"text-dc-text-secondary\" />\n <line\n x1={0}\n y1={0}\n x2={x}\n y2={y}\n stroke=\"currentColor\"\n strokeWidth={3}\n strokeLinecap=\"round\"\n className=\"text-dc-text-secondary\"\n />\n </g>\n )\n}\n\nconst GaugeChart = React.memo(function GaugeChart({\n data,\n chartConfig,\n displayConfig = {},\n height = '100%',\n}: ChartProps) {\n const getFieldLabel = useCubeFieldLabel()\n const containerRef = useRef<HTMLDivElement>(null)\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n\n useLayoutEffect(() => {\n const el = containerRef.current\n if (!el) return\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height: h } = entry.contentRect\n if (width > 0 && h > 0) setDimensions({ width, height: h })\n }\n })\n observer.observe(el)\n const rect = el.getBoundingClientRect()\n if (rect.width > 0 && rect.height > 0) setDimensions({ width: rect.width, height: rect.height })\n return () => observer.disconnect()\n }, [])\n\n const { valueField, maxField, configError } = useMemo(() => {\n const yAxis: string[] = Array.isArray(chartConfig?.yAxis)\n ? chartConfig.yAxis\n : []\n\n const valueField = yAxis[0] ?? ''\n const maxField = yAxis[1] ?? ''\n\n if (!valueField) {\n return { valueField, maxField, configError: 'Gauge requires at least 1 measure in Y-Axis (current value)' }\n }\n return { valueField, maxField, configError: null }\n }, [chartConfig])\n\n const thresholds: ThresholdBand[] = useMemo(() => {\n const raw = displayConfig?.thresholds\n let arr: unknown[] | null = null\n if (Array.isArray(raw)) {\n arr = raw\n } else if (typeof raw === 'string' && raw.trim()) {\n try {\n const parsed = JSON.parse(raw)\n if (Array.isArray(parsed)) arr = parsed\n } catch (e) {\n console.warn('GaugeChart: invalid threshold JSON', e)\n return []\n }\n }\n if (!arr) return []\n return arr.filter(\n (entry): entry is ThresholdBand =>\n entry !== null &&\n typeof entry === 'object' &&\n typeof (entry as ThresholdBand).value === 'number' &&\n typeof (entry as ThresholdBand).color === 'string'\n )\n }, [displayConfig?.thresholds])\n\n const thresholdBands = thresholds.length === 0\n ? []\n : [...thresholds].sort((a, b) => a.value - b.value).map((t, i, sorted) => {\n const bandStart = i === 0 ? START_ANGLE : valueToAngle(sorted[i - 1].value, 0, 1)\n const bandEnd = valueToAngle(t.value, 0, 1)\n return { color: t.color, start: bandStart, end: bandEnd }\n })\n\n try {\n if (!data || data.length === 0) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">No data available</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">No data points to display in gauge chart</div>\n </div>\n </div>\n )\n }\n\n if (configError) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-warning\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">Configuration Error</div>\n <div className=\"dc:text-xs\">{configError}</div>\n </div>\n </div>\n )\n }\n\n const row = (data as Record<string, unknown>[])[0]\n const rawValue = parseNum(row[valueField])\n if (rawValue === null) {\n return (\n <div className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">No valid data</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">Gauge value is not a valid number</div>\n </div>\n </div>\n )\n }\n const minValue = displayConfig?.minValue ?? 0\n const maxFieldValue = maxField ? parseNum(row[maxField]) : null\n const maxValue = displayConfig?.maxValue ?? (maxFieldValue ?? 100)\n\n const effectiveMax = maxValue === minValue ? minValue + 1 : maxValue\n const clampedValue = clamp(rawValue, minValue, effectiveMax)\n const fraction = (clampedValue - minValue) / (effectiveMax - minValue)\n\n const fillColor = thresholds.length > 0 ? resolveColor(fraction, thresholds) : DEFAULT_FILL\n\n const showCenterLabel = displayConfig?.showCenterLabel ?? true\n const showPercentage = displayConfig?.showPercentage ?? false\n const yAxisFormat = displayConfig?.leftYAxisFormat\n\n const containerW = dimensions.width || 300\n const containerH = typeof height === 'number' ? height : (dimensions.height || 200)\n\n const radius = Math.min(containerW / 2, containerH * 0.9) * 0.85\n const outerR = radius\n const innerR = radius * 0.6\n const cx = containerW / 2\n const cy = containerH * 0.7\n\n const trackPath = buildArcPath(innerR, outerR, START_ANGLE, END_ANGLE)\n const fillAngle = valueToAngle(clampedValue, minValue, effectiveMax)\n const fillPath = buildArcPath(innerR, outerR, START_ANGLE, fillAngle)\n\n const needleAngle = valueToAngle(clampedValue, minValue, effectiveMax)\n\n const displayValue = yAxisFormat\n ? formatAxisValue(rawValue, yAxisFormat)\n : rawValue.toLocaleString()\n\n const valueLabel = showPercentage\n ? `${(fraction * 100).toFixed(1)}%`\n : displayValue\n\n const fieldLabel = getFieldLabel(valueField)\n return (\n <div ref={containerRef} className=\"dc:relative dc:w-full\" style={{ height }}>\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox={`0 0 ${containerW} ${containerH}`}\n preserveAspectRatio=\"xMidYMid meet\"\n data-testid=\"gauge-svg\"\n >\n <g transform={`translate(${cx}, ${cy})`}>\n <path\n d={trackPath}\n fill={TRACK_COLOR}\n data-testid=\"gauge-track\"\n />\n\n {thresholdBands.map((band, i) => (\n <path\n key={i}\n d={buildArcPath(outerR + 4, outerR + 8, band.start, band.end)}\n fill={band.color}\n data-testid={`gauge-band-${i}`}\n />\n ))}\n\n <path\n d={fillPath}\n fill={fillColor}\n data-testid=\"gauge-fill\"\n data-fraction={fraction.toFixed(4)}\n />\n\n <Needle angle={needleAngle} radius={radius} />\n\n {showCenterLabel && (\n <g data-testid=\"gauge-label\">\n <text\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={radius * 0.22}\n fontWeight=\"bold\"\n fill=\"currentColor\"\n dy={radius * 0.12}\n data-testid=\"gauge-value-text\"\n >\n {valueLabel}\n </text>\n <text\n textAnchor=\"middle\"\n fontSize={radius * 0.13}\n fill=\"currentColor\"\n className=\"text-dc-text-secondary\"\n dy={radius * 0.34}\n >\n {fieldLabel}\n </text>\n </g>\n )}\n\n <text\n x={Math.cos(START_ANGLE - Math.PI / 2) * (outerR + 14)}\n y={Math.sin(START_ANGLE - Math.PI / 2) * (outerR + 14)}\n textAnchor=\"middle\"\n fontSize={radius * 0.12}\n fill=\"currentColor\"\n className=\"text-dc-text-secondary\"\n data-testid=\"gauge-min-label\"\n >\n {yAxisFormat ? formatAxisValue(minValue, yAxisFormat) : minValue.toLocaleString()}\n </text>\n <text\n x={Math.cos(END_ANGLE - Math.PI / 2) * (outerR + 14)}\n y={Math.sin(END_ANGLE - Math.PI / 2) * (outerR + 14)}\n textAnchor=\"middle\"\n fontSize={radius * 0.12}\n fill=\"currentColor\"\n className=\"text-dc-text-secondary\"\n data-testid=\"gauge-max-label\"\n >\n {yAxisFormat ? formatAxisValue(effectiveMax, yAxisFormat) : effectiveMax.toLocaleString()}\n </text>\n </g>\n </svg>\n </div>\n )\n } catch (error) {\n return (\n <div className=\"dc:flex dc:flex-col dc:items-center dc:justify-center dc:w-full text-dc-error dc:p-4\" style={{ height }}>\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">Gauge Chart Error</div>\n <div className=\"dc:text-xs dc:mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"dc:text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n})\n\nexport default GaugeChart\n"],"names":["constant","x","abs","atan2","cos","max","min","sin","sqrt","epsilon","pi","halfPi","tau","acos","asin","tauEpsilon","append","strings","i","n","appendRound","digits","d","k","Path","y","x1","y1","x2","y2","r","x0","y0","x21","y21","x01","y01","l01_2","x20","y20","l21_2","l20_2","l21","l01","l","t01","t21","a0","a1","ccw","dx","dy","cw","da","w","h","withPath","shape","_","arcInnerRadius","arcOuterRadius","arcStartAngle","arcEndAngle","arcPadAngle","intersect","x3","y3","x10","y10","x32","y32","t","cornerTangents","r1","rc","lo","ox","oy","x11","y11","x00","y00","d2","D","cx0","cy0","cx1","cy1","dx0","dy0","dx1","dy1","arc","innerRadius","outerRadius","cornerRadius","padRadius","startAngle","endAngle","padAngle","context","path","buffer","r0","a01","a11","a00","a10","da0","da1","ap","rp","rc0","rc1","t0","t1","p0","p1","oc","ax","ay","bx","by","kc","lc","a","START_ANGLE","END_ANGLE","TRACK_COLOR","DEFAULT_FILL","parseNum","v","clamp","hi","valueToAngle","value","span","resolveColor","fraction","thresholds","sorted","b","color","buildArcPath","Needle","angle","radius","needleLen","needleBase","jsxs","jsx","GaugeChart","React","data","chartConfig","displayConfig","height","getFieldLabel","useCubeFieldLabel","containerRef","useRef","dimensions","setDimensions","useState","useLayoutEffect","el","observer","entries","entry","width","rect","valueField","maxField","configError","useMemo","yAxis","raw","arr","parsed","e","thresholdBands","bandStart","bandEnd","row","rawValue","minValue","maxFieldValue","maxValue","effectiveMax","clampedValue","fillColor","showCenterLabel","showPercentage","yAxisFormat","containerW","containerH","outerR","innerR","cx","cy","trackPath","fillAngle","fillPath","needleAngle","displayValue","formatAxisValue","valueLabel","fieldLabel","band","error"],"mappings":";;;AAAe,SAAAA,EAASC,GAAG;AACzB,SAAO,WAAoB;AACzB,WAAOA;AAAA,EACT;AACF;ACJO,MAAMC,KAAM,KAAK,KACXC,IAAQ,KAAK,OACbC,IAAM,KAAK,KACXC,KAAM,KAAK,KACXC,KAAM,KAAK,KACXC,IAAM,KAAK,KACXC,IAAO,KAAK,MAEZC,IAAU,OACVC,IAAK,KAAK,IACVC,KAASD,IAAK,GACdE,KAAM,IAAIF;AAEhB,SAASG,GAAKZ,GAAG;AACtB,SAAOA,IAAI,IAAI,IAAIA,IAAI,KAAKS,IAAK,KAAK,KAAKT,CAAC;AAC9C;AAEO,SAASa,GAAKb,GAAG;AACtB,SAAOA,KAAK,IAAIU,KAASV,KAAK,KAAK,CAACU,KAAS,KAAK,KAAKV,CAAC;AAC1D;ACnBA,MAAMS,KAAK,KAAK,IACZE,KAAM,IAAIF,IACVD,IAAU,MACVM,KAAaH,KAAMH;AAEvB,SAASO,GAAOC,GAAS;AACvB,OAAK,KAAKA,EAAQ,CAAC;AACnB,WAASC,IAAI,GAAGC,IAAIF,EAAQ,QAAQC,IAAIC,GAAG,EAAED;AAC3C,SAAK,KAAK,UAAUA,CAAC,IAAID,EAAQC,CAAC;AAEtC;AAEA,SAASE,GAAYC,GAAQ;AAC3B,MAAIC,IAAI,KAAK,MAAMD,CAAM;AACzB,MAAI,EAAEC,KAAK,GAAI,OAAM,IAAI,MAAM,mBAAmBD,CAAM,EAAE;AAC1D,MAAIC,IAAI,GAAI,QAAON;AACnB,QAAMO,IAAI,MAAMD;AAChB,SAAO,SAASL,GAAS;AACvB,SAAK,KAAKA,EAAQ,CAAC;AACnB,aAASC,IAAI,GAAGC,IAAIF,EAAQ,QAAQC,IAAIC,GAAG,EAAED;AAC3C,WAAK,KAAK,KAAK,MAAM,UAAUA,CAAC,IAAIK,CAAC,IAAIA,IAAIN,EAAQC,CAAC;AAAA,EAE1D;AACF;AAEO,MAAMM,GAAK;AAAA,EAChB,YAAYH,GAAQ;AAClB,SAAK,MAAM,KAAK;AAAA,IAChB,KAAK,MAAM,KAAK,MAAM,MACtB,KAAK,IAAI,IACT,KAAK,UAAUA,KAAU,OAAOL,KAASI,GAAYC,CAAM;AAAA,EAC7D;AAAA,EACA,OAAOpB,GAAGwB,GAAG;AACX,SAAK,WAAW,KAAK,MAAM,KAAK,MAAM,CAACxB,CAAC,IAAI,KAAK,MAAM,KAAK,MAAM,CAACwB,CAAC;AAAA,EACtE;AAAA,EACA,YAAY;AACV,IAAI,KAAK,QAAQ,SACf,KAAK,MAAM,KAAK,KAAK,KAAK,MAAM,KAAK,KACrC,KAAK;AAAA,EAET;AAAA,EACA,OAAOxB,GAAGwB,GAAG;AACX,SAAK,WAAW,KAAK,MAAM,CAACxB,CAAC,IAAI,KAAK,MAAM,CAACwB,CAAC;AAAA,EAChD;AAAA,EACA,iBAAiBC,GAAIC,GAAI1B,GAAGwB,GAAG;AAC7B,SAAK,WAAW,CAACC,CAAE,IAAI,CAACC,CAAE,IAAI,KAAK,MAAM,CAAC1B,CAAC,IAAI,KAAK,MAAM,CAACwB,CAAC;AAAA,EAC9D;AAAA,EACA,cAAcC,GAAIC,GAAIC,GAAIC,GAAI5B,GAAGwB,GAAG;AAClC,SAAK,WAAW,CAACC,CAAE,IAAI,CAACC,CAAE,IAAI,CAACC,CAAE,IAAI,CAACC,CAAE,IAAI,KAAK,MAAM,CAAC5B,CAAC,IAAI,KAAK,MAAM,CAACwB,CAAC;AAAA,EAC5E;AAAA,EACA,MAAMC,GAAIC,GAAIC,GAAIC,GAAIC,GAAG;AAIvB,QAHAJ,IAAK,CAACA,GAAIC,IAAK,CAACA,GAAIC,IAAK,CAACA,GAAIC,IAAK,CAACA,GAAIC,IAAI,CAACA,GAGzCA,IAAI,EAAG,OAAM,IAAI,MAAM,oBAAoBA,CAAC,EAAE;AAElD,QAAIC,IAAK,KAAK,KACVC,IAAK,KAAK,KACVC,IAAML,IAAKF,GACXQ,IAAML,IAAKF,GACXQ,IAAMJ,IAAKL,GACXU,IAAMJ,IAAKL,GACXU,IAAQF,IAAMA,IAAMC,IAAMA;AAG9B,QAAI,KAAK,QAAQ;AACf,WAAK,WAAW,KAAK,MAAMV,CAAE,IAAI,KAAK,MAAMC,CAAE;AAAA,aAIrCU,IAAQ5B,EAKd,KAAI,EAAE,KAAK,IAAI2B,IAAMH,IAAMC,IAAMC,CAAG,IAAI1B,MAAY,CAACqB;AACxD,WAAK,WAAW,KAAK,MAAMJ,CAAE,IAAI,KAAK,MAAMC,CAAE;AAAA,SAI3C;AACH,UAAIW,IAAMV,IAAKG,GACXQ,IAAMV,IAAKG,GACXQ,IAAQP,IAAMA,IAAMC,IAAMA,GAC1BO,IAAQH,IAAMA,IAAMC,IAAMA,GAC1BG,IAAM,KAAK,KAAKF,CAAK,GACrBG,IAAM,KAAK,KAAKN,CAAK,GACrBO,IAAId,IAAI,KAAK,KAAKpB,KAAK,KAAK,MAAM8B,IAAQH,IAAQI,MAAU,IAAIC,IAAMC,EAAI,KAAK,CAAC,GAChFE,IAAMD,IAAID,GACVG,IAAMF,IAAIF;AAGd,MAAI,KAAK,IAAIG,IAAM,CAAC,IAAIpC,KACtB,KAAK,WAAWiB,IAAKmB,IAAMV,CAAG,IAAIR,IAAKkB,IAAMT,CAAG,IAGlD,KAAK,WAAWN,CAAC,IAAIA,CAAC,QAAQ,EAAEM,IAAME,IAAMH,IAAMI,EAAI,IAAI,KAAK,MAAMb,IAAKoB,IAAMb,CAAG,IAAI,KAAK,MAAMN,IAAKmB,IAAMZ,CAAG;AAAA,IAClH;AAAA,EACF;AAAA,EACA,IAAIjC,GAAGwB,GAAGK,GAAGiB,GAAIC,GAAIC,GAAK;AAIxB,QAHAhD,IAAI,CAACA,GAAGwB,IAAI,CAACA,GAAGK,IAAI,CAACA,GAAGmB,IAAM,CAAC,CAACA,GAG5BnB,IAAI,EAAG,OAAM,IAAI,MAAM,oBAAoBA,CAAC,EAAE;AAElD,QAAIoB,IAAKpB,IAAI,KAAK,IAAIiB,CAAE,GACpBI,IAAKrB,IAAI,KAAK,IAAIiB,CAAE,GACpBhB,IAAK9B,IAAIiD,GACTlB,IAAKP,IAAI0B,GACTC,IAAK,IAAIH,GACTI,IAAKJ,IAAMF,IAAKC,IAAKA,IAAKD;AAa9B,IAVI,KAAK,QAAQ,OACf,KAAK,WAAWhB,CAAE,IAAIC,CAAE,MAIjB,KAAK,IAAI,KAAK,MAAMD,CAAE,IAAItB,KAAW,KAAK,IAAI,KAAK,MAAMuB,CAAE,IAAIvB,MACtE,KAAK,WAAWsB,CAAE,IAAIC,CAAE,IAIrBF,MAGDuB,IAAK,MAAGA,IAAKA,IAAKzC,KAAMA,KAGxByC,IAAKtC,KACP,KAAK,WAAWe,CAAC,IAAIA,CAAC,QAAQsB,CAAE,IAAInD,IAAIiD,CAAE,IAAIzB,IAAI0B,CAAE,IAAIrB,CAAC,IAAIA,CAAC,QAAQsB,CAAE,IAAI,KAAK,MAAMrB,CAAE,IAAI,KAAK,MAAMC,CAAE,KAInGqB,IAAK5C,KACZ,KAAK,WAAWqB,CAAC,IAAIA,CAAC,MAAM,EAAEuB,KAAM3C,GAAG,IAAI0C,CAAE,IAAI,KAAK,MAAMnD,IAAI6B,IAAI,KAAK,IAAIkB,CAAE,CAAC,IAAI,KAAK,MAAMvB,IAAIK,IAAI,KAAK,IAAIkB,CAAE,CAAC;AAAA,EAEvH;AAAA,EACA,KAAK/C,GAAGwB,GAAG6B,GAAGC,GAAG;AACf,SAAK,WAAW,KAAK,MAAM,KAAK,MAAM,CAACtD,CAAC,IAAI,KAAK,MAAM,KAAK,MAAM,CAACwB,CAAC,IAAI6B,IAAI,CAACA,CAAC,IAAI,CAACC,CAAC,IAAI,CAACD,CAAC;AAAA,EAC5F;AAAA,EACA,WAAW;AACT,WAAO,KAAK;AAAA,EACd;AACF;AC9IO,SAASE,GAASC,GAAO;AAC9B,MAAIpC,IAAS;AAEb,SAAAoC,EAAM,SAAS,SAASC,GAAG;AACzB,QAAI,CAAC,UAAU,OAAQ,QAAOrC;AAC9B,QAAIqC,KAAK;AACP,MAAArC,IAAS;AAAA,SACJ;AACL,YAAMC,IAAI,KAAK,MAAMoC,CAAC;AACtB,UAAI,EAAEpC,KAAK,GAAI,OAAM,IAAI,WAAW,mBAAmBoC,CAAC,EAAE;AAC1D,MAAArC,IAASC;AAAA,IACX;AACA,WAAOmC;AAAA,EACT,GAEO,MAAM,IAAIjC,GAAKH,CAAM;AAC9B;ACdA,SAASsC,GAAerC,GAAG;AACzB,SAAOA,EAAE;AACX;AAEA,SAASsC,GAAetC,GAAG;AACzB,SAAOA,EAAE;AACX;AAEA,SAASuC,GAAcvC,GAAG;AACxB,SAAOA,EAAE;AACX;AAEA,SAASwC,GAAYxC,GAAG;AACtB,SAAOA,EAAE;AACX;AAEA,SAASyC,GAAYzC,GAAG;AACtB,SAAOA,KAAKA,EAAE;AAChB;AAEA,SAAS0C,GAAUjC,GAAIC,GAAIN,GAAIC,GAAIC,GAAIC,GAAIoC,GAAIC,GAAI;AACjD,MAAIC,IAAMzC,IAAKK,GAAIqC,IAAMzC,IAAKK,GAC1BqC,IAAMJ,IAAKrC,GAAI0C,IAAMJ,IAAKrC,GAC1B0C,IAAID,IAAMH,IAAME,IAAMD;AAC1B,MAAI,EAAAG,IAAIA,IAAI9D;AACZ,WAAA8D,KAAKF,KAAOrC,IAAKH,KAAMyC,KAAOvC,IAAKH,MAAO2C,GACnC,CAACxC,IAAKwC,IAAIJ,GAAKnC,IAAKuC,IAAIH,CAAG;AACpC;AAIA,SAASI,EAAezC,GAAIC,GAAIN,GAAIC,GAAI8C,GAAIC,GAAItB,GAAI;AAClD,MAAIjB,IAAMJ,IAAKL,GACXU,IAAMJ,IAAKL,GACXgD,KAAMvB,IAAKsB,IAAK,CAACA,KAAMlE,EAAK2B,IAAMA,IAAMC,IAAMA,CAAG,GACjDwC,IAAKD,IAAKvC,GACVyC,IAAK,CAACF,IAAKxC,GACX2C,IAAM/C,IAAK6C,GACXG,IAAM/C,IAAK6C,GACXV,IAAMzC,IAAKkD,GACXR,IAAMzC,IAAKkD,GACXG,KAAOF,IAAMX,KAAO,GACpBc,KAAOF,IAAMX,KAAO,GACpBlB,IAAKiB,IAAMW,GACX3B,IAAKiB,IAAMW,GACXG,IAAKhC,IAAKA,IAAKC,IAAKA,GACpBrB,IAAI2C,IAAKC,GACTS,IAAIL,IAAMV,IAAMD,IAAMY,GACtBzD,KAAK6B,IAAK,IAAI,KAAK,KAAK3C,EAAKH,GAAI,GAAGyB,IAAIA,IAAIoD,IAAKC,IAAIA,CAAC,CAAC,GACvDC,KAAOD,IAAIhC,IAAKD,IAAK5B,KAAK4D,GAC1BG,KAAO,CAACF,IAAIjC,IAAKC,IAAK7B,KAAK4D,GAC3BI,KAAOH,IAAIhC,IAAKD,IAAK5B,KAAK4D,GAC1BK,KAAO,CAACJ,IAAIjC,IAAKC,IAAK7B,KAAK4D,GAC3BM,IAAMJ,IAAMJ,GACZS,IAAMJ,IAAMJ,GACZS,IAAMJ,IAAMN,GACZW,IAAMJ,IAAMN;AAIhB,SAAIO,IAAMA,IAAMC,IAAMA,IAAMC,IAAMA,IAAMC,IAAMA,MAAKP,IAAME,GAAKD,IAAME,IAE7D;AAAA,IACL,IAAIH;AAAA,IACJ,IAAIC;AAAA,IACJ,KAAK,CAACT;AAAA,IACN,KAAK,CAACC;AAAA,IACN,KAAKO,KAAOX,IAAK3C,IAAI;AAAA,IACrB,KAAKuD,KAAOZ,IAAK3C,IAAI;AAAA,EACzB;AACA;AAEe,SAAA8D,KAAW;AACxB,MAAIC,IAAclC,IACdmC,IAAclC,IACdmC,IAAe/F,EAAS,CAAC,GACzBgG,IAAY,MACZC,IAAapC,IACbqC,IAAWpC,IACXqC,IAAWpC,IACXqC,IAAU,MACVC,IAAO7C,GAASoC,CAAG;AAEvB,WAASA,IAAM;AACb,QAAIU,GACAxE,GACAyE,IAAK,CAACV,EAAY,MAAM,MAAM,SAAS,GACvCpB,IAAK,CAACqB,EAAY,MAAM,MAAM,SAAS,GACvC/C,IAAKkD,EAAW,MAAM,MAAM,SAAS,IAAItF,IACzCqC,IAAKkD,EAAS,MAAM,MAAM,SAAS,IAAIvF,IACvC0C,IAAKnD,GAAI8C,IAAKD,CAAE,GAChBK,IAAKJ,IAAKD;AAQd,QANKqD,MAASA,IAAUE,IAASD,EAAI,IAGjC5B,IAAK8B,MAAIzE,IAAI2C,GAAIA,IAAK8B,GAAIA,IAAKzE,IAG/B,EAAE2C,IAAKhE,GAAU,CAAA2F,EAAQ,OAAO,GAAG,CAAC;AAAA,aAG/B/C,IAAKzC,KAAMH;AAClB,MAAA2F,EAAQ,OAAO3B,IAAKrE,EAAI2C,CAAE,GAAG0B,IAAKlE,EAAIwC,CAAE,CAAC,GACzCqD,EAAQ,IAAI,GAAG,GAAG3B,GAAI1B,GAAIC,GAAI,CAACI,CAAE,GAC7BmD,IAAK9F,MACP2F,EAAQ,OAAOG,IAAKnG,EAAI4C,CAAE,GAAGuD,IAAKhG,EAAIyC,CAAE,CAAC,GACzCoD,EAAQ,IAAI,GAAG,GAAGG,GAAIvD,GAAID,GAAIK,CAAE;AAAA,SAK/B;AACH,UAAIoD,IAAMzD,GACN0D,IAAMzD,GACN0D,IAAM3D,GACN4D,IAAM3D,GACN4D,IAAMvD,GACNwD,IAAMxD,GACNyD,IAAKX,EAAS,MAAM,MAAM,SAAS,IAAI,GACvCY,IAAMD,IAAKrG,MAAauF,IAAY,CAACA,EAAU,MAAM,MAAM,SAAS,IAAIxF,EAAK+F,IAAKA,IAAK9B,IAAKA,CAAE,IAC9FC,IAAKpE,GAAIJ,GAAIuE,IAAK8B,CAAE,IAAI,GAAG,CAACR,EAAa,MAAM,MAAM,SAAS,CAAC,GAC/DiB,IAAMtC,GACNuC,IAAMvC,GACNwC,GACAC;AAGJ,UAAIJ,IAAKtG,GAAS;AAChB,YAAI2G,IAAKtG,GAAKiG,IAAKR,IAAKhG,EAAIuG,CAAE,CAAC,GAC3BO,IAAKvG,GAAKiG,IAAKtC,IAAKlE,EAAIuG,CAAE,CAAC;AAC/B,SAAKF,KAAOQ,IAAK,KAAK3G,KAAS2G,KAAOhE,IAAK,IAAI,IAAKsD,KAAOU,GAAIT,KAAOS,MACjER,IAAM,GAAGF,IAAMC,KAAO5D,IAAKC,KAAM,KACjC6D,KAAOQ,IAAK,KAAK5G,KAAS4G,KAAOjE,IAAK,IAAI,IAAKoD,KAAOa,GAAIZ,KAAOY,MACjER,IAAM,GAAGL,IAAMC,KAAO1D,IAAKC,KAAM;AAAA,MACxC;AAEA,UAAIb,IAAMsC,IAAKrE,EAAIoG,CAAG,GAClBpE,IAAMqC,IAAKlE,EAAIiG,CAAG,GAClBrC,IAAMoC,IAAKnG,EAAIuG,CAAG,GAClBvC,IAAMmC,IAAKhG,EAAIoG,CAAG;AAGtB,UAAIjC,IAAKjE,GAAS;AAChB,YAAIqE,IAAML,IAAKrE,EAAIqG,CAAG,GAClB1B,IAAMN,IAAKlE,EAAIkG,CAAG,GAClBzB,IAAMuB,IAAKnG,EAAIsG,CAAG,GAClBzB,IAAMsB,IAAKhG,EAAImG,CAAG,GAClBY;AAKJ,YAAIjE,IAAK3C;AACP,cAAI4G,IAAKtD,GAAU7B,GAAKC,GAAK4C,GAAKC,GAAKH,GAAKC,GAAKZ,GAAKC,CAAG,GAAG;AAC1D,gBAAImD,KAAKpF,IAAMmF,EAAG,CAAC,GACfE,KAAKpF,IAAMkF,EAAG,CAAC,GACfG,KAAK3C,IAAMwC,EAAG,CAAC,GACfI,KAAK3C,IAAMuC,EAAG,CAAC,GACfK,KAAK,IAAIpH,EAAIM,IAAM0G,KAAKE,KAAKD,KAAKE,OAAOlH,EAAK+G,KAAKA,KAAKC,KAAKA,EAAE,IAAIhH,EAAKiH,KAAKA,KAAKC,KAAKA,EAAE,EAAE,IAAI,CAAC,GAChGE,KAAKpH,EAAK8G,EAAG,CAAC,IAAIA,EAAG,CAAC,IAAIA,EAAG,CAAC,IAAIA,EAAG,CAAC,CAAC;AAC3C,YAAAN,IAAM1G,GAAIoE,IAAK6B,IAAKqB,OAAOD,KAAK,EAAE,GAClCV,IAAM3G,GAAIoE,IAAKD,IAAKmD,OAAOD,KAAK,EAAE;AAAA,UACpC;AACE,YAAAX,IAAMC,IAAM;AAAA,MAGlB;AAGA,MAAMJ,IAAMpG,IAGHwG,IAAMxG,KACbyG,IAAK1C,EAAeQ,GAAKC,GAAK9C,GAAKC,GAAKqC,GAAIwC,GAAK7D,CAAE,GACnD+D,IAAK3C,EAAeM,GAAKC,GAAKZ,GAAKC,GAAKK,GAAIwC,GAAK7D,CAAE,GAEnDgD,EAAQ,OAAOc,EAAG,KAAKA,EAAG,KAAKA,EAAG,KAAKA,EAAG,GAAG,GAGzCD,IAAMvC,IAAI0B,EAAQ,IAAIc,EAAG,IAAIA,EAAG,IAAID,GAAK9G,EAAM+G,EAAG,KAAKA,EAAG,GAAG,GAAG/G,EAAMgH,EAAG,KAAKA,EAAG,GAAG,GAAG,CAAC/D,CAAE,KAI5FgD,EAAQ,IAAIc,EAAG,IAAIA,EAAG,IAAID,GAAK9G,EAAM+G,EAAG,KAAKA,EAAG,GAAG,GAAG/G,EAAM+G,EAAG,KAAKA,EAAG,GAAG,GAAG,CAAC9D,CAAE,GAChFgD,EAAQ,IAAI,GAAG,GAAG3B,GAAItE,EAAM+G,EAAG,KAAKA,EAAG,KAAKA,EAAG,KAAKA,EAAG,GAAG,GAAG/G,EAAMgH,EAAG,KAAKA,EAAG,KAAKA,EAAG,KAAKA,EAAG,GAAG,GAAG,CAAC/D,CAAE,GACvGgD,EAAQ,IAAIe,EAAG,IAAIA,EAAG,IAAIF,GAAK9G,EAAMgH,EAAG,KAAKA,EAAG,GAAG,GAAGhH,EAAMgH,EAAG,KAAKA,EAAG,GAAG,GAAG,CAAC/D,CAAE,OAK/EgD,EAAQ,OAAOjE,GAAKC,CAAG,GAAGgE,EAAQ,IAAI,GAAG,GAAG3B,GAAI+B,GAAKC,GAAK,CAACrD,CAAE,KArB5CgD,EAAQ,OAAOjE,GAAKC,CAAG,GAyBzC,EAAEmE,IAAK9F,MAAY,EAAEmG,IAAMnG,KAAU2F,EAAQ,OAAOjC,GAAKC,CAAG,IAGvD4C,IAAMvG,KACbyG,IAAK1C,EAAeL,GAAKC,GAAKU,GAAKC,GAAKwB,GAAI,CAACS,GAAK5D,CAAE,GACpD+D,IAAK3C,EAAerC,GAAKC,GAAK4C,GAAKC,GAAKsB,GAAI,CAACS,GAAK5D,CAAE,GAEpDgD,EAAQ,OAAOc,EAAG,KAAKA,EAAG,KAAKA,EAAG,KAAKA,EAAG,GAAG,GAGzCF,IAAMtC,IAAI0B,EAAQ,IAAIc,EAAG,IAAIA,EAAG,IAAIF,GAAK7G,EAAM+G,EAAG,KAAKA,EAAG,GAAG,GAAG/G,EAAMgH,EAAG,KAAKA,EAAG,GAAG,GAAG,CAAC/D,CAAE,KAI5FgD,EAAQ,IAAIc,EAAG,IAAIA,EAAG,IAAIF,GAAK7G,EAAM+G,EAAG,KAAKA,EAAG,GAAG,GAAG/G,EAAM+G,EAAG,KAAKA,EAAG,GAAG,GAAG,CAAC9D,CAAE,GAChFgD,EAAQ,IAAI,GAAG,GAAGG,GAAIpG,EAAM+G,EAAG,KAAKA,EAAG,KAAKA,EAAG,KAAKA,EAAG,GAAG,GAAG/G,EAAMgH,EAAG,KAAKA,EAAG,KAAKA,EAAG,KAAKA,EAAG,GAAG,GAAG/D,CAAE,GACtGgD,EAAQ,IAAIe,EAAG,IAAIA,EAAG,IAAIH,GAAK7G,EAAMgH,EAAG,KAAKA,EAAG,GAAG,GAAGhH,EAAMgH,EAAG,KAAKA,EAAG,GAAG,GAAG,CAAC/D,CAAE,MAK/EgD,EAAQ,IAAI,GAAG,GAAGG,GAAII,GAAKD,GAAKtD,CAAE;AAAA,IACzC;AAIA,QAFAgD,EAAQ,UAAS,GAEbE,EAAQ,QAAOF,IAAU,MAAME,IAAS,MAAM;AAAA,EACpD;AAEA,SAAAV,EAAI,WAAW,WAAW;AACxB,QAAI9D,KAAK,CAAC+D,EAAY,MAAM,MAAM,SAAS,IAAI,CAACC,EAAY,MAAM,MAAM,SAAS,KAAK,GAClF+B,KAAK,CAAC5B,EAAW,MAAM,MAAM,SAAS,IAAI,CAACC,EAAS,MAAM,MAAM,SAAS,KAAK,IAAIxF,IAAK;AAC3F,WAAO,CAACN,EAAIyH,CAAC,IAAI/F,GAAGvB,EAAIsH,CAAC,IAAI/F,CAAC;AAAA,EAChC,GAEA8D,EAAI,cAAc,SAASlC,GAAG;AAC5B,WAAO,UAAU,UAAUmC,IAAc,OAAOnC,KAAM,aAAaA,IAAI1D,EAAS,CAAC0D,CAAC,GAAGkC,KAAOC;AAAA,EAC9F,GAEAD,EAAI,cAAc,SAASlC,GAAG;AAC5B,WAAO,UAAU,UAAUoC,IAAc,OAAOpC,KAAM,aAAaA,IAAI1D,EAAS,CAAC0D,CAAC,GAAGkC,KAAOE;AAAA,EAC9F,GAEAF,EAAI,eAAe,SAASlC,GAAG;AAC7B,WAAO,UAAU,UAAUqC,IAAe,OAAOrC,KAAM,aAAaA,IAAI1D,EAAS,CAAC0D,CAAC,GAAGkC,KAAOG;AAAA,EAC/F,GAEAH,EAAI,YAAY,SAASlC,GAAG;AAC1B,WAAO,UAAU,UAAUsC,IAAYtC,KAAK,OAAO,OAAO,OAAOA,KAAM,aAAaA,IAAI1D,EAAS,CAAC0D,CAAC,GAAGkC,KAAOI;AAAA,EAC/G,GAEAJ,EAAI,aAAa,SAASlC,GAAG;AAC3B,WAAO,UAAU,UAAUuC,IAAa,OAAOvC,KAAM,aAAaA,IAAI1D,EAAS,CAAC0D,CAAC,GAAGkC,KAAOK;AAAA,EAC7F,GAEAL,EAAI,WAAW,SAASlC,GAAG;AACzB,WAAO,UAAU,UAAUwC,IAAW,OAAOxC,KAAM,aAAaA,IAAI1D,EAAS,CAAC0D,CAAC,GAAGkC,KAAOM;AAAA,EAC3F,GAEAN,EAAI,WAAW,SAASlC,GAAG;AACzB,WAAO,UAAU,UAAUyC,IAAW,OAAOzC,KAAM,aAAaA,IAAI1D,EAAS,CAAC0D,CAAC,GAAGkC,KAAOO;AAAA,EAC3F,GAEAP,EAAI,UAAU,SAASlC,GAAG;AACxB,WAAO,UAAU,UAAW0C,IAAU1C,KAAY,MAAWkC,KAAOQ;AAAA,EACtE,GAEOR;AACT;ACrQA,MAAMkC,IAAc,CAAC,KAAK,KAAK,MACzBC,KAAY,KAAK,KAAK,MACtBC,KAAc,WACdC,KAAe;AAErB,SAASC,GAASC,GAA2B;AAC3C,MAAuBA,KAAM,KAAM,QAAO;AAC1C,QAAMhH,IAAI,OAAOgH,KAAM,WAAWA,IAAI,WAAW,OAAOA,CAAC,CAAC;AAC1D,SAAO,MAAMhH,CAAC,IAAI,OAAOA;AAC3B;AAEA,SAASiH,GAAMD,GAAWxD,GAAY0D,GAAoB;AACxD,SAAO,KAAK,IAAI1D,GAAI,KAAK,IAAI0D,GAAIF,CAAC,CAAC;AACrC;AAEA,SAASG,GAAaC,GAAejI,GAAaD,GAAqB;AACrE,QAAMmI,IAAOnI,MAAQC,IAAM,IAAID,IAAMC,GAC/BiE,IAAI6D,IAAOG,IAAQjI,KAAOkI,GAAM,GAAG,CAAC;AAC1C,SAAOV,IAAcvD,KAAKwD,KAAYD;AACxC;AAEA,SAASW,GAAaC,GAAkBC,GAAqC;AAC3E,QAAMC,IAAS,CAAC,GAAGD,CAAU,EAAE,KAAK,CAAC,GAAGE,MAAM,EAAE,QAAQA,EAAE,KAAK;AAC/D,MAAIC,IAAQb;AACZ,aAAW1D,KAAKqE;AACd,IAAIF,KAAYnE,EAAE,UAAOuE,IAAQvE,EAAE;AAErC,SAAOuE;AACT;AAEA,SAASC,GACPlD,GACAC,GACAG,GACAC,GACQ;AAER,SADeN,GAAA,EACD,EAAE,aAAAC,GAAa,aAAAC,GAAa,YAAAG,GAAY,UAAAC,EAAA,CAAU,KAAK;AACvE;AAEA,SAAS8C,GAAO,EAAE,OAAAC,GAAO,QAAAC,KAA6C;AACpE,QAAMC,IAAYD,IAAS,MACrBE,IAAaF,IAAS,MACtBjJ,IAAI,KAAK,IAAIgJ,IAAQ,KAAK,KAAK,CAAC,IAAIE,GACpC1H,IAAI,KAAK,IAAIwH,IAAQ,KAAK,KAAK,CAAC,IAAIE;AAC1C,SACE,gBAAAE,EAAC,KAAA,EAAE,eAAY,gBACb,UAAA;AAAA,IAAA,gBAAAC,EAAC,YAAO,GAAGF,GAAY,MAAK,gBAAe,WAAU,0BAAyB;AAAA,IAC9E,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAIrJ;AAAA,QACJ,IAAIwB;AAAA,QACJ,QAAO;AAAA,QACP,aAAa;AAAA,QACb,eAAc;AAAA,QACd,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,EACZ,GACF;AAEJ;AAEA,MAAM8H,KAAaC,GAAM,KAAK,SAAoB;AAAA,EAChD,MAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC,IAAgB,CAAA;AAAA,EAChB,QAAAC,IAAS;AACX,GAAe;AACb,QAAMC,IAAgBC,GAAA,GAChBC,IAAeC,GAAuB,IAAI,GAC1C,CAACC,GAAYC,CAAa,IAAIC,GAAS,EAAE,OAAO,GAAG,QAAQ,GAAG;AAEpE,EAAAC,GAAgB,MAAM;AACpB,UAAMC,IAAKN,EAAa;AACxB,QAAI,CAACM,EAAI;AACT,UAAMC,IAAW,IAAI,eAAe,CAACC,MAAY;AAC/C,iBAAWC,KAASD,GAAS;AAC3B,cAAM,EAAE,OAAAE,GAAO,QAAQlH,EAAA,IAAMiH,EAAM;AACnC,QAAIC,IAAQ,KAAKlH,IAAI,OAAiB,EAAE,OAAAkH,GAAO,QAAQlH,GAAG;AAAA,MAC5D;AAAA,IACF,CAAC;AACD,IAAA+G,EAAS,QAAQD,CAAE;AACnB,UAAMK,IAAOL,EAAG,sBAAA;AAChB,WAAIK,EAAK,QAAQ,KAAKA,EAAK,SAAS,KAAGR,EAAc,EAAE,OAAOQ,EAAK,OAAO,QAAQA,EAAK,QAAQ,GACxF,MAAMJ,EAAS,WAAA;AAAA,EACxB,GAAG,CAAA,CAAE;AAEL,QAAM,EAAE,YAAAK,GAAY,UAAAC,GAAU,aAAAC,EAAA,IAAgBC,GAAQ,MAAM;AAC1D,UAAMC,IAAkB,MAAM,QAAQrB,GAAa,KAAK,IACpDA,EAAY,QACZ,CAAA,GAEEiB,IAAaI,EAAM,CAAC,KAAK,IACzBH,IAAWG,EAAM,CAAC,KAAK;AAE7B,WAAKJ,IAGE,EAAE,YAAAA,GAAY,UAAAC,GAAU,aAAa,KAAA,IAFnC,EAAE,YAAAD,GAAY,UAAAC,GAAU,aAAa,8DAAA;AAAA,EAGhD,GAAG,CAAClB,CAAW,CAAC,GAEVf,IAA8BmC,GAAQ,MAAM;AAChD,UAAME,IAAMrB,GAAe;AAC3B,QAAIsB,IAAwB;AAC5B,QAAI,MAAM,QAAQD,CAAG;AACnB,MAAAC,IAAMD;AAAA,aACG,OAAOA,KAAQ,YAAYA,EAAI;AACxC,UAAI;AACF,cAAME,IAAS,KAAK,MAAMF,CAAG;AAC7B,QAAI,MAAM,QAAQE,CAAM,MAAGD,IAAMC;AAAA,MACnC,SAASC,GAAG;AACV,uBAAQ,KAAK,sCAAsCA,CAAC,GAC7C,CAAA;AAAA,MACT;AAEF,WAAKF,IACEA,EAAI;AAAA,MACT,CAACT,MACCA,MAAU,QACV,OAAOA,KAAU,YACjB,OAAQA,EAAwB,SAAU,YAC1C,OAAQA,EAAwB,SAAU;AAAA,IAAA,IAN7B,CAAA;AAAA,EAQnB,GAAG,CAACb,GAAe,UAAU,CAAC,GAExByB,IAAiBzC,EAAW,WAAW,IACzC,CAAA,IACA,CAAC,GAAGA,CAAU,EAAE,KAAK,CAACd,GAAGgB,MAAMhB,EAAE,QAAQgB,EAAE,KAAK,EAAE,IAAI,CAACtE,GAAGrD,GAAG0H,MAAW;AACtE,UAAMyC,IAAYnK,MAAM,IAAI4G,IAAcQ,GAAaM,EAAO1H,IAAI,CAAC,EAAE,OAAO,GAAG,CAAC,GAC1EoK,IAAUhD,GAAa/D,EAAE,OAAO,GAAG,CAAC;AAC1C,WAAO,EAAE,OAAOA,EAAE,OAAO,OAAO8G,GAAW,KAAKC,EAAA;AAAA,EAClD,CAAC;AAEL,MAAI;AACF,QAAI,CAAC7B,KAAQA,EAAK,WAAW;AAC3B,aACE,gBAAAH,EAAC,OAAA,EAAI,WAAU,0EAAyE,OAAO,EAAE,QAAAM,EAAA,GAC/F,UAAA,gBAAAP,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,QAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,uCAAsC,UAAA,qBAAiB;AAAA,QACtE,gBAAAA,EAAC,OAAA,EAAI,WAAU,qCAAoC,UAAA,2CAAA,CAAwC;AAAA,MAAA,EAAA,CAC7F,EAAA,CACF;AAIJ,QAAIuB;AACF,aACE,gBAAAvB,EAAC,OAAA,EAAI,WAAU,uEAAsE,OAAO,EAAE,QAAAM,EAAA,GAC5F,UAAA,gBAAAP,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,QAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,uCAAsC,UAAA,uBAAmB;AAAA,QACxE,gBAAAA,EAAC,OAAA,EAAI,WAAU,cAAc,UAAAuB,EAAA,CAAY;AAAA,MAAA,EAAA,CAC3C,EAAA,CACF;AAIJ,UAAMU,IAAO9B,EAAmC,CAAC,GAC3C+B,IAAWtD,GAASqD,EAAIZ,CAAU,CAAC;AACzC,QAAIa,MAAa;AACf,aACE,gBAAAlC,EAAC,OAAA,EAAI,WAAU,0EAAyE,OAAO,EAAE,QAAAM,EAAA,GAC/F,UAAA,gBAAAP,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,QAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,uCAAsC,UAAA,iBAAa;AAAA,QAClE,gBAAAA,EAAC,OAAA,EAAI,WAAU,qCAAoC,UAAA,oCAAA,CAAiC;AAAA,MAAA,EAAA,CACtF,EAAA,CACF;AAGJ,UAAMmC,IAAW9B,GAAe,YAAY,GACtC+B,IAAgBd,IAAW1C,GAASqD,EAAIX,CAAQ,CAAC,IAAI,MACrDe,IAAWhC,GAAe,YAAa+B,KAAiB,KAExDE,IAAeD,MAAaF,IAAWA,IAAW,IAAIE,GACtDE,IAAezD,GAAMoD,GAAUC,GAAUG,CAAY,GACrDlD,KAAYmD,IAAeJ,MAAaG,IAAeH,IAEvDK,IAAYnD,EAAW,SAAS,IAAIF,GAAaC,GAAUC,CAAU,IAAIV,IAEzE8D,IAAkBpC,GAAe,mBAAmB,IACpDqC,IAAiBrC,GAAe,kBAAkB,IAClDsC,IAActC,GAAe,iBAE7BuC,IAAajC,EAAW,SAAS,KACjCkC,IAAa,OAAOvC,KAAW,WAAWA,IAAUK,EAAW,UAAU,KAEzEf,IAAS,KAAK,IAAIgD,IAAa,GAAGC,IAAa,GAAG,IAAI,MACtDC,IAASlD,GACTmD,IAASnD,IAAS,KAClBoD,IAAKJ,IAAa,GAClBK,IAAKJ,IAAa,KAElBK,IAAYzD,GAAasD,GAAQD,GAAQtE,GAAaC,EAAS,GAC/D0E,IAAYnE,GAAauD,GAAcJ,GAAUG,CAAY,GAC7Dc,IAAW3D,GAAasD,GAAQD,GAAQtE,GAAa2E,CAAS,GAE9DE,IAAcrE,GAAauD,GAAcJ,GAAUG,CAAY,GAE/DgB,IAAeX,IACjBY,GAAgBrB,GAAUS,CAAW,IACrCT,EAAS,eAAA,GAEPsB,IAAad,IACf,IAAItD,IAAW,KAAK,QAAQ,CAAC,CAAC,MAC9BkE,GAEEG,IAAalD,EAAcc,CAAU;AAC3C,WACE,gBAAArB,EAAC,SAAI,KAAKS,GAAc,WAAU,yBAAwB,OAAO,EAAE,QAAAH,EAAA,GACjE,UAAA,gBAAAN;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,QAAO;AAAA,QACP,SAAS,OAAO4C,CAAU,IAAIC,CAAU;AAAA,QACxC,qBAAoB;AAAA,QACpB,eAAY;AAAA,QAEZ,4BAAC,KAAA,EAAE,WAAW,aAAaG,CAAE,KAAKC,CAAE,KAClC,UAAA;AAAA,UAAA,gBAAAjD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,GAAGkD;AAAA,cACH,MAAMxE;AAAA,cACN,eAAY;AAAA,YAAA;AAAA,UAAA;AAAA,UAGboD,EAAe,IAAI,CAAC4B,GAAM9L,MACzB,gBAAAoI;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,GAAGP,GAAaqD,IAAS,GAAGA,IAAS,GAAGY,EAAK,OAAOA,EAAK,GAAG;AAAA,cAC5D,MAAMA,EAAK;AAAA,cACX,eAAa,cAAc9L,CAAC;AAAA,YAAA;AAAA,YAHvBA;AAAA,UAAA,CAKR;AAAA,UAED,gBAAAoI;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,GAAGoD;AAAA,cACH,MAAMZ;AAAA,cACN,eAAY;AAAA,cACZ,iBAAepD,EAAS,QAAQ,CAAC;AAAA,YAAA;AAAA,UAAA;AAAA,UAGnC,gBAAAY,EAACN,IAAA,EAAO,OAAO2D,GAAa,QAAAzD,EAAA,CAAgB;AAAA,UAE3C6C,KACC,gBAAA1C,EAAC,KAAA,EAAE,eAAY,eACb,UAAA;AAAA,YAAA,gBAAAC;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,YAAW;AAAA,gBACX,kBAAiB;AAAA,gBACjB,UAAUJ,IAAS;AAAA,gBACnB,YAAW;AAAA,gBACX,MAAK;AAAA,gBACL,IAAIA,IAAS;AAAA,gBACb,eAAY;AAAA,gBAEX,UAAA4D;AAAA,cAAA;AAAA,YAAA;AAAA,YAEH,gBAAAxD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,YAAW;AAAA,gBACX,UAAUJ,IAAS;AAAA,gBACnB,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,IAAIA,IAAS;AAAA,gBAEZ,UAAA6D;AAAA,cAAA;AAAA,YAAA;AAAA,UACH,GACF;AAAA,UAGF,gBAAAzD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,GAAG,KAAK,IAAIxB,IAAc,KAAK,KAAK,CAAC,KAAKsE,IAAS;AAAA,cACnD,GAAG,KAAK,IAAItE,IAAc,KAAK,KAAK,CAAC,KAAKsE,IAAS;AAAA,cACnD,YAAW;AAAA,cACX,UAAUlD,IAAS;AAAA,cACnB,MAAK;AAAA,cACL,WAAU;AAAA,cACV,eAAY;AAAA,cAEX,cAAc2D,GAAgBpB,GAAUQ,CAAW,IAAIR,EAAS,eAAA;AAAA,YAAe;AAAA,UAAA;AAAA,UAElF,gBAAAnC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,GAAG,KAAK,IAAIvB,KAAY,KAAK,KAAK,CAAC,KAAKqE,IAAS;AAAA,cACjD,GAAG,KAAK,IAAIrE,KAAY,KAAK,KAAK,CAAC,KAAKqE,IAAS;AAAA,cACjD,YAAW;AAAA,cACX,UAAUlD,IAAS;AAAA,cACnB,MAAK;AAAA,cACL,WAAU;AAAA,cACV,eAAY;AAAA,cAEX,cAAc2D,GAAgBjB,GAAcK,CAAW,IAAIL,EAAa,eAAA;AAAA,YAAe;AAAA,UAAA;AAAA,QAC1F,EAAA,CACF;AAAA,MAAA;AAAA,IAAA,GAEJ;AAAA,EAEJ,SAASqB,GAAO;AACd,WACE,gBAAA3D,EAAC,OAAA,EAAI,WAAU,wFAAuF,OAAO,EAAE,QAAAM,EAAA,GAC7G,UAAA,gBAAAP,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,MAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,uCAAsC,UAAA,qBAAiB;AAAA,MACtE,gBAAAA,EAAC,SAAI,WAAU,sBAAsB,uBAAiB,QAAQ2D,EAAM,UAAU,0BAAA,CAA0B;AAAA,MACxG,gBAAA3D,EAAC,OAAA,EAAI,WAAU,iCAAgC,UAAA,mCAAA,CAAgC;AAAA,IAAA,EAAA,CACjF,EAAA,CACF;AAAA,EAEJ;AACF,CAAC;","x_google_ignoreList":[0,1,2,3,4]}
@@ -1,7 +1,7 @@
1
1
  import { jsx as x, jsxs as b } from "react/jsx-runtime";
2
2
  import q, { useMemo as C } from "react";
3
3
  import { ResponsiveHeatMap as P } from "@nivo/heatmap";
4
- import { g as L, f as k, d as T } from "./charts-core-DmGfleFz.js";
4
+ import { g as L, f as k, d as T } from "./charts-core-CU9u_HtL.js";
5
5
  function z(i) {
6
6
  if (i.startsWith("#")) {
7
7
  const s = i.slice(1);
@@ -228,4 +228,4 @@ const G = q.memo(function({
228
228
  export {
229
229
  G as default
230
230
  };
231
- //# sourceMappingURL=chart-heat-map-CYGemyPB.js.map
231
+ //# sourceMappingURL=chart-heat-map-BVuPUKHT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-heat-map-CYGemyPB.js","sources":["../../../src/client/components/charts/HeatMapChart.tsx"],"sourcesContent":["/**\n * HeatMapChart Component\n *\n * Visualizes intensity across two categorical dimensions using a color matrix.\n * Uses @nivo/heatmap for rendering.\n *\n * The chart displays:\n * - Rows: Y-axis dimension values\n * - Columns: X-axis dimension values\n * - Cell color: Intensity based on measure value\n */\n\nimport React, { useMemo } from 'react'\nimport { ResponsiveHeatMap } from '@nivo/heatmap'\nimport { formatTimeValue, getFieldGranularity, formatAxisValue } from '../../utils/chartUtils'\nimport type { AxisFormatConfig } from '../../types'\nimport type { ChartProps } from '../../types'\n\n/**\n * Parse color string (hex or rgb) to RGB values\n */\nfunction parseColor(color: string): { r: number; g: number; b: number } | null {\n // Handle hex colors\n if (color.startsWith('#')) {\n const hex = color.slice(1)\n return {\n r: parseInt(hex.substring(0, 2), 16),\n g: parseInt(hex.substring(2, 4), 16),\n b: parseInt(hex.substring(4, 6), 16),\n }\n }\n\n // Handle rgb/rgba colors\n const rgbMatch = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/)\n if (rgbMatch) {\n return {\n r: parseInt(rgbMatch[1], 10),\n g: parseInt(rgbMatch[2], 10),\n b: parseInt(rgbMatch[3], 10),\n }\n }\n\n return null\n}\n\n/**\n * Calculate relative luminance of a color\n * Returns value between 0 (black) and 1 (white)\n */\nfunction getLuminance(color: string): number {\n const rgb = parseColor(color)\n if (!rgb) return 0.5 // Default to mid-gray if parsing fails\n\n const r = rgb.r / 255\n const g = rgb.g / 255\n const b = rgb.b / 255\n\n // Apply gamma correction\n const rLinear = r <= 0.03928 ? r / 12.92 : Math.pow((r + 0.055) / 1.055, 2.4)\n const gLinear = g <= 0.03928 ? g / 12.92 : Math.pow((g + 0.055) / 1.055, 2.4)\n const bLinear = b <= 0.03928 ? b / 12.92 : Math.pow((b + 0.055) / 1.055, 2.4)\n\n // Calculate luminance using WCAG formula\n return 0.2126 * rLinear + 0.7152 * gLinear + 0.0722 * bLinear\n}\n\n/**\n * Get contrasting text color (white or dark) based on background color\n */\nfunction getContrastingTextColor(bgColor: string): string {\n const luminance = getLuminance(bgColor)\n // Use white text on dark backgrounds, dark text on light backgrounds\n return luminance < 0.4 ? '#ffffff' : '#1f2937'\n}\n\n/**\n * Maximum dimensions for heatmap to prevent browser lockup\n * 50x50 = 2500 cells max\n */\nconst MAX_HEATMAP_ROWS = 50\nconst MAX_HEATMAP_COLS = 50\n\n/**\n * Nivo heatmap data format\n */\ninterface HeatMapDatum {\n x: string\n y: number | null\n}\n\ninterface HeatMapSerie {\n id: string\n data: HeatMapDatum[]\n}\n\n/**\n * Result of heatmap transformation including truncation info\n */\ninterface HeatMapTransformResult {\n data: HeatMapSerie[]\n truncated: boolean\n originalRows: number\n originalCols: number\n}\n\n/**\n * Transform drizzle-cube flat query results to nivo heatmap format\n *\n * Input (drizzle-cube):\n * [\n * { \"Region.name\": \"East\", \"Product.category\": \"Electronics\", \"Sales.total\": 1500 },\n * { \"Region.name\": \"East\", \"Product.category\": \"Clothing\", \"Sales.total\": 800 },\n * ]\n *\n * Output (nivo format):\n * [\n * { id: \"East\", data: [{ x: \"Electronics\", y: 1500 }, { x: \"Clothing\", y: 800 }] }\n * ]\n *\n * Data is truncated to MAX_HEATMAP_ROWS x MAX_HEATMAP_COLS to prevent browser lockup\n */\nfunction transformToHeatMapFormat(\n data: Record<string, unknown>[],\n xAxisField: string | undefined,\n yAxisField: string | undefined,\n valueField: string | undefined,\n xGranularity?: string,\n yGranularity?: string\n): HeatMapTransformResult {\n if (!xAxisField || !yAxisField || !valueField) {\n return { data: [], truncated: false, originalRows: 0, originalCols: 0 }\n }\n\n // Group data by Y-axis dimension\n const groupedByY = new Map<string, Map<string, number>>()\n const allXValues = new Set<string>()\n // Keep original values for sorting timestamps correctly\n const xValueOriginals = new Map<string, unknown>()\n\n for (const row of data) {\n const rawYValue = row[yAxisField]\n const rawXValue = row[xAxisField]\n\n // Format time values based on granularity\n const yValue = formatTimeValue(rawYValue, yGranularity) || String(rawYValue ?? '(empty)')\n const xValue = formatTimeValue(rawXValue, xGranularity) || String(rawXValue ?? '(empty)')\n const value = Number(row[valueField]) || 0\n\n allXValues.add(xValue)\n // Store original for sorting\n if (!xValueOriginals.has(xValue)) {\n xValueOriginals.set(xValue, rawXValue)\n }\n\n if (!groupedByY.has(yValue)) {\n groupedByY.set(yValue, new Map())\n }\n groupedByY.get(yValue)!.set(xValue, value)\n }\n\n // Sort X values - try to sort by original timestamp if available\n const xValueArray = Array.from(allXValues).sort((a, b) => {\n const origA = xValueOriginals.get(a)\n const origB = xValueOriginals.get(b)\n // If both are date strings, sort chronologically\n if (typeof origA === 'string' && typeof origB === 'string' &&\n origA.match(/^\\d{4}-\\d{2}-\\d{2}/) && origB.match(/^\\d{4}-\\d{2}-\\d{2}/)) {\n return origA.localeCompare(origB)\n }\n // Otherwise sort alphabetically by formatted value\n return a.localeCompare(b)\n })\n\n // Track original dimensions for truncation warning\n const originalRows = groupedByY.size\n const originalCols = xValueArray.length\n const truncated = originalRows > MAX_HEATMAP_ROWS || originalCols > MAX_HEATMAP_COLS\n\n // Truncate X values if needed\n const limitedXValues = xValueArray.slice(0, MAX_HEATMAP_COLS)\n\n // Build result with truncation\n const result: HeatMapSerie[] = []\n let rowCount = 0\n for (const [yValue, xMap] of groupedByY) {\n if (rowCount >= MAX_HEATMAP_ROWS) break\n result.push({\n id: yValue,\n data: limitedXValues.map((x) => ({\n x,\n y: xMap.get(x) ?? null,\n })),\n })\n rowCount++\n }\n\n return { data: result, truncated, originalRows, originalCols }\n}\n\n/**\n * HeatMapChart Component\n *\n * Renders a heatmap visualization from query results.\n * Shows intensity patterns across two categorical dimensions.\n */\nconst HeatMapChart = React.memo(function HeatMapChart({\n data,\n height = '100%',\n chartConfig,\n colorPalette,\n displayConfig,\n queryObject,\n}: ChartProps) {\n // Get display config options\n const displayConfigAny = displayConfig as Record<string, unknown> | undefined\n const showLabels = (displayConfigAny?.showLabels as boolean) ?? false\n const cellShape = (displayConfigAny?.cellShape as 'rect' | 'circle') ?? 'rect'\n const showLegend = (displayConfigAny?.showLegend as boolean) ?? true\n const xAxisFormat = displayConfigAny?.xAxisFormat as AxisFormatConfig | undefined\n const yAxisFormat = displayConfigAny?.yAxisFormat as AxisFormatConfig | undefined\n const valueFormat = displayConfigAny?.valueFormat as AxisFormatConfig | undefined\n\n // Extract field names from chartConfig (handle both array and string formats)\n const xAxisField = chartConfig?.xAxis\n ? (Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis)\n : undefined\n const yAxisField = chartConfig?.yAxis\n ? (Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis)\n : undefined\n const valueField = chartConfig?.valueField\n ? (Array.isArray(chartConfig.valueField) ? chartConfig.valueField[0] : chartConfig.valueField)\n : undefined\n\n // Get granularity for time dimensions (only if field is defined)\n const xGranularity = xAxisField ? getFieldGranularity(queryObject, xAxisField) : undefined\n const yGranularity = yAxisField ? getFieldGranularity(queryObject, yAxisField) : undefined\n\n // Transform data to nivo format\n const { data: heatmapData, truncated, originalRows, originalCols } = useMemo(() => {\n if (!data || data.length === 0) {\n return { data: [], truncated: false, originalRows: 0, originalCols: 0 }\n }\n return transformToHeatMapFormat(\n data as Record<string, unknown>[],\n xAxisField,\n yAxisField,\n valueField,\n xGranularity,\n yGranularity\n )\n }, [data, xAxisField, yAxisField, valueField, xGranularity, yGranularity])\n\n // Handle no data or missing config\n if (!data || data.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\"\n style={{ height }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">No data available</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">\n Run a query to see heatmap visualization\n </div>\n </div>\n </div>\n )\n }\n\n if (!xAxisField || !yAxisField || !valueField) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\"\n style={{ height }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">Configuration required</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">\n {!xAxisField && 'X-axis dimension required. '}\n {!yAxisField && 'Y-axis dimension required. '}\n {!valueField && 'Value measure required.'}\n </div>\n </div>\n </div>\n )\n }\n\n if (heatmapData.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\"\n style={{ height }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">No data to display</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">\n The query returned no results for the heatmap\n </div>\n </div>\n </div>\n )\n }\n\n // Use gradient colors from palette, or default sequential blue gradient\n // Sequential single-hue gradients are ideal for heatmaps showing magnitude/intensity\n const colors = colorPalette?.gradient || [\n '#eff3ff', // lightest blue\n '#c6dbef',\n '#9ecae1',\n '#6baed6',\n '#3182bd',\n '#08519c', // darkest blue\n ]\n\n return (\n <div className=\"dc:relative dc:w-full dc:h-full\" style={{ height }}>\n {truncated && (\n <div className=\"dc:absolute dc:top-0 dc:left-0 dc:right-0 dc:z-10 dc:px-3 dc:py-1.5 dc:text-xs bg-dc-warning-bg text-dc-warning dc:border-b border-dc-border\">\n Data truncated to {MAX_HEATMAP_ROWS}x{MAX_HEATMAP_COLS} cells (original: {originalRows}x{originalCols}). Add filters to reduce dimensions.\n </div>\n )}\n <ResponsiveHeatMap\n data={heatmapData}\n margin={{ top: truncated ? 40 : 20, right: 20, bottom: 120, left: 120 }}\n valueFormat={valueFormat ? (v) => formatAxisValue(v, valueFormat) : '>-.2s'}\n axisTop={null}\n axisRight={null}\n axisBottom={{\n tickSize: 5,\n tickPadding: 5,\n tickRotation: -45,\n legend: xAxisFormat?.label || xAxisField?.split('.').pop() || 'X Axis',\n legendPosition: 'middle',\n legendOffset: 70,\n format: xAxisFormat\n ? (v) => {\n const num = parseFloat(String(v))\n return isNaN(num) ? String(v) : formatAxisValue(num, xAxisFormat)\n }\n : undefined,\n }}\n axisLeft={{\n tickSize: 5,\n tickPadding: 5,\n tickRotation: 0,\n legend: yAxisFormat?.label || yAxisField?.split('.').pop() || 'Y Axis',\n legendPosition: 'middle',\n legendOffset: -80,\n format: yAxisFormat\n ? (v) => {\n const num = parseFloat(String(v))\n return isNaN(num) ? String(v) : formatAxisValue(num, yAxisFormat)\n }\n : undefined,\n }}\n colors={\n colors.length >= 2\n // Sequential scale needs [minColor, maxColor] tuple\n // Use first color for low values, last color for high values\n ? { type: 'sequential', colors: [colors[0], colors[colors.length - 1]] as [string, string] }\n : { type: 'sequential', scheme: 'greens' } // Fallback to built-in scheme\n }\n emptyColor=\"var(--dc-surface-tertiary)\"\n cellComponent={cellShape === 'circle' ? 'circle' : 'rect'}\n enableLabels={showLabels}\n labelTextColor={({ color }) => getContrastingTextColor(color)}\n legends={\n showLegend\n ? [\n {\n anchor: 'bottom',\n translateX: 0,\n translateY: 95,\n length: 400,\n thickness: 8,\n direction: 'row',\n tickPosition: 'after',\n tickSize: 3,\n tickSpacing: 4,\n tickOverlap: false,\n title: valueField?.split('.').pop() || 'Value',\n titleAlign: 'start',\n titleOffset: 4,\n },\n ]\n : []\n }\n annotations={[]}\n theme={{\n text: {\n fill: 'var(--dc-text)',\n },\n axis: {\n legend: {\n text: {\n fill: 'var(--dc-text)',\n },\n },\n ticks: {\n text: {\n fill: 'var(--dc-text-secondary)',\n },\n },\n },\n legends: {\n text: {\n fill: 'var(--dc-text-secondary)',\n },\n title: {\n text: {\n fill: 'var(--dc-text)',\n },\n },\n },\n tooltip: {\n container: {\n background: 'var(--dc-surface)',\n color: 'var(--dc-text)',\n borderRadius: '4px',\n boxShadow: '0 1px 2px rgba(0, 0, 0, 0.25)',\n },\n },\n }}\n />\n </div>\n )\n})\n\nexport default HeatMapChart\n"],"names":["parseColor","color","hex","rgbMatch","getLuminance","rgb","r","g","b","rLinear","gLinear","bLinear","getContrastingTextColor","bgColor","MAX_HEATMAP_ROWS","MAX_HEATMAP_COLS","transformToHeatMapFormat","data","xAxisField","yAxisField","valueField","xGranularity","yGranularity","groupedByY","allXValues","xValueOriginals","row","rawYValue","rawXValue","yValue","formatTimeValue","xValue","value","xValueArray","origA","origB","originalRows","originalCols","truncated","limitedXValues","result","rowCount","xMap","x","HeatMapChart","React","height","chartConfig","colorPalette","displayConfig","queryObject","displayConfigAny","showLabels","cellShape","showLegend","xAxisFormat","yAxisFormat","valueFormat","getFieldGranularity","heatmapData","useMemo","jsx","jsxs","colors","ResponsiveHeatMap","v","formatAxisValue","num"],"mappings":"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"}
1
+ {"version":3,"file":"chart-heat-map-BVuPUKHT.js","sources":["../../../src/client/components/charts/HeatMapChart.tsx"],"sourcesContent":["/**\n * HeatMapChart Component\n *\n * Visualizes intensity across two categorical dimensions using a color matrix.\n * Uses @nivo/heatmap for rendering.\n *\n * The chart displays:\n * - Rows: Y-axis dimension values\n * - Columns: X-axis dimension values\n * - Cell color: Intensity based on measure value\n */\n\nimport React, { useMemo } from 'react'\nimport { ResponsiveHeatMap } from '@nivo/heatmap'\nimport { formatTimeValue, getFieldGranularity, formatAxisValue } from '../../utils/chartUtils'\nimport type { AxisFormatConfig } from '../../types'\nimport type { ChartProps } from '../../types'\n\n/**\n * Parse color string (hex or rgb) to RGB values\n */\nfunction parseColor(color: string): { r: number; g: number; b: number } | null {\n // Handle hex colors\n if (color.startsWith('#')) {\n const hex = color.slice(1)\n return {\n r: parseInt(hex.substring(0, 2), 16),\n g: parseInt(hex.substring(2, 4), 16),\n b: parseInt(hex.substring(4, 6), 16),\n }\n }\n\n // Handle rgb/rgba colors\n const rgbMatch = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/)\n if (rgbMatch) {\n return {\n r: parseInt(rgbMatch[1], 10),\n g: parseInt(rgbMatch[2], 10),\n b: parseInt(rgbMatch[3], 10),\n }\n }\n\n return null\n}\n\n/**\n * Calculate relative luminance of a color\n * Returns value between 0 (black) and 1 (white)\n */\nfunction getLuminance(color: string): number {\n const rgb = parseColor(color)\n if (!rgb) return 0.5 // Default to mid-gray if parsing fails\n\n const r = rgb.r / 255\n const g = rgb.g / 255\n const b = rgb.b / 255\n\n // Apply gamma correction\n const rLinear = r <= 0.03928 ? r / 12.92 : Math.pow((r + 0.055) / 1.055, 2.4)\n const gLinear = g <= 0.03928 ? g / 12.92 : Math.pow((g + 0.055) / 1.055, 2.4)\n const bLinear = b <= 0.03928 ? b / 12.92 : Math.pow((b + 0.055) / 1.055, 2.4)\n\n // Calculate luminance using WCAG formula\n return 0.2126 * rLinear + 0.7152 * gLinear + 0.0722 * bLinear\n}\n\n/**\n * Get contrasting text color (white or dark) based on background color\n */\nfunction getContrastingTextColor(bgColor: string): string {\n const luminance = getLuminance(bgColor)\n // Use white text on dark backgrounds, dark text on light backgrounds\n return luminance < 0.4 ? '#ffffff' : '#1f2937'\n}\n\n/**\n * Maximum dimensions for heatmap to prevent browser lockup\n * 50x50 = 2500 cells max\n */\nconst MAX_HEATMAP_ROWS = 50\nconst MAX_HEATMAP_COLS = 50\n\n/**\n * Nivo heatmap data format\n */\ninterface HeatMapDatum {\n x: string\n y: number | null\n}\n\ninterface HeatMapSerie {\n id: string\n data: HeatMapDatum[]\n}\n\n/**\n * Result of heatmap transformation including truncation info\n */\ninterface HeatMapTransformResult {\n data: HeatMapSerie[]\n truncated: boolean\n originalRows: number\n originalCols: number\n}\n\n/**\n * Transform drizzle-cube flat query results to nivo heatmap format\n *\n * Input (drizzle-cube):\n * [\n * { \"Region.name\": \"East\", \"Product.category\": \"Electronics\", \"Sales.total\": 1500 },\n * { \"Region.name\": \"East\", \"Product.category\": \"Clothing\", \"Sales.total\": 800 },\n * ]\n *\n * Output (nivo format):\n * [\n * { id: \"East\", data: [{ x: \"Electronics\", y: 1500 }, { x: \"Clothing\", y: 800 }] }\n * ]\n *\n * Data is truncated to MAX_HEATMAP_ROWS x MAX_HEATMAP_COLS to prevent browser lockup\n */\nfunction transformToHeatMapFormat(\n data: Record<string, unknown>[],\n xAxisField: string | undefined,\n yAxisField: string | undefined,\n valueField: string | undefined,\n xGranularity?: string,\n yGranularity?: string\n): HeatMapTransformResult {\n if (!xAxisField || !yAxisField || !valueField) {\n return { data: [], truncated: false, originalRows: 0, originalCols: 0 }\n }\n\n // Group data by Y-axis dimension\n const groupedByY = new Map<string, Map<string, number>>()\n const allXValues = new Set<string>()\n // Keep original values for sorting timestamps correctly\n const xValueOriginals = new Map<string, unknown>()\n\n for (const row of data) {\n const rawYValue = row[yAxisField]\n const rawXValue = row[xAxisField]\n\n // Format time values based on granularity\n const yValue = formatTimeValue(rawYValue, yGranularity) || String(rawYValue ?? '(empty)')\n const xValue = formatTimeValue(rawXValue, xGranularity) || String(rawXValue ?? '(empty)')\n const value = Number(row[valueField]) || 0\n\n allXValues.add(xValue)\n // Store original for sorting\n if (!xValueOriginals.has(xValue)) {\n xValueOriginals.set(xValue, rawXValue)\n }\n\n if (!groupedByY.has(yValue)) {\n groupedByY.set(yValue, new Map())\n }\n groupedByY.get(yValue)!.set(xValue, value)\n }\n\n // Sort X values - try to sort by original timestamp if available\n const xValueArray = Array.from(allXValues).sort((a, b) => {\n const origA = xValueOriginals.get(a)\n const origB = xValueOriginals.get(b)\n // If both are date strings, sort chronologically\n if (typeof origA === 'string' && typeof origB === 'string' &&\n origA.match(/^\\d{4}-\\d{2}-\\d{2}/) && origB.match(/^\\d{4}-\\d{2}-\\d{2}/)) {\n return origA.localeCompare(origB)\n }\n // Otherwise sort alphabetically by formatted value\n return a.localeCompare(b)\n })\n\n // Track original dimensions for truncation warning\n const originalRows = groupedByY.size\n const originalCols = xValueArray.length\n const truncated = originalRows > MAX_HEATMAP_ROWS || originalCols > MAX_HEATMAP_COLS\n\n // Truncate X values if needed\n const limitedXValues = xValueArray.slice(0, MAX_HEATMAP_COLS)\n\n // Build result with truncation\n const result: HeatMapSerie[] = []\n let rowCount = 0\n for (const [yValue, xMap] of groupedByY) {\n if (rowCount >= MAX_HEATMAP_ROWS) break\n result.push({\n id: yValue,\n data: limitedXValues.map((x) => ({\n x,\n y: xMap.get(x) ?? null,\n })),\n })\n rowCount++\n }\n\n return { data: result, truncated, originalRows, originalCols }\n}\n\n/**\n * HeatMapChart Component\n *\n * Renders a heatmap visualization from query results.\n * Shows intensity patterns across two categorical dimensions.\n */\nconst HeatMapChart = React.memo(function HeatMapChart({\n data,\n height = '100%',\n chartConfig,\n colorPalette,\n displayConfig,\n queryObject,\n}: ChartProps) {\n // Get display config options\n const displayConfigAny = displayConfig as Record<string, unknown> | undefined\n const showLabels = (displayConfigAny?.showLabels as boolean) ?? false\n const cellShape = (displayConfigAny?.cellShape as 'rect' | 'circle') ?? 'rect'\n const showLegend = (displayConfigAny?.showLegend as boolean) ?? true\n const xAxisFormat = displayConfigAny?.xAxisFormat as AxisFormatConfig | undefined\n const yAxisFormat = displayConfigAny?.yAxisFormat as AxisFormatConfig | undefined\n const valueFormat = displayConfigAny?.valueFormat as AxisFormatConfig | undefined\n\n // Extract field names from chartConfig (handle both array and string formats)\n const xAxisField = chartConfig?.xAxis\n ? (Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis)\n : undefined\n const yAxisField = chartConfig?.yAxis\n ? (Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis)\n : undefined\n const valueField = chartConfig?.valueField\n ? (Array.isArray(chartConfig.valueField) ? chartConfig.valueField[0] : chartConfig.valueField)\n : undefined\n\n // Get granularity for time dimensions (only if field is defined)\n const xGranularity = xAxisField ? getFieldGranularity(queryObject, xAxisField) : undefined\n const yGranularity = yAxisField ? getFieldGranularity(queryObject, yAxisField) : undefined\n\n // Transform data to nivo format\n const { data: heatmapData, truncated, originalRows, originalCols } = useMemo(() => {\n if (!data || data.length === 0) {\n return { data: [], truncated: false, originalRows: 0, originalCols: 0 }\n }\n return transformToHeatMapFormat(\n data as Record<string, unknown>[],\n xAxisField,\n yAxisField,\n valueField,\n xGranularity,\n yGranularity\n )\n }, [data, xAxisField, yAxisField, valueField, xGranularity, yGranularity])\n\n // Handle no data or missing config\n if (!data || data.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\"\n style={{ height }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">No data available</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">\n Run a query to see heatmap visualization\n </div>\n </div>\n </div>\n )\n }\n\n if (!xAxisField || !yAxisField || !valueField) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\"\n style={{ height }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">Configuration required</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">\n {!xAxisField && 'X-axis dimension required. '}\n {!yAxisField && 'Y-axis dimension required. '}\n {!valueField && 'Value measure required.'}\n </div>\n </div>\n </div>\n )\n }\n\n if (heatmapData.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\"\n style={{ height }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">No data to display</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">\n The query returned no results for the heatmap\n </div>\n </div>\n </div>\n )\n }\n\n // Use gradient colors from palette, or default sequential blue gradient\n // Sequential single-hue gradients are ideal for heatmaps showing magnitude/intensity\n const colors = colorPalette?.gradient || [\n '#eff3ff', // lightest blue\n '#c6dbef',\n '#9ecae1',\n '#6baed6',\n '#3182bd',\n '#08519c', // darkest blue\n ]\n\n return (\n <div className=\"dc:relative dc:w-full dc:h-full\" style={{ height }}>\n {truncated && (\n <div className=\"dc:absolute dc:top-0 dc:left-0 dc:right-0 dc:z-10 dc:px-3 dc:py-1.5 dc:text-xs bg-dc-warning-bg text-dc-warning dc:border-b border-dc-border\">\n Data truncated to {MAX_HEATMAP_ROWS}x{MAX_HEATMAP_COLS} cells (original: {originalRows}x{originalCols}). Add filters to reduce dimensions.\n </div>\n )}\n <ResponsiveHeatMap\n data={heatmapData}\n margin={{ top: truncated ? 40 : 20, right: 20, bottom: 120, left: 120 }}\n valueFormat={valueFormat ? (v) => formatAxisValue(v, valueFormat) : '>-.2s'}\n axisTop={null}\n axisRight={null}\n axisBottom={{\n tickSize: 5,\n tickPadding: 5,\n tickRotation: -45,\n legend: xAxisFormat?.label || xAxisField?.split('.').pop() || 'X Axis',\n legendPosition: 'middle',\n legendOffset: 70,\n format: xAxisFormat\n ? (v) => {\n const num = parseFloat(String(v))\n return isNaN(num) ? String(v) : formatAxisValue(num, xAxisFormat)\n }\n : undefined,\n }}\n axisLeft={{\n tickSize: 5,\n tickPadding: 5,\n tickRotation: 0,\n legend: yAxisFormat?.label || yAxisField?.split('.').pop() || 'Y Axis',\n legendPosition: 'middle',\n legendOffset: -80,\n format: yAxisFormat\n ? (v) => {\n const num = parseFloat(String(v))\n return isNaN(num) ? String(v) : formatAxisValue(num, yAxisFormat)\n }\n : undefined,\n }}\n colors={\n colors.length >= 2\n // Sequential scale needs [minColor, maxColor] tuple\n // Use first color for low values, last color for high values\n ? { type: 'sequential', colors: [colors[0], colors[colors.length - 1]] as [string, string] }\n : { type: 'sequential', scheme: 'greens' } // Fallback to built-in scheme\n }\n emptyColor=\"var(--dc-surface-tertiary)\"\n cellComponent={cellShape === 'circle' ? 'circle' : 'rect'}\n enableLabels={showLabels}\n labelTextColor={({ color }) => getContrastingTextColor(color)}\n legends={\n showLegend\n ? [\n {\n anchor: 'bottom',\n translateX: 0,\n translateY: 95,\n length: 400,\n thickness: 8,\n direction: 'row',\n tickPosition: 'after',\n tickSize: 3,\n tickSpacing: 4,\n tickOverlap: false,\n title: valueField?.split('.').pop() || 'Value',\n titleAlign: 'start',\n titleOffset: 4,\n },\n ]\n : []\n }\n annotations={[]}\n theme={{\n text: {\n fill: 'var(--dc-text)',\n },\n axis: {\n legend: {\n text: {\n fill: 'var(--dc-text)',\n },\n },\n ticks: {\n text: {\n fill: 'var(--dc-text-secondary)',\n },\n },\n },\n legends: {\n text: {\n fill: 'var(--dc-text-secondary)',\n },\n title: {\n text: {\n fill: 'var(--dc-text)',\n },\n },\n },\n tooltip: {\n container: {\n background: 'var(--dc-surface)',\n color: 'var(--dc-text)',\n borderRadius: '4px',\n boxShadow: '0 1px 2px rgba(0, 0, 0, 0.25)',\n },\n },\n }}\n />\n </div>\n )\n})\n\nexport default HeatMapChart\n"],"names":["parseColor","color","hex","rgbMatch","getLuminance","rgb","r","g","b","rLinear","gLinear","bLinear","getContrastingTextColor","bgColor","MAX_HEATMAP_ROWS","MAX_HEATMAP_COLS","transformToHeatMapFormat","data","xAxisField","yAxisField","valueField","xGranularity","yGranularity","groupedByY","allXValues","xValueOriginals","row","rawYValue","rawXValue","yValue","formatTimeValue","xValue","value","xValueArray","origA","origB","originalRows","originalCols","truncated","limitedXValues","result","rowCount","xMap","x","HeatMapChart","React","height","chartConfig","colorPalette","displayConfig","queryObject","displayConfigAny","showLabels","cellShape","showLegend","xAxisFormat","yAxisFormat","valueFormat","getFieldGranularity","heatmapData","useMemo","jsx","jsxs","colors","ResponsiveHeatMap","v","formatAxisValue","num"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { jsx as t, jsxs as s } from "react/jsx-runtime";
2
2
  import ce, { useState as O, useRef as U, useEffect as se } from "react";
3
3
  import { I as de, d as ne } from "./icons-DAeqv1iX.js";
4
- import { u as ie } from "./charts-core-DmGfleFz.js";
5
- import { f as re } from "./chart-kpi-number-C29Vj2g8.js";
4
+ import { u as ie } from "./charts-core-CU9u_HtL.js";
5
+ import { f as re } from "./chart-kpi-number-DkoO99c1.js";
6
6
  function oe({
7
7
  values: w,
8
8
  lastValue: p,
@@ -348,4 +348,4 @@ const he = ce.memo(function({
348
348
  export {
349
349
  he as default
350
350
  };
351
- //# sourceMappingURL=chart-kpi-delta-D9XJoKuA.js.map
351
+ //# sourceMappingURL=chart-kpi-delta-Dgg2eYRl.js.map