@thebuoyant-tsdev/mui-ts-library 3.26.0 → 3.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/README.de.md +22 -0
  2. package/README.md +22 -0
  3. package/dist/components/chord-chart/ChordChart.d.ts +1 -1
  4. package/dist/components/chord-chart/ChordChart.js +138 -128
  5. package/dist/components/chord-chart/ChordChart.types.d.ts +4 -0
  6. package/dist/components/circle-packing-chart/CirclePackingChart.d.ts +1 -1
  7. package/dist/components/circle-packing-chart/CirclePackingChart.js +142 -142
  8. package/dist/components/circle-packing-chart/CirclePackingChart.types.d.ts +2 -0
  9. package/dist/components/gantt-chart/GanttChart.js +29 -29
  10. package/dist/components/horizontal-tree-chart/HorizontalTreeChart.d.ts +1 -1
  11. package/dist/components/horizontal-tree-chart/HorizontalTreeChart.js +131 -125
  12. package/dist/components/horizontal-tree-chart/HorizontalTreeChart.types.d.ts +2 -0
  13. package/dist/components/radial-stacked-bar-chart/RadialStackedBarChart.d.ts +1 -1
  14. package/dist/components/radial-stacked-bar-chart/RadialStackedBarChart.js +60 -50
  15. package/dist/components/radial-stacked-bar-chart/RadialStackedBarChart.types.d.ts +2 -0
  16. package/dist/components/radial-tree-chart/RadialTreeChart.d.ts +1 -1
  17. package/dist/components/radial-tree-chart/RadialTreeChart.js +115 -111
  18. package/dist/components/radial-tree-chart/RadialTreeChart.types.d.ts +2 -0
  19. package/dist/components/sunburst-chart/SunburstChart.d.ts +1 -1
  20. package/dist/components/sunburst-chart/SunburstChart.js +120 -106
  21. package/dist/components/sunburst-chart/SunburstChart.types.d.ts +2 -0
  22. package/dist/index.cjs +2 -2
  23. package/package.json +1 -1
@@ -47,28 +47,28 @@ function ne({ node: e, valueDecimalCount: t, valueDecimalSep: n, valueThousandsS
47
47
  ]
48
48
  });
49
49
  }
