@plumile/ui 0.1.114 → 0.1.116

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 (72) hide show
  1. package/lib/esm/admin/templates/admin_shell_layout/AdminShellLayout.js +15 -14
  2. package/lib/esm/admin/templates/admin_shell_layout/AdminShellLayout.js.map +1 -1
  3. package/lib/esm/atomic/atoms/modal/Modal.js +14 -14
  4. package/lib/esm/atomic/atoms/modal/Modal.js.map +1 -1
  5. package/lib/esm/atomic/molecules/markdown/components/MarkdownLink.css.js +0 -1
  6. package/lib/esm/atomic/molecules/markdown/components/MarkdownTableCell.css.js +1 -0
  7. package/lib/esm/backoffice/organisms/backoffice_data_table/BackofficeDataTable.js +59 -56
  8. package/lib/esm/backoffice/organisms/backoffice_data_table/BackofficeDataTable.js.map +1 -1
  9. package/lib/esm/backoffice/organisms/backoffice_data_table/backofficeDataTable.css.js +2 -2
  10. package/lib/esm/backoffice/organisms/backoffice_data_table/backofficeDataTable.css.js.map +1 -1
  11. package/lib/esm/backoffice/organisms/backoffice_virtualized_connection_table/BackofficeVirtualizedConnectionTable.js +3 -2
  12. package/lib/esm/backoffice/organisms/backoffice_virtualized_connection_table/BackofficeVirtualizedConnectionTable.js.map +1 -1
  13. package/lib/esm/backoffice/templates/detail_page_template/DetailPageTemplate.js +42 -39
  14. package/lib/esm/backoffice/templates/detail_page_template/DetailPageTemplate.js.map +1 -1
  15. package/lib/esm/backoffice/templates/detail_page_template/detailPageTemplate.css.js +3 -3
  16. package/lib/esm/backoffice/templates/detail_page_template/detailPageTemplate.css.js.map +1 -1
  17. package/lib/esm/backoffice/templates/list_page_template/ListPageTemplate.js +45 -29
  18. package/lib/esm/backoffice/templates/list_page_template/ListPageTemplate.js.map +1 -1
  19. package/lib/esm/backoffice/templates/list_page_template/listPageTemplate.css.js +73 -13
  20. package/lib/esm/backoffice/templates/list_page_template/listPageTemplate.css.js.map +1 -1
  21. package/lib/esm/components/data-table/DataTable.css.js +52 -52
  22. package/lib/esm/components/data-table/DataTable.css.js.map +1 -1
  23. package/lib/esm/components/data-table/DataTable.js +43 -39
  24. package/lib/esm/components/data-table/DataTable.js.map +1 -1
  25. package/lib/esm/components/data-table/ResponsiveRecordList.css.js +7 -7
  26. package/lib/esm/components/data-table/ResponsiveRecordList.css.js.map +1 -1
  27. package/lib/esm/components/data-table/ResponsiveRecordList.js +86 -61
  28. package/lib/esm/components/data-table/ResponsiveRecordList.js.map +1 -1
  29. package/lib/esm/components/data-table/VirtualizedConnectionTable.js +158 -142
  30. package/lib/esm/components/data-table/VirtualizedConnectionTable.js.map +1 -1
  31. package/lib/esm/components/layout/AppShell.js +2 -1
  32. package/lib/esm/components/layout/AppShell.js.map +1 -1
  33. package/lib/esm/components/layout/PageShell.css.js +8 -8
  34. package/lib/esm/components/layout/PageShell.css.js.map +1 -1
  35. package/lib/esm/components/layout/PageShell.js +115 -107
  36. package/lib/esm/components/layout/PageShell.js.map +1 -1
  37. package/lib/esm/focus/focusable.js +1 -1
  38. package/lib/esm/focus/focusable.js.map +1 -1
  39. package/lib/esm/style.css +1 -1
  40. package/lib/types/admin/templates/admin_shell_layout/AdminShellLayout.d.ts +3 -2
  41. package/lib/types/admin/templates/admin_shell_layout/AdminShellLayout.d.ts.map +1 -1
  42. package/lib/types/atomic/atoms/modal/Modal.d.ts.map +1 -1
  43. package/lib/types/backoffice/organisms/backoffice_data_table/BackofficeDataTable.d.ts +3 -2
  44. package/lib/types/backoffice/organisms/backoffice_data_table/BackofficeDataTable.d.ts.map +1 -1
  45. package/lib/types/backoffice/organisms/backoffice_data_table/backofficeDataTable.css.d.ts +1 -0
  46. package/lib/types/backoffice/organisms/backoffice_data_table/backofficeDataTable.css.d.ts.map +1 -1
  47. package/lib/types/backoffice/organisms/backoffice_virtualized_connection_table/BackofficeVirtualizedConnectionTable.d.ts +3 -2
  48. package/lib/types/backoffice/organisms/backoffice_virtualized_connection_table/BackofficeVirtualizedConnectionTable.d.ts.map +1 -1
  49. package/lib/types/backoffice/templates/detail_page_template/DetailPageTemplate.d.ts.map +1 -1
  50. package/lib/types/backoffice/templates/detail_page_template/detailPageTemplate.css.d.ts +5 -0
  51. package/lib/types/backoffice/templates/detail_page_template/detailPageTemplate.css.d.ts.map +1 -1
  52. package/lib/types/backoffice/templates/list_page_template/ListPageTemplate.d.ts +1 -0
  53. package/lib/types/backoffice/templates/list_page_template/ListPageTemplate.d.ts.map +1 -1
  54. package/lib/types/backoffice/templates/list_page_template/listPageTemplate.css.d.ts +17 -2
  55. package/lib/types/backoffice/templates/list_page_template/listPageTemplate.css.d.ts.map +1 -1
  56. package/lib/types/components/data-table/DataTable.css.d.ts +2 -0
  57. package/lib/types/components/data-table/DataTable.css.d.ts.map +1 -1
  58. package/lib/types/components/data-table/DataTable.d.ts +5 -2
  59. package/lib/types/components/data-table/DataTable.d.ts.map +1 -1
  60. package/lib/types/components/data-table/ResponsiveRecordList.css.d.ts +2 -0
  61. package/lib/types/components/data-table/ResponsiveRecordList.css.d.ts.map +1 -1
  62. package/lib/types/components/data-table/ResponsiveRecordList.d.ts +1 -1
  63. package/lib/types/components/data-table/ResponsiveRecordList.d.ts.map +1 -1
  64. package/lib/types/components/data-table/VirtualizedConnectionTable.d.ts +3 -2
  65. package/lib/types/components/data-table/VirtualizedConnectionTable.d.ts.map +1 -1
  66. package/lib/types/components/layout/AppShell.d.ts +3 -2
  67. package/lib/types/components/layout/AppShell.d.ts.map +1 -1
  68. package/lib/types/components/layout/PageShell.css.d.ts +3 -0
  69. package/lib/types/components/layout/PageShell.css.d.ts.map +1 -1
  70. package/lib/types/components/layout/PageShell.d.ts +3 -1
  71. package/lib/types/components/layout/PageShell.d.ts.map +1 -1
  72. package/package.json +2 -2
