@nocoo/basalt 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,16 +4,18 @@ import { Button as t } from "./button.js";
4
4
  import { Checkbox as n } from "./checkbox.js";
5
5
  import { SkeletonLine as r } from "./skeleton-line.js";
6
6
  import { Pagination as i } from "./pagination.js";
7
- import { Table as a, TableBody as o, TableCell as s, TableHead as c, TableHeader as l, TableRow as u } from "./table.js";
8
- import { useCallback as d, useEffect as ee, useLayoutEffect as te, useMemo as ne, useRef as f, useState as p } from "react";
9
- import { ArrowDown as re, ArrowUp as ie, ArrowUpDown as ae } from "lucide-react";
10
- import { jsx as m, jsxs as h } from "react/jsx-runtime";
7
+ import { Table as a, TableBody as o, TableCell as s, TableHead as c, TableHeader as l, TableRow as u, TableSortableHeader as d } from "./table.js";
8
+ import { useCallback as f, useEffect as ee, useLayoutEffect as te, useMemo as ne, useRef as p, useState as m } from "react";
9
+ import { jsx as h, jsxs as g } from "react/jsx-runtime";
11
10
  //#region src/components/data-table.tsx
12
- function g(e) {
11
+ function _(t, n, r) {
12
+ if (t === "attached") return e(n === 0 && "ps-basalt-table-edge", n === r - 1 && "pe-basalt-table-edge");
13
+ }
14
+ function v(e) {
13
15
  return e === -Infinity ? 0 : typeof e == "bigint" || typeof e == "number" && Number.isFinite(e) ? 1 : e === Infinity ? 2 : typeof e == "number" ? 3 : typeof e == "string" ? 4 : 5;
14
16
  }
15
- function oe(e, t) {
16
- let n = g(e), r = g(t);
17
+ function re(e, t) {
18
+ let n = v(e), r = v(t);
17
19
  if (n !== r) return n - r;
18
20
  if (n === 1) {
19
21
  let n = e, r = t;
@@ -22,7 +24,7 @@ function oe(e, t) {
22
24
  let i = String(e), a = String(t);
23
25
  return i < a ? -1 : +(i > a);
24
26
  }
25
- function se(e, t, n, r) {
27
+ function ie(e, t, n, r) {
26
28
  if (e === null) return "prim:null";
27
29
  if (e === void 0) return "prim:undefined";
28
30
  if (typeof e == "symbol") {
@@ -32,33 +34,33 @@ function se(e, t, n, r) {
32
34
  let i = typeof e;
33
35
  return i === "number" ? Object.is(e, -0) ? "prim:number:-0" : `prim:number:${String(e)}` : i === "string" || i === "bigint" || i === "boolean" ? `prim:${i}:${String(e)}` : `prim:${t}`;
34
36
  }
35
- function _(e) {
37
+ function y(e) {
36
38
  return e.startsWith("dup:") || e.startsWith("gen:");
37
39
  }
38
- function v(e) {
40
+ function b(e) {
39
41
  return typeof e == "function" || typeof e == "object" && !!e;
40
42
  }
41
- function ce(e, t) {
43
+ function ae(e, t) {
42
44
  if (e.filterValue) return String(e.filterValue(t));
43
45
  if (e.sortValue) return String(e.sortValue(t));
44
46
  let n = e.accessor(t);
45
47
  return typeof n == "string" || typeof n == "number" || typeof n == "bigint" ? String(n) : "";
46
48
  }
47
- function y(e, t, n, r) {
49
+ function x(e, t, n, r) {
48
50
  let i = r?.(e, t);
49
- return i === void 0 ? v(e) && "id" in e && e.id != null ? String(e.id) : n : i;
51
+ return i === void 0 ? b(e) && "id" in e && e.id != null ? String(e.id) : n : i;
50
52
  }
51
- function b({ data: g, columns: b, filter: le = "", loading: x = !1, empty: ue = "No results", selected: S, defaultSelected: C, onSelectedChange: w, multiple: de = !1, page: T, defaultPage: fe = 1, pageSize: E, onPageChange: D, getRowId: O, className: pe, maxHeight: me, rowNumbers: k = !1, sort: A, defaultSort: he = null, onSortChange: ge, manualSorting: j = !1, manualPagination: M = !1, manualFiltering: N = !1, total: P, error: F, onRetry: I, retryLabel: _e = "Try again", "aria-label": L = "Data table", "aria-describedby": ve }) {
52
- let [ye, be] = p(he), R = A === void 0 ? ye : A, xe = (e) => {
53
- A === void 0 && be(e), ge?.(e);
54
- }, [Se, Ce] = p(C ?? []), [z, we] = p(fe), B = f(/* @__PURE__ */ new WeakMap()), V = f(0), H = f(/* @__PURE__ */ new WeakMap()), U = f(/* @__PURE__ */ new Map()), W = f(/* @__PURE__ */ new Map()), G = f(/* @__PURE__ */ new Map()), Te = f(/* @__PURE__ */ new Map()), K = le.trim().toLowerCase(), q = ne(() => {
53
+ function S({ data: v, columns: S, filter: oe = "", loading: C = !1, empty: se = "No results", selected: w, defaultSelected: ce, onSelectedChange: T, multiple: le = !1, page: E, defaultPage: ue = 1, pageSize: D, onPageChange: O, getRowId: k, className: de, maxHeight: fe, rowNumbers: A = !1, sort: j, defaultSort: pe = null, onSortChange: me, manualSorting: M = !1, manualPagination: N = !1, manualFiltering: P = !1, total: F, error: I, onRetry: L, retryLabel: he = "Try again", "aria-label": R = "Data table", "aria-describedby": ge, edge: z }) {
54
+ let [_e, ve] = m(pe), B = j === void 0 ? _e : j, ye = (e) => {
55
+ j === void 0 && ve(e), me?.(e);
56
+ }, [be, xe] = m(ce ?? []), [V, Se] = m(ue), H = p(/* @__PURE__ */ new WeakMap()), U = p(0), W = p(/* @__PURE__ */ new WeakMap()), G = p(/* @__PURE__ */ new Map()), Ce = p(/* @__PURE__ */ new Map()), we = p(/* @__PURE__ */ new Map()), Te = p(/* @__PURE__ */ new Map()), K = oe.trim().toLowerCase(), q = ne(() => {
55
57
  let e = (e) => {
56
- let t = B.current.get(e);
57
- return t || (t = `basalt-row-${V.current++}`, B.current.set(e, t)), t;
58
+ let t = H.current.get(e);
59
+ return t || (t = `basalt-row-${U.current++}`, H.current.set(e, t)), t;
58
60
  }, t = (e, t) => {
59
- let n = O?.(e, t);
61
+ let n = k?.(e, t);
60
62
  if (n !== void 0) return `get:${n}`;
61
- if (v(e) && "id" in e) {
63
+ if (b(e) && "id" in e) {
62
64
  let t = e.id;
63
65
  if (t != null) return `id:${String(t)}`;
64
66
  }
@@ -67,12 +69,12 @@ function b({ data: g, columns: b, filter: le = "", loading: x = !1, empty: ue =
67
69
  let l = a.get(c) ?? [];
68
70
  l.push(s), a.set(c, l), o.set(s, c);
69
71
  let u = t(e, n);
70
- if (u && (r.set(u, s), _(s))) {
72
+ if (u && (r.set(u, s), y(s))) {
71
73
  let e = i.get(u) ?? [];
72
74
  e.push(s), i.set(u, e);
73
75
  }
74
- }, c = /* @__PURE__ */ new WeakMap(), l = g.map((e, t) => {
75
- let n = v(e) ? e : null, r = n ? c.get(n) ?? 0 : 0;
76
+ }, c = /* @__PURE__ */ new WeakMap(), l = v.map((e, t) => {
77
+ let n = b(e) ? e : null, r = n ? c.get(n) ?? 0 : 0;
76
78
  return n && c.set(n, r + 1), {
77
79
  row: e,
78
80
  index: t,
@@ -81,29 +83,29 @@ function b({ data: g, columns: b, filter: le = "", loading: x = !1, empty: ue =
81
83
  };
82
84
  });
83
85
  for (let e of l) {
84
- let t = v(e.row) ? e.row : null;
86
+ let t = b(e.row) ? e.row : null;
85
87
  if (!t) continue;
86
- let r = H.current.get(t)?.[e.occurrence];
87
- r && !n.has(r) && U.current.get(r) === t && (e.key = r, n.add(r));
88
+ let r = W.current.get(t)?.[e.occurrence];
89
+ r && !n.has(r) && G.current.get(r) === t && (e.key = r, n.add(r));
88
90
  }
89
91
  let u = l.map(({ row: r, index: i, occurrence: a, key: o }) => {
90
- let c = v(r) ? r : null;
92
+ let c = b(r) ? r : null;
91
93
  if (o) return s(r, i, o, c), {
92
94
  row: r,
93
95
  key: o,
94
- selectId: y(r, i, o, O)
96
+ selectId: x(r, i, o, k)
95
97
  };
96
98
  let l = a > 0, u, d = t(r, i);
97
99
  if (d && (u = d), c) {
98
100
  let t = e(c);
99
101
  if (!u) u = l ? `gen:${t}#${a}` : `gen:${t}`;
100
- else if (n.has(u) || l) u = (G.current.get(u) ?? []).find((e) => !n.has(e)) ?? (l ? `dup:${t}#${a}` : `dup:${t}`);
102
+ else if (n.has(u) || l) u = (we.current.get(u) ?? []).find((e) => !n.has(e)) ?? (l ? `dup:${t}#${a}` : `dup:${t}`);
101
103
  else {
102
- let e = W.current.get(u);
103
- e && !n.has(e) && _(e) && (u = e);
104
+ let e = Ce.current.get(u);
105
+ e && !n.has(e) && y(e) && (u = e);
104
106
  }
105
107
  }
106
- if (u ??= se(r, i, Te.current, V), n.has(u)) {
108
+ if (u ??= ie(r, i, Te.current, U), n.has(u)) {
107
109
  let e = 0, t = `occ:${u}#${e}`;
108
110
  for (; n.has(t);) e += 1, t = `occ:${u}#${e}`;
109
111
  u = t;
@@ -111,16 +113,16 @@ function b({ data: g, columns: b, filter: le = "", loading: x = !1, empty: ue =
111
113
  return n.add(u), s(r, i, u, c), {
112
114
  row: r,
113
115
  key: u,
114
- selectId: y(r, i, u, O)
116
+ selectId: x(r, i, u, k)
115
117
  };
116
- }), d = K && !N ? u.filter(({ row: e }) => b.some((t) => ce(t, e).toLowerCase().includes(K))) : u;
118
+ }), d = K && !P ? u.filter(({ row: e }) => S.some((t) => ae(t, e).toLowerCase().includes(K))) : u;
117
119
  return {
118
120
  rows: (() => {
119
- if (!R || j) return d;
120
- let e = b.find((e) => e.id === R.id);
121
+ if (!B || M) return d;
122
+ let e = S.find((e) => e.id === B.id);
121
123
  return e ? [...d].sort((t, n) => {
122
- let r = oe(e.sortValue?.(t.row) ?? e.accessor(t.row), e.sortValue?.(n.row) ?? e.accessor(n.row));
123
- return R.dir === "asc" ? r : -r;
124
+ let r = re(e.sortValue?.(t.row) ?? e.accessor(t.row), e.sortValue?.(n.row) ?? e.accessor(n.row));
125
+ return B.dir === "asc" ? r : -r;
124
126
  }) : d;
125
127
  })(),
126
128
  assigned: a,
@@ -129,193 +131,186 @@ function b({ data: g, columns: b, filter: le = "", loading: x = !1, empty: ue =
129
131
  dups: i
130
132
  };
131
133
  }, [
132
- b,
133
- g,
134
- O,
134
+ S,
135
+ v,
136
+ k,
135
137
  K,
136
- R,
137
- N,
138
- j
138
+ B,
139
+ P,
140
+ M
139
141
  ]);
140
142
  te(() => {
141
- for (let [e, t] of q.assigned) H.current.set(e, t);
142
- U.current = q.owner, W.current = q.lastKey, G.current = q.dups;
143
+ for (let [e, t] of q.assigned) W.current.set(e, t);
144
+ G.current = q.owner, Ce.current = q.lastKey, we.current = q.dups;
143
145
  }, [q]);
144
- let J = S !== void 0 || C !== void 0 || w !== void 0, Y = S ?? Se, Ee = d((e) => {
145
- S === void 0 && Ce(e), w?.(e);
146
- }, [w, S]), De = M && P !== void 0 ? Math.max(0, P) : q.rows.length, Oe = E && E > 0 ? Math.max(1, Math.ceil(De / E)) : 1, X = Math.min(Oe, Math.max(1, T ?? z)), Z = d((e) => {
147
- T === void 0 && we(e), D?.(e);
148
- }, [D, T]), Q = f(null);
146
+ let J = w !== void 0 || ce !== void 0 || T !== void 0, Y = w ?? be, Ee = f((e) => {
147
+ w === void 0 && xe(e), T?.(e);
148
+ }, [T, w]), De = N && F !== void 0 ? Math.max(0, F) : q.rows.length, Oe = D && D > 0 ? Math.max(1, Math.ceil(De / D)) : 1, X = Math.min(Oe, Math.max(1, E ?? V)), Z = f((e) => {
149
+ E === void 0 && Se(e), O?.(e);
150
+ }, [O, E]), Q = p(null);
149
151
  ee(() => {
150
- let e = T ?? z;
151
- if (e === X || x) {
152
+ let e = E ?? V;
153
+ if (e === X || C) {
152
154
  Q.current = null;
153
155
  return;
154
156
  }
155
157
  let t = `${e}:${X}`;
156
158
  Q.current !== t && (Q.current = t, Z(X));
157
159
  }, [
158
- T,
159
- z,
160
+ E,
161
+ V,
160
162
  X,
161
- x,
163
+ C,
162
164
  Z
163
165
  ]);
164
- let ke = !M && E && E > 0 ? q.rows.slice((X - 1) * E, X * E) : q.rows, $ = b.length + +!!J + +!!k, Ae = (e) => {
165
- if (de) {
166
+ let ke = !N && D && D > 0 ? q.rows.slice((X - 1) * D, X * D) : q.rows, $ = S.length + +!!J + +!!A, Ae = (e) => {
167
+ if (le) {
166
168
  Ee(Y.includes(e) ? Y.filter((t) => t !== e) : [...Y, e]);
167
169
  return;
168
170
  }
169
171
  Ee(Y.includes(e) ? [] : [e]);
170
172
  };
171
- return /* @__PURE__ */ h("div", {
173
+ return /* @__PURE__ */ g("div", {
172
174
  className: "flex min-w-0 flex-col gap-basalt-space-lg",
173
- children: [/* @__PURE__ */ m("div", {
175
+ children: [/* @__PURE__ */ h("div", {
174
176
  role: "region",
175
- "aria-label": `${L} scroll area`,
177
+ "aria-label": `${R} scroll area`,
176
178
  tabIndex: 0,
177
- className: "relative min-w-0 overflow-auto rounded-basalt-md focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-basalt-primary",
178
- style: { maxHeight: me },
179
- children: /* @__PURE__ */ h(a, {
180
- className: e("w-full", pe),
181
- "aria-label": L,
182
- "aria-describedby": ve,
183
- "aria-busy": x || void 0,
179
+ className: "relative min-w-0 overflow-auto rounded-basalt-md focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-basalt-primary",
180
+ style: { maxHeight: fe },
181
+ children: /* @__PURE__ */ g(a, {
182
+ className: e("w-full", de),
183
+ "aria-label": R,
184
+ "aria-describedby": ge,
185
+ "aria-busy": C || void 0,
184
186
  "data-basalt-data-table": "",
185
- children: [/* @__PURE__ */ m(l, { children: /* @__PURE__ */ h(u, { children: [
186
- k && /* @__PURE__ */ h(c, {
187
+ children: [/* @__PURE__ */ h(l, { children: /* @__PURE__ */ g(u, { children: [
188
+ A && /* @__PURE__ */ g(c, {
187
189
  scope: "col",
188
- className: "sticky top-0 z-10 w-basalt-10 min-w-basalt-10 bg-basalt-control text-right",
189
- children: [/* @__PURE__ */ m("span", {
190
+ textAlign: "end",
191
+ className: e("sticky top-0 z-10 w-basalt-10 min-w-basalt-10 bg-basalt-control", _(z, 0, $)),
192
+ children: [/* @__PURE__ */ h("span", {
190
193
  "aria-hidden": "true",
191
194
  children: "#"
192
- }), /* @__PURE__ */ m("span", {
195
+ }), /* @__PURE__ */ h("span", {
193
196
  className: "sr-only",
194
197
  children: "Row number"
195
198
  })]
196
199
  }),
197
- J ? /* @__PURE__ */ m(c, {
200
+ J ? /* @__PURE__ */ h(c, {
198
201
  scope: "col",
199
- className: "sticky top-0 z-10 w-basalt-10 min-w-basalt-10 bg-basalt-control text-center",
200
- children: /* @__PURE__ */ m("span", {
202
+ className: e("sticky top-0 z-10 w-basalt-10 min-w-basalt-10 bg-basalt-control text-center", _(z, +!!A, $)),
203
+ children: /* @__PURE__ */ h("span", {
201
204
  className: "sr-only",
202
205
  children: "Select"
203
206
  })
204
207
  }) : null,
205
- b.map((t) => /* @__PURE__ */ m(c, {
206
- className: e("sticky top-0 z-10 bg-basalt-control", t.headerClassName),
208
+ S.map((t, n) => /* @__PURE__ */ h(c, {
209
+ textAlign: t.textAlign,
210
+ className: e("sticky top-0 z-10 bg-basalt-control", _(z, +!!A + +!!J + n, $), t.headerClassName),
207
211
  style: {
208
212
  width: t.width,
209
213
  minWidth: t.width
210
214
  },
211
215
  scope: "col",
212
- "aria-sort": t.sortable === !1 ? void 0 : R?.id === t.id ? R.dir === "asc" ? "ascending" : "descending" : "none",
213
- children: t.sortable === !1 ? /* @__PURE__ */ m("span", {
214
- className: "flex items-center gap-basalt-control-gap",
216
+ "aria-sort": t.sortable === !1 ? void 0 : B?.id === t.id ? B.dir === "asc" ? "ascending" : "descending" : "none",
217
+ children: t.sortable === !1 ? /* @__PURE__ */ h("span", {
218
+ className: e("flex items-center gap-basalt-control-gap", t.textAlign === "end" && "w-full justify-end text-end"),
215
219
  children: t.headerContent ?? t.header
216
- }) : /* @__PURE__ */ h("button", {
217
- type: "button",
220
+ }) : /* @__PURE__ */ h(d, {
221
+ textAlign: t.textAlign,
222
+ sorted: B?.id === t.id ? B.dir : void 0,
218
223
  "aria-label": t.header,
219
- className: "group flex w-full cursor-pointer items-center gap-basalt-control-gap rounded-basalt-sm border-0 bg-transparent p-0 text-left font-inherit text-inherit font-medium focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-basalt-primary",
220
- onClick: () => xe(R?.id === t.id && R.dir === "asc" ? {
224
+ onClick: () => ye(B?.id === t.id && B.dir === "asc" ? {
221
225
  id: t.id,
222
226
  dir: "desc"
223
227
  } : {
224
228
  id: t.id,
225
229
  dir: "asc"
226
230
  }),
227
- children: [/* @__PURE__ */ m("span", {
228
- className: "flex min-w-0 items-center gap-basalt-control-gap truncate",
229
- children: t.headerContent ?? t.header
230
- }), R?.id === t.id ? R.dir === "asc" ? /* @__PURE__ */ m(ie, {
231
- "aria-hidden": "true",
232
- className: "ml-auto size-basalt-icon-sm shrink-0",
233
- strokeWidth: 1.5
234
- }) : /* @__PURE__ */ m(re, {
235
- "aria-hidden": "true",
236
- className: "ml-auto size-basalt-icon-sm shrink-0",
237
- strokeWidth: 1.5
238
- }) : /* @__PURE__ */ m(ae, {
239
- "aria-hidden": "true",
240
- className: "ml-auto size-basalt-icon-sm shrink-0 opacity-0 transition-opacity basalt-motion group-hover:opacity-60 group-focus-visible:opacity-60 motion-reduce:transition-none",
241
- strokeWidth: 1.5
242
- })]
231
+ children: t.headerContent ?? t.header
243
232
  })
244
233
  }, t.id))
245
- ] }) }), /* @__PURE__ */ m(o, { children: x ? /* @__PURE__ */ m(u, { children: /* @__PURE__ */ m(s, {
234
+ ] }) }), /* @__PURE__ */ h(o, { children: C ? /* @__PURE__ */ h(u, { children: /* @__PURE__ */ h(s, {
246
235
  colSpan: $,
247
- children: /* @__PURE__ */ h("div", {
236
+ className: _(z, 0, 1),
237
+ children: /* @__PURE__ */ g("div", {
248
238
  role: "status",
249
239
  className: "flex flex-col gap-basalt-space-lg py-basalt-space-lg",
250
240
  children: [
251
- /* @__PURE__ */ m("span", {
241
+ /* @__PURE__ */ h("span", {
252
242
  className: "sr-only",
253
243
  children: "Loading"
254
244
  }),
255
- /* @__PURE__ */ m(r, {}),
256
- /* @__PURE__ */ m(r, {}),
257
- /* @__PURE__ */ m(r, {})
245
+ /* @__PURE__ */ h(r, {}),
246
+ /* @__PURE__ */ h(r, {}),
247
+ /* @__PURE__ */ h(r, {})
258
248
  ]
259
249
  })
260
- }) }) : F != null && F !== !1 ? /* @__PURE__ */ m(u, { children: /* @__PURE__ */ m(s, {
250
+ }) }) : I != null && I !== !1 ? /* @__PURE__ */ h(u, { children: /* @__PURE__ */ h(s, {
261
251
  colSpan: $,
262
- children: /* @__PURE__ */ h("div", {
252
+ className: _(z, 0, 1),
253
+ children: /* @__PURE__ */ g("div", {
263
254
  role: "alert",
264
255
  className: "flex flex-wrap items-center justify-between gap-basalt-space-lg py-basalt-space-lg",
265
- children: [/* @__PURE__ */ m("div", { children: F }), I ? /* @__PURE__ */ m(t, {
256
+ children: [/* @__PURE__ */ h("div", { children: I }), L ? /* @__PURE__ */ h(t, {
266
257
  variant: "outline",
267
258
  size: "sm",
268
- onClick: I,
269
- children: _e
259
+ onClick: L,
260
+ children: he
270
261
  }) : null]
271
262
  })
272
- }) }) : ke.length === 0 ? /* @__PURE__ */ m(u, { children: /* @__PURE__ */ m(s, {
263
+ }) }) : ke.length === 0 ? /* @__PURE__ */ h(u, { children: /* @__PURE__ */ h(s, {
273
264
  colSpan: $,
274
- children: /* @__PURE__ */ m("div", {
265
+ className: _(z, 0, 1),
266
+ children: /* @__PURE__ */ h("div", {
275
267
  role: "status",
276
- children: ue
268
+ children: se
277
269
  })
278
270
  }) }) : ke.map(({ row: t, key: r, selectId: i }, a) => {
279
271
  let o = Y.includes(i);
280
- return /* @__PURE__ */ h(u, {
272
+ return /* @__PURE__ */ g(u, {
281
273
  variant: o ? "selected" : "default",
282
274
  "aria-selected": J ? o : void 0,
283
275
  children: [
284
- k && /* @__PURE__ */ m(s, {
276
+ A && /* @__PURE__ */ h(s, {
285
277
  "data-row-number": "",
286
- className: "text-right text-basalt-sm tabular-nums text-basalt-muted-foreground",
287
- children: (E && E > 0 ? (X - 1) * E : 0) + a + 1
278
+ textAlign: "end",
279
+ className: e("text-basalt-sm text-basalt-muted-foreground", _(z, 0, $)),
280
+ children: (D && D > 0 ? (X - 1) * D : 0) + a + 1
288
281
  }),
289
- J ? /* @__PURE__ */ m(s, {
290
- className: "text-center",
291
- children: /* @__PURE__ */ m(n, {
282
+ J ? /* @__PURE__ */ h(s, {
283
+ className: e("text-center", _(z, +!!A, $)),
284
+ children: /* @__PURE__ */ h(n, {
292
285
  checked: o,
293
286
  "aria-label": `Select ${i}`,
294
287
  onCheckedChange: () => Ae(i),
295
288
  className: "align-middle"
296
289
  })
297
290
  }) : null,
298
- b.map((n) => {
299
- let r = n.accessor(t);
300
- return /* @__PURE__ */ m(s, {
301
- className: e(n.wrap ? "whitespace-normal break-words" : "whitespace-nowrap", n.cellClassName),
291
+ S.map((n, r) => {
292
+ let i = n.accessor(t);
293
+ return /* @__PURE__ */ h(s, {
294
+ textAlign: n.textAlign,
295
+ className: e(n.wrap ? "whitespace-normal break-words" : "whitespace-nowrap", _(z, +!!A + +!!J + r, $), n.cellClassName),
302
296
  style: { minWidth: n.width },
303
- children: typeof r == "bigint" ? String(r) : r
297
+ children: typeof i == "bigint" ? String(i) : i
304
298
  }, n.id);
305
299
  })
306
300
  ]
307
301
  }, r);
308
302
  }) })]
309
303
  })
310
- }), E && E > 0 ? /* @__PURE__ */ m(i, {
304
+ }), D && D > 0 ? /* @__PURE__ */ h(i, {
311
305
  page: X,
312
306
  pageCount: Oe,
313
- disabled: x,
314
- onPageChange: Z
307
+ disabled: C,
308
+ onPageChange: Z,
309
+ className: z === "attached" ? "px-basalt-panel-x pb-basalt-panel-y" : void 0
315
310
  }) : null]
316
311
  });
317
312
  }
318
313
  //#endregion
319
- export { b as DataTable };
314
+ export { S as DataTable };
320
315
 
321
316
  //# sourceMappingURL=data-table.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.js","names":["rank","value","compareUnknown","leftRank","left","rightRank","right","a","b","leftStr","rightStr","primitiveKey","row","key","symbols","type","index","isInstanceKey","isRefRow","filterSource","column","rendered","publicSelectId","requested","getRowId","DataTable","controlledSort","ariaLabel","ariaDescribedBy","uncontrolledSort","setUncontrolledSort","useState","defaultSort","sort","requestSort","next","onSortChange","uncontrolledSelected","setUncontrolledSelected","defaultSelected","uncontrolledPage","setUncontrolledPage","defaultPage","rowIds","useRef","rowSeq","assignedKeys","lastOwner","lastKeyByCanonical","lastDupsByCanonical","symbolKeys","query","filter","rows","useMemo","identityOf","stored","canonicalOf","raw","used","nextLastKey","nextDups","nextAssigned","nextOwner","rememberKey","objectRow","list","canonical","dups","counts","pending","data","occurrence","item","previous","keyed","reserved","isRepeat","candidate","inherited","n","filtered","manualFiltering","columns","manualSorting","cmp","keys","selectable","selected","onSelectedChange","selectedIds","setSelectedIds","useCallback","rowCount","manualPagination","total","pageCount","pageSize","resolvedPage","page","setResolvedPage","onPageChange","lastCorrection","loading","correction","paged","colCount","toggleSelected","multiple","id","Table","cn","className","TableHeader","TableRow","rowNumbers","TableHead","ArrowUp","ArrowDown","ArrowUpDown","TableBody","TableCell","SkeletonLine","error","onRetry","Button","retryLabel","empty","isSelected","selectId","rowIndex","Checkbox","cell","Pagination"],"sources":["../../src/components/data-table.tsx"],"sourcesContent":["import { ArrowDown, ArrowUp, ArrowUpDown } from \"lucide-react\";\nimport {\n\ttype CSSProperties,\n\ttype ReactNode,\n\tuseCallback,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Button } from \"./button\";\nimport { Checkbox } from \"./checkbox\";\nimport { Pagination } from \"./pagination\";\nimport { SkeletonLine } from \"./skeleton-line\";\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from \"./table\";\n\nexport type DataTableColumn<T> = {\n\tid: string;\n\theader: string;\n\taccessor: (row: T) => ReactNode;\n\tsortValue?: (row: T) => string | number | bigint;\n\tfilterValue?: (row: T) => string | number | bigint;\n\t/** Rich header content; header remains the plain text accessible name. */\n\theaderContent?: ReactNode;\n\t/** Whether the header changes sorting. @default true */\n\tsortable?: boolean;\n\t/** Preferred and minimum column width; narrow viewports scroll instead of squeezing it. */\n\twidth?: CSSProperties[\"width\"];\n\t/** Allow multiline cell content. Default false keeps dense records on one line. */\n\twrap?: boolean;\n\t/** Classes applied to the header cell. */\n\theaderClassName?: string;\n\t/** Classes applied to each data cell. */\n\tcellClassName?: string;\n};\n\nexport type DataTableSort = { id: string; dir: \"asc\" | \"desc\" };\n\nfunction rank(value: unknown): number {\n\tif (value === Number.NEGATIVE_INFINITY) {\n\t\treturn 0;\n\t}\n\tif (typeof value === \"bigint\" || (typeof value === \"number\" && Number.isFinite(value))) {\n\t\treturn 1;\n\t}\n\tif (value === Number.POSITIVE_INFINITY) {\n\t\treturn 2;\n\t}\n\tif (typeof value === \"number\") {\n\t\treturn 3;\n\t}\n\tif (typeof value === \"string\") {\n\t\treturn 4;\n\t}\n\treturn 5;\n}\n\nfunction compareUnknown(left: unknown, right: unknown): number {\n\tconst leftRank = rank(left);\n\tconst rightRank = rank(right);\n\tif (leftRank !== rightRank) {\n\t\treturn leftRank - rightRank;\n\t}\n\tif (leftRank === 1) {\n\t\tconst a = left as number | bigint;\n\t\tconst b = right as number | bigint;\n\t\treturn a < b ? -1 : a > b ? 1 : 0;\n\t}\n\tconst leftStr = String(left);\n\tconst rightStr = String(right);\n\treturn leftStr < rightStr ? -1 : leftStr > rightStr ? 1 : 0;\n}\n\nfunction primitiveKey(\n\trow: unknown,\n\tindex: number,\n\tsymbols: Map<symbol, string>,\n\tseq: { current: number },\n): string {\n\tif (row === null) {\n\t\treturn \"prim:null\";\n\t}\n\tif (row === undefined) {\n\t\treturn \"prim:undefined\";\n\t}\n\tif (typeof row === \"symbol\") {\n\t\tlet key = symbols.get(row);\n\t\tif (!key) {\n\t\t\tkey = `prim:symbol:${seq.current++}`;\n\t\t\tsymbols.set(row, key);\n\t\t}\n\t\treturn key;\n\t}\n\tconst type = typeof row;\n\tif (type === \"number\") {\n\t\tif (Object.is(row, -0)) {\n\t\t\treturn \"prim:number:-0\";\n\t\t}\n\t\treturn `prim:number:${String(row)}`;\n\t}\n\tif (type === \"string\" || type === \"bigint\" || type === \"boolean\") {\n\t\treturn `prim:${type}:${String(row)}`;\n\t}\n\treturn `prim:${index}`;\n}\n\nfunction isInstanceKey(key: string) {\n\treturn key.startsWith(\"dup:\") || key.startsWith(\"gen:\");\n}\n\nfunction isRefRow(row: unknown): row is object {\n\treturn typeof row === \"function\" || (typeof row === \"object\" && row !== null);\n}\n\nfunction filterSource<T>(column: DataTableColumn<T>, row: T): string {\n\tif (column.filterValue) {\n\t\treturn String(column.filterValue(row));\n\t}\n\tif (column.sortValue) {\n\t\treturn String(column.sortValue(row));\n\t}\n\tconst rendered = column.accessor(row);\n\tif (\n\t\ttypeof rendered === \"string\" ||\n\t\ttypeof rendered === \"number\" ||\n\t\ttypeof rendered === \"bigint\"\n\t) {\n\t\treturn String(rendered);\n\t}\n\treturn \"\";\n}\n\nfunction publicSelectId<T>(\n\trow: T,\n\tindex: number,\n\tkey: string,\n\tgetRowId?: (row: T, index: number) => string,\n): string {\n\tconst requested = getRowId?.(row, index);\n\tif (requested !== undefined) {\n\t\treturn requested;\n\t}\n\tif (isRefRow(row) && \"id\" in row && row.id != null) {\n\t\treturn String(row.id);\n\t}\n\treturn key;\n}\n\nexport type DataTableProps<T = unknown> = {\n\t/**\n\t * Rows to render.\n\t */\n\tdata: T[];\n\t/**\n\t * Column descriptors.\n\t */\n\tcolumns: DataTableColumn<T>[];\n\t/**\n\t * Filter query matched against column values.\n\t * @default \"\"\n\t */\n\tfilter?: string;\n\t/**\n\t * Replace rows with a loading placeholder.\n\t * @default false\n\t */\n\tloading?: boolean;\n\t/**\n\t * Copy shown when no rows remain after filtering.\n\t * @default \"No results\"\n\t */\n\tempty?: ReactNode;\n\t/**\n\t * Controlled selected row ids.\n\t */\n\tselected?: string[];\n\t/**\n\t * Uncontrolled initial selected row ids.\n\t */\n\tdefaultSelected?: string[];\n\t/**\n\t * Called when selected row ids change.\n\t */\n\tonSelectedChange?: (ids: string[]) => void;\n\t/**\n\t * Allow more than one selected row.\n\t * @default false\n\t */\n\tmultiple?: boolean;\n\t/**\n\t * Controlled 1-based page. Used with pageSize.\n\t */\n\tpage?: number;\n\t/**\n\t * Uncontrolled initial page.\n\t * @default 1\n\t */\n\tdefaultPage?: number;\n\t/**\n\t * Rows per page. Omit to show every row.\n\t */\n\tpageSize?: number;\n\t/**\n\t * Called when the page changes.\n\t */\n\tonPageChange?: (page: number) => void;\n\t/**\n\t * Stable id for a row.\n\t */\n\tgetRowId?: (row: T, index: number) => string;\n\t/**\n\t * Additional classes for the table.\n\t */\n\tclassName?: string;\n\t/** Bound the local scroll region; column headers stay visible while scrolling. */\n\tmaxHeight?: CSSProperties[\"maxHeight\"];\n\t/** Show display-order row numbers, continuous across pages. @default false */\n\trowNumbers?: boolean;\n\t/** Controlled sorting. null explicitly disables sorting. */\n\tsort?: DataTableSort | null;\n\t/** Initial sorting for uncontrolled usage. @default null */\n\tdefaultSort?: DataTableSort | null;\n\t/** Reports header sorting requests. Controlled values change only when the caller accepts. */\n\tonSortChange?: (sort: DataTableSort | null) => void;\n\t/** Caller supplies sorted rows; headers only report requests. @default false */\n\tmanualSorting?: boolean;\n\t/** Caller supplies the current page; rows are never sliced again. Use stable row IDs across pages. @default false */\n\tmanualPagination?: boolean;\n\t/** Caller supplies filtered rows; filter is not applied locally. @default false */\n\tmanualFiltering?: boolean;\n\t/** Total matching row count in manualPagination mode; defaults to data.length. */\n\ttotal?: number;\n\t/** Error content replacing rows after loading finishes. */\n\terror?: ReactNode;\n\t/** Optional retry action for an error. The caller owns the request. */\n\tonRetry?: () => void;\n\t/** Retry button text. @default \"Try again\" */\n\tretryLabel?: string;\n\t/** Accessible table name. @default \"Data table\" */\n\t\"aria-label\"?: string;\n\t/** ID of additional table instructions or summary. */\n\t\"aria-describedby\"?: string;\n};\n\nexport function DataTable<T>({\n\tdata,\n\tcolumns,\n\tfilter = \"\",\n\tloading = false,\n\tempty = \"No results\",\n\tselected,\n\tdefaultSelected,\n\tonSelectedChange,\n\tmultiple = false,\n\tpage,\n\tdefaultPage = 1,\n\tpageSize,\n\tonPageChange,\n\tgetRowId,\n\tclassName,\n\tmaxHeight,\n\trowNumbers = false,\n\tsort: controlledSort,\n\tdefaultSort = null,\n\tonSortChange,\n\tmanualSorting = false,\n\tmanualPagination = false,\n\tmanualFiltering = false,\n\ttotal,\n\terror,\n\tonRetry,\n\tretryLabel = \"Try again\",\n\t\"aria-label\": ariaLabel = \"Data table\",\n\t\"aria-describedby\": ariaDescribedBy,\n}: DataTableProps<T>) {\n\tconst [uncontrolledSort, setUncontrolledSort] = useState<DataTableSort | null>(defaultSort);\n\tconst sort = controlledSort === undefined ? uncontrolledSort : controlledSort;\n\tconst requestSort = (next: DataTableSort) => {\n\t\tif (controlledSort === undefined) setUncontrolledSort(next);\n\t\tonSortChange?.(next);\n\t};\n\tconst [uncontrolledSelected, setUncontrolledSelected] = useState<string[]>(defaultSelected ?? []);\n\tconst [uncontrolledPage, setUncontrolledPage] = useState(defaultPage);\n\tconst rowIds = useRef(new WeakMap<object, string>());\n\tconst rowSeq = useRef(0);\n\tconst assignedKeys = useRef(new WeakMap<object, string[]>());\n\tconst lastOwner = useRef(new Map<string, object>());\n\tconst lastKeyByCanonical = useRef(new Map<string, string>());\n\tconst lastDupsByCanonical = useRef(new Map<string, string[]>());\n\tconst symbolKeys = useRef(new Map<symbol, string>());\n\tconst query = filter.trim().toLowerCase();\n\n\tconst rows = useMemo(() => {\n\t\tconst identityOf = (row: object) => {\n\t\t\tlet stored = rowIds.current.get(row);\n\t\t\tif (!stored) {\n\t\t\t\tstored = `basalt-row-${rowSeq.current++}`;\n\t\t\t\trowIds.current.set(row, stored);\n\t\t\t}\n\t\t\treturn stored;\n\t\t};\n\t\tconst canonicalOf = (row: T, index: number) => {\n\t\t\tconst requested = getRowId?.(row, index);\n\t\t\tif (requested !== undefined) {\n\t\t\t\treturn `get:${requested}`;\n\t\t\t}\n\t\t\tif (isRefRow(row) && \"id\" in row) {\n\t\t\t\tconst raw = (row as { id: unknown }).id;\n\t\t\t\tif (raw != null) {\n\t\t\t\t\treturn `id:${String(raw)}`;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tconst used = new Set<string>();\n\t\tconst nextLastKey = new Map<string, string>();\n\t\tconst nextDups = new Map<string, string[]>();\n\t\tconst nextAssigned = new Map<object, string[]>();\n\t\tconst nextOwner = new Map<string, object>();\n\t\tconst rememberKey = (row: T, index: number, key: string, objectRow: object | null) => {\n\t\t\tif (!objectRow) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst list = nextAssigned.get(objectRow) ?? [];\n\t\t\tlist.push(key);\n\t\t\tnextAssigned.set(objectRow, list);\n\t\t\tnextOwner.set(key, objectRow);\n\t\t\tconst canonical = canonicalOf(row, index);\n\t\t\tif (!canonical) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tnextLastKey.set(canonical, key);\n\t\t\tif (isInstanceKey(key)) {\n\t\t\t\tconst dups = nextDups.get(canonical) ?? [];\n\t\t\t\tdups.push(key);\n\t\t\t\tnextDups.set(canonical, dups);\n\t\t\t}\n\t\t};\n\t\tconst counts = new WeakMap<object, number>();\n\t\tconst pending = data.map((row, index) => {\n\t\t\tconst objectRow = isRefRow(row) ? row : null;\n\t\t\tconst occurrence = objectRow ? (counts.get(objectRow) ?? 0) : 0;\n\t\t\tif (objectRow) {\n\t\t\t\tcounts.set(objectRow, occurrence + 1);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\trow,\n\t\t\t\tindex,\n\t\t\t\toccurrence,\n\t\t\t\tkey: undefined as string | undefined,\n\t\t\t};\n\t\t});\n\t\tfor (const item of pending) {\n\t\t\tconst objectRow = isRefRow(item.row) ? item.row : null;\n\t\t\tif (!objectRow) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst previous = assignedKeys.current.get(objectRow)?.[item.occurrence];\n\t\t\tif (!previous || used.has(previous)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (lastOwner.current.get(previous) === objectRow) {\n\t\t\t\titem.key = previous;\n\t\t\t\tused.add(previous);\n\t\t\t}\n\t\t}\n\t\tconst keyed = pending.map(({ row, index, occurrence, key: reserved }) => {\n\t\t\tconst objectRow = isRefRow(row) ? row : null;\n\t\t\tif (reserved) {\n\t\t\t\trememberKey(row, index, reserved, objectRow);\n\t\t\t\treturn {\n\t\t\t\t\trow,\n\t\t\t\t\tkey: reserved,\n\t\t\t\t\tselectId: publicSelectId(row, index, reserved, getRowId),\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst isRepeat = occurrence > 0;\n\t\t\tlet key: string | undefined;\n\t\t\tconst requested = canonicalOf(row, index);\n\t\t\tif (requested) {\n\t\t\t\tkey = requested;\n\t\t\t}\n\t\t\tif (objectRow) {\n\t\t\t\tconst stored = identityOf(objectRow);\n\t\t\t\tif (!key) {\n\t\t\t\t\tkey = isRepeat ? `gen:${stored}#${occurrence}` : `gen:${stored}`;\n\t\t\t\t} else if (used.has(key) || isRepeat) {\n\t\t\t\t\tconst reused = (lastDupsByCanonical.current.get(key) ?? []).find(\n\t\t\t\t\t\t(candidate) => !used.has(candidate),\n\t\t\t\t\t);\n\t\t\t\t\tkey = reused ?? (isRepeat ? `dup:${stored}#${occurrence}` : `dup:${stored}`);\n\t\t\t\t} else {\n\t\t\t\t\tconst inherited = lastKeyByCanonical.current.get(key);\n\t\t\t\t\tif (inherited && !used.has(inherited) && isInstanceKey(inherited)) {\n\t\t\t\t\t\tkey = inherited;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tkey = key ?? primitiveKey(row, index, symbolKeys.current, rowSeq);\n\t\t\tif (used.has(key)) {\n\t\t\t\tlet n = 0;\n\t\t\t\tlet candidate = `occ:${key}#${n}`;\n\t\t\t\twhile (used.has(candidate)) {\n\t\t\t\t\tn += 1;\n\t\t\t\t\tcandidate = `occ:${key}#${n}`;\n\t\t\t\t}\n\t\t\t\tkey = candidate;\n\t\t\t}\n\t\t\tused.add(key);\n\t\t\trememberKey(row, index, key, objectRow);\n\t\t\treturn { row, key, selectId: publicSelectId(row, index, key, getRowId) };\n\t\t});\n\t\tconst filtered =\n\t\t\tquery && !manualFiltering\n\t\t\t\t? keyed.filter(({ row }) =>\n\t\t\t\t\t\tcolumns.some((column) => filterSource(column, row).toLowerCase().includes(query)),\n\t\t\t\t\t)\n\t\t\t\t: keyed;\n\t\tconst sorted = (() => {\n\t\t\tif (!sort || manualSorting) {\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t\tconst column = columns.find((item) => item.id === sort.id);\n\t\t\tif (!column) {\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t\treturn [...filtered].sort((a, b) => {\n\t\t\t\tconst left = column.sortValue?.(a.row) ?? column.accessor(a.row);\n\t\t\t\tconst right = column.sortValue?.(b.row) ?? column.accessor(b.row);\n\t\t\t\tconst cmp = compareUnknown(left, right);\n\t\t\t\treturn sort.dir === \"asc\" ? cmp : -cmp;\n\t\t\t});\n\t\t})();\n\t\treturn {\n\t\t\trows: sorted,\n\t\t\tassigned: nextAssigned,\n\t\t\towner: nextOwner,\n\t\t\tlastKey: nextLastKey,\n\t\t\tdups: nextDups,\n\t\t};\n\t}, [columns, data, getRowId, query, sort, manualFiltering, manualSorting]);\n\n\tuseLayoutEffect(() => {\n\t\tfor (const [objectRow, keys] of rows.assigned) {\n\t\t\tassignedKeys.current.set(objectRow, keys);\n\t\t}\n\t\tlastOwner.current = rows.owner;\n\t\tlastKeyByCanonical.current = rows.lastKey;\n\t\tlastDupsByCanonical.current = rows.dups;\n\t}, [rows]);\n\n\tconst selectable =\n\t\tselected !== undefined || defaultSelected !== undefined || onSelectedChange !== undefined;\n\tconst selectedIds = selected ?? uncontrolledSelected;\n\tconst setSelectedIds = useCallback(\n\t\t(next: string[]) => {\n\t\t\tif (selected === undefined) {\n\t\t\t\tsetUncontrolledSelected(next);\n\t\t\t}\n\t\t\tonSelectedChange?.(next);\n\t\t},\n\t\t[onSelectedChange, selected],\n\t);\n\tconst rowCount = manualPagination && total !== undefined ? Math.max(0, total) : rows.rows.length;\n\tconst pageCount = pageSize && pageSize > 0 ? Math.max(1, Math.ceil(rowCount / pageSize)) : 1;\n\tconst resolvedPage = Math.min(pageCount, Math.max(1, page ?? uncontrolledPage));\n\tconst setResolvedPage = useCallback(\n\t\t(next: number) => {\n\t\t\tif (page === undefined) {\n\t\t\t\tsetUncontrolledPage(next);\n\t\t\t}\n\t\t\tonPageChange?.(next);\n\t\t},\n\t\t[onPageChange, page],\n\t);\n\tconst lastCorrection = useRef<string | null>(null);\n\tuseEffect(() => {\n\t\tconst requested = page ?? uncontrolledPage;\n\t\tif (requested === resolvedPage || loading) {\n\t\t\tlastCorrection.current = null;\n\t\t\treturn;\n\t\t}\n\t\tconst correction = `${requested}:${resolvedPage}`;\n\t\tif (lastCorrection.current !== correction) {\n\t\t\tlastCorrection.current = correction;\n\t\t\tsetResolvedPage(resolvedPage);\n\t\t}\n\t}, [page, uncontrolledPage, resolvedPage, loading, setResolvedPage]);\n\tconst paged =\n\t\t!manualPagination && pageSize && pageSize > 0\n\t\t\t? rows.rows.slice((resolvedPage - 1) * pageSize, resolvedPage * pageSize)\n\t\t\t: rows.rows;\n\tconst colCount = columns.length + (selectable ? 1 : 0) + (rowNumbers ? 1 : 0);\n\tconst toggleSelected = (id: string) => {\n\t\tif (multiple) {\n\t\t\tsetSelectedIds(\n\t\t\t\tselectedIds.includes(id) ? selectedIds.filter((item) => item !== id) : [...selectedIds, id],\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tsetSelectedIds(selectedIds.includes(id) ? [] : [id]);\n\t};\n\n\treturn (\n\t\t<div className=\"flex min-w-0 flex-col gap-basalt-space-lg\">\n\t\t\t<div\n\t\t\t\trole=\"region\"\n\t\t\t\taria-label={`${ariaLabel} scroll area`}\n\t\t\t\t// biome-ignore lint/a11y/noNoninteractiveTabindex: Named overflow regions need keyboard scrolling.\n\t\t\t\ttabIndex={0}\n\t\t\t\tclassName=\"relative min-w-0 overflow-auto rounded-basalt-md focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-basalt-primary\"\n\t\t\t\tstyle={{ maxHeight }}\n\t\t\t>\n\t\t\t\t<Table\n\t\t\t\t\tclassName={cn(\"w-full\", className)}\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\tdata-basalt-data-table=\"\"\n\t\t\t\t>\n\t\t\t\t\t<TableHeader>\n\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t{rowNumbers && (\n\t\t\t\t\t\t\t\t<TableHead\n\t\t\t\t\t\t\t\t\tscope=\"col\"\n\t\t\t\t\t\t\t\t\tclassName=\"sticky top-0 z-10 w-basalt-10 min-w-basalt-10 bg-basalt-control text-right\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span aria-hidden=\"true\">#</span>\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Row number</span>\n\t\t\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{selectable ? (\n\t\t\t\t\t\t\t\t<TableHead\n\t\t\t\t\t\t\t\t\tscope=\"col\"\n\t\t\t\t\t\t\t\t\tclassName=\"sticky top-0 z-10 w-basalt-10 min-w-basalt-10 bg-basalt-control text-center\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Select</span>\n\t\t\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t{columns.map((column) => (\n\t\t\t\t\t\t\t\t<TableHead\n\t\t\t\t\t\t\t\t\tkey={column.id}\n\t\t\t\t\t\t\t\t\tclassName={cn(\"sticky top-0 z-10 bg-basalt-control\", column.headerClassName)}\n\t\t\t\t\t\t\t\t\tstyle={{ width: column.width, minWidth: column.width }}\n\t\t\t\t\t\t\t\t\tscope=\"col\"\n\t\t\t\t\t\t\t\t\taria-sort={\n\t\t\t\t\t\t\t\t\t\tcolumn.sortable === false\n\t\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t\t: sort?.id === column.id\n\t\t\t\t\t\t\t\t\t\t\t\t? sort.dir === \"asc\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t? \"ascending\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t: \"descending\"\n\t\t\t\t\t\t\t\t\t\t\t\t: \"none\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{column.sortable === false ? (\n\t\t\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-basalt-control-gap\">\n\t\t\t\t\t\t\t\t\t\t\t{column.headerContent ?? column.header}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\taria-label={column.header}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"group flex w-full cursor-pointer items-center gap-basalt-control-gap rounded-basalt-sm border-0 bg-transparent p-0 text-left font-inherit text-inherit font-medium focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-basalt-primary\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\t\trequestSort(\n\t\t\t\t\t\t\t\t\t\t\t\t\tsort?.id === column.id && sort.dir === \"asc\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? { id: column.id, dir: \"desc\" }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: { id: column.id, dir: \"asc\" },\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"flex min-w-0 items-center gap-basalt-control-gap truncate\">\n\t\t\t\t\t\t\t\t\t\t\t\t{column.headerContent ?? column.header}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t{sort?.id === column.id ? (\n\t\t\t\t\t\t\t\t\t\t\t\tsort.dir === \"asc\" ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ArrowUp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"ml-auto size-basalt-icon-sm shrink-0\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ArrowDown\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"ml-auto size-basalt-icon-sm shrink-0\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<ArrowUpDown\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"ml-auto size-basalt-icon-sm shrink-0 opacity-0 transition-opacity basalt-motion group-hover:opacity-60 group-focus-visible:opacity-60 motion-reduce:transition-none\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t</TableHeader>\n\t\t\t\t\t<TableBody>\n\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t\t<TableCell colSpan={colCount}>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\trole=\"status\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex flex-col gap-basalt-space-lg py-basalt-space-lg\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Loading</span>\n\t\t\t\t\t\t\t\t\t\t<SkeletonLine />\n\t\t\t\t\t\t\t\t\t\t<SkeletonLine />\n\t\t\t\t\t\t\t\t\t\t<SkeletonLine />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t) : error != null && error !== false ? (\n\t\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t\t<TableCell colSpan={colCount}>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\trole=\"alert\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex flex-wrap items-center justify-between gap-basalt-space-lg py-basalt-space-lg\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div>{error}</div>\n\t\t\t\t\t\t\t\t\t\t{onRetry ? (\n\t\t\t\t\t\t\t\t\t\t\t<Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n\t\t\t\t\t\t\t\t\t\t\t\t{retryLabel}\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t) : paged.length === 0 ? (\n\t\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t\t<TableCell colSpan={colCount}>\n\t\t\t\t\t\t\t\t\t<div role=\"status\">{empty}</div>\n\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tpaged.map(({ row, key, selectId }, rowIndex) => {\n\t\t\t\t\t\t\t\tconst isSelected = selectedIds.includes(selectId);\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<TableRow\n\t\t\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\t\t\tvariant={isSelected ? \"selected\" : \"default\"}\n\t\t\t\t\t\t\t\t\t\taria-selected={selectable ? isSelected : undefined}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{rowNumbers && (\n\t\t\t\t\t\t\t\t\t\t\t<TableCell\n\t\t\t\t\t\t\t\t\t\t\t\tdata-row-number=\"\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-right text-basalt-sm tabular-nums text-basalt-muted-foreground\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{(pageSize && pageSize > 0 ? (resolvedPage - 1) * pageSize : 0) +\n\t\t\t\t\t\t\t\t\t\t\t\t\trowIndex +\n\t\t\t\t\t\t\t\t\t\t\t\t\t1}\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{selectable ? (\n\t\t\t\t\t\t\t\t\t\t\t<TableCell className=\"text-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\t\t\t\t\t\tchecked={isSelected}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={`Select ${selectId}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonCheckedChange={() => toggleSelected(selectId)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"align-middle\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t{columns.map((column) => {\n\t\t\t\t\t\t\t\t\t\t\tconst cell = column.accessor(row);\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={column.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolumn.wrap ? \"whitespace-normal break-words\" : \"whitespace-nowrap\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolumn.cellClassName,\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ minWidth: column.width }}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{typeof cell === \"bigint\" ? String(cell) : cell}\n\t\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)}\n\t\t\t\t\t</TableBody>\n\t\t\t\t</Table>\n\t\t\t</div>\n\t\t\t{pageSize && pageSize > 0 ? (\n\t\t\t\t<Pagination\n\t\t\t\t\tpage={resolvedPage}\n\t\t\t\t\tpageCount={pageCount}\n\t\t\t\t\tdisabled={loading}\n\t\t\t\t\tonPageChange={setResolvedPage}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"data-table.js","names":["attachedEdge","edge","cn","index","count","rank","value","compareUnknown","leftRank","left","rightRank","right","a","b","leftStr","rightStr","primitiveKey","row","key","symbols","type","isInstanceKey","isRefRow","filterSource","column","rendered","publicSelectId","requested","getRowId","DataTable","controlledSort","ariaLabel","ariaDescribedBy","uncontrolledSort","setUncontrolledSort","useState","defaultSort","sort","requestSort","next","onSortChange","uncontrolledSelected","setUncontrolledSelected","defaultSelected","uncontrolledPage","setUncontrolledPage","defaultPage","rowIds","useRef","rowSeq","assignedKeys","lastOwner","lastKeyByCanonical","lastDupsByCanonical","symbolKeys","query","filter","rows","useMemo","identityOf","stored","canonicalOf","raw","used","nextLastKey","nextDups","nextAssigned","nextOwner","rememberKey","objectRow","list","canonical","dups","counts","pending","data","occurrence","item","previous","keyed","reserved","isRepeat","candidate","inherited","n","filtered","manualFiltering","columns","manualSorting","cmp","keys","selectable","selected","onSelectedChange","selectedIds","setSelectedIds","useCallback","rowCount","manualPagination","total","pageCount","pageSize","resolvedPage","page","setResolvedPage","onPageChange","lastCorrection","loading","correction","paged","colCount","toggleSelected","multiple","id","Table","className","TableHeader","TableRow","rowNumbers","TableHead","columnIndex","TableSortableHeader","TableBody","TableCell","SkeletonLine","error","onRetry","Button","retryLabel","empty","isSelected","selectId","rowIndex","Checkbox","cell","Pagination"],"sources":["../../src/components/data-table.tsx"],"sourcesContent":["import {\n\ttype CSSProperties,\n\ttype ReactNode,\n\tuseCallback,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Button } from \"./button\";\nimport { Checkbox } from \"./checkbox\";\nimport { Pagination } from \"./pagination\";\nimport { SkeletonLine } from \"./skeleton-line\";\nimport {\n\tTable,\n\tTableBody,\n\tTableCell,\n\tTableHead,\n\tTableHeader,\n\tTableRow,\n\tTableSortableHeader,\n\ttype TableTextAlign,\n} from \"./table\";\n\nexport type DataTableEdge = \"inset\" | \"attached\";\n\nfunction attachedEdge(edge: DataTableEdge | undefined, index: number, count: number) {\n\tif (edge !== \"attached\") return;\n\treturn cn(index === 0 && \"ps-basalt-table-edge\", index === count - 1 && \"pe-basalt-table-edge\");\n}\n\nexport type DataTableColumn<T> = {\n\tid: string;\n\theader: string;\n\taccessor: (row: T) => ReactNode;\n\tsortValue?: (row: T) => string | number | bigint;\n\tfilterValue?: (row: T) => string | number | bigint;\n\t/** Rich header content; header remains the plain text accessible name. */\n\theaderContent?: ReactNode;\n\t/** Whether the header changes sorting. @default true */\n\tsortable?: boolean;\n\t/** Preferred and minimum column width; narrow viewports scroll instead of squeezing it. */\n\twidth?: CSSProperties[\"width\"];\n\t/** Allow multiline cell content. Default false keeps dense records on one line. */\n\twrap?: boolean;\n\t/** Classes applied to the header cell. */\n\theaderClassName?: string;\n\t/** Classes applied to each data cell. */\n\tcellClassName?: string;\n\t/** Logical header and cell alignment. Omitted cells inherit from the table. */\n\ttextAlign?: TableTextAlign;\n};\n\nexport type DataTableSort = { id: string; dir: \"asc\" | \"desc\" };\n\nfunction rank(value: unknown): number {\n\tif (value === Number.NEGATIVE_INFINITY) {\n\t\treturn 0;\n\t}\n\tif (typeof value === \"bigint\" || (typeof value === \"number\" && Number.isFinite(value))) {\n\t\treturn 1;\n\t}\n\tif (value === Number.POSITIVE_INFINITY) {\n\t\treturn 2;\n\t}\n\tif (typeof value === \"number\") {\n\t\treturn 3;\n\t}\n\tif (typeof value === \"string\") {\n\t\treturn 4;\n\t}\n\treturn 5;\n}\n\nfunction compareUnknown(left: unknown, right: unknown): number {\n\tconst leftRank = rank(left);\n\tconst rightRank = rank(right);\n\tif (leftRank !== rightRank) {\n\t\treturn leftRank - rightRank;\n\t}\n\tif (leftRank === 1) {\n\t\tconst a = left as number | bigint;\n\t\tconst b = right as number | bigint;\n\t\treturn a < b ? -1 : a > b ? 1 : 0;\n\t}\n\tconst leftStr = String(left);\n\tconst rightStr = String(right);\n\treturn leftStr < rightStr ? -1 : leftStr > rightStr ? 1 : 0;\n}\n\nfunction primitiveKey(\n\trow: unknown,\n\tindex: number,\n\tsymbols: Map<symbol, string>,\n\tseq: { current: number },\n): string {\n\tif (row === null) {\n\t\treturn \"prim:null\";\n\t}\n\tif (row === undefined) {\n\t\treturn \"prim:undefined\";\n\t}\n\tif (typeof row === \"symbol\") {\n\t\tlet key = symbols.get(row);\n\t\tif (!key) {\n\t\t\tkey = `prim:symbol:${seq.current++}`;\n\t\t\tsymbols.set(row, key);\n\t\t}\n\t\treturn key;\n\t}\n\tconst type = typeof row;\n\tif (type === \"number\") {\n\t\tif (Object.is(row, -0)) {\n\t\t\treturn \"prim:number:-0\";\n\t\t}\n\t\treturn `prim:number:${String(row)}`;\n\t}\n\tif (type === \"string\" || type === \"bigint\" || type === \"boolean\") {\n\t\treturn `prim:${type}:${String(row)}`;\n\t}\n\treturn `prim:${index}`;\n}\n\nfunction isInstanceKey(key: string) {\n\treturn key.startsWith(\"dup:\") || key.startsWith(\"gen:\");\n}\n\nfunction isRefRow(row: unknown): row is object {\n\treturn typeof row === \"function\" || (typeof row === \"object\" && row !== null);\n}\n\nfunction filterSource<T>(column: DataTableColumn<T>, row: T): string {\n\tif (column.filterValue) {\n\t\treturn String(column.filterValue(row));\n\t}\n\tif (column.sortValue) {\n\t\treturn String(column.sortValue(row));\n\t}\n\tconst rendered = column.accessor(row);\n\tif (\n\t\ttypeof rendered === \"string\" ||\n\t\ttypeof rendered === \"number\" ||\n\t\ttypeof rendered === \"bigint\"\n\t) {\n\t\treturn String(rendered);\n\t}\n\treturn \"\";\n}\n\nfunction publicSelectId<T>(\n\trow: T,\n\tindex: number,\n\tkey: string,\n\tgetRowId?: (row: T, index: number) => string,\n): string {\n\tconst requested = getRowId?.(row, index);\n\tif (requested !== undefined) {\n\t\treturn requested;\n\t}\n\tif (isRefRow(row) && \"id\" in row && row.id != null) {\n\t\treturn String(row.id);\n\t}\n\treturn key;\n}\n\nexport type DataTableProps<T = unknown> = {\n\t/**\n\t * Rows to render.\n\t */\n\tdata: T[];\n\t/**\n\t * Column descriptors.\n\t */\n\tcolumns: DataTableColumn<T>[];\n\t/**\n\t * Filter query matched against column values.\n\t * @default \"\"\n\t */\n\tfilter?: string;\n\t/**\n\t * Replace rows with a loading placeholder.\n\t * @default false\n\t */\n\tloading?: boolean;\n\t/**\n\t * Copy shown when no rows remain after filtering.\n\t * @default \"No results\"\n\t */\n\tempty?: ReactNode;\n\t/**\n\t * Controlled selected row ids.\n\t */\n\tselected?: string[];\n\t/**\n\t * Uncontrolled initial selected row ids.\n\t */\n\tdefaultSelected?: string[];\n\t/**\n\t * Called when selected row ids change.\n\t */\n\tonSelectedChange?: (ids: string[]) => void;\n\t/**\n\t * Allow more than one selected row.\n\t * @default false\n\t */\n\tmultiple?: boolean;\n\t/**\n\t * Controlled 1-based page. Used with pageSize.\n\t */\n\tpage?: number;\n\t/**\n\t * Uncontrolled initial page.\n\t * @default 1\n\t */\n\tdefaultPage?: number;\n\t/**\n\t * Rows per page. Omit to show every row.\n\t */\n\tpageSize?: number;\n\t/**\n\t * Called when the page changes.\n\t */\n\tonPageChange?: (page: number) => void;\n\t/**\n\t * Stable id for a row.\n\t */\n\tgetRowId?: (row: T, index: number) => string;\n\t/**\n\t * Additional classes for the table.\n\t */\n\tclassName?: string;\n\t/** Bound the local scroll region; column headers stay visible while scrolling. */\n\tmaxHeight?: CSSProperties[\"maxHeight\"];\n\t/** Show display-order row numbers, continuous across pages. @default false */\n\trowNumbers?: boolean;\n\t/** Controlled sorting. null explicitly disables sorting. */\n\tsort?: DataTableSort | null;\n\t/** Initial sorting for uncontrolled usage. @default null */\n\tdefaultSort?: DataTableSort | null;\n\t/** Reports header sorting requests. Controlled values change only when the caller accepts. */\n\tonSortChange?: (sort: DataTableSort | null) => void;\n\t/** Caller supplies sorted rows; headers only report requests. @default false */\n\tmanualSorting?: boolean;\n\t/** Caller supplies the current page; rows are never sliced again. Use stable row IDs across pages. @default false */\n\tmanualPagination?: boolean;\n\t/** Caller supplies filtered rows; filter is not applied locally. @default false */\n\tmanualFiltering?: boolean;\n\t/** Total matching row count in manualPagination mode; defaults to data.length. */\n\ttotal?: number;\n\t/** Error content replacing rows after loading finishes. */\n\terror?: ReactNode;\n\t/** Optional retry action for an error. The caller owns the request. */\n\tonRetry?: () => void;\n\t/** Retry button text. @default \"Try again\" */\n\tretryLabel?: string;\n\t/** Accessible table name. @default \"Data table\" */\n\t\"aria-label\"?: string;\n\t/** ID of additional table instructions or summary. */\n\t\"aria-describedby\"?: string;\n\t/** Direct-card rails on the first and last display columns. @default \"inset\" */\n\tedge?: DataTableEdge;\n};\n\nexport function DataTable<T>({\n\tdata,\n\tcolumns,\n\tfilter = \"\",\n\tloading = false,\n\tempty = \"No results\",\n\tselected,\n\tdefaultSelected,\n\tonSelectedChange,\n\tmultiple = false,\n\tpage,\n\tdefaultPage = 1,\n\tpageSize,\n\tonPageChange,\n\tgetRowId,\n\tclassName,\n\tmaxHeight,\n\trowNumbers = false,\n\tsort: controlledSort,\n\tdefaultSort = null,\n\tonSortChange,\n\tmanualSorting = false,\n\tmanualPagination = false,\n\tmanualFiltering = false,\n\ttotal,\n\terror,\n\tonRetry,\n\tretryLabel = \"Try again\",\n\t\"aria-label\": ariaLabel = \"Data table\",\n\t\"aria-describedby\": ariaDescribedBy,\n\tedge,\n}: DataTableProps<T>) {\n\tconst [uncontrolledSort, setUncontrolledSort] = useState<DataTableSort | null>(defaultSort);\n\tconst sort = controlledSort === undefined ? uncontrolledSort : controlledSort;\n\tconst requestSort = (next: DataTableSort) => {\n\t\tif (controlledSort === undefined) setUncontrolledSort(next);\n\t\tonSortChange?.(next);\n\t};\n\tconst [uncontrolledSelected, setUncontrolledSelected] = useState<string[]>(defaultSelected ?? []);\n\tconst [uncontrolledPage, setUncontrolledPage] = useState(defaultPage);\n\tconst rowIds = useRef(new WeakMap<object, string>());\n\tconst rowSeq = useRef(0);\n\tconst assignedKeys = useRef(new WeakMap<object, string[]>());\n\tconst lastOwner = useRef(new Map<string, object>());\n\tconst lastKeyByCanonical = useRef(new Map<string, string>());\n\tconst lastDupsByCanonical = useRef(new Map<string, string[]>());\n\tconst symbolKeys = useRef(new Map<symbol, string>());\n\tconst query = filter.trim().toLowerCase();\n\n\tconst rows = useMemo(() => {\n\t\tconst identityOf = (row: object) => {\n\t\t\tlet stored = rowIds.current.get(row);\n\t\t\tif (!stored) {\n\t\t\t\tstored = `basalt-row-${rowSeq.current++}`;\n\t\t\t\trowIds.current.set(row, stored);\n\t\t\t}\n\t\t\treturn stored;\n\t\t};\n\t\tconst canonicalOf = (row: T, index: number) => {\n\t\t\tconst requested = getRowId?.(row, index);\n\t\t\tif (requested !== undefined) {\n\t\t\t\treturn `get:${requested}`;\n\t\t\t}\n\t\t\tif (isRefRow(row) && \"id\" in row) {\n\t\t\t\tconst raw = (row as { id: unknown }).id;\n\t\t\t\tif (raw != null) {\n\t\t\t\t\treturn `id:${String(raw)}`;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tconst used = new Set<string>();\n\t\tconst nextLastKey = new Map<string, string>();\n\t\tconst nextDups = new Map<string, string[]>();\n\t\tconst nextAssigned = new Map<object, string[]>();\n\t\tconst nextOwner = new Map<string, object>();\n\t\tconst rememberKey = (row: T, index: number, key: string, objectRow: object | null) => {\n\t\t\tif (!objectRow) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst list = nextAssigned.get(objectRow) ?? [];\n\t\t\tlist.push(key);\n\t\t\tnextAssigned.set(objectRow, list);\n\t\t\tnextOwner.set(key, objectRow);\n\t\t\tconst canonical = canonicalOf(row, index);\n\t\t\tif (!canonical) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tnextLastKey.set(canonical, key);\n\t\t\tif (isInstanceKey(key)) {\n\t\t\t\tconst dups = nextDups.get(canonical) ?? [];\n\t\t\t\tdups.push(key);\n\t\t\t\tnextDups.set(canonical, dups);\n\t\t\t}\n\t\t};\n\t\tconst counts = new WeakMap<object, number>();\n\t\tconst pending = data.map((row, index) => {\n\t\t\tconst objectRow = isRefRow(row) ? row : null;\n\t\t\tconst occurrence = objectRow ? (counts.get(objectRow) ?? 0) : 0;\n\t\t\tif (objectRow) {\n\t\t\t\tcounts.set(objectRow, occurrence + 1);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\trow,\n\t\t\t\tindex,\n\t\t\t\toccurrence,\n\t\t\t\tkey: undefined as string | undefined,\n\t\t\t};\n\t\t});\n\t\tfor (const item of pending) {\n\t\t\tconst objectRow = isRefRow(item.row) ? item.row : null;\n\t\t\tif (!objectRow) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst previous = assignedKeys.current.get(objectRow)?.[item.occurrence];\n\t\t\tif (!previous || used.has(previous)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (lastOwner.current.get(previous) === objectRow) {\n\t\t\t\titem.key = previous;\n\t\t\t\tused.add(previous);\n\t\t\t}\n\t\t}\n\t\tconst keyed = pending.map(({ row, index, occurrence, key: reserved }) => {\n\t\t\tconst objectRow = isRefRow(row) ? row : null;\n\t\t\tif (reserved) {\n\t\t\t\trememberKey(row, index, reserved, objectRow);\n\t\t\t\treturn {\n\t\t\t\t\trow,\n\t\t\t\t\tkey: reserved,\n\t\t\t\t\tselectId: publicSelectId(row, index, reserved, getRowId),\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst isRepeat = occurrence > 0;\n\t\t\tlet key: string | undefined;\n\t\t\tconst requested = canonicalOf(row, index);\n\t\t\tif (requested) {\n\t\t\t\tkey = requested;\n\t\t\t}\n\t\t\tif (objectRow) {\n\t\t\t\tconst stored = identityOf(objectRow);\n\t\t\t\tif (!key) {\n\t\t\t\t\tkey = isRepeat ? `gen:${stored}#${occurrence}` : `gen:${stored}`;\n\t\t\t\t} else if (used.has(key) || isRepeat) {\n\t\t\t\t\tconst reused = (lastDupsByCanonical.current.get(key) ?? []).find(\n\t\t\t\t\t\t(candidate) => !used.has(candidate),\n\t\t\t\t\t);\n\t\t\t\t\tkey = reused ?? (isRepeat ? `dup:${stored}#${occurrence}` : `dup:${stored}`);\n\t\t\t\t} else {\n\t\t\t\t\tconst inherited = lastKeyByCanonical.current.get(key);\n\t\t\t\t\tif (inherited && !used.has(inherited) && isInstanceKey(inherited)) {\n\t\t\t\t\t\tkey = inherited;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tkey = key ?? primitiveKey(row, index, symbolKeys.current, rowSeq);\n\t\t\tif (used.has(key)) {\n\t\t\t\tlet n = 0;\n\t\t\t\tlet candidate = `occ:${key}#${n}`;\n\t\t\t\twhile (used.has(candidate)) {\n\t\t\t\t\tn += 1;\n\t\t\t\t\tcandidate = `occ:${key}#${n}`;\n\t\t\t\t}\n\t\t\t\tkey = candidate;\n\t\t\t}\n\t\t\tused.add(key);\n\t\t\trememberKey(row, index, key, objectRow);\n\t\t\treturn { row, key, selectId: publicSelectId(row, index, key, getRowId) };\n\t\t});\n\t\tconst filtered =\n\t\t\tquery && !manualFiltering\n\t\t\t\t? keyed.filter(({ row }) =>\n\t\t\t\t\t\tcolumns.some((column) => filterSource(column, row).toLowerCase().includes(query)),\n\t\t\t\t\t)\n\t\t\t\t: keyed;\n\t\tconst sorted = (() => {\n\t\t\tif (!sort || manualSorting) {\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t\tconst column = columns.find((item) => item.id === sort.id);\n\t\t\tif (!column) {\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t\treturn [...filtered].sort((a, b) => {\n\t\t\t\tconst left = column.sortValue?.(a.row) ?? column.accessor(a.row);\n\t\t\t\tconst right = column.sortValue?.(b.row) ?? column.accessor(b.row);\n\t\t\t\tconst cmp = compareUnknown(left, right);\n\t\t\t\treturn sort.dir === \"asc\" ? cmp : -cmp;\n\t\t\t});\n\t\t})();\n\t\treturn {\n\t\t\trows: sorted,\n\t\t\tassigned: nextAssigned,\n\t\t\towner: nextOwner,\n\t\t\tlastKey: nextLastKey,\n\t\t\tdups: nextDups,\n\t\t};\n\t}, [columns, data, getRowId, query, sort, manualFiltering, manualSorting]);\n\n\tuseLayoutEffect(() => {\n\t\tfor (const [objectRow, keys] of rows.assigned) {\n\t\t\tassignedKeys.current.set(objectRow, keys);\n\t\t}\n\t\tlastOwner.current = rows.owner;\n\t\tlastKeyByCanonical.current = rows.lastKey;\n\t\tlastDupsByCanonical.current = rows.dups;\n\t}, [rows]);\n\n\tconst selectable =\n\t\tselected !== undefined || defaultSelected !== undefined || onSelectedChange !== undefined;\n\tconst selectedIds = selected ?? uncontrolledSelected;\n\tconst setSelectedIds = useCallback(\n\t\t(next: string[]) => {\n\t\t\tif (selected === undefined) {\n\t\t\t\tsetUncontrolledSelected(next);\n\t\t\t}\n\t\t\tonSelectedChange?.(next);\n\t\t},\n\t\t[onSelectedChange, selected],\n\t);\n\tconst rowCount = manualPagination && total !== undefined ? Math.max(0, total) : rows.rows.length;\n\tconst pageCount = pageSize && pageSize > 0 ? Math.max(1, Math.ceil(rowCount / pageSize)) : 1;\n\tconst resolvedPage = Math.min(pageCount, Math.max(1, page ?? uncontrolledPage));\n\tconst setResolvedPage = useCallback(\n\t\t(next: number) => {\n\t\t\tif (page === undefined) {\n\t\t\t\tsetUncontrolledPage(next);\n\t\t\t}\n\t\t\tonPageChange?.(next);\n\t\t},\n\t\t[onPageChange, page],\n\t);\n\tconst lastCorrection = useRef<string | null>(null);\n\tuseEffect(() => {\n\t\tconst requested = page ?? uncontrolledPage;\n\t\tif (requested === resolvedPage || loading) {\n\t\t\tlastCorrection.current = null;\n\t\t\treturn;\n\t\t}\n\t\tconst correction = `${requested}:${resolvedPage}`;\n\t\tif (lastCorrection.current !== correction) {\n\t\t\tlastCorrection.current = correction;\n\t\t\tsetResolvedPage(resolvedPage);\n\t\t}\n\t}, [page, uncontrolledPage, resolvedPage, loading, setResolvedPage]);\n\tconst paged =\n\t\t!manualPagination && pageSize && pageSize > 0\n\t\t\t? rows.rows.slice((resolvedPage - 1) * pageSize, resolvedPage * pageSize)\n\t\t\t: rows.rows;\n\tconst colCount = columns.length + (selectable ? 1 : 0) + (rowNumbers ? 1 : 0);\n\tconst toggleSelected = (id: string) => {\n\t\tif (multiple) {\n\t\t\tsetSelectedIds(\n\t\t\t\tselectedIds.includes(id) ? selectedIds.filter((item) => item !== id) : [...selectedIds, id],\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tsetSelectedIds(selectedIds.includes(id) ? [] : [id]);\n\t};\n\n\treturn (\n\t\t<div className=\"flex min-w-0 flex-col gap-basalt-space-lg\">\n\t\t\t<div\n\t\t\t\trole=\"region\"\n\t\t\t\taria-label={`${ariaLabel} scroll area`}\n\t\t\t\t// biome-ignore lint/a11y/noNoninteractiveTabindex: Named overflow regions need keyboard scrolling.\n\t\t\t\ttabIndex={0}\n\t\t\t\tclassName=\"relative min-w-0 overflow-auto rounded-basalt-md focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-basalt-primary\"\n\t\t\t\tstyle={{ maxHeight }}\n\t\t\t>\n\t\t\t\t<Table\n\t\t\t\t\tclassName={cn(\"w-full\", className)}\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\tdata-basalt-data-table=\"\"\n\t\t\t\t>\n\t\t\t\t\t<TableHeader>\n\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t{rowNumbers && (\n\t\t\t\t\t\t\t\t<TableHead\n\t\t\t\t\t\t\t\t\tscope=\"col\"\n\t\t\t\t\t\t\t\t\ttextAlign=\"end\"\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"sticky top-0 z-10 w-basalt-10 min-w-basalt-10 bg-basalt-control\",\n\t\t\t\t\t\t\t\t\t\tattachedEdge(edge, 0, colCount),\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span aria-hidden=\"true\">#</span>\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Row number</span>\n\t\t\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{selectable ? (\n\t\t\t\t\t\t\t\t<TableHead\n\t\t\t\t\t\t\t\t\tscope=\"col\"\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"sticky top-0 z-10 w-basalt-10 min-w-basalt-10 bg-basalt-control text-center\",\n\t\t\t\t\t\t\t\t\t\tattachedEdge(edge, rowNumbers ? 1 : 0, colCount),\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Select</span>\n\t\t\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t{columns.map((column, columnIndex) => (\n\t\t\t\t\t\t\t\t<TableHead\n\t\t\t\t\t\t\t\t\tkey={column.id}\n\t\t\t\t\t\t\t\t\ttextAlign={column.textAlign}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"sticky top-0 z-10 bg-basalt-control\",\n\t\t\t\t\t\t\t\t\t\tattachedEdge(\n\t\t\t\t\t\t\t\t\t\t\tedge,\n\t\t\t\t\t\t\t\t\t\t\t(rowNumbers ? 1 : 0) + (selectable ? 1 : 0) + columnIndex,\n\t\t\t\t\t\t\t\t\t\t\tcolCount,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\tcolumn.headerClassName,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={{ width: column.width, minWidth: column.width }}\n\t\t\t\t\t\t\t\t\tscope=\"col\"\n\t\t\t\t\t\t\t\t\taria-sort={\n\t\t\t\t\t\t\t\t\t\tcolumn.sortable === false\n\t\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t\t: sort?.id === column.id\n\t\t\t\t\t\t\t\t\t\t\t\t? sort.dir === \"asc\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t? \"ascending\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t: \"descending\"\n\t\t\t\t\t\t\t\t\t\t\t\t: \"none\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{column.sortable === false ? (\n\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"flex items-center gap-basalt-control-gap\",\n\t\t\t\t\t\t\t\t\t\t\t\tcolumn.textAlign === \"end\" && \"w-full justify-end text-end\",\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{column.headerContent ?? column.header}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<TableSortableHeader\n\t\t\t\t\t\t\t\t\t\t\ttextAlign={column.textAlign}\n\t\t\t\t\t\t\t\t\t\t\tsorted={sort?.id === column.id ? sort.dir : undefined}\n\t\t\t\t\t\t\t\t\t\t\taria-label={column.header}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\t\trequestSort(\n\t\t\t\t\t\t\t\t\t\t\t\t\tsort?.id === column.id && sort.dir === \"asc\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? { id: column.id, dir: \"desc\" }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: { id: column.id, dir: \"asc\" },\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{column.headerContent ?? column.header}\n\t\t\t\t\t\t\t\t\t\t</TableSortableHeader>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t</TableHeader>\n\t\t\t\t\t<TableBody>\n\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t\t<TableCell colSpan={colCount} className={attachedEdge(edge, 0, 1)}>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\trole=\"status\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex flex-col gap-basalt-space-lg py-basalt-space-lg\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Loading</span>\n\t\t\t\t\t\t\t\t\t\t<SkeletonLine />\n\t\t\t\t\t\t\t\t\t\t<SkeletonLine />\n\t\t\t\t\t\t\t\t\t\t<SkeletonLine />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t) : error != null && error !== false ? (\n\t\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t\t<TableCell colSpan={colCount} className={attachedEdge(edge, 0, 1)}>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\trole=\"alert\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex flex-wrap items-center justify-between gap-basalt-space-lg py-basalt-space-lg\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div>{error}</div>\n\t\t\t\t\t\t\t\t\t\t{onRetry ? (\n\t\t\t\t\t\t\t\t\t\t\t<Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n\t\t\t\t\t\t\t\t\t\t\t\t{retryLabel}\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t) : paged.length === 0 ? (\n\t\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t\t<TableCell colSpan={colCount} className={attachedEdge(edge, 0, 1)}>\n\t\t\t\t\t\t\t\t\t<div role=\"status\">{empty}</div>\n\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tpaged.map(({ row, key, selectId }, rowIndex) => {\n\t\t\t\t\t\t\t\tconst isSelected = selectedIds.includes(selectId);\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<TableRow\n\t\t\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\t\t\tvariant={isSelected ? \"selected\" : \"default\"}\n\t\t\t\t\t\t\t\t\t\taria-selected={selectable ? isSelected : undefined}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{rowNumbers && (\n\t\t\t\t\t\t\t\t\t\t\t<TableCell\n\t\t\t\t\t\t\t\t\t\t\t\tdata-row-number=\"\"\n\t\t\t\t\t\t\t\t\t\t\t\ttextAlign=\"end\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"text-basalt-sm text-basalt-muted-foreground\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tattachedEdge(edge, 0, colCount),\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{(pageSize && pageSize > 0 ? (resolvedPage - 1) * pageSize : 0) +\n\t\t\t\t\t\t\t\t\t\t\t\t\trowIndex +\n\t\t\t\t\t\t\t\t\t\t\t\t\t1}\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{selectable ? (\n\t\t\t\t\t\t\t\t\t\t\t<TableCell\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"text-center\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tattachedEdge(edge, rowNumbers ? 1 : 0, colCount),\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\t\t\t\t\t\tchecked={isSelected}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={`Select ${selectId}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonCheckedChange={() => toggleSelected(selectId)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"align-middle\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t{columns.map((column, columnIndex) => {\n\t\t\t\t\t\t\t\t\t\t\tconst cell = column.accessor(row);\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={column.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttextAlign={column.textAlign}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolumn.wrap ? \"whitespace-normal break-words\" : \"whitespace-nowrap\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tattachedEdge(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tedge,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(rowNumbers ? 1 : 0) + (selectable ? 1 : 0) + columnIndex,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolCount,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolumn.cellClassName,\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ minWidth: column.width }}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{typeof cell === \"bigint\" ? String(cell) : cell}\n\t\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)}\n\t\t\t\t\t</TableBody>\n\t\t\t\t</Table>\n\t\t\t</div>\n\t\t\t{pageSize && pageSize > 0 ? (\n\t\t\t\t<Pagination\n\t\t\t\t\tpage={resolvedPage}\n\t\t\t\t\tpageCount={pageCount}\n\t\t\t\t\tdisabled={loading}\n\t\t\t\t\tonPageChange={setResolvedPage}\n\t\t\t\t\tclassName={edge === \"attached\" ? \"px-basalt-panel-x pb-basalt-panel-y\" : undefined}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}