@plumile/ui 0.1.122 → 0.1.125

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 (54) hide show
  1. package/lib/esm/__tests__/reactDomTestUtils.js +48 -0
  2. package/lib/esm/__tests__/reactDomTestUtils.js.map +1 -0
  3. package/lib/esm/atomic/molecules/markdown/components/MarkdownHeading.css.js +1 -0
  4. package/lib/esm/atomic/molecules/markdown/components/MarkdownTable.css.js +0 -1
  5. package/lib/esm/components/charts/MetricHistoryChart.js +17 -39
  6. package/lib/esm/components/charts/MetricHistoryChart.js.map +1 -1
  7. package/lib/esm/components/charts/TimeSeriesLineChart.js +20 -32
  8. package/lib/esm/components/charts/TimeSeriesLineChart.js.map +1 -1
  9. package/lib/esm/components/data-table/DataTable.js +33 -35
  10. package/lib/esm/components/data-table/DataTable.js.map +1 -1
  11. package/lib/esm/components/data-table/VirtualizedConnectionTable.js +48 -60
  12. package/lib/esm/components/data-table/VirtualizedConnectionTable.js.map +1 -1
  13. package/lib/esm/internal/charts/metricHistoryChartHelpers.js +24 -0
  14. package/lib/esm/internal/charts/metricHistoryChartHelpers.js.map +1 -0
  15. package/lib/esm/internal/charts/timeSeriesLineChartHelpers.js +18 -0
  16. package/lib/esm/internal/charts/timeSeriesLineChartHelpers.js.map +1 -0
  17. package/lib/esm/internal/data-table/layout.js +6 -0
  18. package/lib/esm/internal/data-table/layout.js.map +1 -0
  19. package/lib/esm/internal/data-table/virtualization.js +12 -0
  20. package/lib/esm/internal/data-table/virtualization.js.map +1 -0
  21. package/lib/esm/node_modules/@vitest/pretty-format/dist/index.js +614 -0
  22. package/lib/esm/node_modules/@vitest/pretty-format/dist/index.js.map +1 -0
  23. package/lib/esm/node_modules/@vitest/runner/dist/chunk-artifact.js +909 -0
  24. package/lib/esm/node_modules/@vitest/runner/dist/chunk-artifact.js.map +1 -0
  25. package/lib/esm/node_modules/@vitest/runner/dist/index.js +1 -0
  26. package/lib/esm/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +50 -0
  27. package/lib/esm/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js.map +1 -0
  28. package/lib/esm/node_modules/@vitest/utils/dist/display.js +424 -0
  29. package/lib/esm/node_modules/@vitest/utils/dist/display.js.map +1 -0
  30. package/lib/esm/node_modules/@vitest/utils/dist/helpers.js +43 -0
  31. package/lib/esm/node_modules/@vitest/utils/dist/helpers.js.map +1 -0
  32. package/lib/esm/node_modules/@vitest/utils/dist/source-map.js +68 -0
  33. package/lib/esm/node_modules/@vitest/utils/dist/source-map.js.map +1 -0
  34. package/lib/esm/node_modules/@vitest/utils/dist/timers.js +19 -0
  35. package/lib/esm/node_modules/@vitest/utils/dist/timers.js.map +1 -0
  36. package/lib/esm/node_modules/tinyrainbow/dist/index.js +85 -0
  37. package/lib/esm/node_modules/tinyrainbow/dist/index.js.map +1 -0
  38. package/lib/types/components/charts/MetricHistoryChart.d.ts +0 -8
  39. package/lib/types/components/charts/MetricHistoryChart.d.ts.map +1 -1
  40. package/lib/types/components/charts/TimeSeriesLineChart.d.ts +0 -4
  41. package/lib/types/components/charts/TimeSeriesLineChart.d.ts.map +1 -1
  42. package/lib/types/components/data-table/DataTable.d.ts +1 -5
  43. package/lib/types/components/data-table/DataTable.d.ts.map +1 -1
  44. package/lib/types/components/data-table/VirtualizedConnectionTable.d.ts +1 -34
  45. package/lib/types/components/data-table/VirtualizedConnectionTable.d.ts.map +1 -1
  46. package/lib/types/internal/charts/metricHistoryChartHelpers.d.ts +4 -0
  47. package/lib/types/internal/charts/metricHistoryChartHelpers.d.ts.map +1 -0
  48. package/lib/types/internal/charts/timeSeriesLineChartHelpers.d.ts +9 -0
  49. package/lib/types/internal/charts/timeSeriesLineChartHelpers.d.ts.map +1 -0
  50. package/lib/types/internal/data-table/layout.d.ts +4 -0
  51. package/lib/types/internal/data-table/layout.d.ts.map +1 -0
  52. package/lib/types/internal/data-table/virtualization.d.ts +29 -0
  53. package/lib/types/internal/data-table/virtualization.d.ts.map +1 -0
  54. package/package.json +2 -2
@@ -1,14 +1,16 @@
1
1
  import { cx as e } from "../../theme/tools.js";
2
2
  import { useUiTranslation as t } from "../../i18n/useUiTranslation.js";
3
3
  import { alignRecipe as n, body as r, bodyContained as i, cell as a, container as o, containerWithContainedBody as s, emptyRow as c, header as l, headerCell as u, headerRow as ee, hideBelowRecipe as d, primaryCell as te, primaryHeaderCell as ne, row as re, rowEven as ie, rowOdd as ae } from "./DataTable.css.js";
4
- import { bodyViewport as oe, sentinel as se, singleLineCell as ce, spacer as f } from "./VirtualizedConnectionTable.css.js";
5
- import { useCallback as p, useEffect as le, useLayoutEffect as ue, useMemo as m, useRef as h, useState as de } from "react";
6
- import { jsx as g, jsxs as _ } from "react/jsx-runtime";
4
+ import { buildDataTableInlineTemplate as oe } from "../../internal/data-table/layout.js";
5
+ import { bodyViewport as se, sentinel as ce, singleLineCell as le, spacer as f } from "./VirtualizedConnectionTable.css.js";
6
+ import { clamp as ue, computeVirtualWindowBounds as de, isVerticallyScrollable as p, shouldTriggerInfiniteLoad as fe } from "../../internal/data-table/virtualization.js";
7
+ import { useCallback as m, useEffect as h, useLayoutEffect as g, useMemo as _, useRef as v, useState as pe } from "react";
8
+ import { jsx as y, jsxs as b } from "react/jsx-runtime";
7
9
  //#region src/components/data-table/VirtualizedConnectionTable.tsx
