@nocoo/basalt 3.1.0 → 3.2.1
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.
- package/ai/DESIGN.md +128 -55
- package/ai/INTEGRATION.md +9 -9
- package/ai/USAGE.md +1 -1
- package/ai/registry.json +166 -124
- package/dist/charts/config.d.ts +1 -1
- package/dist/charts/config.js +1 -1
- package/dist/charts/config.js.map +1 -1
- package/dist/charts/frame.js +2 -2
- package/dist/charts/frame.js.map +1 -1
- package/dist/charts/heatmap-calendar.js +4 -4
- package/dist/charts/heatmap-calendar.js.map +1 -1
- package/dist/charts/heatmap-matrix.js +5 -5
- package/dist/charts/heatmap-matrix.js.map +1 -1
- package/dist/charts/sparkline.js +1 -1
- package/dist/charts/sparkline.js.map +1 -1
- package/dist/charts/stat-card.js +1 -1
- package/dist/charts/stat-card.js.map +1 -1
- package/dist/components/alert-dialog.js +4 -4
- package/dist/components/alert-dialog.js.map +1 -1
- package/dist/components/app-header.js +1 -1
- package/dist/components/app-header.js.map +1 -1
- package/dist/components/app-shell.js +1 -1
- package/dist/components/app-shell.js.map +1 -1
- package/dist/components/approval-card.js +5 -6
- package/dist/components/approval-card.js.map +1 -1
- package/dist/components/avatar.js +1 -1
- package/dist/components/avatar.js.map +1 -1
- package/dist/components/chat-bubble.js +1 -1
- package/dist/components/chat-bubble.js.map +1 -1
- package/dist/components/chat-composer.js +1 -1
- package/dist/components/chat-composer.js.map +1 -1
- package/dist/components/chat-header.js +1 -1
- package/dist/components/chat-header.js.map +1 -1
- package/dist/components/chat-inbox.js +1 -1
- package/dist/components/chat-inbox.js.map +1 -1
- package/dist/components/chat-markdown.js +1 -1
- package/dist/components/chat-markdown.js.map +1 -1
- package/dist/components/chat-message.js +2 -2
- package/dist/components/chat-message.js.map +1 -1
- package/dist/components/code.js +5 -4
- package/dist/components/code.js.map +1 -1
- package/dist/components/command-palette.js +2 -2
- package/dist/components/command-palette.js.map +1 -1
- package/dist/components/context-cards.js +6 -6
- package/dist/components/context-cards.js.map +1 -1
- package/dist/components/context-menu.js +1 -1
- package/dist/components/context-menu.js.map +1 -1
- package/dist/components/data-table.js +127 -124
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/dialog.js +2 -2
- package/dist/components/dialog.js.map +1 -1
- package/dist/components/diff-table.js +3 -3
- package/dist/components/diff-table.js.map +1 -1
- package/dist/components/dropdown-menu.js +1 -1
- package/dist/components/dropdown-menu.js.map +1 -1
- package/dist/components/editable-nav-item.js +2 -2
- package/dist/components/editable-nav-item.js.map +1 -1
- package/dist/components/file-dropzone.js +1 -1
- package/dist/components/file-dropzone.js.map +1 -1
- package/dist/components/filter-bar.js +1 -1
- package/dist/components/filter-bar.js.map +1 -1
- package/dist/components/icon-picker.js +3 -3
- package/dist/components/icon-picker.js.map +1 -1
- package/dist/components/inline-editable.js +1 -1
- package/dist/components/inline-editable.js.map +1 -1
- package/dist/components/input-area.js +1 -1
- package/dist/components/input-area.js.map +1 -1
- package/dist/components/input-group.js +2 -2
- package/dist/components/input-group.js.map +1 -1
- package/dist/components/layer-card.d.ts +6 -4
- package/dist/components/layer-card.js +61 -71
- package/dist/components/layer-card.js.map +1 -1
- package/dist/components/link.js +1 -1
- package/dist/components/link.js.map +1 -1
- package/dist/components/loader.js +1 -1
- package/dist/components/loader.js.map +1 -1
- package/dist/components/menu-bar.js +2 -2
- package/dist/components/menu-bar.js.map +1 -1
- package/dist/components/multi-select.js +1 -1
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/overlay.d.ts +3 -6
- package/dist/components/overlay.js +3 -3
- package/dist/components/overlay.js.map +1 -1
- package/dist/components/page-header.d.ts +2 -2
- package/dist/components/page-header.js +7 -7
- package/dist/components/page-header.js.map +1 -1
- package/dist/components/recommendation-card.js +2 -2
- package/dist/components/recommendation-card.js.map +1 -1
- package/dist/components/responsive-master-detail.js +2 -2
- package/dist/components/responsive-master-detail.js.map +1 -1
- package/dist/components/scroll-area.js +1 -1
- package/dist/components/scroll-area.js.map +1 -1
- package/dist/components/section-rule.js +1 -1
- package/dist/components/section-rule.js.map +1 -1
- package/dist/components/segment-control.js +1 -1
- package/dist/components/segment-control.js.map +1 -1
- package/dist/components/select.js +2 -2
- package/dist/components/select.js.map +1 -1
- package/dist/components/sensitive-input.js +1 -1
- package/dist/components/sensitive-input.js.map +1 -1
- package/dist/components/sheet.js +3 -3
- package/dist/components/sheet.js.map +1 -1
- package/dist/components/sidebar.js +3 -3
- package/dist/components/sidebar.js.map +1 -1
- package/dist/components/skeleton-line.js +1 -1
- package/dist/components/skeleton-line.js.map +1 -1
- package/dist/components/stat-strip.js +1 -1
- package/dist/components/stat-strip.js.map +1 -1
- package/dist/components/table.d.ts +2 -0
- package/dist/components/table.js +10 -12
- package/dist/components/table.js.map +1 -1
- package/dist/components/tabs.js +2 -2
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/tag-badge.js +1 -1
- package/dist/components/tag-badge.js.map +1 -1
- package/dist/components/tag-color-picker.js +2 -2
- package/dist/components/tag-color-picker.js.map +1 -1
- package/dist/components/text.js +2 -2
- package/dist/components/text.js.map +1 -1
- package/dist/components/thinking.js +1 -1
- package/dist/components/thinking.js.map +1 -1
- package/dist/components/toast.js +1 -1
- package/dist/components/toast.js.map +1 -1
- package/dist/components/tool-chips.js +2 -2
- package/dist/components/tool-chips.js.map +1 -1
- package/dist/components/toolbar.js +8 -8
- package/dist/components/toolbar.js.map +1 -1
- package/dist/styles/base.css +71 -0
- package/dist/styles/standalone.css +187 -168
- package/dist/styles/tailwind.css +9 -2
- package/dist/styles/tokens.css +86 -40
- package/dist/utils/navigation.d.ts +1 -1
- package/package.json +1 -1
|
@@ -173,133 +173,136 @@ function S({ data: v, columns: S, filter: oe = "", loading: C = !1, empty: se =
|
|
|
173
173
|
return /* @__PURE__ */ g("div", {
|
|
174
174
|
className: "flex min-w-0 flex-col gap-basalt-space-lg",
|
|
175
175
|
children: [/* @__PURE__ */ h("div", {
|
|
176
|
-
|
|
177
|
-
"
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
"
|
|
194
|
-
children: "
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
className: "
|
|
205
|
-
children: "
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
style: {
|
|
212
|
-
width: t.width,
|
|
213
|
-
minWidth: t.width
|
|
214
|
-
},
|
|
215
|
-
scope: "col",
|
|
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"),
|
|
219
|
-
children: t.headerContent ?? t.header
|
|
220
|
-
}) : /* @__PURE__ */ h(d, {
|
|
176
|
+
className: "basalt-focus-frame relative isolate min-w-0 rounded-basalt-md",
|
|
177
|
+
children: /* @__PURE__ */ h("div", {
|
|
178
|
+
role: "region",
|
|
179
|
+
"aria-label": `${R} scroll area`,
|
|
180
|
+
tabIndex: 0,
|
|
181
|
+
className: "basalt-focus basalt-focus-inset relative isolate min-w-0 overflow-auto rounded-[inherit]",
|
|
182
|
+
style: { maxHeight: fe },
|
|
183
|
+
children: /* @__PURE__ */ g(a, {
|
|
184
|
+
className: e("w-full", de),
|
|
185
|
+
"aria-label": R,
|
|
186
|
+
"aria-describedby": ge,
|
|
187
|
+
"aria-busy": C || void 0,
|
|
188
|
+
"data-basalt-data-table": "",
|
|
189
|
+
children: [/* @__PURE__ */ h(l, { children: /* @__PURE__ */ g(u, { children: [
|
|
190
|
+
A && /* @__PURE__ */ g(c, {
|
|
191
|
+
scope: "col",
|
|
192
|
+
textAlign: "end",
|
|
193
|
+
className: e("sticky top-0 z-10 w-basalt-10 min-w-basalt-10 bg-basalt-control", _(z, 0, $)),
|
|
194
|
+
children: [/* @__PURE__ */ h("span", {
|
|
195
|
+
"aria-hidden": "true",
|
|
196
|
+
children: "#"
|
|
197
|
+
}), /* @__PURE__ */ h("span", {
|
|
198
|
+
className: "sr-only",
|
|
199
|
+
children: "Row number"
|
|
200
|
+
})]
|
|
201
|
+
}),
|
|
202
|
+
J ? /* @__PURE__ */ h(c, {
|
|
203
|
+
scope: "col",
|
|
204
|
+
className: e("sticky top-0 z-10 w-basalt-10 min-w-basalt-10 bg-basalt-control text-center", _(z, +!!A, $)),
|
|
205
|
+
children: /* @__PURE__ */ h("span", {
|
|
206
|
+
className: "sr-only",
|
|
207
|
+
children: "Select"
|
|
208
|
+
})
|
|
209
|
+
}) : null,
|
|
210
|
+
S.map((t, n) => /* @__PURE__ */ h(c, {
|
|
221
211
|
textAlign: t.textAlign,
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
212
|
+
className: e("sticky top-0 z-10 bg-basalt-control", _(z, +!!A + +!!J + n, $), t.headerClassName),
|
|
213
|
+
style: {
|
|
214
|
+
width: t.width,
|
|
215
|
+
minWidth: t.width
|
|
216
|
+
},
|
|
217
|
+
scope: "col",
|
|
218
|
+
"aria-sort": t.sortable === !1 ? void 0 : B?.id === t.id ? B.dir === "asc" ? "ascending" : "descending" : "none",
|
|
219
|
+
children: t.sortable === !1 ? /* @__PURE__ */ h("span", {
|
|
220
|
+
className: e("flex items-center gap-basalt-control-gap", t.textAlign === "end" && "w-full justify-end text-end"),
|
|
221
|
+
children: t.headerContent ?? t.header
|
|
222
|
+
}) : /* @__PURE__ */ h(d, {
|
|
223
|
+
textAlign: t.textAlign,
|
|
224
|
+
sorted: B?.id === t.id ? B.dir : void 0,
|
|
225
|
+
"aria-label": t.header,
|
|
226
|
+
onClick: () => ye(B?.id === t.id && B.dir === "asc" ? {
|
|
227
|
+
id: t.id,
|
|
228
|
+
dir: "desc"
|
|
229
|
+
} : {
|
|
230
|
+
id: t.id,
|
|
231
|
+
dir: "asc"
|
|
232
|
+
}),
|
|
233
|
+
children: t.headerContent ?? t.header
|
|
234
|
+
})
|
|
235
|
+
}, t.id))
|
|
236
|
+
] }) }), /* @__PURE__ */ h(o, { children: C ? /* @__PURE__ */ h(u, { children: /* @__PURE__ */ h(s, {
|
|
237
|
+
colSpan: $,
|
|
238
|
+
className: _(z, 0, 1),
|
|
239
|
+
children: /* @__PURE__ */ g("div", {
|
|
240
|
+
role: "status",
|
|
241
|
+
className: "flex flex-col gap-basalt-space-lg py-basalt-space-lg",
|
|
242
|
+
children: [
|
|
243
|
+
/* @__PURE__ */ h("span", {
|
|
244
|
+
className: "sr-only",
|
|
245
|
+
children: "Loading"
|
|
246
|
+
}),
|
|
247
|
+
/* @__PURE__ */ h(r, {}),
|
|
248
|
+
/* @__PURE__ */ h(r, {}),
|
|
249
|
+
/* @__PURE__ */ h(r, {})
|
|
250
|
+
]
|
|
232
251
|
})
|
|
233
|
-
},
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
children:
|
|
244
|
-
})
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
J ? /* @__PURE__ */ h(s, {
|
|
283
|
-
className: e("text-center", _(z, +!!A, $)),
|
|
284
|
-
children: /* @__PURE__ */ h(n, {
|
|
285
|
-
checked: o,
|
|
286
|
-
"aria-label": `Select ${i}`,
|
|
287
|
-
onCheckedChange: () => Ae(i),
|
|
288
|
-
className: "align-middle"
|
|
252
|
+
}) }) : I != null && I !== !1 ? /* @__PURE__ */ h(u, { children: /* @__PURE__ */ h(s, {
|
|
253
|
+
colSpan: $,
|
|
254
|
+
className: _(z, 0, 1),
|
|
255
|
+
children: /* @__PURE__ */ g("div", {
|
|
256
|
+
role: "alert",
|
|
257
|
+
className: "flex flex-wrap items-center justify-between gap-basalt-space-lg py-basalt-space-lg",
|
|
258
|
+
children: [/* @__PURE__ */ h("div", { children: I }), L ? /* @__PURE__ */ h(t, {
|
|
259
|
+
variant: "outline",
|
|
260
|
+
size: "sm",
|
|
261
|
+
onClick: L,
|
|
262
|
+
children: he
|
|
263
|
+
}) : null]
|
|
264
|
+
})
|
|
265
|
+
}) }) : ke.length === 0 ? /* @__PURE__ */ h(u, { children: /* @__PURE__ */ h(s, {
|
|
266
|
+
colSpan: $,
|
|
267
|
+
className: _(z, 0, 1),
|
|
268
|
+
children: /* @__PURE__ */ h("div", {
|
|
269
|
+
role: "status",
|
|
270
|
+
children: se
|
|
271
|
+
})
|
|
272
|
+
}) }) : ke.map(({ row: t, key: r, selectId: i }, a) => {
|
|
273
|
+
let o = Y.includes(i);
|
|
274
|
+
return /* @__PURE__ */ g(u, {
|
|
275
|
+
variant: o ? "selected" : "default",
|
|
276
|
+
"aria-selected": J ? o : void 0,
|
|
277
|
+
children: [
|
|
278
|
+
A && /* @__PURE__ */ h(s, {
|
|
279
|
+
"data-row-number": "",
|
|
280
|
+
textAlign: "end",
|
|
281
|
+
className: e("text-basalt-sm text-basalt-muted-foreground", _(z, 0, $)),
|
|
282
|
+
children: (D && D > 0 ? (X - 1) * D : 0) + a + 1
|
|
283
|
+
}),
|
|
284
|
+
J ? /* @__PURE__ */ h(s, {
|
|
285
|
+
className: e("text-center", _(z, +!!A, $)),
|
|
286
|
+
children: /* @__PURE__ */ h(n, {
|
|
287
|
+
checked: o,
|
|
288
|
+
"aria-label": `Select ${i}`,
|
|
289
|
+
onCheckedChange: () => Ae(i),
|
|
290
|
+
className: "align-middle"
|
|
291
|
+
})
|
|
292
|
+
}) : null,
|
|
293
|
+
S.map((n, r) => {
|
|
294
|
+
let i = n.accessor(t);
|
|
295
|
+
return /* @__PURE__ */ h(s, {
|
|
296
|
+
textAlign: n.textAlign,
|
|
297
|
+
className: e(n.wrap ? "whitespace-normal break-words" : "whitespace-nowrap", _(z, +!!A + +!!J + r, $), n.cellClassName),
|
|
298
|
+
style: { minWidth: n.width },
|
|
299
|
+
children: typeof i == "bigint" ? String(i) : i
|
|
300
|
+
}, n.id);
|
|
289
301
|
})
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
textAlign: n.textAlign,
|
|
295
|
-
className: e(n.wrap ? "whitespace-normal break-words" : "whitespace-nowrap", _(z, +!!A + +!!J + r, $), n.cellClassName),
|
|
296
|
-
style: { minWidth: n.width },
|
|
297
|
-
children: typeof i == "bigint" ? String(i) : i
|
|
298
|
-
}, n.id);
|
|
299
|
-
})
|
|
300
|
-
]
|
|
301
|
-
}, r);
|
|
302
|
-
}) })]
|
|
302
|
+
]
|
|
303
|
+
}, r);
|
|
304
|
+
}) })]
|
|
305
|
+
})
|
|
303
306
|
})
|
|
304
307
|
}), D && D > 0 ? /* @__PURE__ */ h(i, {
|
|
305
308
|
page: X,
|
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
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 className=\"basalt-focus-frame relative isolate min-w-0 rounded-basalt-md\">\n\t\t\t\t<div\n\t\t\t\t\trole=\"region\"\n\t\t\t\t\taria-label={`${ariaLabel} scroll area`}\n\t\t\t\t\t// biome-ignore lint/a11y/noNoninteractiveTabindex: Named overflow regions need keyboard scrolling.\n\t\t\t\t\ttabIndex={0}\n\t\t\t\t\tclassName=\"basalt-focus basalt-focus-inset relative isolate min-w-0 overflow-auto rounded-[inherit]\"\n\t\t\t\t\tstyle={{ maxHeight }}\n\t\t\t\t>\n\t\t\t\t\t<Table\n\t\t\t\t\t\tclassName={cn(\"w-full\", className)}\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\t\tdata-basalt-data-table=\"\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<TableHeader>\n\t\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t\t{rowNumbers && (\n\t\t\t\t\t\t\t\t\t<TableHead\n\t\t\t\t\t\t\t\t\t\tscope=\"col\"\n\t\t\t\t\t\t\t\t\t\ttextAlign=\"end\"\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\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\t\tattachedEdge(edge, 0, colCount),\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<span aria-hidden=\"true\">#</span>\n\t\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\t</TableHead>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{selectable ? (\n\t\t\t\t\t\t\t\t\t<TableHead\n\t\t\t\t\t\t\t\t\t\tscope=\"col\"\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\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\t\tattachedEdge(edge, rowNumbers ? 1 : 0, colCount),\n\t\t\t\t\t\t\t\t\t\t)}\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\">Select</span>\n\t\t\t\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t{columns.map((column, columnIndex) => (\n\t\t\t\t\t\t\t\t\t<TableHead\n\t\t\t\t\t\t\t\t\t\tkey={column.id}\n\t\t\t\t\t\t\t\t\t\ttextAlign={column.textAlign}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\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\t\tattachedEdge(\n\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(rowNumbers ? 1 : 0) + (selectable ? 1 : 0) + columnIndex,\n\t\t\t\t\t\t\t\t\t\t\t\tcolCount,\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\tcolumn.headerClassName,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\tstyle={{ width: column.width, minWidth: column.width }}\n\t\t\t\t\t\t\t\t\t\tscope=\"col\"\n\t\t\t\t\t\t\t\t\t\taria-sort={\n\t\t\t\t\t\t\t\t\t\t\tcolumn.sortable === false\n\t\t\t\t\t\t\t\t\t\t\t\t? undefined\n\t\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\t? sort.dir === \"asc\"\n\t\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\t: \"descending\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t: \"none\"\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{column.sortable === false ? (\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\tclassName={cn(\n\t\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\t\tcolumn.textAlign === \"end\" && \"w-full justify-end text-end\",\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{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) : (\n\t\t\t\t\t\t\t\t\t\t\t<TableSortableHeader\n\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\tsorted={sort?.id === column.id ? sort.dir : undefined}\n\t\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\t\tonClick={() =>\n\t\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\t\tsort?.id === column.id && sort.dir === \"asc\"\n\t\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\t: { id: column.id, dir: \"asc\" },\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{column.headerContent ?? column.header}\n\t\t\t\t\t\t\t\t\t\t\t</TableSortableHeader>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t</TableHeader>\n\t\t\t\t\t\t<TableBody>\n\t\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\t\t<TableRow>\n\t\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\t<div\n\t\t\t\t\t\t\t\t\t\t\trole=\"status\"\n\t\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\t>\n\t\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\t<SkeletonLine />\n\t\t\t\t\t\t\t\t\t\t\t<SkeletonLine />\n\t\t\t\t\t\t\t\t\t\t\t<SkeletonLine />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t\t) : error != null && error !== false ? (\n\t\t\t\t\t\t\t\t<TableRow>\n\t\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\t<div\n\t\t\t\t\t\t\t\t\t\t\trole=\"alert\"\n\t\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\t>\n\t\t\t\t\t\t\t\t\t\t\t<div>{error}</div>\n\t\t\t\t\t\t\t\t\t\t\t{onRetry ? (\n\t\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\t{retryLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t\t) : paged.length === 0 ? (\n\t\t\t\t\t\t\t\t<TableRow>\n\t\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\t<div role=\"status\">{empty}</div>\n\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\tpaged.map(({ row, key, selectId }, rowIndex) => {\n\t\t\t\t\t\t\t\t\tconst isSelected = selectedIds.includes(selectId);\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<TableRow\n\t\t\t\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\t\t\t\tvariant={isSelected ? \"selected\" : \"default\"}\n\t\t\t\t\t\t\t\t\t\t\taria-selected={selectable ? isSelected : undefined}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{rowNumbers && (\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\tdata-row-number=\"\"\n\t\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\t\tclassName={cn(\n\t\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\t\tattachedEdge(edge, 0, colCount),\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{(pageSize && pageSize > 0 ? (resolvedPage - 1) * pageSize : 0) +\n\t\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\t\t1}\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\t{selectable ? (\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\tclassName={cn(\n\t\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\t\tattachedEdge(edge, rowNumbers ? 1 : 0, colCount),\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<Checkbox\n\t\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\t\taria-label={`Select ${selectId}`}\n\t\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\t\tclassName=\"align-middle\"\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</TableCell>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\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\t\tconst cell = column.accessor(row);\n\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\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\t\tkey={column.id}\n\t\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\t\tclassName={cn(\n\t\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\t\tattachedEdge(\n\t\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\t(rowNumbers ? 1 : 0) + (selectable ? 1 : 0) + columnIndex,\n\t\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\t),\n\t\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\t)}\n\t\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\t>\n\t\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\t</TableCell>\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</TableRow>\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)}\n\t\t\t\t\t\t</TableBody>\n\t\t\t\t\t</Table>\n\t\t\t\t</div>\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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"}
|
|
@@ -46,13 +46,13 @@ var g = i.forwardRef(({ className: e, children: t, size: n = "base", disablePoin
|
|
|
46
46
|
g.displayName = s.Content.displayName;
|
|
47
47
|
var _ = i.forwardRef(({ className: t, ...n }, r) => /* @__PURE__ */ a(s.Title, {
|
|
48
48
|
ref: r,
|
|
49
|
-
className: e("min-w-0 text-basalt-
|
|
49
|
+
className: e("min-w-0 text-basalt-xl font-semibold leading-basalt-tight tracking-tight wrap-anywhere", t),
|
|
50
50
|
...n
|
|
51
51
|
}));
|
|
52
52
|
_.displayName = s.Title.displayName;
|
|
53
53
|
var v = i.forwardRef(({ className: t, ...n }, r) => /* @__PURE__ */ a(s.Description, {
|
|
54
54
|
ref: r,
|
|
55
|
-
className: e("text-basalt-
|
|
55
|
+
className: e("text-basalt-base leading-[var(--basalt-line-relaxed)] text-basalt-muted-foreground", t),
|
|
56
56
|
...n
|
|
57
57
|
}));
|
|
58
58
|
v.displayName = s.Description.displayName;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dialog.js","names":["React","DialogPrimitive","DIALOG_SIZES","dialogOverlayClass","cn","OVERLAY_LAYER","OVERLAY_MOTION","className","dialogPanelClass","BASALT_UI_CLASS","size","Dialog","DialogTrigger","DialogClose","DialogPortal","DialogOverlay","props","DialogContent","disablePointerDismissal","event","onPointerDownOutside","onInteractOutside","DialogTitle","DialogDescription","DialogHeader","DialogFooter"],"sources":["../../src/components/dialog.tsx"],"sourcesContent":["import * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { BASALT_UI_CLASS } from \"../utils/control-surface\";\nimport { OVERLAY_LAYER, OVERLAY_MOTION } from \"./overlay\";\n\nexport const DIALOG_SIZES = {\n\tsm: \"sm:w-basalt-72\",\n\tbase: \"sm:w-basalt-96\",\n\tlg: \"sm:w-[32rem]\",\n\txl: \"sm:w-[48rem]\",\n} as const;\n\nexport type DialogSize = keyof typeof DIALOG_SIZES;\n\nexport function dialogOverlayClass(className?: string) {\n\treturn cn(\n\t\t\"fixed inset-0 bg-basalt-backdrop/40 backdrop-blur-md\",\n\t\tOVERLAY_LAYER,\n\t\t\"data-[state=open]:animate-basalt-overlay-in data-[state=closed]:animate-basalt-overlay-out\",\n\t\tOVERLAY_MOTION,\n\t\tclassName,\n\t);\n}\n\nexport function dialogPanelClass({\n\tsize = \"base\",\n\tclassName,\n}: {\n\tsize?: DialogSize;\n\tclassName?: string;\n} = {}) {\n\treturn cn(\n\t\tBASALT_UI_CLASS,\n\t\t\"fixed top-1/2 left-1/2 w-full max-h-[calc(100vh-2rem)] max-w-[calc(100vw-2rem)] origin-center -translate-x-1/2 -translate-y-1/2 overflow-y-auto rounded-basalt-lg p-basalt-card sm:p-basalt-card-lg text-basalt-foreground shadow-lg ring-1 ring-basalt-border\",\n\t\tOVERLAY_LAYER,\n\t\t\"data-[state=open]:animate-basalt-dialog-in data-[state=closed]:animate-basalt-dialog-out\",\n\t\tOVERLAY_MOTION,\n\t\tDIALOG_SIZES[size],\n\t\tclassName,\n\t);\n}\n\ntype RadixDialogProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root>;\ntype RadixDialogTriggerProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Trigger>;\ntype RadixDialogPortalProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Portal>;\ntype RadixDialogOverlayProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>;\ntype RadixDialogContentProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>;\ntype RadixDialogTitleProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>;\ntype RadixDialogDescriptionProps = React.ComponentPropsWithoutRef<\n\ttypeof DialogPrimitive.Description\n>;\ntype RadixDialogCloseProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Close>;\n\nexport interface DialogProps\n\textends Omit<RadixDialogProps, \"open\" | \"defaultOpen\" | \"onOpenChange\" | \"modal\"> {\n\t/**\n\t * Controlled open state of the dialog.\n\t */\n\topen?: RadixDialogProps[\"open\"];\n\t/**\n\t * Uncontrolled default open state of the dialog on initial render.\n\t * @default false\n\t */\n\tdefaultOpen?: RadixDialogProps[\"defaultOpen\"];\n\t/**\n\t * Callback invoked when the open state changes.\n\t */\n\tonOpenChange?: RadixDialogProps[\"onOpenChange\"];\n\t/**\n\t * Whether the dialog renders modally, preventing outside interaction and hiding background content from screen readers.\n\t * @default true\n\t */\n\tmodal?: RadixDialogProps[\"modal\"];\n}\n\nexport const Dialog: React.FC<DialogProps> = DialogPrimitive.Root;\n\nexport interface DialogTriggerProps extends Omit<RadixDialogTriggerProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered button element to the child element, merging props and behavior.\n\t * Trigger forwards ref to HTMLButtonElement and inherits native button attributes.\n\t * @default false\n\t */\n\tasChild?: RadixDialogTriggerProps[\"asChild\"];\n}\n\nexport const DialogTrigger = DialogPrimitive.Trigger;\n\nexport interface DialogCloseProps extends Omit<RadixDialogCloseProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered button element to the child element, merging props and behavior.\n\t * Close forwards ref to HTMLButtonElement and inherits native button attributes.\n\t * @default false\n\t */\n\tasChild?: RadixDialogCloseProps[\"asChild\"];\n}\n\nexport const DialogClose = DialogPrimitive.Close;\n\nexport interface DialogPortalProps\n\textends Omit<RadixDialogPortalProps, \"container\" | \"forceMount\"> {\n\t/**\n\t * Target container element where the dialog overlay and content portal should mount.\n\t */\n\tcontainer?: RadixDialogPortalProps[\"container\"];\n\t/**\n\t * Used to force mounting when controlling transition animations externally.\n\t */\n\tforceMount?: RadixDialogPortalProps[\"forceMount\"];\n}\n\nexport const DialogPortal = DialogPrimitive.Portal;\n\nexport interface DialogOverlayProps\n\textends Omit<RadixDialogOverlayProps, \"asChild\" | \"forceMount\"> {\n\t/**\n\t * Change the default rendered div element to the child element, merging props and behavior.\n\t * Overlay forwards ref to HTMLDivElement and inherits native div attributes.\n\t * @default false\n\t */\n\tasChild?: RadixDialogOverlayProps[\"asChild\"];\n\t/**\n\t * Used to force mounting when controlling transition animations externally.\n\t */\n\tforceMount?: RadixDialogOverlayProps[\"forceMount\"];\n}\n\nexport const DialogOverlay = React.forwardRef<\n\tReact.ElementRef<typeof DialogPrimitive.Overlay>,\n\tDialogOverlayProps\n>(({ className, ...props }, ref) => (\n\t<DialogPrimitive.Overlay ref={ref} className={dialogOverlayClass(className)} {...props} />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nexport interface DialogContentProps\n\textends Omit<\n\t\tRadixDialogContentProps,\n\t\t| \"size\"\n\t\t| \"disablePointerDismissal\"\n\t\t| \"asChild\"\n\t\t| \"forceMount\"\n\t\t| \"trapFocus\"\n\t\t| \"onOpenAutoFocus\"\n\t\t| \"onCloseAutoFocus\"\n\t\t| \"onEscapeKeyDown\"\n\t\t| \"onPointerDownOutside\"\n\t\t| \"onFocusOutside\"\n\t\t| \"onInteractOutside\"\n\t> {\n\t/**\n\t * Fixed desktop width preset. Dialog panel scrolls vertically when content overflows available viewport height.\n\t * @default \"base\"\n\t */\n\tsize?: DialogSize;\n\t/**\n\t * When true, pointer interactions outside the dialog panel are prevented from dismissing the dialog.\n\t * @default false\n\t */\n\tdisablePointerDismissal?: boolean;\n\t/**\n\t * Change the default rendered div element to the child element, merging props and behavior.\n\t * Content forwards ref to HTMLDivElement and inherits native div attributes.\n\t * @default false\n\t */\n\tasChild?: RadixDialogContentProps[\"asChild\"];\n\t/**\n\t * Force mounting content in DOM for external animation controls.\n\t * When forceMount is true, the content remains mounted even when closed.\n\t * The caller is responsible for visibility transitions and unmounting after animation completes.\n\t * Note: Keeping modal content forceMounted may isolate background interactions until unmounted.\n\t */\n\tforceMount?: RadixDialogContentProps[\"forceMount\"];\n\t/**\n\t * Event handler called when auto-focusing the first element on open. Can be prevented with event.preventDefault().\n\t */\n\tonOpenAutoFocus?: RadixDialogContentProps[\"onOpenAutoFocus\"];\n\t/**\n\t * Event handler called when restoring focus on close. Can be prevented with event.preventDefault().\n\t */\n\tonCloseAutoFocus?: RadixDialogContentProps[\"onCloseAutoFocus\"];\n\t/**\n\t * Event handler called when the Escape key is pressed. Can be prevented with event.preventDefault().\n\t */\n\tonEscapeKeyDown?: RadixDialogContentProps[\"onEscapeKeyDown\"];\n\t/**\n\t * Event handler called when a pointer event occurs outside the dialog bounds.\n\t */\n\tonPointerDownOutside?: RadixDialogContentProps[\"onPointerDownOutside\"];\n\t/**\n\t * Event handler called when focus moves outside the dialog bounds.\n\t */\n\tonFocusOutside?: RadixDialogContentProps[\"onFocusOutside\"];\n\t/**\n\t * Event handler called when any interaction (pointer or focus) occurs outside the dialog bounds.\n\t */\n\tonInteractOutside?: RadixDialogContentProps[\"onInteractOutside\"];\n}\n\nexport const DialogContent = React.forwardRef<\n\tReact.ElementRef<typeof DialogPrimitive.Content>,\n\tDialogContentProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tchildren,\n\t\t\tsize = \"base\",\n\t\t\tdisablePointerDismissal = false,\n\t\t\tonPointerDownOutside,\n\t\t\tonInteractOutside,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => (\n\t\t<DialogPortal forceMount={props.forceMount}>\n\t\t\t<DialogOverlay forceMount={props.forceMount} />\n\t\t\t<DialogPrimitive.Content\n\t\t\t\tref={ref}\n\t\t\t\tdata-basalt-surface-root=\"\"\n\t\t\t\tclassName={dialogPanelClass({ size, className })}\n\t\t\t\tonPointerDownOutside={(event) => {\n\t\t\t\t\tif (disablePointerDismissal) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\tonPointerDownOutside?.(event);\n\t\t\t\t}}\n\t\t\t\tonInteractOutside={(event) => {\n\t\t\t\t\tif (disablePointerDismissal) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\tonInteractOutside?.(event);\n\t\t\t\t}}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</DialogPrimitive.Content>\n\t\t</DialogPortal>\n\t),\n);\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nexport interface DialogTitleProps extends Omit<RadixDialogTitleProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered heading element to the child element, merging props and behavior.\n\t * Title forwards ref to HTMLHeadingElement and inherits native h2 attributes.\n\t * @default false\n\t */\n\tasChild?: RadixDialogTitleProps[\"asChild\"];\n}\n\nexport const DialogTitle = React.forwardRef<\n\tReact.ElementRef<typeof DialogPrimitive.Title>,\n\tDialogTitleProps\n>(({ className, ...props }, ref) => (\n\t<DialogPrimitive.Title\n\t\tref={ref}\n\t\tclassName={cn(\"min-w-0 text-basalt-3xl font-semibold tracking-tight wrap-anywhere\", className)}\n\t\t{...props}\n\t/>\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nexport interface DialogDescriptionProps extends Omit<RadixDialogDescriptionProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered paragraph element to the child element, merging props and behavior.\n\t * Description forwards ref to HTMLParagraphElement and inherits native p attributes.\n\t * @default false\n\t */\n\tasChild?: RadixDialogDescriptionProps[\"asChild\"];\n}\n\nexport const DialogDescription = React.forwardRef<\n\tReact.ElementRef<typeof DialogPrimitive.Description>,\n\tDialogDescriptionProps\n>(({ className, ...props }, ref) => (\n\t<DialogPrimitive.Description\n\t\tref={ref}\n\t\tclassName={cn(\"text-basalt-lg text-basalt-muted-foreground\", className)}\n\t\t{...props}\n\t/>\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport interface DialogHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const DialogHeader = ({ className, ...props }: DialogHeaderProps) => (\n\t<div className={cn(\"flex flex-col space-y-basalt-space-md text-left\", className)} {...props} />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nexport interface DialogFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const DialogFooter = ({ className, ...props }: DialogFooterProps) => (\n\t<div\n\t\tclassName={cn(\n\t\t\t\"mt-basalt-layout flex flex-col-reverse gap-basalt-space-lg sm:flex-row sm:justify-end\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n);\nDialogFooter.displayName = \"DialogFooter\";\n"],"mappings":";;;;;;;;AAMA,IAAaE,IAAe;CAC3B,IAAI;CACJ,MAAM;CACN,IAAI;CACJ,IAAI;AACL;AAIA,SAAgBC,EAAmB,GAAoB;CACtD,OAAOC,EACN,wDACAC,GACA,8FACAC,GACAC,CACD;AACD;AAEA,SAAgBC,EAAiB,EAChC,UAAO,QACP,iBAIG,CAAC,GAAG;CACP,OAAOJ,EACNK,GACA,kQACAJ,GACA,4FACAC,GACAJ,EAAaQ,IACbH,CACD;AACD;AAmCA,IAAaI,IAAgCV,EAAgB,MAWhDW,IAAgBX,EAAgB,SAWhCY,IAAcZ,EAAgB,OAc9Ba,IAAeb,EAAgB,QAgB/Bc,IAAgBf,EAAM,YAGhC,EAAE,cAAW,GAAGgB,KAAS,MAC3B,kBAACf,EAAgB,SAAjB;CAA8B;CAAK,WAAWE,EAAmBI,CAAS;CAAG,GAAIS;AAAQ,CAAA,CACzF;AACD,EAAc,cAAcf,EAAgB,QAAQ;AAkEpD,IAAagB,IAAgBjB,EAAM,YAKjC,EACC,cACA,aACA,UAAO,QACP,6BAA0B,IAC1B,yBACA,sBACA,GAAGgB,KAEJ,MAEA,kBAACF,GAAD;CAAc,YAAYE,EAAM;CAAhC,UAAA,CACC,kBAACD,GAAD,EAAe,YAAYC,EAAM,WAAa,CAAA,GAC9C,kBAACf,EAAgB,SAAjB;EACM;EACL,4BAAyB;EACzB,WAAWO,EAAiB;GAAE;GAAM;EAAU,CAAC;EAC/C,uBAAuB,MAAU;GAIhC,AAHIU,KACHC,EAAM,eAAe,GAEtBC,IAAuBD,CAAK;EAC7B;EACA,oBAAoB,MAAU;GAI7B,AAHID,KACHC,EAAM,eAAe,GAEtBE,IAAoBF,CAAK;EAC1B;EACA,GAAIH;EAEH;CACuB,CAAA,CACZ;AAEhB,CAAA,CAAA;AACA,EAAc,cAAcf,EAAgB,QAAQ;AAWpD,IAAaqB,IAActB,EAAM,YAG9B,EAAE,cAAW,GAAGgB,KAAS,MAC3B,kBAACf,EAAgB,OAAjB;CACM;CACL,WAAWG,EAAG,sEAAsEG,CAAS;CAC7F,GAAIS;AACJ,CAAA,CACD;AACD,EAAY,cAAcf,EAAgB,MAAM;AAWhD,IAAasB,IAAoBvB,EAAM,YAGpC,EAAE,cAAW,GAAGgB,KAAS,MAC3B,kBAACf,EAAgB,aAAjB;CACM;CACL,WAAWG,EAAG,+CAA+CG,CAAS;CACtE,GAAIS;AACJ,CAAA,CACD;AACD,EAAkB,cAAcf,EAAgB,YAAY;AAI5D,IAAauB,KAAgB,EAAE,cAAW,GAAGR,QAC5C,kBAAC,OAAD;CAAK,WAAWZ,EAAG,mDAAmDG,CAAS;CAAG,GAAIS;AAAQ,CAAA;AAE/F,EAAa,cAAc;AAI3B,IAAaS,KAAgB,EAAE,cAAW,GAAGT,QAC5C,kBAAC,OAAD;CACC,WAAWZ,EACV,yFACAG,CACD;CACA,GAAIS;AACJ,CAAA;AAEF,EAAa,cAAc"}
|
|
1
|
+
{"version":3,"file":"dialog.js","names":["React","DialogPrimitive","DIALOG_SIZES","dialogOverlayClass","cn","OVERLAY_LAYER","OVERLAY_MOTION","className","dialogPanelClass","BASALT_UI_CLASS","size","Dialog","DialogTrigger","DialogClose","DialogPortal","DialogOverlay","props","DialogContent","disablePointerDismissal","event","onPointerDownOutside","onInteractOutside","DialogTitle","DialogDescription","DialogHeader","DialogFooter"],"sources":["../../src/components/dialog.tsx"],"sourcesContent":["import * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { BASALT_UI_CLASS } from \"../utils/control-surface\";\nimport { OVERLAY_LAYER, OVERLAY_MOTION } from \"./overlay\";\n\nexport const DIALOG_SIZES = {\n\tsm: \"sm:w-basalt-72\",\n\tbase: \"sm:w-basalt-96\",\n\tlg: \"sm:w-[32rem]\",\n\txl: \"sm:w-[48rem]\",\n} as const;\n\nexport type DialogSize = keyof typeof DIALOG_SIZES;\n\nexport function dialogOverlayClass(className?: string) {\n\treturn cn(\n\t\t\"fixed inset-0 bg-basalt-backdrop/40 backdrop-blur-md\",\n\t\tOVERLAY_LAYER,\n\t\t\"data-[state=open]:animate-basalt-overlay-in data-[state=closed]:animate-basalt-overlay-out\",\n\t\tOVERLAY_MOTION,\n\t\tclassName,\n\t);\n}\n\nexport function dialogPanelClass({\n\tsize = \"base\",\n\tclassName,\n}: {\n\tsize?: DialogSize;\n\tclassName?: string;\n} = {}) {\n\treturn cn(\n\t\tBASALT_UI_CLASS,\n\t\t\"fixed top-1/2 left-1/2 w-full max-h-[calc(100vh-2rem)] max-w-[calc(100vw-2rem)] origin-center -translate-x-1/2 -translate-y-1/2 overflow-y-auto rounded-basalt-lg p-basalt-card sm:p-basalt-card-lg text-basalt-foreground shadow-lg ring-1 ring-basalt-border\",\n\t\tOVERLAY_LAYER,\n\t\t\"data-[state=open]:animate-basalt-dialog-in data-[state=closed]:animate-basalt-dialog-out\",\n\t\tOVERLAY_MOTION,\n\t\tDIALOG_SIZES[size],\n\t\tclassName,\n\t);\n}\n\ntype RadixDialogProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root>;\ntype RadixDialogTriggerProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Trigger>;\ntype RadixDialogPortalProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Portal>;\ntype RadixDialogOverlayProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>;\ntype RadixDialogContentProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>;\ntype RadixDialogTitleProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>;\ntype RadixDialogDescriptionProps = React.ComponentPropsWithoutRef<\n\ttypeof DialogPrimitive.Description\n>;\ntype RadixDialogCloseProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Close>;\n\nexport interface DialogProps\n\textends Omit<RadixDialogProps, \"open\" | \"defaultOpen\" | \"onOpenChange\" | \"modal\"> {\n\t/**\n\t * Controlled open state of the dialog.\n\t */\n\topen?: RadixDialogProps[\"open\"];\n\t/**\n\t * Uncontrolled default open state of the dialog on initial render.\n\t * @default false\n\t */\n\tdefaultOpen?: RadixDialogProps[\"defaultOpen\"];\n\t/**\n\t * Callback invoked when the open state changes.\n\t */\n\tonOpenChange?: RadixDialogProps[\"onOpenChange\"];\n\t/**\n\t * Whether the dialog renders modally, preventing outside interaction and hiding background content from screen readers.\n\t * @default true\n\t */\n\tmodal?: RadixDialogProps[\"modal\"];\n}\n\nexport const Dialog: React.FC<DialogProps> = DialogPrimitive.Root;\n\nexport interface DialogTriggerProps extends Omit<RadixDialogTriggerProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered button element to the child element, merging props and behavior.\n\t * Trigger forwards ref to HTMLButtonElement and inherits native button attributes.\n\t * @default false\n\t */\n\tasChild?: RadixDialogTriggerProps[\"asChild\"];\n}\n\nexport const DialogTrigger = DialogPrimitive.Trigger;\n\nexport interface DialogCloseProps extends Omit<RadixDialogCloseProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered button element to the child element, merging props and behavior.\n\t * Close forwards ref to HTMLButtonElement and inherits native button attributes.\n\t * @default false\n\t */\n\tasChild?: RadixDialogCloseProps[\"asChild\"];\n}\n\nexport const DialogClose = DialogPrimitive.Close;\n\nexport interface DialogPortalProps\n\textends Omit<RadixDialogPortalProps, \"container\" | \"forceMount\"> {\n\t/**\n\t * Target container element where the dialog overlay and content portal should mount.\n\t */\n\tcontainer?: RadixDialogPortalProps[\"container\"];\n\t/**\n\t * Used to force mounting when controlling transition animations externally.\n\t */\n\tforceMount?: RadixDialogPortalProps[\"forceMount\"];\n}\n\nexport const DialogPortal = DialogPrimitive.Portal;\n\nexport interface DialogOverlayProps\n\textends Omit<RadixDialogOverlayProps, \"asChild\" | \"forceMount\"> {\n\t/**\n\t * Change the default rendered div element to the child element, merging props and behavior.\n\t * Overlay forwards ref to HTMLDivElement and inherits native div attributes.\n\t * @default false\n\t */\n\tasChild?: RadixDialogOverlayProps[\"asChild\"];\n\t/**\n\t * Used to force mounting when controlling transition animations externally.\n\t */\n\tforceMount?: RadixDialogOverlayProps[\"forceMount\"];\n}\n\nexport const DialogOverlay = React.forwardRef<\n\tReact.ElementRef<typeof DialogPrimitive.Overlay>,\n\tDialogOverlayProps\n>(({ className, ...props }, ref) => (\n\t<DialogPrimitive.Overlay ref={ref} className={dialogOverlayClass(className)} {...props} />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nexport interface DialogContentProps\n\textends Omit<\n\t\tRadixDialogContentProps,\n\t\t| \"size\"\n\t\t| \"disablePointerDismissal\"\n\t\t| \"asChild\"\n\t\t| \"forceMount\"\n\t\t| \"trapFocus\"\n\t\t| \"onOpenAutoFocus\"\n\t\t| \"onCloseAutoFocus\"\n\t\t| \"onEscapeKeyDown\"\n\t\t| \"onPointerDownOutside\"\n\t\t| \"onFocusOutside\"\n\t\t| \"onInteractOutside\"\n\t> {\n\t/**\n\t * Fixed desktop width preset. Dialog panel scrolls vertically when content overflows available viewport height.\n\t * @default \"base\"\n\t */\n\tsize?: DialogSize;\n\t/**\n\t * When true, pointer interactions outside the dialog panel are prevented from dismissing the dialog.\n\t * @default false\n\t */\n\tdisablePointerDismissal?: boolean;\n\t/**\n\t * Change the default rendered div element to the child element, merging props and behavior.\n\t * Content forwards ref to HTMLDivElement and inherits native div attributes.\n\t * @default false\n\t */\n\tasChild?: RadixDialogContentProps[\"asChild\"];\n\t/**\n\t * Force mounting content in DOM for external animation controls.\n\t * When forceMount is true, the content remains mounted even when closed.\n\t * The caller is responsible for visibility transitions and unmounting after animation completes.\n\t * Note: Keeping modal content forceMounted may isolate background interactions until unmounted.\n\t */\n\tforceMount?: RadixDialogContentProps[\"forceMount\"];\n\t/**\n\t * Event handler called when auto-focusing the first element on open. Can be prevented with event.preventDefault().\n\t */\n\tonOpenAutoFocus?: RadixDialogContentProps[\"onOpenAutoFocus\"];\n\t/**\n\t * Event handler called when restoring focus on close. Can be prevented with event.preventDefault().\n\t */\n\tonCloseAutoFocus?: RadixDialogContentProps[\"onCloseAutoFocus\"];\n\t/**\n\t * Event handler called when the Escape key is pressed. Can be prevented with event.preventDefault().\n\t */\n\tonEscapeKeyDown?: RadixDialogContentProps[\"onEscapeKeyDown\"];\n\t/**\n\t * Event handler called when a pointer event occurs outside the dialog bounds.\n\t */\n\tonPointerDownOutside?: RadixDialogContentProps[\"onPointerDownOutside\"];\n\t/**\n\t * Event handler called when focus moves outside the dialog bounds.\n\t */\n\tonFocusOutside?: RadixDialogContentProps[\"onFocusOutside\"];\n\t/**\n\t * Event handler called when any interaction (pointer or focus) occurs outside the dialog bounds.\n\t */\n\tonInteractOutside?: RadixDialogContentProps[\"onInteractOutside\"];\n}\n\nexport const DialogContent = React.forwardRef<\n\tReact.ElementRef<typeof DialogPrimitive.Content>,\n\tDialogContentProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tchildren,\n\t\t\tsize = \"base\",\n\t\t\tdisablePointerDismissal = false,\n\t\t\tonPointerDownOutside,\n\t\t\tonInteractOutside,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => (\n\t\t<DialogPortal forceMount={props.forceMount}>\n\t\t\t<DialogOverlay forceMount={props.forceMount} />\n\t\t\t<DialogPrimitive.Content\n\t\t\t\tref={ref}\n\t\t\t\tdata-basalt-surface-root=\"\"\n\t\t\t\tclassName={dialogPanelClass({ size, className })}\n\t\t\t\tonPointerDownOutside={(event) => {\n\t\t\t\t\tif (disablePointerDismissal) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\tonPointerDownOutside?.(event);\n\t\t\t\t}}\n\t\t\t\tonInteractOutside={(event) => {\n\t\t\t\t\tif (disablePointerDismissal) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\tonInteractOutside?.(event);\n\t\t\t\t}}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</DialogPrimitive.Content>\n\t\t</DialogPortal>\n\t),\n);\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nexport interface DialogTitleProps extends Omit<RadixDialogTitleProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered heading element to the child element, merging props and behavior.\n\t * Title forwards ref to HTMLHeadingElement and inherits native h2 attributes.\n\t * @default false\n\t */\n\tasChild?: RadixDialogTitleProps[\"asChild\"];\n}\n\nexport const DialogTitle = React.forwardRef<\n\tReact.ElementRef<typeof DialogPrimitive.Title>,\n\tDialogTitleProps\n>(({ className, ...props }, ref) => (\n\t<DialogPrimitive.Title\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t\"min-w-0 text-basalt-xl font-semibold leading-basalt-tight tracking-tight wrap-anywhere\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nexport interface DialogDescriptionProps extends Omit<RadixDialogDescriptionProps, \"asChild\"> {\n\t/**\n\t * Change the default rendered paragraph element to the child element, merging props and behavior.\n\t * Description forwards ref to HTMLParagraphElement and inherits native p attributes.\n\t * @default false\n\t */\n\tasChild?: RadixDialogDescriptionProps[\"asChild\"];\n}\n\nexport const DialogDescription = React.forwardRef<\n\tReact.ElementRef<typeof DialogPrimitive.Description>,\n\tDialogDescriptionProps\n>(({ className, ...props }, ref) => (\n\t<DialogPrimitive.Description\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t\"text-basalt-base leading-[var(--basalt-line-relaxed)] text-basalt-muted-foreground\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport interface DialogHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const DialogHeader = ({ className, ...props }: DialogHeaderProps) => (\n\t<div className={cn(\"flex flex-col space-y-basalt-space-md text-left\", className)} {...props} />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nexport interface DialogFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const DialogFooter = ({ className, ...props }: DialogFooterProps) => (\n\t<div\n\t\tclassName={cn(\n\t\t\t\"mt-basalt-layout flex flex-col-reverse gap-basalt-space-lg sm:flex-row sm:justify-end\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n);\nDialogFooter.displayName = \"DialogFooter\";\n"],"mappings":";;;;;;;;AAMA,IAAaE,IAAe;CAC3B,IAAI;CACJ,MAAM;CACN,IAAI;CACJ,IAAI;AACL;AAIA,SAAgBC,EAAmB,GAAoB;CACtD,OAAOC,EACN,wDACAC,GACA,8FACAC,GACAC,CACD;AACD;AAEA,SAAgBC,EAAiB,EAChC,UAAO,QACP,iBAIG,CAAC,GAAG;CACP,OAAOJ,EACNK,GACA,kQACAJ,GACA,4FACAC,GACAJ,EAAaQ,IACbH,CACD;AACD;AAmCA,IAAaI,IAAgCV,EAAgB,MAWhDW,IAAgBX,EAAgB,SAWhCY,IAAcZ,EAAgB,OAc9Ba,IAAeb,EAAgB,QAgB/Bc,IAAgBf,EAAM,YAGhC,EAAE,cAAW,GAAGgB,KAAS,MAC3B,kBAACf,EAAgB,SAAjB;CAA8B;CAAK,WAAWE,EAAmBI,CAAS;CAAG,GAAIS;AAAQ,CAAA,CACzF;AACD,EAAc,cAAcf,EAAgB,QAAQ;AAkEpD,IAAagB,IAAgBjB,EAAM,YAKjC,EACC,cACA,aACA,UAAO,QACP,6BAA0B,IAC1B,yBACA,sBACA,GAAGgB,KAEJ,MAEA,kBAACF,GAAD;CAAc,YAAYE,EAAM;CAAhC,UAAA,CACC,kBAACD,GAAD,EAAe,YAAYC,EAAM,WAAa,CAAA,GAC9C,kBAACf,EAAgB,SAAjB;EACM;EACL,4BAAyB;EACzB,WAAWO,EAAiB;GAAE;GAAM;EAAU,CAAC;EAC/C,uBAAuB,MAAU;GAIhC,AAHIU,KACHC,EAAM,eAAe,GAEtBC,IAAuBD,CAAK;EAC7B;EACA,oBAAoB,MAAU;GAI7B,AAHID,KACHC,EAAM,eAAe,GAEtBE,IAAoBF,CAAK;EAC1B;EACA,GAAIH;EAEH;CACuB,CAAA,CACZ;AAEhB,CAAA,CAAA;AACA,EAAc,cAAcf,EAAgB,QAAQ;AAWpD,IAAaqB,IAActB,EAAM,YAG9B,EAAE,cAAW,GAAGgB,KAAS,MAC3B,kBAACf,EAAgB,OAAjB;CACM;CACL,WAAWG,EACV,0FACAG,CACD;CACA,GAAIS;AACJ,CAAA,CACD;AACD,EAAY,cAAcf,EAAgB,MAAM;AAWhD,IAAasB,IAAoBvB,EAAM,YAGpC,EAAE,cAAW,GAAGgB,KAAS,MAC3B,kBAACf,EAAgB,aAAjB;CACM;CACL,WAAWG,EACV,sFACAG,CACD;CACA,GAAIS;AACJ,CAAA,CACD;AACD,EAAkB,cAAcf,EAAgB,YAAY;AAI5D,IAAauB,KAAgB,EAAE,cAAW,GAAGR,QAC5C,kBAAC,OAAD;CAAK,WAAWZ,EAAG,mDAAmDG,CAAS;CAAG,GAAIS;AAAQ,CAAA;AAE/F,EAAa,cAAc;AAI3B,IAAaS,KAAgB,EAAE,cAAW,GAAGT,QAC5C,kBAAC,OAAD;CACC,WAAWZ,EACV,yFACAG,CACD;CACA,GAAIS;AACJ,CAAA;AAEF,EAAa,cAAc"}
|
|
@@ -20,7 +20,7 @@ function v({ title: v = "Proposed changes", columns: y, className: b, ...x }) {
|
|
|
20
20
|
className: "flex flex-wrap items-center justify-between gap-basalt-content-gap border-b border-basalt-border px-basalt-panel-x py-basalt-panel-y",
|
|
21
21
|
children: [/* @__PURE__ */ g("h3", {
|
|
22
22
|
id: C,
|
|
23
|
-
className: "text-basalt-
|
|
23
|
+
className: "text-basalt-base font-medium",
|
|
24
24
|
children: v
|
|
25
25
|
}), /* @__PURE__ */ g("span", {
|
|
26
26
|
className: "text-basalt-sm text-basalt-muted-foreground",
|
|
@@ -31,7 +31,7 @@ function v({ title: v = "Proposed changes", columns: y, className: b, ...x }) {
|
|
|
31
31
|
role: "region",
|
|
32
32
|
"aria-label": `${v} scroll area`,
|
|
33
33
|
tabIndex: 0,
|
|
34
|
-
className: "
|
|
34
|
+
className: "basalt-focus basalt-focus-inset overflow-x-auto",
|
|
35
35
|
children: /* @__PURE__ */ _(a, {
|
|
36
36
|
"aria-label": v,
|
|
37
37
|
"aria-busy": S.status === "applying" || void 0,
|
|
@@ -68,7 +68,7 @@ function v({ title: v = "Proposed changes", columns: y, className: b, ...x }) {
|
|
|
68
68
|
/* @__PURE__ */ g(s, {
|
|
69
69
|
className: "whitespace-nowrap ps-basalt-table-edge text-basalt-sm",
|
|
70
70
|
children: /* @__PURE__ */ _("span", {
|
|
71
|
-
className: "inline-flex items-center gap-basalt-control-gap leading-[var(--basalt-line-body)]",
|
|
71
|
+
className: e("inline-flex items-center gap-basalt-control-gap leading-[var(--basalt-line-body)]", t.change === "add" && "text-basalt-success", t.change === "remove" && "text-basalt-destructive"),
|
|
72
72
|
children: [/* @__PURE__ */ g("span", {
|
|
73
73
|
"data-diff-marker": "",
|
|
74
74
|
"aria-hidden": "true",
|