@@ -1,14 +1,14 @@
1
1
  import { cx as e } from "../../theme/tools.js";
2
2
  import { useUiTranslation as t } from "../../i18n/useUiTranslation.js";
3
- import { alignRecipe as n, body as r, cell as i, container as a, emptyRow as o, header as s, headerCell as c, headerRow as l, hideBelowRecipe as u, primaryCell as d, primaryHeaderCell as ee, row as te, rowEven as ne, rowOdd as re } from "./DataTable.css.js";
4
- import { bodyViewport as ie, sentinel as ae, singleLineCell as oe, spacer as f } from "./VirtualizedConnectionTable.css.js";
5
- import { useCallback as p, useEffect as m, useLayoutEffect as se, useMemo as h, useRef as g, useState as ce } from "react";
6
- import { jsx as _, jsxs as v } from "react/jsx-runtime";
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";
7
7
  //#region src/components/data-table/VirtualizedConnectionTable.tsx
8
- var y = "minmax(0, 1fr)", b = (e, t) => typeof t == "string" && t !== "" ? { gridTemplateColumns: t } : { gridTemplateColumns: `repeat(${e}, ${y})` }, x = (e) => e == null ? null : u({ minVisibleAt: e }), S = ({ overflowY: e, scrollHeight: t, clientHeight: n }) => e !== "auto" && e !== "scroll" && e !== "overlay" ? !1 : t > n + 1, C = (e) => {
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) => {
9
9
  let t = e;
10
10
  for (; t != null;) {
11
- if (S({
11
+ if (x({
12
12
  overflowY: window.getComputedStyle(t).overflowY,
13
13
  scrollHeight: t.scrollHeight,
14
14
  clientHeight: t.clientHeight
@@ -16,210 +16,226 @@ var y = "minmax(0, 1fr)", b = (e, t) => typeof t == "string" && t !== "" ? { gri
16
16
  t = t.parentElement;
17
17
  }
18
18
  return null;
19
- }, w = (e, t, n) => Math.min(n, Math.max(t, e)), T = ({ autoLoad: e, canLoadMore: t, totalHeight: n, visibleBottom: r, thresholdPx: i, isCoolingDown: a }) => !e || !t || a ? !1 : n - r <= i, E = ({ rowCount: e, rowHeightPx: t, overscan: n, visibleTop: r, visibleBottom: i }) => {
20
- let a = e * t, o = w(i, 0, a), s = w(r, 0, a), c = Math.floor(s / t) - n, l = Math.ceil(o / t) + n, u = w(c, 0, e);
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
21
  return {
22
22
  startIndex: u,
23
- endIndex: w(l, u, e)
23
+ endIndex: C(l, u, e)
24
24
  };
25
- }, D = ({ columns: u, rows: y, getRowId: S, emptyState: D, className: O, gridTemplateColumns: le, kind: ue, classes: k, virtualization: A, infiniteScroll: j, hasNextPage: de = !1, isLoadingMore: fe = !1, onLoadMore: M, ariaLabel: pe, ariaLabelledBy: N }) => {
26
- let { t: P } = t(), F = ue ?? "default", I = pe ?? P("common.table.label");
27
- N != null && (I = void 0);
28
- let L = g(null), R = g(null), z = g(null), B = g(null), V = g(null), H = g(!1), U = A?.enabled === !0, W = h(() => {
29
- if (!U) return null;
30
- let e = A.rowHeightPx;
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 }) => {
26
+ let { t: A } = t(), j = _e ?? "default", M = be ?? A("common.table.label");
27
+ 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(() => {
29
+ if (!B) return null;
30
+ let e = E.rowHeightPx;
31
31
  return typeof e == "number" && Number.isFinite(e) && e > 0 ? e : 56;
32
- }, [U, A]), G = h(() => {
33
- if (!U) return 0;
34
- let e = 10, t = A.overscan;
32
+ }, [B, E]), H = m(() => {
33
+ if (!B) return 0;
34
+ let e = 10, t = E.overscan;
35
35
  return typeof t == "number" && Number.isFinite(t) && (e = t), Math.max(0, e);
36
- }, [U, A]), K = j?.thresholdPx ?? 800, q = j?.autoLoad ?? !0, J = j?.enabled === !0, Y = J && de && !fe && M != null, X = p(() => {
37
- M?.();
38
- }, [M]), [me, he] = ce(() => ({
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(() => {
37
+ O?.();
38
+ }, [O]), [xe, Se] = de(() => ({
39
39
  startIndex: 0,
40
- endIndex: Math.min(y.length, 50)
41
- })), Z = h(() => b(u.length, le), [u.length, le]), ge = p((t, r, a) => {
42
- let o = S(t, r), s = [te({ kind: F }), k?.row];
43
- r % 2 == 0 ? s.push(ne({ kind: F }), k?.rowEven) : s.push(re({ kind: F }), k?.rowOdd);
44
- let c = { ...Z };
45
- return typeof a == "number" && (c.height = a), /* @__PURE__ */ _("div", {
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];
43
+ r % 2 == 0 ? s.push(ie({ kind: j }), w?.rowEven) : s.push(ae({ kind: j }), w?.rowOdd);
44
+ let c = { ...Y };
45
+ return typeof i == "number" && (c.height = i), /* @__PURE__ */ g("div", {
46
46
  role: "row",
47
47
  className: e(...s),
48
48
  style: c,
49
- children: u.map((r) => {
50
- let a = [
51
- i({ kind: F }),
52
- oe,
53
- k?.cell
54
- ], o = x(r.minVisibleAt);
55
- return o != null && a.push(o), r.className != null && a.push(r.className), r.isPrimary && a.push(d, k?.primaryCell), r.align != null && a.push(n({ align: r.align })), /* @__PURE__ */ _("div", {
49
+ children: d.map((r) => {
50
+ let i = [
51
+ a({ kind: j }),
52
+ ce,
53
+ 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", {
56
56
  role: "cell",
57
- className: e(...a),
57
+ className: e(...i),
58
58
  children: r.cell(t)
59
59
  }, r.id);
60
60
  })
61
61
  }, o);
62
62
  }, [
63
- k,
64
- u,
65
- S,
66
- Z,
67
- F
68
- ]), _e = p(() => {
69
- if (!U) return;
70
- let e = W;
63
+ w,
64
+ d,
65
+ x,
66
+ Y,
67
+ j
68
+ ]), X = p(() => {
69
+ if (!B) return;
70
+ let e = V;
71
71
  if (e == null) return;
72
- let t = R.current;
72
+ let t = F.current;
73
73
  if (t == null) return;
74
- let n = B.current, r = n?.clientHeight ?? window.innerHeight, i = n?.getBoundingClientRect().top ?? 0, a = t.getBoundingClientRect().top - i, o = Math.max(0, -a), s = o + r, c = y.length * e, l = w(s, 0, c), { startIndex: u, endIndex: d } = E({
75
- rowCount: y.length,
74
+ let n = P.current, r = L.current, i = r?.clientHeight ?? window.innerHeight, a = 0;
75
+ if (K && n != null) i = n.clientHeight, a = n.scrollTop;
76
+ else {
77
+ let e = r?.getBoundingClientRect().top ?? 0, n = t.getBoundingClientRect().top - e;
78
+ a = Math.max(0, -n);
79
+ }
80
+ let o = a + i, s = v.length * e, c = C(o, 0, s), { startIndex: l, endIndex: u } = pe({
81
+ rowCount: v.length,
76
82
  rowHeightPx: e,
77
- overscan: G,
78
- visibleTop: o,
79
- visibleBottom: s
83
+ overscan: H,
84
+ visibleTop: a,
85
+ visibleBottom: o
80
86
  });
81
- he((e) => e.startIndex === u && e.endIndex === d ? e : {
82
- startIndex: u,
83
- endIndex: d
84
- }), T({
85
- autoLoad: q,
86
- canLoadMore: Y,
87
- totalHeight: c,
88
- visibleBottom: l,
89
- thresholdPx: K,
90
- isCoolingDown: H.current
91
- }) && (H.current = !0, X(), window.setTimeout(() => {
92
- H.current = !1;
87
+ Se((e) => e.startIndex === l && e.endIndex === u ? e : {
88
+ startIndex: l,
89
+ endIndex: u
90
+ }), fe({
91
+ autoLoad: W,
92
+ canLoadMore: q,
93
+ totalHeight: s,
94
+ visibleBottom: c,
95
+ thresholdPx: U,
96
+ isCoolingDown: z.current
97
+ }) && (z.current = !0, J(), window.setTimeout(() => {
98
+ z.current = !1;
93
99
  }, 250));
94
100
  }, [
95
- q,
96
- Y,
97
- U,
98
- G,
99
101
  W,
100
- y.length,
102
+ q,
101
103
  K,
102
- X
103
- ]), Q = p(() => {
104
- V.current ??= window.requestAnimationFrame(() => {
105
- V.current = null, _e();
104
+ B,
105
+ H,
106
+ V,
107
+ v.length,
108
+ U,
109
+ J
110
+ ]), Z = p(() => {
111
+ R.current ??= window.requestAnimationFrame(() => {
112
+ R.current = null, X();
106
113
  });
107
- }, [_e]);
108
- se(() => {
109
- if (!U) return;
110
- let e = L.current;
111
- e != null && (B.current = C(e), Q());
112
- }, [U, Q]), m(() => {
113
- if (!U) return;
114
- let e = B.current ?? window, t = () => {
115
- Q();
114
+ }, [X]);
115
+ ue(() => {
116
+ if (!B) return;
117
+ let e = N.current;
118
+ e != null && (K ? L.current = P.current : L.current = S(e), Z());
119
+ }, [
120
+ K,
121
+ B,
122
+ Z
123
+ ]), le(() => {
124
+ if (!B) return;
125
+ let e = L.current ?? window, t = () => {
126
+ Z();
116
127
  };
117
128
  return e.addEventListener("scroll", t, { passive: !0 }), window.addEventListener("resize", t), () => {
118
129
  e.removeEventListener("scroll", t), window.removeEventListener("resize", t);
119
130
  };
120
- }, [U, Q]), m(() => {
121
- if (U || !J || !q || !Y) return;
122
- let e = z.current;
131
+ }, [B, Z]), le(() => {
132
+ if (B || !G || !W || !q) return;
133
+ let e = I.current;
123
134
  if (e == null) return;
124
- let t = B.current, n = new IntersectionObserver((e) => {
135
+ let t = L.current, n = new IntersectionObserver((e) => {
125
136
  let [t] = e;
126
- t != null && t.isIntersecting && !H.current && (H.current = !0, X(), window.setTimeout(() => {
127
- H.current = !1;
137
+ t != null && t.isIntersecting && !z.current && (z.current = !0, J(), window.setTimeout(() => {
138
+ z.current = !1;
128
139
  }, 250));
129
140
  }, {
130
141
  root: t,
131
- rootMargin: `0px 0px ${K}px 0px`
142
+ rootMargin: `0px 0px ${U}px 0px`
132
143
  });
133
144
  return n.observe(e), () => {
134
145
  n.disconnect();
135
146
  };
136
147
  }, [
148
+ W,
137
149
  q,
138
- Y,
139
- J,
150
+ G,
151
+ B,
140
152
  U,
141
- K,
142
- X
143
- ]), se(() => {
144
- if (U) return;
145
- let e = L.current;
146
- e != null && (B.current = C(e));
147
- }, [U]);
148
- let ve = /* @__PURE__ */ _("div", {
149
- className: e(s({ kind: F }), k?.header),
153
+ J
154
+ ]), ue(() => {
155
+ if (B) return;
156
+ let e = N.current;
157
+ e != null && (K ? L.current = P.current : L.current = S(e));
158
+ }, [K, B]);
159
+ let we = /* @__PURE__ */ g("div", {
160
+ className: e(l({ kind: j }), w?.header),
150
161
  role: "rowgroup",
151
- children: /* @__PURE__ */ _("div", {
152
- className: e(l, k?.headerRow),
162
+ children: /* @__PURE__ */ g("div", {
163
+ className: e(ee, w?.headerRow),
153
164
  role: "row",
154
- style: Z,
155
- children: u.map((t) => {
156
- let r = [c({ kind: F }), k?.headerCell], i = x(t.minVisibleAt);
157
- return i != null && r.push(i), t.className != null && r.push(t.className), t.isPrimary && r.push(ee, k?.primaryHeaderCell), t.align != null && r.push(n({ align: t.align })), /* @__PURE__ */ _("div", {
165
+ style: Y,
166
+ 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", {
158
169
  role: "columnheader",
159
170
  className: e(...r),
160
171
  children: t.header
161
172
  }, t.id);
162
173
  })
163
174
  })
164
- }), $;
165
- if (y.length === 0) $ = /* @__PURE__ */ _("div", {
166
- className: e(o, k?.emptyRow),
175
+ }), Q;
176
+ if (v.length === 0) Q = /* @__PURE__ */ g("div", {
177
+ className: e(c, w?.emptyRow),
167
178
  role: "row",
168
- children: /* @__PURE__ */ _("div", {
179
+ children: /* @__PURE__ */ g("div", {
169
180
  role: "cell",
170
- children: D ?? /* @__PURE__ */ _("div", {
171
- className: e("ysn84621 txvbqb97 txvbqbva1 txvbqbt6y", k?.emptyCell),
172
- children: P("common.table.empty")
181
+ children: me ?? /* @__PURE__ */ g("div", {
182
+ className: e("ysn84624 txvbqb97 txvbqbva1 txvbqbt6y", w?.emptyCell),
183
+ children: A("common.table.empty")
173
184
  })
174
185
  })
175
186
  });
176
- else if (U && W != null) {
177
- let { startIndex: e, endIndex: t } = me, n = e * W, r = (y.length - t) * W, i = y.slice(e, t);
178
- $ = /* @__PURE__ */ v("div", {
179
- className: ie,
180
- ref: R,
187
+ 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,
191
+ ref: F,
181
192
  children: [
182
- /* @__PURE__ */ _("div", {
193
+ /* @__PURE__ */ g("div", {
183
194
  className: f,
184
195
  style: { height: n }
185
196
  }),
186
- i.map((t, n) => ge(t, e + n, W)),
187
- /* @__PURE__ */ _("div", {
197
+ i.map((t, n) => Ce(t, e + n, V)),
198
+ /* @__PURE__ */ g("div", {
188
199
  className: f,
189
200
  style: { height: r }
190
201
  })
191
202
  ]
192
203
  });
193
- } else $ = /* @__PURE__ */ _("div", {
194
- ref: R,
195
- children: y.map((e, t) => ge(e, t, null))
204
+ } else Q = /* @__PURE__ */ g("div", {
205
+ ref: F,
206
+ children: v.map((e, t) => Ce(e, t, null))
196
207
  });
197
- let ye = null;
198
- return !U && J && q && (ye = /* @__PURE__ */ _("div", {
199
- ref: z,
200
- className: ae
201
- })), /* @__PURE__ */ v("div", {
202
- ref: L,
203
- className: e(a({ kind: F }), k?.container, O),
208
+ let Te = null;
209
+ !B && G && W && (Te = /* @__PURE__ */ g("div", {
210
+ ref: I,
211
+ className: se
212
+ }));
213
+ let Ee = null, $ = null;
214
+ return K && (Ee = s, $ = i), /* @__PURE__ */ _("div", {
215
+ ref: N,
216
+ className: e(o({ kind: j }), Ee, w?.container, he),
204
217
  role: "table",
205
- "aria-label": I,
206
- "aria-labelledby": N,
207
- children: [ve, /* @__PURE__ */ v("div", {
208
- className: e(r({ kind: F }), k?.body),
218
+ "aria-label": M,
219
+ "aria-labelledby": k,
220
+ "data-scroll-mode": T,
221
+ children: [we, /* @__PURE__ */ _("div", {
222
+ ref: P,
223
+ className: e(r({ kind: j }), $, w?.body),
209
224
  role: "rowgroup",
210
- children: [$, ye]
225
+ "data-scroll-mode": T,
226
+ children: [Q, Te]
211
227
  })]
212
228
  });
213
- }, O = {
214
- buildInlineTemplate: b,
215
- getVisibilityClass: x,
216
- isVerticallyScrollable: S,
217
- findScrollParent: C,
218
- clamp: w,
219
- shouldTriggerInfiniteLoad: T,
220
- computeVirtualWindowBounds: E
229
+ }, he = {
230
+ buildInlineTemplate: y,
231
+ getVisibilityClass: b,
232
+ isVerticallyScrollable: x,
233
+ findScrollParent: S,
234
+ clamp: C,
235
+ shouldTriggerInfiniteLoad: fe,
236
+ computeVirtualWindowBounds: pe
221
237
  };
222
238
  //#endregion
223
- export { D as VirtualizedConnectionTable, O as __test };
239
+ export { me as VirtualizedConnectionTable, he as __test };
224
240
 
225
241
  //# 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 { DataTableColumn, DataTableKind, GetRowId } 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\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 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 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\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 scrollParent = scrollParentRef.current;\n const viewportHeight = scrollParent?.clientHeight ?? window.innerHeight;\n const parentRectTop = scrollParent?.getBoundingClientRect().top ?? 0;\n const bodyRectTop = bodyEl.getBoundingClientRect().top;\n const relativeTop = bodyRectTop - parentRectTop;\n const visibleTop = Math.max(0, -relativeTop);\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 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 scrollParentRef.current = findScrollParent(container);\n scheduleCompute();\n }, [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 scrollParentRef.current = findScrollParent(container);\n }, [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 return (\n <div\n ref={containerRef}\n className={cx(\n dataTableStyles.container({ kind: resolvedKind }),\n classes?.container,\n className,\n )}\n role=\"table\"\n aria-label={tableAriaLabel}\n aria-labelledby={ariaLabelledBy}\n >\n {headerRow}\n <div\n className={cx(\n dataTableStyles.body({ kind: resolvedKind }),\n classes?.body,\n )}\n role=\"rowgroup\"\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":";;;;;;;AAmEA,IAAM,IAAwB,kBAExB,KACJ,GACA,MAEI,OAAO,KAAwB,YAAY,MAAwB,KAC9D,EAAE,wBAAqB,GAEzB,EACL,qBAAqB,UAAU,EAAY,IAAI,EAAsB,IACtE,EAGG,KAAsB,MACtB,KAAgB,OACX,OAEF,EAAgC,EAAE,iBAAc,CAAC,EAGpD,KAA0B,EAC9B,cACA,iBACA,sBAOE,MAAc,UACd,MAAc,YACd,MAAc,YAEP,KAEF,IAAe,IAAe,GAGjC,KAAoB,MAA+C;CACvE,IAAI,IAA8B;CAClC,OAAO,KAAW,OAAM;EAEtB,IACE,EAAuB;GACrB,WAHU,OAAO,iBAAiB,EAGvB,CAAM;GACjB,cAAc,EAAQ;GACtB,cAAc,EAAQ;GACvB,CAAC,EAEF,OAAO;EAET,IAAU,EAAQ;;CAEpB,OAAO;GAyBH,KAAS,GAAe,GAAa,MAClC,KAAK,IAAI,GAAK,KAAK,IAAI,GAAK,EAAM,CAAC,EAGtC,KAA6B,EACjC,aACA,gBACA,gBACA,kBACA,gBACA,uBAEI,CAAC,KAAY,CAAC,KAAe,IACxB,KAEF,IAAc,KAAiB,GAGlC,KAA8B,EAClC,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;GAGpB,KAAoC,EAC/C,YACA,SACA,aACA,eACA,cACA,yBACA,UACA,YACA,mBACA,mBACA,kBAAc,IACd,oBAAgB,IAChB,eACA,eACA,wBACuD;CACvD,IAAM,EAAE,SAAM,GAAkB,EAC1B,IAA8B,MAAQ,WAExC,IADsB,MAAa,EAAE,qBAAqB;CAE9D,AAAI,KAAkB,SACpB,IAAiB,KAAA;CAEnB,IAAM,IAAe,EAAuB,KAAK,EAC3C,IAAU,EAAuB,KAAK,EACtC,IAAc,EAAuB,KAAK,EAC1C,IAAkB,EAA2B,KAAK,EAClD,IAAS,EAAsB,KAAK,EACpC,IAAsB,EAAO,GAAM,EAEnC,IAAgB,GAAgB,YAAY,IAC5C,IAAc,QAAc;EAChC,IAAI,CAAC,GACH,OAAO;EAGT,IAAM,IAAsB,EAAe;EAS3C,OAPE,OAAO,KAAwB,YAC/B,OAAO,SAAS,EAAoB,IACpC,IAAsB,IAEf,IAGF;IACN,CAAC,GAAe,EAAe,CAAC,EAE7B,IAAW,QAAc;EAC7B,IAAI,CAAC,GACH,OAAO;EAGT,IAAI,IAAe,IACb,IAAqB,EAAe;EAO1C,OALE,OAAO,KAAuB,YAC9B,OAAO,SAAS,EAAmB,KAEnC,IAAe,IAEV,KAAK,IAAI,GAAG,EAAa;IAC/B,CAAC,GAAe,EAAe,CAAC,EAE7B,IAAc,GAAgB,eAAe,KAC7C,IAAW,GAAgB,YAAY,IACvC,IAAkB,GAAgB,YAAY,IAE9C,IACJ,KAAmB,MAAe,CAAC,MAAiB,KAAc,MAE9D,IAAkB,QAAkB;EACpC,KAGQ;IACX,CAAC,EAAW,CAAC,EAEV,CAAC,IAAa,MAAkB,UAC7B;EAAE,YAAY;EAAG,UAAU,KAAK,IAAI,EAAK,QAAQ,GAAG;EAAE,EAC7D,EAEI,IAAsB,QACnB,EAAoB,EAAQ,QAAQ,GAAoB,EAC9D,CAAC,EAAQ,QAAQ,GAAoB,CAAC,EAEnC,KAAY,GACf,GAAU,GAAe,MAA0C;EAClE,IAAM,IAAQ,EAAS,GAAK,EAAM,EAC5B,IAAa,CACjB,GAAoB,EAAE,MAAM,GAAc,CAAC,EAC3C,GAAS,IACV;EACD,AAAI,IAAQ,KAAM,IAChB,EAAW,KACT,GAAwB,EAAE,MAAM,GAAc,CAAC,EAC/C,GAAS,QACV,GAED,EAAW,KACT,GAAuB,EAAE,MAAM,GAAc,CAAC,EAC9C,GAAS,OACV;EAEH,IAAM,IAA0B,EAAE,GAAG,GAAqB;EAI1D,OAHI,OAAO,KAAa,aACtB,EAAS,SAAS,IAGlB,kBAAC,OAAD;GAEE,MAAK;GACL,WAAW,EAAG,GAAG,EAAW;GAC5B,OAAO;aAEN,EAAQ,KAAK,MAAW;IACvB,IAAM,IAAc;KAClB,EAAqB,EAAE,MAAM,GAAc,CAAC;KAC5C;KACA,GAAS;KACV,EACK,IAAkB,EAAmB,EAAO,aAAa;IAkB/D,OAjBI,KAAmB,QACrB,EAAY,KAAK,EAAgB,EAE/B,EAAO,aAAa,QACtB,EAAY,KAAK,EAAO,UAAU,EAEhC,EAAO,aACT,EAAY,KACV,GACA,GAAS,YACV,EAEC,EAAO,SAAS,QAClB,EAAY,KACV,EAA4B,EAAE,OAAO,EAAO,OAAO,CAAC,CACrD,EAGD,kBAAC,OAAD;KAAqB,MAAK;KAAO,WAAW,EAAG,GAAG,EAAY;eAC3D,EAAO,KAAK,EAAI;KACb,EAFI,EAAO,GAEX;KAER;GACE,EAnCC,EAmCD;IAGV;EAAC;EAAS;EAAS;EAAU;EAAqB;EAAa,CAChE,EAEK,KAAuB,QAAkB;EAC7C,IAAI,CAAC,GACH;EAEF,IAAM,IAAS;EACf,IAAI,KAAU,MACZ;EAEF,IAAM,IAAS,EAAQ;EACvB,IAAI,KAAU,MACZ;EAGF,IAAM,IAAe,EAAgB,SAC/B,IAAiB,GAAc,gBAAgB,OAAO,aACtD,IAAgB,GAAc,uBAAuB,CAAC,OAAO,GAE7D,IADc,EAAO,uBAAuB,CAAC,MACjB,GAC5B,IAAa,KAAK,IAAI,GAAG,CAAC,EAAY,EACtC,IAAgB,IAAa,GAE7B,IAAc,EAAK,SAAS,GAC5B,IAAgB,EAAM,GAAe,GAAG,EAAY,EACpD,EAAE,eAAY,gBAAa,EAA2B;GAC1D,UAAU,EAAK;GACf,aAAa;GACb;GACA;GACA;GACD,CAAC;EASF,AAPA,IAAgB,MACV,EAAK,eAAe,KAAc,EAAK,aAAa,IAC/C,IAEF;GAAE;GAAY;GAAU,CAC/B,EAGA,EAA0B;GACxB;GACA;GACA;GACA,eAAe;GACf;GACA,eAAe,EAAoB;GACpC,CAAC,KAEF,EAAoB,UAAU,IAC9B,GAAiB,EACjB,OAAO,iBAAiB;GACtB,EAAoB,UAAU;KAC7B,IAAI;IAER;EACD;EACA;EACA;EACA;EACA;EACA,EAAK;EACL;EACA;EACD,CAAC,EAEI,IAAkB,QAAkB;EACpC,AAGJ,EAAO,YAAU,OAAO,4BAA4B;GAElD,AADA,EAAO,UAAU,MACjB,IAAsB;IACtB;IACD,CAAC,GAAqB,CAAC;CAkF1B,AAhFA,SAAsB;EACpB,IAAI,CAAC,GACH;EAEF,IAAM,IAAY,EAAa;EAC3B,KAAa,SAGjB,EAAgB,UAAU,EAAiB,EAAU,EACrD,GAAiB;IAChB,CAAC,GAAe,EAAgB,CAAC,EAEpC,QAAgB;EACd,IAAI,CAAC,GACH;EAGF,IAAM,IADe,EAAgB,WACgB,QAE/C,UAAgB;GACpB,GAAiB;;EAMnB,OAHA,EAAO,iBAAiB,UAAU,GAAS,EAAE,SAAS,IAAM,CAAC,EAC7D,OAAO,iBAAiB,UAAU,EAAQ,QAE7B;GAEX,AADA,EAAO,oBAAoB,UAAU,EAAQ,EAC7C,OAAO,oBAAoB,UAAU,EAAQ;;IAE9C,CAAC,GAAe,EAAgB,CAAC,EAEpC,QAAgB;EAId,IAHI,KAGA,CAAC,KAAmB,CAAC,KAAY,CAAC,GACpC;EAEF,IAAM,IAAW,EAAY;EAC7B,IAAI,KAAY,MACd;EAGF,IAAM,IAAe,EAAgB,SAE/B,IAAW,IAAI,sBAClB,MAAY;GACX,IAAM,CAAC,KAAS;GACZ,KAAS,QAIT,EAAM,kBAAkB,CAAC,EAAoB,YAC/C,EAAoB,UAAU,IAC9B,GAAiB,EACjB,OAAO,iBAAiB;IACtB,EAAoB,UAAU;MAC7B,IAAI;KAGX;GACE,MAAM;GACN,YAAY,WAAW,EAAY;GACpC,CACF;EAGD,OADA,EAAS,QAAQ,EAAS,QACb;GACX,EAAS,YAAY;;IAEtB;EACD;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,EAEF,SAAsB;EACpB,IAAI,GACF;EAEF,IAAM,IAAY,EAAa;EAC3B,KAAa,SAGjB,EAAgB,UAAU,EAAiB,EAAU;IACpD,CAAC,EAAc,CAAC;CAEnB,IAAM,KACJ,kBAAC,OAAD;EACE,WAAW,EACT,EAAuB,EAAE,MAAM,GAAc,CAAC,EAC9C,GAAS,OACV;EACD,MAAK;YAEL,kBAAC,OAAD;GACE,WAAW,EAAG,GAA2B,GAAS,UAAU;GAC5D,MAAK;GACL,OAAO;aAEN,EAAQ,KAAK,MAAW;IACvB,IAAM,IAAgB,CACpB,EAA2B,EAAE,MAAM,GAAc,CAAC,EAClD,GAAS,WACV,EACK,IAAkB,EAAmB,EAAO,aAAa;IAkB/D,OAjBI,KAAmB,QACrB,EAAc,KAAK,EAAgB,EAEjC,EAAO,aAAa,QACtB,EAAc,KAAK,EAAO,UAAU,EAElC,EAAO,aACT,EAAc,KACZ,IACA,GAAS,kBACV,EAEC,EAAO,SAAS,QAClB,EAAc,KACZ,EAA4B,EAAE,OAAO,EAAO,OAAO,CAAC,CACrD,EAGD,kBAAC,OAAD;KAEE,MAAK;KACL,WAAW,EAAG,GAAG,EAAc;eAE9B,EAAO;KACJ,EALC,EAAO,GAKR;KAER;GACE,CAAA;EACF,CAAA,EAGJ;CACJ,IAAI,EAAK,WAAW,GAClB,IACE,kBAAC,OAAD;EACE,WAAW,EAAG,GAA0B,GAAS,SAAS;EAC1D,MAAK;YAEL,kBAAC,OAAD;GAAK,MAAK;aACP,KACC,kBAAC,OAAD;IAAK,WAAW,EAAG,yCAA2B,GAAS,UAAU;cAC9D,EAAE,qBAAqB;IACpB,CAAA;GAEJ,CAAA;EACF,CAAA;MAEH,IAAI,KAAiB,KAAe,MAAM;EAC/C,IAAM,EAAE,eAAY,gBAAa,IAC3B,IAAkB,IAAa,GAC/B,KAAsB,EAAK,SAAS,KAAY,GAChD,IAAQ,EAAK,MAAM,GAAY,EAAS;EAC9C,IACE,kBAAC,OAAD;GAAK,WAAW;GAAqB,KAAK;aAA1C;IACE,kBAAC,OAAD;KAAK,WAAW;KAAe,OAAO,EAAE,QAAQ,GAAiB;KAAI,CAAA;IACpE,EAAM,KAAK,GAAK,MAER,GAAU,GADK,IAAa,GACE,EAAY,CACjD;IACF,kBAAC,OAAD;KAAK,WAAW;KAAe,OAAO,EAAE,QAAQ,GAAoB;KAAI,CAAA;IACpE;;QAGR,IACE,kBAAC,OAAD;EAAK,KAAK;YACP,EAAK,KAAK,GAAK,MACP,GAAU,GAAK,GAAO,KAAK,CAClC;EACE,CAAA;CAIV,IAAI,KAAmC;CAKvC,OAJI,CAAC,KAAiB,KAAmB,MACvC,KAAe,kBAAC,OAAD;EAAK,KAAK;EAAa,WAAW;EAAmB,CAAA,GAIpE,kBAAC,OAAD;EACE,KAAK;EACL,WAAW,EACT,EAA0B,EAAE,MAAM,GAAc,CAAC,EACjD,GAAS,WACT,EACD;EACD,MAAK;EACL,cAAY;EACZ,mBAAiB;YATnB,CAWG,IACD,kBAAC,OAAD;GACE,WAAW,EACT,EAAqB,EAAE,MAAM,GAAc,CAAC,EAC5C,GAAS,KACV;GACD,MAAK;aALP,CAOG,GACA,GACG;KACF;;GAIG,IAAS;CACpB;CACA;CACA;CACA;CACA;CACA;CACA;CACD"}
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,7 +1,7 @@
1
1
  import { PageShell as e } from "./PageShell.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/components/layout/AppShell.tsx
4
- var n = ({ sidebar: n, children: r, breadcrumbSlot: i, desktopSidebarOpen: a, mobileSidebar: o, onOpenDesktopSidebar: s, openDesktopSidebarLabel: c, actions: l, tabs: u }) => /* @__PURE__ */ t(e, {
4
+ var n = ({ sidebar: n, children: r, breadcrumbSlot: i, desktopSidebarOpen: a, mobileSidebar: o, onOpenDesktopSidebar: s, openDesktopSidebarLabel: c, actions: l, tabs: u, contentScrollMode: d }) => /* @__PURE__ */ t(e, {
5
5
  sidebar: n,
6
6
  mobileSidebar: o,
7
7
  desktopSidebarOpen: a,
@@ -10,6 +10,7 @@ var n = ({ sidebar: n, children: r, breadcrumbSlot: i, desktopSidebarOpen: a, mo
10
10
  breadcrumbSlot: i,
11
11
  actions: l,
12
12
  tabs: u,
13
+ contentScrollMode: d,
13
14
  children: r
14
15
  });
15
16
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"AppShell.js","names":[],"sources":["../../../../src/components/layout/AppShell.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport {\n PageShell,\n type PageShellActions,\n type PageShellTab,\n} from './PageShell.js';\n\nexport type AppShellProps = {\n sidebar: ReactNode;\n mobileSidebar?: ReactNode;\n desktopSidebarOpen?: boolean;\n onOpenDesktopSidebar?: () => void;\n openDesktopSidebarLabel?: string;\n children: ReactNode;\n breadcrumbSlot?: ReactNode;\n actions?: PageShellActions;\n tabs?: PageShellTab[];\n};\n\nexport const AppShell = ({\n sidebar,\n children,\n breadcrumbSlot,\n desktopSidebarOpen,\n mobileSidebar,\n onOpenDesktopSidebar,\n openDesktopSidebarLabel,\n actions,\n tabs,\n}: AppShellProps): JSX.Element => {\n return (\n <PageShell\n sidebar={sidebar}\n mobileSidebar={mobileSidebar}\n desktopSidebarOpen={desktopSidebarOpen}\n onOpenDesktopSidebar={onOpenDesktopSidebar}\n openDesktopSidebarLabel={openDesktopSidebarLabel}\n breadcrumbSlot={breadcrumbSlot}\n actions={actions}\n tabs={tabs}\n >\n {children}\n </PageShell>\n );\n};\n\nexport default AppShell;\n"],"mappings":";;;AAoBA,IAAa,KAAY,EACvB,YACA,aACA,mBACA,uBACA,kBACA,yBACA,4BACA,YACA,cAGE,kBAAC,GAAD;CACW;CACM;CACK;CACE;CACG;CACT;CACP;CACH;CAEL;CACS,CAAA"}
1
+ {"version":3,"file":"AppShell.js","names":[],"sources":["../../../../src/components/layout/AppShell.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport {\n PageShell,\n type PageShellActions,\n type PageShellContentScrollMode,\n type PageShellTab,\n} from './PageShell.js';\n\nexport type AppShellProps = {\n sidebar: ReactNode;\n mobileSidebar?: ReactNode;\n desktopSidebarOpen?: boolean;\n onOpenDesktopSidebar?: () => void;\n openDesktopSidebarLabel?: string;\n children: ReactNode;\n breadcrumbSlot?: ReactNode;\n actions?: PageShellActions;\n tabs?: PageShellTab[];\n contentScrollMode?: PageShellContentScrollMode;\n};\n\nexport const AppShell = ({\n sidebar,\n children,\n breadcrumbSlot,\n desktopSidebarOpen,\n mobileSidebar,\n onOpenDesktopSidebar,\n openDesktopSidebarLabel,\n actions,\n tabs,\n contentScrollMode,\n}: AppShellProps): JSX.Element => {\n return (\n <PageShell\n sidebar={sidebar}\n mobileSidebar={mobileSidebar}\n desktopSidebarOpen={desktopSidebarOpen}\n onOpenDesktopSidebar={onOpenDesktopSidebar}\n openDesktopSidebarLabel={openDesktopSidebarLabel}\n breadcrumbSlot={breadcrumbSlot}\n actions={actions}\n tabs={tabs}\n contentScrollMode={contentScrollMode}\n >\n {children}\n </PageShell>\n );\n};\n\nexport default AppShell;\n"],"mappings":";;;AAsBA,IAAa,KAAY,EACvB,YACA,aACA,mBACA,uBACA,kBACA,yBACA,4BACA,YACA,SACA,2BAGE,kBAAC,GAAD;CACW;CACM;CACK;CACE;CACG;CACT;CACP;CACH;CACa;CAElB;CACS,CAAA"}
@@ -2,16 +2,16 @@
2
2
  /* empty css */
3
3
  import { createRuntimeFn as e } from "@vanilla-extract/recipes/createRuntimeFn";
4
4
  //#region src/components/layout/PageShell.css.ts
5
- var t = "_1kley2d0 txvbqb9ip txvbqbu7g txvbqbv49 txvbqbv07", n = "_1kley2d1 txvbqbnvy txvbqboj7 txvbqbp6g txvbqbly7 txvbqbcx7 txvbqbcge txvbqb9my txvbqbk5y", r = "_1kley2d2 txvbqb9ip txvbqbc7 txvbqbanp txvbqbaon txvbqbk5y txvbqbahy txvbqbaie txvbqbcgg txvbqbcge", i = "_1kley2d3 txvbqbpty txvbqbt7y txvbqbcx7 txvbqbaj7 txvbqb9ip txvbqbl7g", a = "_1kley2d4", o = "_1kley2d5", s = "_1kley2d7 _1kley2d6 txvbqb9ip txvbqbcgg", c = "_1kley2d8", l = "_1kley2d9", u = "_1kley2da txvbqb9hy txvbqb9jn txvbqbcp txvbqbdoy txvbqbtyp txvbqbc7p txvbqb1rp txvbqb1qg txvbqb1cp txvbqbwg txvbqbv41 txvbqbv9z txvbqbv txvbqbaj7", d = "_1kley2dc _1kley2db txvbqb9jg txvbqb9i5 txvbqbcp txvbqbdoy txvbqbtyp txvbqbc7p txvbqb1rp txvbqb1qg txvbqb1cp txvbqbwg txvbqbv41 txvbqbv9z txvbqbv txvbqbaj7 txvbqb77 txvbqb6x txvbqb7k", f = "_1kley2dd txvbqb9hy txvbqb9jn txvbqbpu7 txvbqbpte txvbqbpug txvbqbpve txvbqbt7y txvbqbt8w txvbqbuwg txvbqbcp txvbqbdoy txvbqbtyp txvbqbc7p txvbqb1rp txvbqb1qg txvbqb1cp txvbqbwg txvbqbv41 txvbqbv9z txvbqbv", p = "_1kley2de txvbqb9my txvbqbcgg txvbqbk5y txvbqbjh7 txvbqb9ip txvbqbai7 txvbqbv41 txvbqbl7g txvbqb1rp txvbqb1cp txvbqb1qg txvbqbwp txvbqb8qy", m = "_1kley2df txvbqbcgg txvbqbcge", h = "_1kley2dg txvbqb9ip txvbqbai7 txvbqbjh7 txvbqbcgg txvbqbcge", g = "_1kley2dh txvbqb9np txvbqbv41 txvbqb1ry txvbqb1cp txvbqb1qg txvbqbwp", _ = "_1kley2di", v = "_1kley2dk _1kley2dj txvbqbeg txvbqbv0t txvbqbb txvbqb9np txvbqbk6y txvbqbptg txvbqbtx7", y = "_1kley2dl txvbqb9i7 txvbqb9i5", b = "_1kley2dm txvbqbpty txvbqbt7y txvbqbuvp txvbqb9ip txvbqbai7 txvbqbaog txvbqbv41 txvbqb12g txvbqb1qg txvbqb62p txvbqb3ny txvbqbnwp txvbqbojy txvbqbly7 txvbqbp6p", x = "_1kley2dn txvbqb9ip txvbqbajy txvbqbcg txvbqbdpp txvbqbaop txvbqbu7g", S = "_1kley2do txvbqb9ip txvbqbcp txvbqbaog txvbqb9my txvbqbk5y", C = "_1kley2dp txvbqb9ip txvbqbai7 txvbqbao7 txvbqbk5y", w = "_1kley2dq txvbqb9ip txvbqbajy txvbqbcp txvbqb8v7 txvbqbqhy txvbqbfby txvbqbfcp txvbqblag txvbqbva1 txvbqb8p", T = "_1kley2dr txvbqb9ip txvbqbcp txvbqbany txvbqbjd7", E = "_1kley2dt _1kley2ds txvbqbv9z txvbqb3b txvbqbamg txvbqbl7g txvbqbt7g txvbqbuxg", D = "_1kley2du txvbqbv9z txvbqbamp txvbqbl7g txvbqbt7g txvbqbuxg", O = "_1kley2dv txvbqbvab txvbqb8p", k = "_1kley2dw txvbqb9ip txvbqbajy txvbqbao7 txvbqbdp7", A = "_1kley2dx txvbqb9jg", j = "_1kley2dy txvbqbu7g txvbqb9ip txvbqbajy txvbqbao7", M = e({
6
- defaultClassName: "_1kley2d13 _1kley2d10 _1kley2dz txvbqbcp txvbqbv45 txvbqb1rp txvbqbva1 txvbqb9jg txvbqb8y txvbqbamg txvbqbn6y txvbqbn8y txvbqb3b txvbqb77 txvbqb6x txvbqb7k",
5
+ var t = "_1kley2d0 txvbqb9ip txvbqbu7g txvbqbv49 txvbqbv07", n = "_1kley2d1 txvbqbnvy txvbqboj7 txvbqbp6g txvbqbly7 txvbqbcx7 txvbqbcge txvbqb9my txvbqbk5y", r = "_1kley2d2 txvbqbcx7 txvbqbjh7 txvbqbl7g", i = "_1kley2d3 txvbqb9ip txvbqbc7 txvbqbanp txvbqbaon txvbqbk5y txvbqbahy txvbqbaie txvbqbcgg txvbqbcge", a = "_1kley2d4 txvbqbpty txvbqbt7y txvbqbcx7 txvbqbaj7 txvbqb9ip txvbqbl7g", o = "_1kley2d5", s = "_1kley2d6", c = "_1kley2d8 _1kley2d7 txvbqb9ip txvbqbcgg", l = "_1kley2d9", u = "_1kley2da", d = "_1kley2db txvbqb9hy txvbqb9jn txvbqbcp txvbqbdoy txvbqbtyp txvbqbc7p txvbqb1rp txvbqb1qg txvbqb1cp txvbqbwg txvbqbv41 txvbqbv9z txvbqbv txvbqbaj7", f = "_1kley2dd _1kley2dc txvbqb9jg txvbqb9i5 txvbqbcp txvbqbdoy txvbqbtyp txvbqbc7p txvbqb1rp txvbqb1qg txvbqb1cp txvbqbwg txvbqbv41 txvbqbv9z txvbqbv txvbqbaj7 txvbqb77 txvbqb6x txvbqb7k", p = "_1kley2de txvbqb9hy txvbqb9jn txvbqbpu7 txvbqbpte txvbqbpug txvbqbpve txvbqbt7y txvbqbt8w txvbqbuwg txvbqbcp txvbqbdoy txvbqbtyp txvbqbc7p txvbqb1rp txvbqb1qg txvbqb1cp txvbqbwg txvbqbv41 txvbqbv9z txvbqbv", m = "_1kley2df txvbqb9my txvbqbcgg txvbqbk5y txvbqbjh7 txvbqb9ip txvbqbai7 txvbqbv41 txvbqbl7g txvbqb1rp txvbqb1cp txvbqb1qg txvbqbwp txvbqb8qy", h = "_1kley2dg txvbqbjh7 txvbqbl7g", g = "_1kley2dh txvbqbcgg txvbqbcge", _ = "_1kley2di txvbqb9ip txvbqbai7 txvbqbjh7 txvbqbcgg txvbqbcge", v = "_1kley2dj txvbqb9np txvbqbv41 txvbqb1ry txvbqb1cp txvbqb1qg txvbqbwp", y = "_1kley2dk", b = "_1kley2dm _1kley2dl txvbqbeg txvbqbv0t txvbqbb txvbqb9np txvbqbk6y txvbqbptg txvbqbtx7", x = "_1kley2dn txvbqb9i7 txvbqb9i5", S = "_1kley2do txvbqbpty txvbqbt7y txvbqbuvp txvbqb9ip txvbqbai7 txvbqbaog txvbqbv41 txvbqb12g txvbqb1qg txvbqb62p txvbqb3ny txvbqbnwp txvbqbojy txvbqbly7 txvbqbp6p", C = "_1kley2dp txvbqb9ip txvbqbajy txvbqbcg txvbqbdpp txvbqbaop txvbqbu7g", w = "_1kley2dq txvbqb9ip txvbqbcp txvbqbaog txvbqb9my txvbqbk5y", T = "_1kley2dr txvbqb9ip txvbqbai7 txvbqbao7 txvbqbk5y", E = "_1kley2ds txvbqb9ip txvbqbajy txvbqbcp txvbqb8v7 txvbqbqhy txvbqbfby txvbqbfcp txvbqblag txvbqbva1 txvbqb8p", D = "_1kley2dt txvbqb9ip txvbqbcp txvbqbany txvbqbjd7", O = "_1kley2dv _1kley2du txvbqbv9z txvbqb3b txvbqbamg txvbqbl7g txvbqbt7g txvbqbuxg", k = "_1kley2dw txvbqbv9z txvbqbamp txvbqbl7g txvbqbt7g txvbqbuxg", A = "_1kley2dx txvbqbvab txvbqb8p", j = "_1kley2dy txvbqb9ip txvbqbajy txvbqbao7 txvbqbdp7", M = "_1kley2dz txvbqb9jg", N = "_1kley2d10 txvbqbu7g txvbqb9ip txvbqbajy txvbqbao7", P = e({
6
+ defaultClassName: "_1kley2d15 _1kley2d12 _1kley2d11 txvbqbcp txvbqbv45 txvbqb1rp txvbqbva1 txvbqb9jg txvbqb8y txvbqbamg txvbqbn6y txvbqbn8y txvbqb3b txvbqb77 txvbqb6x txvbqb7k",
7
7
  variantClassNames: {
8
8
  state: {
9
- default: "_1kley2d14",
10
- active: "_1kley2d15 _1kley2d11 txvbqbv2z txvbqbv6f txvbqb8pg"
9
+ default: "_1kley2d16",
10
+ active: "_1kley2d17 _1kley2d13 txvbqbv2z txvbqbv6f txvbqb8pg"
11
11
  },
12
12
  mode: {
13
- link: "_1kley2d16",
14
- static: "_1kley2d17 _1kley2d12 txvbqbf"
13
+ link: "_1kley2d18",
14
+ static: "_1kley2d19 _1kley2d14 txvbqbf"
15
15
  }
16
16
  },
17
17
  defaultVariants: {
@@ -19,8 +19,8 @@ var t = "_1kley2d0 txvbqb9ip txvbqbu7g txvbqbv49 txvbqbv07", n = "_1kley2d1 txvb
19
19
  mode: "link"
20
20
  },
21
21
  compoundVariants: []
22
- }), N = "_1kley2d18 txvbqb9my txvbqbjh7 txvbqb9ip txvbqbai7 txvbqbl77 txvbqblbg txvbqblbe";
22
+ }), F = "_1kley2d1a txvbqb9my txvbqbjh7 txvbqb9ip txvbqbai7 txvbqbl77 txvbqblbg txvbqblbe", I = "_1kley2d1b txvbqbl7g txvbqbjh7";
23
23
  //#endregion
24
- export { k as actionGroup, D as breadcrumbCurrent, T as breadcrumbItem, E as breadcrumbLink, w as breadcrumbList, C as breadcrumbNav, O as breadcrumbSeparator, N as content, d as desktopSidebarToggle, b as header, S as headerLeading, x as headerRow, p as mainColumn, m as mainColumnWithSidePanel, c as mobileSidebarBackdrop, l as mobileSidebarBackdropOpen, f as mobileSidebarClose, u as mobileSidebarToggle, n as page, r as pageWithSidePanel, A as secondaryAction, t as shell, h as sidePanel, _ as sidePanelResizable, v as sidePanelResizer, y as sidePanelResizerHiddenOnMobile, g as sidePanelSurface, i as sidebarColumn, a as sidebarColumnMobile, o as sidebarColumnMobileOpen, s as sidebarInner, M as tabRecipe, j as tabsRow };
24
+ export { j as actionGroup, k as breadcrumbCurrent, D as breadcrumbItem, O as breadcrumbLink, E as breadcrumbList, T as breadcrumbNav, A as breadcrumbSeparator, F as content, I as contentContained, f as desktopSidebarToggle, S as header, w as headerLeading, C as headerRow, m as mainColumn, h as mainColumnContained, g as mainColumnWithSidePanel, l as mobileSidebarBackdrop, u as mobileSidebarBackdropOpen, p as mobileSidebarClose, d as mobileSidebarToggle, n as page, r as pageContained, i as pageWithSidePanel, M as secondaryAction, t as shell, _ as sidePanel, y as sidePanelResizable, b as sidePanelResizer, x as sidePanelResizerHiddenOnMobile, v as sidePanelSurface, a as sidebarColumn, o as sidebarColumnMobile, s as sidebarColumnMobileOpen, c as sidebarInner, P as tabRecipe, N as tabsRow };
25
25
 
26
26
  //# sourceMappingURL=PageShell.css.js.map