8
- var v = "minmax(0, 1fr)", y = (e, t) => typeof t == "string" && t !== "" ? { gridTemplateColumns: t } : { gridTemplateColumns: `repeat(${e}, ${v})` }, b = (e) => e == null ? null : d({ minVisibleAt: e }), x = ({ overflowY: e, scrollHeight: t, clientHeight: n }) => e !== "auto" && e !== "scroll" && e !== "overlay" ? !1 : t > n + 1, S = (e) => {
10
+ var x = (e) => e == null ? null : d({ minVisibleAt: e }), S = (e) => {
9
11
  let t = e;
10
12
  for (; t != null;) {
11
- if (x({
13
+ if (p({
12
14
  overflowY: window.getComputedStyle(t).overflowY,
13
15
  scrollHeight: t.scrollHeight,
14
16
  clientHeight: t.clientHeight
@@ -16,43 +18,37 @@ var v = "minmax(0, 1fr)", y = (e, t) => typeof t == "string" && t !== "" ? { gri
16
18
  t = t.parentElement;
17
19
  }
18
20
  return null;
19
- }, C = (e, t, n) => Math.min(n, Math.max(t, e)), fe = ({ autoLoad: e, canLoadMore: t, totalHeight: n, visibleBottom: r, thresholdPx: i, isCoolingDown: a }) => !e || !t || a ? !1 : n - r <= i, pe = ({ rowCount: e, rowHeightPx: t, overscan: n, visibleTop: r, visibleBottom: i }) => {
20
- let a = e * t, o = C(i, 0, a), s = C(r, 0, a), c = Math.floor(s / t) - n, l = Math.ceil(o / t) + n, u = C(c, 0, e);
21
- return {
22
- startIndex: u,
23
- endIndex: C(l, u, e)
24
- };
25
- }, me = ({ columns: d, rows: v, getRowId: x, emptyState: me, className: he, gridTemplateColumns: ge, kind: _e, classes: w, bodyScrollMode: T = "page", virtualization: E, infiniteScroll: D, hasNextPage: ve = !1, isLoadingMore: ye = !1, onLoadMore: O, ariaLabel: be, ariaLabelledBy: k }) => {
21
+ }, C = ({ columns: d, rows: p, getRowId: C, emptyState: me, className: he, gridTemplateColumns: ge, kind: _e, classes: w, bodyScrollMode: T = "page", virtualization: E, infiniteScroll: D, hasNextPage: ve = !1, isLoadingMore: ye = !1, onLoadMore: O, ariaLabel: be, ariaLabelledBy: k }) => {
26
22
  let { t: A } = t(), j = _e ?? "default", M = be ?? A("common.table.label");
27
23
  k != null && (M = void 0);
28
- let N = h(null), P = h(null), F = h(null), I = h(null), L = h(null), R = h(null), z = h(!1), B = E?.enabled === !0, V = m(() => {
24
+ let N = v(null), P = v(null), F = v(null), I = v(null), L = v(null), R = v(null), z = v(!1), B = E?.enabled === !0, V = _(() => {
29
25
  if (!B) return null;
30
26
  let e = E.rowHeightPx;
31
27
  return typeof e == "number" && Number.isFinite(e) && e > 0 ? e : 56;
32
- }, [B, E]), H = m(() => {
28
+ }, [B, E]), H = _(() => {
33
29
  if (!B) return 0;
34
30
  let e = 10, t = E.overscan;
35
31
  return typeof t == "number" && Number.isFinite(t) && (e = t), Math.max(0, e);
36
- }, [B, E]), U = D?.thresholdPx ?? 800, W = D?.autoLoad ?? !0, G = D?.enabled === !0, K = T === "contained", q = G && ve && !ye && O != null, J = p(() => {
32
+ }, [B, E]), U = D?.thresholdPx ?? 800, W = D?.autoLoad ?? !0, G = D?.enabled === !0, K = T === "contained", q = G && ve && !ye && O != null, J = m(() => {
37
33
  O?.();
38
- }, [O]), [xe, Se] = de(() => ({
34
+ }, [O]), [xe, Se] = pe(() => ({
39
35
  startIndex: 0,
40
- endIndex: Math.min(v.length, 50)
41
- })), Y = m(() => y(d.length, ge), [d.length, ge]), Ce = p((t, r, i) => {
42
- let o = x(t, r), s = [re({ kind: j }), w?.row];
36
+ endIndex: Math.min(p.length, 50)
37
+ })), Y = _(() => oe(d.length, ge), [d.length, ge]), Ce = m((t, r, i) => {
38
+ let o = C(t, r), s = [re({ kind: j }), w?.row];
43
39
  r % 2 == 0 ? s.push(ie({ kind: j }), w?.rowEven) : s.push(ae({ kind: j }), w?.rowOdd);
44
40
  let c = { ...Y };
45
- return typeof i == "number" && (c.height = i), /* @__PURE__ */ g("div", {
41
+ return typeof i == "number" && (c.height = i), /* @__PURE__ */ y("div", {
46
42
  role: "row",
47
43
  className: e(...s),
48
44
  style: c,
49
45
  children: d.map((r) => {
50
46
  let i = [
51
47
  a({ kind: j }),
52
- ce,
48
+ le,
53
49
  w?.cell
54
- ], o = b(r.minVisibleAt);
55
- return o != null && i.push(o), r.className != null && i.push(r.className), r.isPrimary && i.push(te, w?.primaryCell), r.align != null && i.push(n({ align: r.align })), /* @__PURE__ */ g("div", {
50
+ ], o = x(r.minVisibleAt);
51
+ return o != null && i.push(o), r.className != null && i.push(r.className), r.isPrimary && i.push(te, w?.primaryCell), r.align != null && i.push(n({ align: r.align })), /* @__PURE__ */ y("div", {
56
52
  role: "cell",
57
53
  className: e(...i),
58
54
  children: r.cell(t)
@@ -62,10 +58,10 @@ var v = "minmax(0, 1fr)", y = (e, t) => typeof t == "string" && t !== "" ? { gri
62
58
  }, [
63
59
  w,
64
60
  d,
65
- x,
61
+ C,
66
62
  Y,
67
63
  j
68
- ]), X = p(() => {
64
+ ]), X = m(() => {
69
65
  if (!B) return;
70
66
  let e = V;
71
67
  if (e == null) return;
@@ -77,8 +73,8 @@ var v = "minmax(0, 1fr)", y = (e, t) => typeof t == "string" && t !== "" ? { gri
77
73
  let e = r?.getBoundingClientRect().top ?? 0, n = t.getBoundingClientRect().top - e;
78
74
  a = Math.max(0, -n);
79
75
  }
80
- let o = a + i, s = v.length * e, c = C(o, 0, s), { startIndex: l, endIndex: u } = pe({
81
- rowCount: v.length,
76
+ let o = a + i, s = p.length * e, c = ue(o, 0, s), { startIndex: l, endIndex: u } = de({
77
+ rowCount: p.length,
82
78
  rowHeightPx: e,
83
79
  overscan: H,
84
80
  visibleTop: a,
@@ -104,15 +100,15 @@ var v = "minmax(0, 1fr)", y = (e, t) => typeof t == "string" && t !== "" ? { gri
104
100
  B,
105
101
  H,
106
102
  V,
107
- v.length,
103
+ p.length,
108
104
  U,
109
105
  J
110
- ]), Z = p(() => {
106
+ ]), Z = m(() => {
111
107
  R.current ??= window.requestAnimationFrame(() => {
112
108
  R.current = null, X();
113
109
  });
114
110
  }, [X]);
115
- ue(() => {
111
+ g(() => {
116
112
  if (!B) return;
117
113
  let e = N.current;
118
114
  e != null && (K ? L.current = P.current : L.current = S(e), Z());
@@ -120,7 +116,7 @@ var v = "minmax(0, 1fr)", y = (e, t) => typeof t == "string" && t !== "" ? { gri
120
116
  K,
121
117
  B,
122
118
  Z
123
- ]), le(() => {
119
+ ]), h(() => {
124
120
  if (!B) return;
125
121
  let e = L.current ?? window, t = () => {
126
122
  Z();
@@ -128,7 +124,7 @@ var v = "minmax(0, 1fr)", y = (e, t) => typeof t == "string" && t !== "" ? { gri
128
124
  return e.addEventListener("scroll", t, { passive: !0 }), window.addEventListener("resize", t), () => {
129
125
  e.removeEventListener("scroll", t), window.removeEventListener("resize", t);
130
126
  };
131
- }, [B, Z]), le(() => {
127
+ }, [B, Z]), h(() => {
132
128
  if (B || !G || !W || !q) return;
133
129
  let e = I.current;
134
130
  if (e == null) return;
@@ -151,21 +147,21 @@ var v = "minmax(0, 1fr)", y = (e, t) => typeof t == "string" && t !== "" ? { gri
151
147
  B,
152
148
  U,
153
149
  J
154
- ]), ue(() => {
150
+ ]), g(() => {
155
151
  if (B) return;
156
152
  let e = N.current;
157
153
  e != null && (K ? L.current = P.current : L.current = S(e));
158
154
  }, [K, B]);
159
- let we = /* @__PURE__ */ g("div", {
155
+ let we = /* @__PURE__ */ y("div", {
160
156
  className: e(l({ kind: j }), w?.header),
161
157
  role: "rowgroup",
162
- children: /* @__PURE__ */ g("div", {
158
+ children: /* @__PURE__ */ y("div", {
163
159
  className: e(ee, w?.headerRow),
164
160
  role: "row",
165
161
  style: Y,
166
162
  children: d.map((t) => {
167
- let r = [u({ kind: j }), w?.headerCell], i = b(t.minVisibleAt);
168
- return i != null && r.push(i), t.className != null && r.push(t.className), t.isPrimary && r.push(ne, w?.primaryHeaderCell), t.align != null && r.push(n({ align: t.align })), /* @__PURE__ */ g("div", {
163
+ let r = [u({ kind: j }), w?.headerCell], i = x(t.minVisibleAt);
164
+ return i != null && r.push(i), t.className != null && r.push(t.className), t.isPrimary && r.push(ne, w?.primaryHeaderCell), t.align != null && r.push(n({ align: t.align })), /* @__PURE__ */ y("div", {
169
165
  role: "columnheader",
170
166
  className: e(...r),
171
167
  children: t.header
@@ -173,52 +169,52 @@ var v = "minmax(0, 1fr)", y = (e, t) => typeof t == "string" && t !== "" ? { gri
173
169
  })
174
170
  })
175
171
  }), Q;
176
- if (v.length === 0) Q = /* @__PURE__ */ g("div", {
172
+ if (p.length === 0) Q = /* @__PURE__ */ y("div", {
177
173
  className: e(c, w?.emptyRow),
178
174
  role: "row",
179
- children: /* @__PURE__ */ g("div", {
175
+ children: /* @__PURE__ */ y("div", {
180
176
  role: "cell",
181
- children: me ?? /* @__PURE__ */ g("div", {
177
+ children: me ?? /* @__PURE__ */ y("div", {
182
178
  className: e("ysn84624 txvbqb9w txvbqb19cb txvbqb16fa", w?.emptyCell),
183
179
  children: A("common.table.empty")
184
180
  })
185
181
  })
186
182
  });
187
183
  else if (B && V != null) {
188
- let { startIndex: e, endIndex: t } = xe, n = e * V, r = (v.length - t) * V, i = v.slice(e, t);
189
- Q = /* @__PURE__ */ _("div", {
190
- className: oe,
184
+ let { startIndex: e, endIndex: t } = xe, n = e * V, r = (p.length - t) * V, i = p.slice(e, t);
185
+ Q = /* @__PURE__ */ b("div", {
186
+ className: se,
191
187
  ref: F,
192
188
  children: [
193
- /* @__PURE__ */ g("div", {
189
+ /* @__PURE__ */ y("div", {
194
190
  className: f,
195
191
  style: { height: n }
196
192
  }),
197
193
  i.map((t, n) => Ce(t, e + n, V)),
198
- /* @__PURE__ */ g("div", {
194
+ /* @__PURE__ */ y("div", {
199
195
  className: f,
200
196
  style: { height: r }
201
197
  })
202
198
  ]
203
199
  });
204
- } else Q = /* @__PURE__ */ g("div", {
200
+ } else Q = /* @__PURE__ */ y("div", {
205
201
  ref: F,
206
- children: v.map((e, t) => Ce(e, t, null))
202
+ children: p.map((e, t) => Ce(e, t, null))
207
203
  });
208
204
  let Te = null;
209
- !B && G && W && (Te = /* @__PURE__ */ g("div", {
205
+ !B && G && W && (Te = /* @__PURE__ */ y("div", {
210
206
  ref: I,
211
- className: se
207
+ className: ce
212
208
  }));
213
209
  let Ee = null, $ = null;
214
- return K && (Ee = s, $ = i), /* @__PURE__ */ _("div", {
210
+ return K && (Ee = s, $ = i), /* @__PURE__ */ b("div", {
215
211
  ref: N,
216
212
  className: e(o({ kind: j }), Ee, w?.container, he),
217
213
  role: "table",
218
214
  "aria-label": M,
219
215
  "aria-labelledby": k,
220
216
  "data-scroll-mode": T,
221
- children: [we, /* @__PURE__ */ _("div", {
217
+ children: [we, /* @__PURE__ */ b("div", {
222
218
  ref: P,
223
219
  className: e(r({ kind: j }), $, w?.body),
224
220
  role: "rowgroup",
@@ -226,16 +222,8 @@ var v = "minmax(0, 1fr)", y = (e, t) => typeof t == "string" && t !== "" ? { gri
226
222
  children: [Q, Te]
227
223
  })]
228
224
  });
229
- }, he = {
230
- buildInlineTemplate: y,
231
- getVisibilityClass: b,
232
- isVerticallyScrollable: x,
233
- findScrollParent: S,
234
- clamp: C,
235
- shouldTriggerInfiniteLoad: fe,
236
- computeVirtualWindowBounds: pe
237
225
  };
238
226
  //#endregion
239
- export { me as VirtualizedConnectionTable, he as __test };
227
+ export { C as VirtualizedConnectionTable };
240
228
 
241
229
  //# sourceMappingURL=VirtualizedConnectionTable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VirtualizedConnectionTable.js","names":[],"sources":["../../../../src/components/data-table/VirtualizedConnectionTable.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type JSX,\n} from 'react';\n\nimport type { DataTableBreakpoint } from './tableBreakpoints.js';\nimport type {\n DataTableBodyScrollMode,\n DataTableColumn,\n DataTableKind,\n GetRowId,\n} from './DataTable.js';\nimport * as dataTableStyles from './DataTable.css.js';\nimport * as styles from './VirtualizedConnectionTable.css.js';\n\nimport { cx } from '../../theme/tools.js';\nimport { useUiTranslation } from '../../i18n/useUiTranslation.js';\nimport type { SlotClasses } from '../../styles/slots.js';\n\nexport type VirtualizationConfig = {\n enabled: boolean;\n rowHeightPx: number;\n overscan: number;\n};\n\nexport type InfiniteScrollConfig = {\n enabled: boolean;\n thresholdPx?: number;\n autoLoad?: boolean;\n};\n\ntype DataTableSlot =\n | 'container'\n | 'header'\n | 'headerRow'\n | 'headerCell'\n | 'primaryHeaderCell'\n | 'body'\n | 'row'\n | 'rowEven'\n | 'rowOdd'\n | 'cell'\n | 'primaryCell'\n | 'emptyRow'\n | 'emptyCell';\n\nexport type VirtualizedConnectionTableProps<Row> = {\n columns: readonly DataTableColumn<Row>[];\n rows: readonly Row[];\n getRowId: GetRowId<Row>;\n emptyState?: JSX.Element;\n className?: string;\n gridTemplateColumns?: string;\n kind?: DataTableKind;\n classes?: SlotClasses<DataTableSlot>;\n bodyScrollMode?: DataTableBodyScrollMode;\n\n virtualization?: VirtualizationConfig;\n\n infiniteScroll?: InfiniteScrollConfig;\n hasNextPage?: boolean;\n isLoadingMore?: boolean;\n onLoadMore?: () => void;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n};\n\nconst DEFAULT_TEMPLATE_CELL = 'minmax(0, 1fr)';\n\nconst buildInlineTemplate = (\n columnCount: number,\n gridTemplateColumns?: string,\n): CSSProperties => {\n if (typeof gridTemplateColumns === 'string' && gridTemplateColumns !== '') {\n return { gridTemplateColumns };\n }\n return {\n gridTemplateColumns: `repeat(${columnCount}, ${DEFAULT_TEMPLATE_CELL})`,\n };\n};\n\nconst getVisibilityClass = (minVisibleAt?: DataTableBreakpoint) => {\n if (minVisibleAt == null) {\n return null;\n }\n return dataTableStyles.hideBelowRecipe({ minVisibleAt });\n};\n\nconst isVerticallyScrollable = ({\n overflowY,\n scrollHeight,\n clientHeight,\n}: {\n overflowY: string;\n scrollHeight: number;\n clientHeight: number;\n}): boolean => {\n if (\n overflowY !== 'auto' &&\n overflowY !== 'scroll' &&\n overflowY !== 'overlay'\n ) {\n return false;\n }\n return scrollHeight > clientHeight + 1;\n};\n\nconst findScrollParent = (el: HTMLElement | null): HTMLElement | null => {\n let current: HTMLElement | null = el;\n while (current != null) {\n const style = window.getComputedStyle(current);\n if (\n isVerticallyScrollable({\n overflowY: style.overflowY,\n scrollHeight: current.scrollHeight,\n clientHeight: current.clientHeight,\n })\n ) {\n return current;\n }\n current = current.parentElement;\n }\n return null;\n};\n\ntype VirtualWindow = {\n startIndex: number;\n endIndex: number;\n};\n\ntype ComputeVirtualWindowInput = {\n rowCount: number;\n rowHeightPx: number;\n overscan: number;\n visibleTop: number;\n visibleBottom: number;\n};\n\ntype ShouldTriggerInfiniteLoadInput = {\n autoLoad: boolean;\n canLoadMore: boolean;\n totalHeight: number;\n visibleBottom: number;\n thresholdPx: number;\n isCoolingDown: boolean;\n};\n\nconst clamp = (value: number, min: number, max: number): number => {\n return Math.min(max, Math.max(min, value));\n};\n\nconst shouldTriggerInfiniteLoad = ({\n autoLoad,\n canLoadMore,\n totalHeight,\n visibleBottom,\n thresholdPx,\n isCoolingDown,\n}: ShouldTriggerInfiniteLoadInput): boolean => {\n if (!autoLoad || !canLoadMore || isCoolingDown) {\n return false;\n }\n return totalHeight - visibleBottom <= thresholdPx;\n};\n\nconst computeVirtualWindowBounds = ({\n rowCount,\n rowHeightPx,\n overscan,\n visibleTop,\n visibleBottom,\n}: ComputeVirtualWindowInput): VirtualWindow => {\n const totalHeight = rowCount * rowHeightPx;\n const clampedBottom = clamp(visibleBottom, 0, totalHeight);\n const clampedTop = clamp(visibleTop, 0, totalHeight);\n\n const rawStart = Math.floor(clampedTop / rowHeightPx) - overscan;\n const rawEnd = Math.ceil(clampedBottom / rowHeightPx) + overscan;\n\n const startIndex = clamp(rawStart, 0, rowCount);\n const endIndex = clamp(rawEnd, startIndex, rowCount);\n\n return { startIndex, endIndex };\n};\n\nexport const VirtualizedConnectionTable = <Row,>({\n columns,\n rows,\n getRowId,\n emptyState,\n className,\n gridTemplateColumns,\n kind,\n classes,\n bodyScrollMode = 'page',\n virtualization,\n infiniteScroll,\n hasNextPage = false,\n isLoadingMore = false,\n onLoadMore,\n ariaLabel,\n ariaLabelledBy,\n}: VirtualizedConnectionTableProps<Row>): JSX.Element => {\n const { t } = useUiTranslation();\n const resolvedKind: DataTableKind = kind ?? 'default';\n const resolvedAriaLabel = ariaLabel ?? t('common.table.label');\n let tableAriaLabel: string | undefined = resolvedAriaLabel;\n if (ariaLabelledBy != null) {\n tableAriaLabel = undefined;\n }\n const containerRef = useRef<HTMLDivElement>(null);\n const bodyScrollerRef = useRef<HTMLDivElement>(null);\n const bodyRef = useRef<HTMLDivElement>(null);\n const sentinelRef = useRef<HTMLDivElement>(null);\n const scrollParentRef = useRef<HTMLElement | null>(null);\n const rafRef = useRef<number | null>(null);\n const loadMoreCooldownRef = useRef(false);\n\n const isVirtualized = virtualization?.enabled === true;\n const rowHeightPx = useMemo(() => {\n if (!isVirtualized) {\n return null;\n }\n\n const configuredRowHeight = virtualization.rowHeightPx;\n if (\n typeof configuredRowHeight === 'number' &&\n Number.isFinite(configuredRowHeight) &&\n configuredRowHeight > 0\n ) {\n return configuredRowHeight;\n }\n\n return 56;\n }, [isVirtualized, virtualization]);\n\n const overscan = useMemo(() => {\n if (!isVirtualized) {\n return 0;\n }\n\n let nextOverscan = 10;\n const configuredOverscan = virtualization.overscan;\n if (\n typeof configuredOverscan === 'number' &&\n Number.isFinite(configuredOverscan)\n ) {\n nextOverscan = configuredOverscan;\n }\n return Math.max(0, nextOverscan);\n }, [isVirtualized, virtualization]);\n\n const thresholdPx = infiniteScroll?.thresholdPx ?? 800;\n const autoLoad = infiniteScroll?.autoLoad ?? true;\n const infiniteEnabled = infiniteScroll?.enabled === true;\n const hasContainedBodyScroll = bodyScrollMode === 'contained';\n\n const canLoadMore =\n infiniteEnabled && hasNextPage && !isLoadingMore && onLoadMore != null;\n\n const triggerLoadMore = useCallback(() => {\n if (onLoadMore == null) {\n return;\n }\n onLoadMore();\n }, [onLoadMore]);\n\n const [windowState, setWindowState] = useState<VirtualWindow>(() => {\n return { startIndex: 0, endIndex: Math.min(rows.length, 50) };\n });\n\n const inlineTemplateStyle = useMemo(() => {\n return buildInlineTemplate(columns.length, gridTemplateColumns);\n }, [columns.length, gridTemplateColumns]);\n\n const renderRow = useCallback(\n (row: Row, index: number, heightPx?: number | null): JSX.Element => {\n const rowId = getRowId(row, index);\n const rowClasses = [\n dataTableStyles.row({ kind: resolvedKind }),\n classes?.row,\n ];\n if (index % 2 === 0) {\n rowClasses.push(\n dataTableStyles.rowEven({ kind: resolvedKind }),\n classes?.rowEven,\n );\n } else {\n rowClasses.push(\n dataTableStyles.rowOdd({ kind: resolvedKind }),\n classes?.rowOdd,\n );\n }\n const rowStyle: CSSProperties = { ...inlineTemplateStyle };\n if (typeof heightPx === 'number') {\n rowStyle.height = heightPx;\n }\n return (\n <div\n key={rowId}\n role=\"row\"\n className={cx(...rowClasses)}\n style={rowStyle}\n >\n {columns.map((column) => {\n const cellClasses = [\n dataTableStyles.cell({ kind: resolvedKind }),\n styles.singleLineCell,\n classes?.cell,\n ];\n const visibilityClass = getVisibilityClass(column.minVisibleAt);\n if (visibilityClass != null) {\n cellClasses.push(visibilityClass);\n }\n if (column.className != null) {\n cellClasses.push(column.className);\n }\n if (column.isPrimary) {\n cellClasses.push(\n dataTableStyles.primaryCell,\n classes?.primaryCell,\n );\n }\n if (column.align != null) {\n cellClasses.push(\n dataTableStyles.alignRecipe({ align: column.align }),\n );\n }\n return (\n <div key={column.id} role=\"cell\" className={cx(...cellClasses)}>\n {column.cell(row)}\n </div>\n );\n })}\n </div>\n );\n },\n [classes, columns, getRowId, inlineTemplateStyle, resolvedKind],\n );\n\n const computeVirtualWindow = useCallback(() => {\n if (!isVirtualized) {\n return;\n }\n const height = rowHeightPx;\n if (height == null) {\n return;\n }\n const bodyEl = bodyRef.current;\n if (bodyEl == null) {\n return;\n }\n\n const bodyScroller = bodyScrollerRef.current;\n const scrollParent = scrollParentRef.current;\n let viewportHeight = scrollParent?.clientHeight ?? window.innerHeight;\n let visibleTop = 0;\n if (hasContainedBodyScroll && bodyScroller != null) {\n viewportHeight = bodyScroller.clientHeight;\n visibleTop = bodyScroller.scrollTop;\n } else {\n const parentRectTop = scrollParent?.getBoundingClientRect().top ?? 0;\n const bodyRectTop = bodyEl.getBoundingClientRect().top;\n const relativeTop = bodyRectTop - parentRectTop;\n visibleTop = Math.max(0, -relativeTop);\n }\n const visibleBottom = visibleTop + viewportHeight;\n\n const totalHeight = rows.length * height;\n const clampedBottom = clamp(visibleBottom, 0, totalHeight);\n const { startIndex, endIndex } = computeVirtualWindowBounds({\n rowCount: rows.length,\n rowHeightPx: height,\n overscan,\n visibleTop,\n visibleBottom,\n });\n\n setWindowState((prev) => {\n if (prev.startIndex === startIndex && prev.endIndex === endIndex) {\n return prev;\n }\n return { startIndex, endIndex };\n });\n\n if (\n shouldTriggerInfiniteLoad({\n autoLoad,\n canLoadMore,\n totalHeight,\n visibleBottom: clampedBottom,\n thresholdPx,\n isCoolingDown: loadMoreCooldownRef.current,\n })\n ) {\n loadMoreCooldownRef.current = true;\n triggerLoadMore();\n window.setTimeout(() => {\n loadMoreCooldownRef.current = false;\n }, 250);\n }\n }, [\n autoLoad,\n canLoadMore,\n hasContainedBodyScroll,\n isVirtualized,\n overscan,\n rowHeightPx,\n rows.length,\n thresholdPx,\n triggerLoadMore,\n ]);\n\n const scheduleCompute = useCallback(() => {\n if (rafRef.current != null) {\n return;\n }\n rafRef.current = window.requestAnimationFrame(() => {\n rafRef.current = null;\n computeVirtualWindow();\n });\n }, [computeVirtualWindow]);\n\n useLayoutEffect(() => {\n if (!isVirtualized) {\n return;\n }\n const container = containerRef.current;\n if (container == null) {\n return;\n }\n if (hasContainedBodyScroll) {\n scrollParentRef.current = bodyScrollerRef.current;\n } else {\n scrollParentRef.current = findScrollParent(container);\n }\n scheduleCompute();\n }, [hasContainedBodyScroll, isVirtualized, scheduleCompute]);\n\n useEffect(() => {\n if (!isVirtualized) {\n return undefined;\n }\n const scrollParent = scrollParentRef.current;\n const target: HTMLElement | Window = scrollParent ?? window;\n\n const handler = () => {\n scheduleCompute();\n };\n\n target.addEventListener('scroll', handler, { passive: true });\n window.addEventListener('resize', handler);\n\n return () => {\n target.removeEventListener('scroll', handler);\n window.removeEventListener('resize', handler);\n };\n }, [isVirtualized, scheduleCompute]);\n\n useEffect(() => {\n if (isVirtualized) {\n return undefined;\n }\n if (!infiniteEnabled || !autoLoad || !canLoadMore) {\n return undefined;\n }\n const sentinel = sentinelRef.current;\n if (sentinel == null) {\n return undefined;\n }\n\n const scrollParent = scrollParentRef.current;\n\n const observer = new IntersectionObserver(\n (entries) => {\n const [entry] = entries;\n if (entry == null) {\n return;\n }\n\n if (entry.isIntersecting && !loadMoreCooldownRef.current) {\n loadMoreCooldownRef.current = true;\n triggerLoadMore();\n window.setTimeout(() => {\n loadMoreCooldownRef.current = false;\n }, 250);\n }\n },\n {\n root: scrollParent,\n rootMargin: `0px 0px ${thresholdPx}px 0px`,\n },\n );\n\n observer.observe(sentinel);\n return () => {\n observer.disconnect();\n };\n }, [\n autoLoad,\n canLoadMore,\n infiniteEnabled,\n isVirtualized,\n thresholdPx,\n triggerLoadMore,\n ]);\n\n useLayoutEffect(() => {\n if (isVirtualized) {\n return;\n }\n const container = containerRef.current;\n if (container == null) {\n return;\n }\n if (hasContainedBodyScroll) {\n scrollParentRef.current = bodyScrollerRef.current;\n } else {\n scrollParentRef.current = findScrollParent(container);\n }\n }, [hasContainedBodyScroll, isVirtualized]);\n\n const headerRow = (\n <div\n className={cx(\n dataTableStyles.header({ kind: resolvedKind }),\n classes?.header,\n )}\n role=\"rowgroup\"\n >\n <div\n className={cx(dataTableStyles.headerRow, classes?.headerRow)}\n role=\"row\"\n style={inlineTemplateStyle}\n >\n {columns.map((column) => {\n const headerClasses = [\n dataTableStyles.headerCell({ kind: resolvedKind }),\n classes?.headerCell,\n ];\n const visibilityClass = getVisibilityClass(column.minVisibleAt);\n if (visibilityClass != null) {\n headerClasses.push(visibilityClass);\n }\n if (column.className != null) {\n headerClasses.push(column.className);\n }\n if (column.isPrimary) {\n headerClasses.push(\n dataTableStyles.primaryHeaderCell,\n classes?.primaryHeaderCell,\n );\n }\n if (column.align != null) {\n headerClasses.push(\n dataTableStyles.alignRecipe({ align: column.align }),\n );\n }\n return (\n <div\n key={column.id}\n role=\"columnheader\"\n className={cx(...headerClasses)}\n >\n {column.header}\n </div>\n );\n })}\n </div>\n </div>\n );\n\n let bodyRows: JSX.Element;\n if (rows.length === 0) {\n bodyRows = (\n <div\n className={cx(dataTableStyles.emptyRow, classes?.emptyRow)}\n role=\"row\"\n >\n <div role=\"cell\">\n {emptyState ?? (\n <div className={cx(dataTableStyles.emptyCell, classes?.emptyCell)}>\n {t('common.table.empty')}\n </div>\n )}\n </div>\n </div>\n );\n } else if (isVirtualized && rowHeightPx != null) {\n const { startIndex, endIndex } = windowState;\n const topSpacerHeight = startIndex * rowHeightPx;\n const bottomSpacerHeight = (rows.length - endIndex) * rowHeightPx;\n const slice = rows.slice(startIndex, endIndex);\n bodyRows = (\n <div className={styles.bodyViewport} ref={bodyRef}>\n <div className={styles.spacer} style={{ height: topSpacerHeight }} />\n {slice.map((row, sliceIndex) => {\n const absoluteIndex = startIndex + sliceIndex;\n return renderRow(row, absoluteIndex, rowHeightPx);\n })}\n <div className={styles.spacer} style={{ height: bottomSpacerHeight }} />\n </div>\n );\n } else {\n bodyRows = (\n <div ref={bodyRef}>\n {rows.map((row, index) => {\n return renderRow(row, index, null);\n })}\n </div>\n );\n }\n\n let sentinelNode: JSX.Element | null = null;\n if (!isVirtualized && infiniteEnabled && autoLoad) {\n sentinelNode = <div ref={sentinelRef} className={styles.sentinel} />;\n }\n\n let containedContainerClassName: string | null = null;\n let containedBodyClassName: string | null = null;\n if (hasContainedBodyScroll) {\n containedContainerClassName = dataTableStyles.containerWithContainedBody;\n containedBodyClassName = dataTableStyles.bodyContained;\n }\n\n return (\n <div\n ref={containerRef}\n className={cx(\n dataTableStyles.container({ kind: resolvedKind }),\n containedContainerClassName,\n classes?.container,\n className,\n )}\n role=\"table\"\n aria-label={tableAriaLabel}\n aria-labelledby={ariaLabelledBy}\n data-scroll-mode={bodyScrollMode}\n >\n {headerRow}\n <div\n ref={bodyScrollerRef}\n className={cx(\n dataTableStyles.body({ kind: resolvedKind }),\n containedBodyClassName,\n classes?.body,\n )}\n role=\"rowgroup\"\n data-scroll-mode={bodyScrollMode}\n >\n {bodyRows}\n {sentinelNode}\n </div>\n </div>\n );\n};\n\nexport const __test = {\n buildInlineTemplate,\n getVisibilityClass,\n isVerticallyScrollable,\n findScrollParent,\n clamp,\n shouldTriggerInfiniteLoad,\n computeVirtualWindowBounds,\n} as const;\n"],"mappings":"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"}
1
+ {"version":3,"file":"VirtualizedConnectionTable.js","names":[],"sources":["../../../../src/components/data-table/VirtualizedConnectionTable.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type JSX,\n} from 'react';\n\nimport type { DataTableBreakpoint } from './tableBreakpoints.js';\nimport type {\n DataTableBodyScrollMode,\n DataTableColumn,\n DataTableKind,\n GetRowId,\n} from './DataTable.js';\nimport * as dataTableStyles from './DataTable.css.js';\nimport * as styles from './VirtualizedConnectionTable.css.js';\n\nimport { buildDataTableInlineTemplate } from '../../internal/data-table/layout.js';\nimport {\n clamp,\n computeVirtualWindowBounds,\n isVerticallyScrollable,\n shouldTriggerInfiniteLoad,\n type VirtualWindow,\n} from '../../internal/data-table/virtualization.js';\nimport { cx } from '../../theme/tools.js';\nimport { useUiTranslation } from '../../i18n/useUiTranslation.js';\nimport type { SlotClasses } from '../../styles/slots.js';\n\nexport type VirtualizationConfig = {\n enabled: boolean;\n rowHeightPx: number;\n overscan: number;\n};\n\nexport type InfiniteScrollConfig = {\n enabled: boolean;\n thresholdPx?: number;\n autoLoad?: boolean;\n};\n\ntype DataTableSlot =\n | 'container'\n | 'header'\n | 'headerRow'\n | 'headerCell'\n | 'primaryHeaderCell'\n | 'body'\n | 'row'\n | 'rowEven'\n | 'rowOdd'\n | 'cell'\n | 'primaryCell'\n | 'emptyRow'\n | 'emptyCell';\n\nexport type VirtualizedConnectionTableProps<Row> = {\n columns: readonly DataTableColumn<Row>[];\n rows: readonly Row[];\n getRowId: GetRowId<Row>;\n emptyState?: JSX.Element;\n className?: string;\n gridTemplateColumns?: string;\n kind?: DataTableKind;\n classes?: SlotClasses<DataTableSlot>;\n bodyScrollMode?: DataTableBodyScrollMode;\n\n virtualization?: VirtualizationConfig;\n\n infiniteScroll?: InfiniteScrollConfig;\n hasNextPage?: boolean;\n isLoadingMore?: boolean;\n onLoadMore?: () => void;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n};\n\nconst getVisibilityClass = (minVisibleAt?: DataTableBreakpoint) => {\n if (minVisibleAt == null) {\n return null;\n }\n return dataTableStyles.hideBelowRecipe({ minVisibleAt });\n};\n\nconst findScrollParent = (el: HTMLElement | null): HTMLElement | null => {\n let current: HTMLElement | null = el;\n while (current != null) {\n const style = window.getComputedStyle(current);\n if (\n isVerticallyScrollable({\n overflowY: style.overflowY,\n scrollHeight: current.scrollHeight,\n clientHeight: current.clientHeight,\n })\n ) {\n return current;\n }\n current = current.parentElement;\n }\n return null;\n};\n\nexport const VirtualizedConnectionTable = <Row,>({\n columns,\n rows,\n getRowId,\n emptyState,\n className,\n gridTemplateColumns,\n kind,\n classes,\n bodyScrollMode = 'page',\n virtualization,\n infiniteScroll,\n hasNextPage = false,\n isLoadingMore = false,\n onLoadMore,\n ariaLabel,\n ariaLabelledBy,\n}: VirtualizedConnectionTableProps<Row>): JSX.Element => {\n const { t } = useUiTranslation();\n const resolvedKind: DataTableKind = kind ?? 'default';\n const resolvedAriaLabel = ariaLabel ?? t('common.table.label');\n let tableAriaLabel: string | undefined = resolvedAriaLabel;\n if (ariaLabelledBy != null) {\n tableAriaLabel = undefined;\n }\n const containerRef = useRef<HTMLDivElement>(null);\n const bodyScrollerRef = useRef<HTMLDivElement>(null);\n const bodyRef = useRef<HTMLDivElement>(null);\n const sentinelRef = useRef<HTMLDivElement>(null);\n const scrollParentRef = useRef<HTMLElement | null>(null);\n const rafRef = useRef<number | null>(null);\n const loadMoreCooldownRef = useRef(false);\n\n const isVirtualized = virtualization?.enabled === true;\n const rowHeightPx = useMemo(() => {\n if (!isVirtualized) {\n return null;\n }\n\n const configuredRowHeight = virtualization.rowHeightPx;\n if (\n typeof configuredRowHeight === 'number' &&\n Number.isFinite(configuredRowHeight) &&\n configuredRowHeight > 0\n ) {\n return configuredRowHeight;\n }\n\n return 56;\n }, [isVirtualized, virtualization]);\n\n const overscan = useMemo(() => {\n if (!isVirtualized) {\n return 0;\n }\n\n let nextOverscan = 10;\n const configuredOverscan = virtualization.overscan;\n if (\n typeof configuredOverscan === 'number' &&\n Number.isFinite(configuredOverscan)\n ) {\n nextOverscan = configuredOverscan;\n }\n return Math.max(0, nextOverscan);\n }, [isVirtualized, virtualization]);\n\n const thresholdPx = infiniteScroll?.thresholdPx ?? 800;\n const autoLoad = infiniteScroll?.autoLoad ?? true;\n const infiniteEnabled = infiniteScroll?.enabled === true;\n const hasContainedBodyScroll = bodyScrollMode === 'contained';\n\n const canLoadMore =\n infiniteEnabled && hasNextPage && !isLoadingMore && onLoadMore != null;\n\n const triggerLoadMore = useCallback(() => {\n if (onLoadMore == null) {\n return;\n }\n onLoadMore();\n }, [onLoadMore]);\n\n const [windowState, setWindowState] = useState<VirtualWindow>(() => {\n return { startIndex: 0, endIndex: Math.min(rows.length, 50) };\n });\n\n const inlineTemplateStyle = useMemo(() => {\n return buildDataTableInlineTemplate(columns.length, gridTemplateColumns);\n }, [columns.length, gridTemplateColumns]);\n\n const renderRow = useCallback(\n (row: Row, index: number, heightPx?: number | null): JSX.Element => {\n const rowId = getRowId(row, index);\n const rowClasses = [\n dataTableStyles.row({ kind: resolvedKind }),\n classes?.row,\n ];\n if (index % 2 === 0) {\n rowClasses.push(\n dataTableStyles.rowEven({ kind: resolvedKind }),\n classes?.rowEven,\n );\n } else {\n rowClasses.push(\n dataTableStyles.rowOdd({ kind: resolvedKind }),\n classes?.rowOdd,\n );\n }\n const rowStyle: CSSProperties = { ...inlineTemplateStyle };\n if (typeof heightPx === 'number') {\n rowStyle.height = heightPx;\n }\n return (\n <div\n key={rowId}\n role=\"row\"\n className={cx(...rowClasses)}\n style={rowStyle}\n >\n {columns.map((column) => {\n const cellClasses = [\n dataTableStyles.cell({ kind: resolvedKind }),\n styles.singleLineCell,\n classes?.cell,\n ];\n const visibilityClass = getVisibilityClass(column.minVisibleAt);\n if (visibilityClass != null) {\n cellClasses.push(visibilityClass);\n }\n if (column.className != null) {\n cellClasses.push(column.className);\n }\n if (column.isPrimary) {\n cellClasses.push(\n dataTableStyles.primaryCell,\n classes?.primaryCell,\n );\n }\n if (column.align != null) {\n cellClasses.push(\n dataTableStyles.alignRecipe({ align: column.align }),\n );\n }\n return (\n <div key={column.id} role=\"cell\" className={cx(...cellClasses)}>\n {column.cell(row)}\n </div>\n );\n })}\n </div>\n );\n },\n [classes, columns, getRowId, inlineTemplateStyle, resolvedKind],\n );\n\n const computeVirtualWindow = useCallback(() => {\n if (!isVirtualized) {\n return;\n }\n const height = rowHeightPx;\n if (height == null) {\n return;\n }\n const bodyEl = bodyRef.current;\n if (bodyEl == null) {\n return;\n }\n\n const bodyScroller = bodyScrollerRef.current;\n const scrollParent = scrollParentRef.current;\n let viewportHeight = scrollParent?.clientHeight ?? window.innerHeight;\n let visibleTop = 0;\n if (hasContainedBodyScroll && bodyScroller != null) {\n viewportHeight = bodyScroller.clientHeight;\n visibleTop = bodyScroller.scrollTop;\n } else {\n const parentRectTop = scrollParent?.getBoundingClientRect().top ?? 0;\n const bodyRectTop = bodyEl.getBoundingClientRect().top;\n const relativeTop = bodyRectTop - parentRectTop;\n visibleTop = Math.max(0, -relativeTop);\n }\n const visibleBottom = visibleTop + viewportHeight;\n\n const totalHeight = rows.length * height;\n const clampedBottom = clamp(visibleBottom, 0, totalHeight);\n const { startIndex, endIndex } = computeVirtualWindowBounds({\n rowCount: rows.length,\n rowHeightPx: height,\n overscan,\n visibleTop,\n visibleBottom,\n });\n\n setWindowState((prev) => {\n if (prev.startIndex === startIndex && prev.endIndex === endIndex) {\n return prev;\n }\n return { startIndex, endIndex };\n });\n\n if (\n shouldTriggerInfiniteLoad({\n autoLoad,\n canLoadMore,\n totalHeight,\n visibleBottom: clampedBottom,\n thresholdPx,\n isCoolingDown: loadMoreCooldownRef.current,\n })\n ) {\n loadMoreCooldownRef.current = true;\n triggerLoadMore();\n window.setTimeout(() => {\n loadMoreCooldownRef.current = false;\n }, 250);\n }\n }, [\n autoLoad,\n canLoadMore,\n hasContainedBodyScroll,\n isVirtualized,\n overscan,\n rowHeightPx,\n rows.length,\n thresholdPx,\n triggerLoadMore,\n ]);\n\n const scheduleCompute = useCallback(() => {\n if (rafRef.current != null) {\n return;\n }\n rafRef.current = window.requestAnimationFrame(() => {\n rafRef.current = null;\n computeVirtualWindow();\n });\n }, [computeVirtualWindow]);\n\n useLayoutEffect(() => {\n if (!isVirtualized) {\n return;\n }\n const container = containerRef.current;\n if (container == null) {\n return;\n }\n if (hasContainedBodyScroll) {\n scrollParentRef.current = bodyScrollerRef.current;\n } else {\n scrollParentRef.current = findScrollParent(container);\n }\n scheduleCompute();\n }, [hasContainedBodyScroll, isVirtualized, scheduleCompute]);\n\n useEffect(() => {\n if (!isVirtualized) {\n return undefined;\n }\n const scrollParent = scrollParentRef.current;\n const target: HTMLElement | Window = scrollParent ?? window;\n\n const handler = () => {\n scheduleCompute();\n };\n\n target.addEventListener('scroll', handler, { passive: true });\n window.addEventListener('resize', handler);\n\n return () => {\n target.removeEventListener('scroll', handler);\n window.removeEventListener('resize', handler);\n };\n }, [isVirtualized, scheduleCompute]);\n\n useEffect(() => {\n if (isVirtualized) {\n return undefined;\n }\n if (!infiniteEnabled || !autoLoad || !canLoadMore) {\n return undefined;\n }\n const sentinel = sentinelRef.current;\n if (sentinel == null) {\n return undefined;\n }\n\n const scrollParent = scrollParentRef.current;\n\n const observer = new IntersectionObserver(\n (entries) => {\n const [entry] = entries;\n if (entry == null) {\n return;\n }\n\n if (entry.isIntersecting && !loadMoreCooldownRef.current) {\n loadMoreCooldownRef.current = true;\n triggerLoadMore();\n window.setTimeout(() => {\n loadMoreCooldownRef.current = false;\n }, 250);\n }\n },\n {\n root: scrollParent,\n rootMargin: `0px 0px ${thresholdPx}px 0px`,\n },\n );\n\n observer.observe(sentinel);\n return () => {\n observer.disconnect();\n };\n }, [\n autoLoad,\n canLoadMore,\n infiniteEnabled,\n isVirtualized,\n thresholdPx,\n triggerLoadMore,\n ]);\n\n useLayoutEffect(() => {\n if (isVirtualized) {\n return;\n }\n const container = containerRef.current;\n if (container == null) {\n return;\n }\n if (hasContainedBodyScroll) {\n scrollParentRef.current = bodyScrollerRef.current;\n } else {\n scrollParentRef.current = findScrollParent(container);\n }\n }, [hasContainedBodyScroll, isVirtualized]);\n\n const headerRow = (\n <div\n className={cx(\n dataTableStyles.header({ kind: resolvedKind }),\n classes?.header,\n )}\n role=\"rowgroup\"\n >\n <div\n className={cx(dataTableStyles.headerRow, classes?.headerRow)}\n role=\"row\"\n style={inlineTemplateStyle}\n >\n {columns.map((column) => {\n const headerClasses = [\n dataTableStyles.headerCell({ kind: resolvedKind }),\n classes?.headerCell,\n ];\n const visibilityClass = getVisibilityClass(column.minVisibleAt);\n if (visibilityClass != null) {\n headerClasses.push(visibilityClass);\n }\n if (column.className != null) {\n headerClasses.push(column.className);\n }\n if (column.isPrimary) {\n headerClasses.push(\n dataTableStyles.primaryHeaderCell,\n classes?.primaryHeaderCell,\n );\n }\n if (column.align != null) {\n headerClasses.push(\n dataTableStyles.alignRecipe({ align: column.align }),\n );\n }\n return (\n <div\n key={column.id}\n role=\"columnheader\"\n className={cx(...headerClasses)}\n >\n {column.header}\n </div>\n );\n })}\n </div>\n </div>\n );\n\n let bodyRows: JSX.Element;\n if (rows.length === 0) {\n bodyRows = (\n <div\n className={cx(dataTableStyles.emptyRow, classes?.emptyRow)}\n role=\"row\"\n >\n <div role=\"cell\">\n {emptyState ?? (\n <div className={cx(dataTableStyles.emptyCell, classes?.emptyCell)}>\n {t('common.table.empty')}\n </div>\n )}\n </div>\n </div>\n );\n } else if (isVirtualized && rowHeightPx != null) {\n const { startIndex, endIndex } = windowState;\n const topSpacerHeight = startIndex * rowHeightPx;\n const bottomSpacerHeight = (rows.length - endIndex) * rowHeightPx;\n const slice = rows.slice(startIndex, endIndex);\n bodyRows = (\n <div className={styles.bodyViewport} ref={bodyRef}>\n <div className={styles.spacer} style={{ height: topSpacerHeight }} />\n {slice.map((row, sliceIndex) => {\n const absoluteIndex = startIndex + sliceIndex;\n return renderRow(row, absoluteIndex, rowHeightPx);\n })}\n <div className={styles.spacer} style={{ height: bottomSpacerHeight }} />\n </div>\n );\n } else {\n bodyRows = (\n <div ref={bodyRef}>\n {rows.map((row, index) => {\n return renderRow(row, index, null);\n })}\n </div>\n );\n }\n\n let sentinelNode: JSX.Element | null = null;\n if (!isVirtualized && infiniteEnabled && autoLoad) {\n sentinelNode = <div ref={sentinelRef} className={styles.sentinel} />;\n }\n\n let containedContainerClassName: string | null = null;\n let containedBodyClassName: string | null = null;\n if (hasContainedBodyScroll) {\n containedContainerClassName = dataTableStyles.containerWithContainedBody;\n containedBodyClassName = dataTableStyles.bodyContained;\n }\n\n return (\n <div\n ref={containerRef}\n className={cx(\n dataTableStyles.container({ kind: resolvedKind }),\n containedContainerClassName,\n classes?.container,\n className,\n )}\n role=\"table\"\n aria-label={tableAriaLabel}\n aria-labelledby={ariaLabelledBy}\n data-scroll-mode={bodyScrollMode}\n >\n {headerRow}\n <div\n ref={bodyScrollerRef}\n className={cx(\n dataTableStyles.body({ kind: resolvedKind }),\n containedBodyClassName,\n classes?.body,\n )}\n role=\"rowgroup\"\n data-scroll-mode={bodyScrollMode}\n >\n {bodyRows}\n {sentinelNode}\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ //#region src/internal/charts/metricHistoryChartHelpers.ts
2
+ function e(e, t) {
3
+ let n = new Intl.NumberFormat(void 0, { maximumFractionDigits: 2 }).format(e);
4
+ return t == null || t.length === 0 ? n : `${n} ${t}`;
5
+ }
6
+ function t(e) {
7
+ let t = new Date(e);
8
+ return Number.isNaN(t.getTime()) ? e : t.toLocaleString(void 0, {
9
+ month: "short",
10
+ day: "2-digit",
11
+ hour: "2-digit",
12
+ minute: "2-digit"
13
+ });
14
+ }
15
+ function n(e) {
16
+ return e.toLocaleTimeString(void 0, {
17
+ hour: "2-digit",
18
+ minute: "2-digit"
19
+ });
20
+ }
21
+ //#endregion
22
+ export { n as formatAxisTimestamp, t as formatDefaultTimestamp, e as formatDefaultValue };
23
+
24
+ //# sourceMappingURL=metricHistoryChartHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metricHistoryChartHelpers.js","names":[],"sources":["../../../../src/internal/charts/metricHistoryChartHelpers.ts"],"sourcesContent":["/**\n * Formats metric values with an optional unit suffix.\n */\nexport function formatDefaultValue(value: number, unit?: string): string {\n const formatted = new Intl.NumberFormat(undefined, {\n maximumFractionDigits: 2,\n }).format(value);\n\n if (unit == null || unit.length === 0) {\n return formatted;\n }\n\n return `${formatted} ${unit}`;\n}\n\n/**\n * Formats an ISO timestamp for tooltip display.\n */\nexport function formatDefaultTimestamp(value: string): string {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return value;\n }\n\n return parsed.toLocaleString(undefined, {\n month: 'short',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\n/**\n * Formats chart axis ticks as localized times.\n */\nexport function formatAxisTimestamp(value: Date): string {\n return value.toLocaleTimeString(undefined, {\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n"],"mappings":";AAGA,SAAgB,EAAmB,GAAe,GAAuB;CACvE,IAAM,IAAY,IAAI,KAAK,aAAa,KAAA,GAAW,EACjD,uBAAuB,GACxB,CAAC,CAAC,OAAO,EAAM;CAMhB,OAJI,KAAQ,QAAQ,EAAK,WAAW,IAC3B,IAGF,GAAG,EAAU,GAAG;;AAMzB,SAAgB,EAAuB,GAAuB;CAC5D,IAAM,IAAS,IAAI,KAAK,EAAM;CAK9B,OAJI,OAAO,MAAM,EAAO,SAAS,CAAC,GACzB,IAGF,EAAO,eAAe,KAAA,GAAW;EACtC,OAAO;EACP,KAAK;EACL,MAAM;EACN,QAAQ;EACT,CAAC;;AAMJ,SAAgB,EAAoB,GAAqB;CACvD,OAAO,EAAM,mBAAmB,KAAA,GAAW;EACzC,MAAM;EACN,QAAQ;EACT,CAAC"}
@@ -0,0 +1,18 @@
1
+ //#region src/internal/charts/timeSeriesLineChartHelpers.ts
2
+ var e = 6;
3
+ function t(t) {
4
+ let n = t[0];
5
+ if (n == null || n.data.length <= e) return n == null ? [] : n.data.map((e) => e.x);
6
+ let r = Math.ceil(n.data.length / e), i = n.data.filter((e, t) => t % r === 0).map((e) => e.x), a = n.data.at(-1);
7
+ return a != null && i.at(-1) !== a.x && i.push(a.x), i;
8
+ }
9
+ function n(e) {
10
+ return (/* @__PURE__ */ new Date(`${e}T00:00:00Z`)).toLocaleDateString(void 0, {
11
+ month: "short",
12
+ day: "2-digit"
13
+ });
14
+ }
15
+ //#endregion
16
+ export { n as formatDayTick, t as getVisibleDayTicks };
17
+
18
+ //# sourceMappingURL=timeSeriesLineChartHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeSeriesLineChartHelpers.js","names":[],"sources":["../../../../src/internal/charts/timeSeriesLineChartHelpers.ts"],"sourcesContent":["const MAX_X_TICKS = 6;\n\ntype TimeSeriesWithDayPoints = {\n data: readonly {\n x: string;\n }[];\n};\n\n/**\n * Limits the number of visible day ticks while always keeping the last point.\n */\nexport function getVisibleDayTicks(\n series: readonly TimeSeriesWithDayPoints[],\n): readonly string[] {\n const firstSerie = series[0];\n if (firstSerie == null || firstSerie.data.length <= MAX_X_TICKS) {\n if (firstSerie == null) {\n return [];\n }\n\n return firstSerie.data.map((point) => {\n return point.x;\n });\n }\n\n const step = Math.ceil(firstSerie.data.length / MAX_X_TICKS);\n const visibleTicks = firstSerie.data\n .filter((_, index) => {\n return index % step === 0;\n })\n .map((point) => {\n return point.x;\n });\n\n const lastPoint = firstSerie.data.at(-1);\n if (lastPoint != null && visibleTicks.at(-1) !== lastPoint.x) {\n visibleTicks.push(lastPoint.x);\n }\n\n return visibleTicks;\n}\n\n/**\n * Formats a YYYY-MM-DD key into a short month/day label for the x-axis.\n */\nexport function formatDayTick(dayKey: string): string {\n const parsed = new Date(`${dayKey}T00:00:00Z`);\n return parsed.toLocaleDateString(undefined, {\n month: 'short',\n day: '2-digit',\n });\n}\n"],"mappings":";AAAA,IAAM,IAAc;AAWpB,SAAgB,EACd,GACmB;CACnB,IAAM,IAAa,EAAO;CAC1B,IAAI,KAAc,QAAQ,EAAW,KAAK,UAAU,GAKlD,OAJI,KAAc,OACT,EAAE,GAGJ,EAAW,KAAK,KAAK,MACnB,EAAM,EACb;CAGJ,IAAM,IAAO,KAAK,KAAK,EAAW,KAAK,SAAS,EAAY,EACtD,IAAe,EAAW,KAC7B,QAAQ,GAAG,MACH,IAAQ,MAAS,EACxB,CACD,KAAK,MACG,EAAM,EACb,EAEE,IAAY,EAAW,KAAK,GAAG,GAAG;CAKxC,OAJI,KAAa,QAAQ,EAAa,GAAG,GAAG,KAAK,EAAU,KACzD,EAAa,KAAK,EAAU,EAAE,EAGzB;;AAMT,SAAgB,EAAc,GAAwB;CAEpD,wBAAO,IADY,KAAK,GAAG,EAAO,YAC3B,EAAO,mBAAmB,KAAA,GAAW;EAC1C,OAAO;EACP,KAAK;EACN,CAAC"}
@@ -0,0 +1,6 @@
1
+ //#region src/internal/data-table/layout.ts
2
+ var e = "minmax(0, 1fr)", t = (t, n) => typeof n == "string" && n !== "" ? { gridTemplateColumns: n } : { gridTemplateColumns: `repeat(${t}, ${e})` };
3
+ //#endregion
4
+ export { e as DEFAULT_DATA_TABLE_TEMPLATE_CELL, t as buildDataTableInlineTemplate };
5
+
6
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","names":[],"sources":["../../../../src/internal/data-table/layout.ts"],"sourcesContent":["import type { CSSProperties } from 'react';\n\nexport const DEFAULT_DATA_TABLE_TEMPLATE_CELL = 'minmax(0, 1fr)';\n\nexport const buildDataTableInlineTemplate = (\n columnCount: number,\n gridTemplateColumns?: string,\n): CSSProperties => {\n if (typeof gridTemplateColumns === 'string' && gridTemplateColumns !== '') {\n return { gridTemplateColumns };\n }\n\n return {\n gridTemplateColumns: `repeat(${columnCount}, ${DEFAULT_DATA_TABLE_TEMPLATE_CELL})`,\n };\n};\n"],"mappings":";AAEA,IAAa,IAAmC,kBAEnC,KACX,GACA,MAEI,OAAO,KAAwB,YAAY,MAAwB,KAC9D,EAAE,wBAAqB,GAGzB,EACL,qBAAqB,UAAU,EAAY,IAAI,EAAiC,IACjF"}
@@ -0,0 +1,12 @@
1
+ //#region src/internal/data-table/virtualization.ts
2
+ var e = (e, t, n) => Math.min(n, Math.max(t, e)), t = ({ overflowY: e, scrollHeight: t, clientHeight: n }) => e !== "auto" && e !== "scroll" && e !== "overlay" ? !1 : t > n + 1, n = ({ autoLoad: e, canLoadMore: t, totalHeight: n, visibleBottom: r, thresholdPx: i, isCoolingDown: a }) => !e || !t || a ? !1 : n - r <= i, r = ({ rowCount: t, rowHeightPx: n, overscan: r, visibleTop: i, visibleBottom: a }) => {
3
+ let o = t * n, s = e(a, 0, o), c = e(i, 0, o), l = Math.floor(c / n) - r, u = Math.ceil(s / n) + r, d = e(l, 0, t);
4
+ return {
5
+ startIndex: d,
6
+ endIndex: e(u, d, t)
7
+ };
8
+ };
9
+ //#endregion
10
+ export { e as clamp, r as computeVirtualWindowBounds, t as isVerticallyScrollable, n as shouldTriggerInfiniteLoad };
11
+
12
+ //# sourceMappingURL=virtualization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtualization.js","names":[],"sources":["../../../../src/internal/data-table/virtualization.ts"],"sourcesContent":["export type VirtualWindow = {\n startIndex: number;\n endIndex: number;\n};\n\nexport type ComputeVirtualWindowInput = {\n rowCount: number;\n rowHeightPx: number;\n overscan: number;\n visibleTop: number;\n visibleBottom: number;\n};\n\nexport type ShouldTriggerInfiniteLoadInput = {\n autoLoad: boolean;\n canLoadMore: boolean;\n totalHeight: number;\n visibleBottom: number;\n thresholdPx: number;\n isCoolingDown: boolean;\n};\n\nexport type VerticallyScrollableInput = {\n overflowY: string;\n scrollHeight: number;\n clientHeight: number;\n};\n\nexport const clamp = (value: number, min: number, max: number): number => {\n return Math.min(max, Math.max(min, value));\n};\n\nexport const isVerticallyScrollable = ({\n overflowY,\n scrollHeight,\n clientHeight,\n}: VerticallyScrollableInput): boolean => {\n if (\n overflowY !== 'auto' &&\n overflowY !== 'scroll' &&\n overflowY !== 'overlay'\n ) {\n return false;\n }\n\n return scrollHeight > clientHeight + 1;\n};\n\nexport const shouldTriggerInfiniteLoad = ({\n autoLoad,\n canLoadMore,\n totalHeight,\n visibleBottom,\n thresholdPx,\n isCoolingDown,\n}: ShouldTriggerInfiniteLoadInput): boolean => {\n if (!autoLoad || !canLoadMore || isCoolingDown) {\n return false;\n }\n\n return totalHeight - visibleBottom <= thresholdPx;\n};\n\nexport const computeVirtualWindowBounds = ({\n rowCount,\n rowHeightPx,\n overscan,\n visibleTop,\n visibleBottom,\n}: ComputeVirtualWindowInput): VirtualWindow => {\n const totalHeight = rowCount * rowHeightPx;\n const clampedBottom = clamp(visibleBottom, 0, totalHeight);\n const clampedTop = clamp(visibleTop, 0, totalHeight);\n\n const rawStart = Math.floor(clampedTop / rowHeightPx) - overscan;\n const rawEnd = Math.ceil(clampedBottom / rowHeightPx) + overscan;\n\n const startIndex = clamp(rawStart, 0, rowCount);\n const endIndex = clamp(rawEnd, startIndex, rowCount);\n\n return { startIndex, endIndex };\n};\n"],"mappings":";AA4BA,IAAa,KAAS,GAAe,GAAa,MACzC,KAAK,IAAI,GAAK,KAAK,IAAI,GAAK,EAAM,CAAC,EAG/B,KAA0B,EACrC,cACA,iBACA,sBAGE,MAAc,UACd,MAAc,YACd,MAAc,YAEP,KAGF,IAAe,IAAe,GAG1B,KAA6B,EACxC,aACA,gBACA,gBACA,kBACA,gBACA,uBAEI,CAAC,KAAY,CAAC,KAAe,IACxB,KAGF,IAAc,KAAiB,GAG3B,KAA8B,EACzC,aACA,gBACA,aACA,eACA,uBAC8C;CAC9C,IAAM,IAAc,IAAW,GACzB,IAAgB,EAAM,GAAe,GAAG,EAAY,EACpD,IAAa,EAAM,GAAY,GAAG,EAAY,EAE9C,IAAW,KAAK,MAAM,IAAa,EAAY,GAAG,GAClD,IAAS,KAAK,KAAK,IAAgB,EAAY,GAAG,GAElD,IAAa,EAAM,GAAU,GAAG,EAAS;CAG/C,OAAO;EAAE;EAAY,UAFJ,EAAM,GAAQ,GAAY,EAEtB;EAAU"}