50
- function v({ data: l, size: h = 500, showSegmentLabels: g = !0, innerRadius: _ = 0, sortBy: v = "value", chartColors: y, showRootLabel: b = !0, onSegmentClick: x, onZoomChange: S, valueDecimalCount: re = 0, valueDecimalSeparator: ie = ".", valueThousandsSeparator: ae = ",", valueFormatter: oe, zoomable: C = !1, duration: w = 750, disabled: T = !1, translation: se }) {
51
- let E = ee(), ce = {
50
+ function v({ data: l, size: h = 500, showSegmentLabels: g = !0, innerRadius: _ = 0, sortBy: v = "value", chartColors: y, showRootLabel: b = !0, onSegmentClick: x, onSegmentHover: S, onZoomChange: C, valueDecimalCount: re = 0, valueDecimalSeparator: ie = ".", valueThousandsSeparator: ae = ",", valueFormatter: oe, zoomable: w = !1, duration: T = 750, disabled: E = !1, translation: se }) {
51
+ let D = ee(), ce = {
52
52
  ...e,
53
53
  ...se
54
- }, D = !l.children?.length && !l.value, O = a(null), [k, A] = o(`-${h / 2} -${h / 2} ${h} ${h}`), [j, M] = o(1), le = i(() => {
55
- if (j === 1) return k;
56
- let [e, t, n, r] = k.split(" ").map(Number), i = n / j, a = r / j;
54
+ }, O = !l.children?.length && !l.value, k = a(null), [A, j] = o(`-${h / 2} -${h / 2} ${h} ${h}`), [M, N] = o(1), le = i(() => {
55
+ if (M === 1) return A;
56
+ let [e, t, n, r] = A.split(" ").map(Number), i = n / M, a = r / M;
57
57
  return `${e + (n - i) / 2} ${t + (r - a) / 2} ${i} ${a}`;
58
- }, [k, j]), N = h / 2, P = Math.max(0, Math.min(_, Math.max(0, N - 1))), F = Math.max(1, N - P), ue = [
59
- E.palette.primary.main,
60
- E.palette.secondary.main,
61
- E.palette.error.main,
62
- E.palette.warning.main,
63
- E.palette.success.main,
64
- E.palette.info.main
65
- ], I = y && y.length > 0 ? y : ue, { root: L, ringThickness: R } = i(() => {
58
+ }, [A, M]), P = h / 2, F = Math.max(0, Math.min(_, Math.max(0, P - 1))), I = Math.max(1, P - F), ue = [
59
+ D.palette.primary.main,
60
+ D.palette.secondary.main,
61
+ D.palette.error.main,
62
+ D.palette.warning.main,
63
+ D.palette.success.main,
64
+ D.palette.info.main
65
+ ], L = y && y.length > 0 ? y : ue, { root: R, ringThickness: z } = i(() => {
66
66
  let e = f.hierarchy(l).sum((e) => e.value ?? 0);
67
67
  v === "value" ? e.sort((e, t) => (t.value ?? 0) - (e.value ?? 0)) : e.sort((e, t) => String(e.data.name).localeCompare(String(t.data.name), void 0, {
68
68
  numeric: !0,
69
69
  sensitivity: "base"
70
70
  }));
71
- let t = f.partition().size([p, F])(e), n = f.max(t.descendants(), (e) => e.depth) ?? 0, r = n > 0 ? F / n : F;
71
+ let t = f.partition().size([p, I])(e), n = f.max(t.descendants(), (e) => e.depth) ?? 0, r = n > 0 ? I / n : I;
72
72
  return n > 0 && t.descendants().forEach((e) => {
73
73
  e.depth === 0 ? (e.y0 = 0, e.y1 = 0) : (e.y0 = (e.depth - 1) * r, e.y1 = e.depth * r);
74
74
  }), {
@@ -77,60 +77,60 @@ function v({ data: l, size: h = 500, showSegmentLabels: g = !0, innerRadius: _ =
77
77
  };
78
78
  }, [
79
79
  l,
80
- F,
80
+ I,
81
81
  v
82
- ]), [z, B] = o(L), [de, fe] = o(L), V = (e) => ({
82
+ ]), [B, V] = o(R), [de, fe] = o(R), H = (e) => ({
83
83
  x0: e.x0,
84
84
  x1: e.x1,
85
- yShift: e.depth === 0 ? 0 : (e.depth - 1) * R
86
- }), [H, U] = o(() => V(L)), W = a(H);
87
- if (de !== L) {
88
- fe(L), B(L);
89
- let e = V(L);
90
- W.current = e, U(e);
85
+ yShift: e.depth === 0 ? 0 : (e.depth - 1) * z
86
+ }), [U, W] = o(() => H(R)), G = a(U);
87
+ if (de !== R) {
88
+ fe(R), V(R);
89
+ let e = H(R);
90
+ G.current = e, W(e);
91
91
  }
92
- let G = i(() => L.children?.map((e) => e.data.name) ?? [L.data.name], [L]), pe = i(() => f.scaleOrdinal().domain(G).range(I), [I, G]), me = (e) => {
92
+ let K = i(() => R.children?.map((e) => e.data.name) ?? [R.data.name], [R]), pe = i(() => f.scaleOrdinal().domain(K).range(L), [L, K]), me = (e) => {
93
93
  if (e.data.colorConfig?.fill) return e.data.colorConfig.fill;
94
94
  let t = e;
95
95
  for (; t.depth > 1;) t = t.parent;
96
96
  return pe(t.data.name);
97
- }, he = i(() => f.arc().startAngle((e) => e.x0).endAngle((e) => e.x1).padAngle((e) => Math.min((e.x1 - e.x0) / 2, .005)).padRadius(N / 2).innerRadius((e) => P + e.y0).outerRadius((e) => P + e.y1 - 1), [N, P]), K = t((e) => {
98
- let t = p / (H.x1 - H.x0);
97
+ }, he = i(() => f.arc().startAngle((e) => e.x0).endAngle((e) => e.x1).padAngle((e) => Math.min((e.x1 - e.x0) / 2, .005)).padRadius(P / 2).innerRadius((e) => F + e.y0).outerRadius((e) => F + e.y1 - 1), [P, F]), q = t((e) => {
98
+ let t = p / (U.x1 - U.x0);
99
99
  return {
100
- x0: Math.max(0, Math.min(p, (e.x0 - H.x0) * t)),
101
- x1: Math.max(0, Math.min(p, (e.x1 - H.x0) * t)),
102
- y0: Math.max(0, e.y0 - H.yShift),
103
- y1: Math.max(0, e.y1 - H.yShift)
100
+ x0: Math.max(0, Math.min(p, (e.x0 - U.x0) * t)),
101
+ x1: Math.max(0, Math.min(p, (e.x1 - U.x0) * t)),
102
+ y0: Math.max(0, e.y0 - U.yShift),
103
+ y1: Math.max(0, e.y1 - U.yShift)
104
104
  };
105
- }, [H]);
105
+ }, [U]);
106
106
  n(() => {
107
- let e = V(z), t = W.current;
107
+ let e = H(B), t = G.current;
108
108
  if (t.x0 === e.x0 && t.x1 === e.x1 && t.yShift === e.yShift) return;
109
- if (w <= 0) {
110
- W.current = e, U(e);
109
+ if (T <= 0) {
110
+ G.current = e, W(e);
111
111
  return;
112
112
  }
113
113
  let n = null, r = f.interpolateNumber(t.x0, e.x0), i = f.interpolateNumber(t.x1, e.x1), a = f.interpolateNumber(t.yShift, e.yShift), o = performance.now(), s = (e) => {
114
- let t = Math.min(1, (e - o) / w), c = f.easeCubic(t), l = {
114
+ let t = Math.min(1, (e - o) / T), c = f.easeCubic(t), l = {
115
115
  x0: r(c),
116
116
  x1: i(c),
117
117
  yShift: a(c)
118
118
  };
119
- W.current = l, U(l), n = t < 1 ? requestAnimationFrame(s) : null;
119
+ G.current = l, W(l), n = t < 1 ? requestAnimationFrame(s) : null;
120
120
  };
121
121
  return n = requestAnimationFrame(s), () => {
122
122
  n != null && cancelAnimationFrame(n);
123
123
  };
124
124
  }, [
125
+ B,
125
126
  z,
126
- R,
127
- w
127
+ T
128
128
  ]);
129
- let ge = (e) => e.x1 > e.x0 && e.y1 > e.y0, _e = (e) => (P + (e.y0 + e.y1) / 2) * (e.x1 - e.x0) > 12, ve = (e) => {
130
- let t = (e.x0 + e.x1) / 2 * 180 / Math.PI, n = P + (e.y0 + e.y1) / 2, r = t < 180 ? 0 : 180;
129
+ let ge = (e) => e.x1 > e.x0 && e.y1 > e.y0, _e = (e) => (F + (e.y0 + e.y1) / 2) * (e.x1 - e.x0) > 12, ve = (e) => {
130
+ let t = (e.x0 + e.x1) / 2 * 180 / Math.PI, n = F + (e.y0 + e.y1) / 2, r = t < 180 ? 0 : 180;
131
131
  return `rotate(${t - 90}) translate(${n},0) rotate(${r})`;
132
- }, ye = t((e) => e.ancestors().includes(z), [z]), q = t((e) => {
133
- let t = e.ancestors().reverse(), n = e.value ?? 0, r = L.value ?? 0;
132
+ }, ye = t((e) => e.ancestors().includes(B), [B]), J = t((e) => {
133
+ let t = e.ancestors().reverse(), n = e.value ?? 0, r = R.value ?? 0;
134
134
  return {
135
135
  id: e.data.id,
136
136
  name: e.data.name,
@@ -142,91 +142,91 @@ function v({ data: l, size: h = 500, showSegmentLabels: g = !0, innerRadius: _ =
142
142
  childrenCount: e.children?.length ?? 0,
143
143
  data: e.data
144
144
  };
145
- }, [L]), J = t((e) => {
146
- B(e), S && S({
147
- focusNode: q(e),
148
- isRoot: e === L
145
+ }, [R]), Y = t((e) => {
146
+ V(e), C && C({
147
+ focusNode: J(e),
148
+ isRoot: e === R
149
149
  });
150
150
  }, [
151
- L,
152
- q,
153
- S
151
+ R,
152
+ J,
153
+ C
154
154
  ]);
155
155
  r(() => {
156
- let e = O.current;
156
+ let e = k.current;
157
157
  if (!e) return;
158
158
  let t = requestAnimationFrame(() => {
159
159
  try {
160
160
  let t = e.getBBox();
161
- A(`${t.x - 8} ${t.y - 8} ${t.width + 16} ${t.height + 16}`);
161
+ j(`${t.x - 8} ${t.y - 8} ${t.width + 16} ${t.height + 16}`);
162
162
  } catch {
163
- A(`-${h / 2} -${h / 2} ${h} ${h}`);
163
+ j(`-${h / 2} -${h / 2} ${h} ${h}`);
164
164
  }
165
165
  });
166
166
  return () => cancelAnimationFrame(t);
167
167
  }, [
168
168
  h,
169
- L,
170
- z,
171
- P,
172
169
  R,
170
+ B,
171
+ F,
172
+ z,
173
173
  b
174
174
  ]);
175
- let Y = a(null), be = (e) => {
176
- Y.current &&= (clearTimeout(Y.current), null), Y.current = setTimeout(() => {
177
- e(), Y.current = null;
175
+ let X = a(null), be = (e) => {
176
+ X.current &&= (clearTimeout(X.current), null), X.current = setTimeout(() => {
177
+ e(), X.current = null;
178
178
  }, 250);
179
- }, X = () => {
180
- Y.current &&= (clearTimeout(Y.current), null);
179
+ }, Z = () => {
180
+ X.current &&= (clearTimeout(X.current), null);
181
181
  };
182
182
  r(() => {
183
- if (T) return;
183
+ if (E) return;
184
184
  let e = (e) => {
185
- e.key === "Escape" && (X(), J(L), M(1));
185
+ e.key === "Escape" && (Z(), Y(R), N(1));
186
186
  };
187
187
  return window.addEventListener("keydown", e), () => window.removeEventListener("keydown", e);
188
188
  }, [
189
- T,
190
- L,
191
- J
189
+ E,
190
+ R,
191
+ Y
192
192
  ]);
193
193
  let xe = t((e) => {
194
- if (!C || T || !e.ctrlKey) return;
194
+ if (!w || E || !e.ctrlKey) return;
195
195
  e.preventDefault();
196
196
  let t = e.deltaY < 0 ? 1.15 : 1 / 1.15;
197
- M((e) => Math.max(.25, Math.min(8, e * t)));
198
- }, [C, T]), Z = L.descendants().filter((e) => e.depth > 0), Se = (e) => {
199
- if (T) return;
200
- let t = Z[Number(e.currentTarget.getAttribute("data-idx"))];
197
+ N((e) => Math.max(.25, Math.min(8, e * t)));
198
+ }, [w, E]), Q = R.descendants().filter((e) => e.depth > 0), Se = (e) => {
199
+ if (E) return;
200
+ let t = Q[Number(e.currentTarget.getAttribute("data-idx"))];
201
201
  if (t) {
202
202
  if (e.ctrlKey || e.metaKey) {
203
- t.children && be(() => J(t));
203
+ t.children && be(() => Y(t));
204
204
  return;
205
205
  }
206
- x?.(q(t), e);
206
+ x?.(J(t), e);
207
207
  }
208
208
  }, Ce = (e) => {
209
- T || (e.ctrlKey || e.metaKey) && (X(), J(z.parent ?? L));
210
- }, Q = (e) => {
211
- if (!T) {
209
+ E || (e.ctrlKey || e.metaKey) && (Z(), Y(B.parent ?? R));
210
+ }, we = (e) => {
211
+ if (!E) {
212
212
  if (e.ctrlKey || e.metaKey) {
213
- X(), J(z.parent ?? L);
213
+ Z(), Y(B.parent ?? R);
214
214
  return;
215
215
  }
216
- x?.(q(z.parent ?? L), e);
216
+ x?.(J(B.parent ?? R), e);
217
217
  }
218
218
  }, $ = {
219
219
  followCursor: !0,
220
220
  enterDelay: 50,
221
221
  enterNextDelay: 0,
222
- disableHoverListener: T,
222
+ disableHoverListener: E,
223
223
  slotProps: { tooltip: { sx: { maxWidth: 260 } } }
224
- }, we = E.palette.text.primary, Te = E.typography.fontFamily;
224
+ }, Te = D.palette.text.primary, Ee = D.typography.fontFamily;
225
225
  return /* @__PURE__ */ u(s, {
226
226
  sx: {
227
227
  display: "inline-flex",
228
- opacity: T ? .5 : 1,
229
- cursor: T ? "not-allowed" : "default",
228
+ opacity: E ? .5 : 1,
229
+ cursor: E ? "not-allowed" : "default",
230
230
  userSelect: "none"
231
231
  },
232
232
  children: /* @__PURE__ */ u("svg", {
@@ -235,37 +235,43 @@ function v({ data: l, size: h = 500, showSegmentLabels: g = !0, innerRadius: _ =
235
235
  viewBox: le,
236
236
  onWheel: xe,
237
237
  style: {
238
- fontFamily: Te ?? "sans-serif",
239
- overflow: C && j > 1 ? "hidden" : "visible"
238
+ fontFamily: Ee ?? "sans-serif",
239
+ overflow: w && M > 1 ? "hidden" : "visible"
240
240
  },
241
241
  role: "img",
242
242
  "aria-label": l.name,
243
243
  children: /* @__PURE__ */ d("g", {
244
- ref: O,
244
+ ref: k,
245
245
  children: [
246
- D && /* @__PURE__ */ u("text", {
246
+ O && /* @__PURE__ */ u("text", {
247
247
  textAnchor: "middle",
248
248
  dy: "0.35em",
249
249
  fontSize: 13,
250
- fill: E.palette.text.secondary,
250
+ fill: D.palette.text.secondary,
251
251
  children: ce.noData
252
252
  }),
253
- P > 0 && /* @__PURE__ */ u(c, {
253
+ F > 0 && /* @__PURE__ */ u(c, {
254
254
  ...$,
255
- title: z.data.name,
255
+ title: B.data.name,
256
256
  placement: "top",
257
257
  children: /* @__PURE__ */ u("circle", {
258
258
  cx: 0,
259
259
  cy: 0,
260
- r: P,
260
+ r: F,
261
261
  fill: "transparent",
262
- pointerEvents: T ? "none" : "auto",
263
- onClick: Q,
264
- style: { cursor: T ? "not-allowed" : "pointer" }
262
+ pointerEvents: E ? "none" : "auto",
263
+ onClick: we,
264
+ style: { cursor: E ? "not-allowed" : "pointer" },
265
+ onMouseEnter: (e) => {
266
+ E || S?.(J(B.parent ?? R), e);
267
+ },
268
+ onMouseLeave: (e) => {
269
+ S?.(null, e);
270
+ }
265
271
  })
266
272
  }),
267
- /* @__PURE__ */ u("g", { children: Z.map((e, t) => {
268
- let n = K(e), r = ge(n), i = !!e.children;
273
+ /* @__PURE__ */ u("g", { children: Q.map((e, t) => {
274
+ let n = q(e), r = ge(n), i = !!e.children;
269
275
  return /* @__PURE__ */ u(c, {
270
276
  ...$,
271
277
  placement: "top",
@@ -282,24 +288,32 @@ function v({ data: l, size: h = 500, showSegmentLabels: g = !0, innerRadius: _ =
282
288
  fill: me(e),
283
289
  fillOpacity: r ? i ? .75 : .5 : 0,
284
290
  style: {
285
- pointerEvents: r && !T ? "auto" : "none",
286
- cursor: i && !T ? "pointer" : "default",
291
+ pointerEvents: r && !E ? "auto" : "none",
292
+ cursor: i && !E ? "pointer" : "default",
287
293
  transition: "fill-opacity 0.15s"
288
294
  },
289
295
  onClick: Se,
290
- onDoubleClick: Ce
296
+ onDoubleClick: Ce,
297
+ onMouseEnter: (e) => {
298
+ if (E || !r) return;
299
+ let t = Q[Number(e.currentTarget.getAttribute("data-idx"))];
300
+ t && S?.(J(t), e);
301
+ },
302
+ onMouseLeave: (e) => {
303
+ r && S?.(null, e);
304
+ }
291
305
  })
292
306
  }, `tt-${e.data.id}-${t}`);
293
307
  }) }),
294
308
  g && /* @__PURE__ */ u("g", {
295
309
  pointerEvents: "none",
296
310
  textAnchor: "middle",
297
- fill: we,
298
- children: Z.map((e, t) => {
311
+ fill: Te,
312
+ children: Q.map((e, t) => {
299
313
  if (!ye(e)) return null;
300
- let n = K(e);
314
+ let n = q(e);
301
315
  if (!_e(n)) return null;
302
- let r = (P + (n.y0 + n.y1) / 2) * (n.x1 - n.x0) * .88, i = te(e.data.name, r);
316
+ let r = (F + (n.y0 + n.y1) / 2) * (n.x1 - n.x0) * .88, i = te(e.data.name, r);
303
317
  return i ? /* @__PURE__ */ u("text", {
304
318
  transform: ve(n),
305
319
  dy: "0.35em",
@@ -308,21 +322,21 @@ function v({ data: l, size: h = 500, showSegmentLabels: g = !0, innerRadius: _ =
308
322
  }, `lbl-${e.data.id}-${t}`) : null;
309
323
  })
310
324
  }),
311
- b && !D && /* @__PURE__ */ u(c, {
325
+ b && !O && /* @__PURE__ */ u(c, {
312
326
  ...$,
313
327
  placement: "top",
314
328
  title: "",
315
329
  children: /* @__PURE__ */ u("g", {
316
330
  textAnchor: "middle",
317
- fill: we,
318
- pointerEvents: T ? "none" : "auto",
319
- onClick: Q,
320
- style: { cursor: z !== L && !T ? "pointer" : "default" },
331
+ fill: Te,
332
+ pointerEvents: E ? "none" : "auto",
333
+ onClick: we,
334
+ style: { cursor: B !== R && !E ? "pointer" : "default" },
321
335
  children: /* @__PURE__ */ u("text", {
322
336
  fontSize: 13,
323
337
  dy: "0.35em",
324
338
  fontWeight: "bold",
325
- children: z.data.name
339
+ children: B.data.name
326
340
  })
327
341
  })
328
342
  })
@@ -56,6 +56,8 @@ export type SunburstChartProps = {
56
56
  showRootLabel?: boolean;
57
57
  /** Fired on single-click on any segment */
58
58
  onSegmentClick?: (info: SunburstSegmentInfo, event: React.MouseEvent<SVGPathElement | SVGCircleElement>) => void;
59
+ /** Fired on mouse enter/leave — `null` on leave. Use for linked-view highlighting. */
60
+ onSegmentHover?: (info: SunburstSegmentInfo | null, event: React.MouseEvent<SVGPathElement | SVGCircleElement> | null) => void;
59
61
  /** Fired when zoom focus changes (Ctrl+Click in/out, Escape reset) */
60
62
  onZoomChange?: (zoom: SunburstZoomInfo) => void;
61
63
  /** Decimal places for value display in tooltips (default: 0) */