@nocoo/basalt 3.2.1 → 3.2.4
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/README.md +25 -19
- package/ai/COMPATIBILITY.md +41 -36
- package/ai/DESIGN.md +53 -47
- package/ai/INTEGRATION.md +814 -820
- package/ai/RECIPES.md +334 -135
- package/ai/USAGE.md +2 -2
- package/ai/registry.json +384 -27
- package/ai/sources.json +2 -2
- package/dist/assets/brand-mark.js +1 -2
- package/dist/charts/area.js +1 -2
- package/dist/charts/bar.js +1 -2
- package/dist/charts/bullet.js +1 -2
- package/dist/charts/chart-colors.js +1 -2
- package/dist/charts/charts.js +1 -2
- package/dist/charts/config.js +1 -2
- package/dist/charts/custom-chart.js +1 -2
- package/dist/charts/date-navigation.js +1 -2
- package/dist/charts/donut.js +1 -2
- package/dist/charts/frame.js +1 -2
- package/dist/charts/frame.js.map +1 -1
- package/dist/charts/funnel.js +1 -2
- package/dist/charts/gauge.js +1 -2
- package/dist/charts/grouped-bar.js +1 -2
- package/dist/charts/heatmap-calendar.js +3 -7
- package/dist/charts/heatmap-calendar.js.map +1 -1
- package/dist/charts/heatmap-matrix.js +1 -2
- package/dist/charts/item-list.js +1 -2
- package/dist/charts/legend.js +1 -2
- package/dist/charts/line.js +1 -2
- package/dist/charts/palette.js +1 -2
- package/dist/charts/radar.js +1 -2
- package/dist/charts/sample.js +1 -2
- package/dist/charts/sankey.js +1 -2
- package/dist/charts/series.js +1 -2
- package/dist/charts/slot-bar.js +1 -2
- package/dist/charts/sparkline.js +1 -2
- package/dist/charts/stacked-bar.js +1 -2
- package/dist/charts/stat-card.js +1 -2
- package/dist/charts/timeline.js +1 -2
- package/dist/charts/timeseries.js +1 -2
- package/dist/charts/tooltip.js +31 -27
- package/dist/charts/tooltip.js.map +1 -1
- package/dist/components/accordion.js +1 -2
- package/dist/components/alert-dialog.js +1 -2
- package/dist/components/app-header.js +1 -2
- package/dist/components/app-shell.js +1 -2
- package/dist/components/approval-card.js +1 -2
- package/dist/components/autocomplete.js +1 -2
- package/dist/components/avatar.js +1 -2
- package/dist/components/badge.js +1 -2
- package/dist/components/banner.js +1 -2
- package/dist/components/basalt-mark.js +1 -2
- package/dist/components/battery-meter.js +1 -2
- package/dist/components/breadcrumbs.js +1 -2
- package/dist/components/button.d.ts +1 -1
- package/dist/components/button.js +3 -3
- package/dist/components/button.js.map +1 -1
- package/dist/components/chat-bubble.js +1 -2
- package/dist/components/chat-composer.js +1 -2
- package/dist/components/chat-header.js +1 -2
- package/dist/components/chat-inbox.js +1 -2
- package/dist/components/chat-markdown.js +1 -2
- package/dist/components/chat-message.js +1 -2
- package/dist/components/checkbox.js +1 -2
- package/dist/components/clipboard-text.js +1 -2
- package/dist/components/code.js +1 -2
- package/dist/components/collapsible.js +1 -2
- package/dist/components/collapsible.js.map +1 -1
- package/dist/components/combobox.js +1 -2
- package/dist/components/command-palette.js +1 -2
- package/dist/components/confirm-dialog.js +3 -12
- package/dist/components/confirm-dialog.js.map +1 -1
- package/dist/components/context-cards.js +1 -2
- package/dist/components/context-menu.js +1 -2
- package/dist/components/data-table.js +2 -7
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-picker.js +7 -18
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/delete-resource.js +1 -2
- package/dist/components/description-list.js +1 -2
- package/dist/components/dialog.js +1 -2
- package/dist/components/diff-table.js +1 -2
- package/dist/components/dock.js +1 -2
- package/dist/components/dock.js.map +1 -1
- package/dist/components/dropdown-menu.js +1 -2
- package/dist/components/editable-nav-item.js +1 -2
- package/dist/components/empty.js +1 -2
- package/dist/components/fab.js +1 -2
- package/dist/components/field.js +1 -2
- package/dist/components/file-dropzone.js +1 -2
- package/dist/components/filter-bar.js +1 -2
- package/dist/components/flow.js +1 -2
- package/dist/components/grid.js +1 -2
- package/dist/components/hover-card.js +1 -2
- package/dist/components/icon-picker.js +1 -2
- package/dist/components/inline-editable.js +1 -2
- package/dist/components/input-area.js +1 -2
- package/dist/components/input-group.js +2 -3
- package/dist/components/input-group.js.map +1 -1
- package/dist/components/input.js +1 -2
- package/dist/components/label.js +1 -2
- package/dist/components/layer-card.js +1 -2
- package/dist/components/link.js +1 -2
- package/dist/components/loader.js +1 -2
- package/dist/components/loading-screen.js +1 -2
- package/dist/components/menu-bar.js +1 -2
- package/dist/components/meter.js +1 -2
- package/dist/components/multi-select.js +1 -2
- package/dist/components/navigation-menu.js +1 -2
- package/dist/components/overlay.js +1 -2
- package/dist/components/page-header.js +1 -2
- package/dist/components/pagination.js +1 -2
- package/dist/components/popover.js +1 -2
- package/dist/components/prompt-bar.js +1 -2
- package/dist/components/radio.js +2 -7
- package/dist/components/radio.js.map +1 -1
- package/dist/components/recommendation-card.js +1 -2
- package/dist/components/resource-list.js +1 -2
- package/dist/components/responsive-master-detail.js +1 -2
- package/dist/components/scroll-area.js +1 -2
- package/dist/components/section-rule.js +1 -2
- package/dist/components/segment-control.js +1 -2
- package/dist/components/select.js +1 -2
- package/dist/components/sensitive-input.js +1 -2
- package/dist/components/separator.js +1 -2
- package/dist/components/sheet.js +1 -2
- package/dist/components/sidebar.d.ts +53 -19
- package/dist/components/sidebar.js +201 -100
- package/dist/components/sidebar.js.map +1 -1
- package/dist/components/skeleton-line.js +1 -2
- package/dist/components/slider.js +1 -2
- package/dist/components/stat-strip.js +1 -2
- package/dist/components/switch.js +1 -2
- package/dist/components/table-of-contents.js +1 -2
- package/dist/components/table-pager.js +1 -2
- package/dist/components/table.js +1 -2
- package/dist/components/tabs.js +1 -2
- package/dist/components/tag-badge.js +1 -2
- package/dist/components/tag-color-picker.js +1 -2
- package/dist/components/text.js +1 -2
- package/dist/components/theme-toggle.js +1 -2
- package/dist/components/thinking.js +1 -2
- package/dist/components/toast.js +1 -2
- package/dist/components/toggle-group.js +1 -2
- package/dist/components/toggle.js +1 -2
- package/dist/components/tool-chips.js +1 -2
- package/dist/components/toolbar.js +1 -2
- package/dist/components/tooltip.js +1 -2
- package/dist/components/typeahead-field.js +6 -21
- package/dist/components/typeahead-field.js.map +1 -1
- package/dist/components/upload-queue.js +1 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +11 -11
- package/dist/models/agent-feedback.js +1 -2
- package/dist/models/avatar.js +1 -2
- package/dist/models/code.js +1 -2
- package/dist/models/context-cards.js +1 -2
- package/dist/models/diff-table.js +1 -2
- package/dist/models/recommendation.js +1 -2
- package/dist/providers/accent.js +2 -7
- package/dist/providers/accent.js.map +1 -1
- package/dist/providers/link.js +1 -2
- package/dist/providers/theme.js +2 -7
- package/dist/providers/theme.js.map +1 -1
- package/dist/styles/standalone.css +55 -11
- package/dist/styles/tailwind.css +2 -0
- package/dist/styles/tokens.css +51 -6
- package/dist/utils/cn.js +1 -2
- package/dist/utils/control-surface.js +1 -2
- package/dist/utils/navigation.d.ts +1 -1
- package/dist/utils/navigation.js +2 -3
- package/dist/utils/navigation.js.map +1 -1
- package/dist/utils/preference-store.js +1 -2
- package/dist/utils/selection-indicator.js +1 -2
- package/dist/utils/use-checkable-group.js +1 -2
- package/dist/utils/use-hover-highlight.js +2 -3
- package/dist/utils/use-hover-highlight.js.map +1 -1
- package/dist/viewmodels/use-approval-card.js +11 -13
- package/dist/viewmodels/use-approval-card.js.map +1 -1
- package/dist/viewmodels/use-chat-composer.js +1 -2
- package/dist/viewmodels/use-chat-message.js +1 -2
- package/dist/viewmodels/use-code-block.js +1 -2
- package/dist/viewmodels/use-code-block.js.map +1 -1
- package/dist/viewmodels/use-context-cards.js +1 -2
- package/dist/viewmodels/use-diff-table.js +1 -2
- package/dist/viewmodels/use-diff-table.js.map +1 -1
- package/dist/viewmodels/use-loader.js +1 -2
- package/dist/viewmodels/use-recommendation-card.js +1 -2
- package/dist/viewmodels/use-recommendation-card.js.map +1 -1
- package/dist/viewmodels/use-thinking.js +1 -2
- package/dist/viewmodels/use-tool-chips.js +1 -2
- package/package.json +1 -1
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { cn as e } from "../utils/cn.js";
|
|
3
3
|
import { BASALT_UI_CLASS as t } from "../utils/control-surface.js";
|
|
4
4
|
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
5
|
-
|
|
5
|
+
// src/components/chat-bubble.tsx
|
|
6
6
|
function i({ variant: i = "assistant", streaming: a = !1, className: o, children: s }) {
|
|
7
7
|
if (i === "system") return /* @__PURE__ */ n("p", {
|
|
8
8
|
className: e(t, "px-basalt-space-sm text-center text-basalt-sm text-basalt-muted-foreground", o),
|
|
@@ -21,7 +21,6 @@ function i({ variant: i = "assistant", streaming: a = !1, className: o, children
|
|
|
21
21
|
})
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
|
-
//#endregion
|
|
25
24
|
export { i as ChatBubble };
|
|
26
25
|
|
|
27
26
|
//# sourceMappingURL=chat-bubble.js.map
|
|
@@ -6,7 +6,7 @@ import { InputArea as r } from "./input-area.js";
|
|
|
6
6
|
import { useId as i, useRef as a } from "react";
|
|
7
7
|
import { ArrowUp as o, Paperclip as s, Square as c, X as l } from "lucide-react";
|
|
8
8
|
import { Fragment as u, jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
9
|
-
|
|
9
|
+
// src/components/chat-composer.tsx
|
|
10
10
|
function p({ disabled: p = !1, streaming: m = !1, label: h = "Message", placeholder: g, onSend: _, onCancel: v, sendLabel: y = "Send message", cancelLabel: b = "Stop generating", className: x, value: S, defaultValue: C, onValueChange: w, toolbar: T, attachments: E = [], onRemoveAttachment: D, onFilesSelect: O, accept: k }) {
|
|
11
11
|
let A = n({
|
|
12
12
|
value: S,
|
|
@@ -133,7 +133,6 @@ function p({ disabled: p = !1, streaming: m = !1, label: h = "Message", placehol
|
|
|
133
133
|
})]
|
|
134
134
|
});
|
|
135
135
|
}
|
|
136
|
-
//#endregion
|
|
137
136
|
export { p as ChatComposer };
|
|
138
137
|
|
|
139
138
|
//# sourceMappingURL=chat-composer.js.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { cn as e } from "../utils/cn.js";
|
|
3
3
|
import { BASALT_UI_CLASS as t } from "../utils/control-surface.js";
|
|
4
4
|
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
5
|
-
|
|
5
|
+
// src/components/chat-header.tsx
|
|
6
6
|
function i({ title: i, subtitle: a, leading: o, children: s, className: c, ...l }) {
|
|
7
7
|
return /* @__PURE__ */ r("header", {
|
|
8
8
|
className: e(t, "flex items-center justify-between gap-basalt-content-gap border-b border-basalt-border/50 px-basalt-panel-x py-basalt-panel-y leading-[var(--basalt-line-body)]", c),
|
|
@@ -28,7 +28,6 @@ function i({ title: i, subtitle: a, leading: o, children: s, className: c, ...l
|
|
|
28
28
|
}) : null]
|
|
29
29
|
});
|
|
30
30
|
}
|
|
31
|
-
//#endregion
|
|
32
31
|
export { i as ChatHeader };
|
|
33
32
|
|
|
34
33
|
//# sourceMappingURL=chat-header.js.map
|
|
@@ -3,7 +3,7 @@ import { cn as e } from "../utils/cn.js";
|
|
|
3
3
|
import { useHoverHighlight as t } from "../utils/use-hover-highlight.js";
|
|
4
4
|
import { NAV_ITEM_CLASS as n, NAV_LIST_CLASS as r } from "../utils/navigation.js";
|
|
5
5
|
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
6
|
-
|
|
6
|
+
// src/components/chat-inbox.tsx
|
|
7
7
|
function o({ items: o, activeId: s, onSelect: c, className: l, ...u }) {
|
|
8
8
|
let d = t();
|
|
9
9
|
return /* @__PURE__ */ i("nav", {
|
|
@@ -42,7 +42,6 @@ function o({ items: o, activeId: s, onSelect: c, className: l, ...u }) {
|
|
|
42
42
|
})
|
|
43
43
|
});
|
|
44
44
|
}
|
|
45
|
-
//#endregion
|
|
46
45
|
export { o as ChatInbox };
|
|
47
46
|
|
|
48
47
|
//# sourceMappingURL=chat-inbox.js.map
|
|
@@ -6,7 +6,7 @@ import { Fragment as r, useMemo as i } from "react";
|
|
|
6
6
|
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
7
7
|
import { decodeHTML as s } from "entities";
|
|
8
8
|
import { marked as c } from "marked";
|
|
9
|
-
|
|
9
|
+
// src/components/chat-markdown.tsx
|
|
10
10
|
function l(i, c = !1) {
|
|
11
11
|
return i.map((i, u) => {
|
|
12
12
|
let d = i, f;
|
|
@@ -116,7 +116,6 @@ function u({ content: t, streaming: n = !1, className: r }) {
|
|
|
116
116
|
children: o
|
|
117
117
|
});
|
|
118
118
|
}
|
|
119
|
-
//#endregion
|
|
120
119
|
export { u as ChatMarkdown };
|
|
121
120
|
|
|
122
121
|
//# sourceMappingURL=chat-markdown.js.map
|
|
@@ -6,7 +6,7 @@ import { useChatMessage as a } from "../viewmodels/use-chat-message.js";
|
|
|
6
6
|
import { ChatMarkdown as o } from "./chat-markdown.js";
|
|
7
7
|
import { Check as s, Copy as c, ExternalLink as l, FileText as u, Pencil as d, RotateCcw as f, ThumbsDown as p, ThumbsUp as m } from "lucide-react";
|
|
8
8
|
import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
9
|
-
|
|
9
|
+
// src/components/chat-message.tsx
|
|
10
10
|
function v({ variant: v, content: y, streaming: b, trace: x, children: S, author: C, onEdit: w, onRegenerate: T, feedback: E, onFeedback: D, className: O, sources: k = [], sourcesLabel: A = "Sources" }) {
|
|
11
11
|
let j = a(y, k);
|
|
12
12
|
return /* @__PURE__ */ _("article", {
|
|
@@ -139,7 +139,6 @@ function v({ variant: v, content: y, streaming: b, trace: x, children: S, author
|
|
|
139
139
|
})]
|
|
140
140
|
});
|
|
141
141
|
}
|
|
142
|
-
//#endregion
|
|
143
142
|
export { v as ChatMessage };
|
|
144
143
|
|
|
145
144
|
//# sourceMappingURL=chat-message.js.map
|
|
@@ -7,7 +7,7 @@ import * as i from "react";
|
|
|
7
7
|
import { Check as a, Minus as o } from "lucide-react";
|
|
8
8
|
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
9
9
|
import * as l from "@radix-ui/react-checkbox";
|
|
10
|
-
|
|
10
|
+
// src/components/checkbox.tsx
|
|
11
11
|
var u = {
|
|
12
12
|
sm: "h-basalt-check-sm w-basalt-check-sm",
|
|
13
13
|
default: "h-basalt-check w-basalt-check"
|
|
@@ -100,7 +100,6 @@ var y = Object.assign(h, {
|
|
|
100
100
|
Legend: _,
|
|
101
101
|
Item: v
|
|
102
102
|
});
|
|
103
|
-
//#endregion
|
|
104
103
|
export { y as Checkbox };
|
|
105
104
|
|
|
106
105
|
//# sourceMappingURL=checkbox.js.map
|
|
@@ -5,7 +5,7 @@ import { Button as n } from "./button.js";
|
|
|
5
5
|
import { useState as r } from "react";
|
|
6
6
|
import { Check as i, Copy as a } from "lucide-react";
|
|
7
7
|
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
8
|
-
|
|
8
|
+
// src/components/clipboard-text.tsx
|
|
9
9
|
function c({ text: c, copyText: l, className: u }) {
|
|
10
10
|
let [d, f] = r(!1);
|
|
11
11
|
return /* @__PURE__ */ s("div", {
|
|
@@ -27,7 +27,6 @@ function c({ text: c, copyText: l, className: u }) {
|
|
|
27
27
|
})]
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
|
-
//#endregion
|
|
31
30
|
export { c as ClipboardText };
|
|
32
31
|
|
|
33
32
|
//# sourceMappingURL=clipboard-text.js.map
|
package/dist/components/code.js
CHANGED
|
@@ -6,7 +6,7 @@ import { useCodeBlock as r } from "../viewmodels/use-code-block.js";
|
|
|
6
6
|
import { useId as i } from "react";
|
|
7
7
|
import { Check as a, Copy as o, FileCode2 as s } from "lucide-react";
|
|
8
8
|
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
9
|
-
|
|
9
|
+
// src/components/code.tsx
|
|
10
10
|
function u({ className: t, ...n }) {
|
|
11
11
|
return /* @__PURE__ */ c("code", {
|
|
12
12
|
className: e("rounded-basalt-sm bg-basalt-secondary px-basalt-space-md py-basalt-space-xs font-mono text-basalt-sm text-basalt-foreground", t),
|
|
@@ -102,7 +102,6 @@ function p({ children: u, title: d, icon: f = /* @__PURE__ */ c(s, { strokeWidth
|
|
|
102
102
|
]
|
|
103
103
|
});
|
|
104
104
|
}
|
|
105
|
-
//#endregion
|
|
106
105
|
export { u as Code, d as CodeBlock, f as CodeHighlighted };
|
|
107
106
|
|
|
108
107
|
//# sourceMappingURL=code.js.map
|
|
@@ -5,7 +5,7 @@ import * as r from "react";
|
|
|
5
5
|
import { ChevronDown as i } from "lucide-react";
|
|
6
6
|
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
7
7
|
import * as s from "@radix-ui/react-collapsible";
|
|
8
|
-
|
|
8
|
+
// src/components/collapsible.tsx
|
|
9
9
|
var c = s.Root, l = r.forwardRef(({ className: r, children: c, asChild: l = !1, ...u }, d) => l ? /* @__PURE__ */ a(s.CollapsibleTrigger, {
|
|
10
10
|
ref: d,
|
|
11
11
|
asChild: !0,
|
|
@@ -36,7 +36,6 @@ var u = r.forwardRef(({ className: t, children: r, unstyled: i = !1, ...o }, c)
|
|
|
36
36
|
})
|
|
37
37
|
}));
|
|
38
38
|
u.displayName = s.CollapsibleContent.displayName;
|
|
39
|
-
//#endregion
|
|
40
39
|
export { c as Collapsible, u as CollapsibleContent, l as CollapsibleTrigger };
|
|
41
40
|
|
|
42
41
|
//# sourceMappingURL=collapsible.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collapsible.js","names":["React","CollapsiblePrimitive","Collapsible","CollapsibleTrigger","props","asChild","cn","FOCUS_INSET","OVERLAY_MOTION","className","ChevronDown","CollapsibleContent","unstyled","children"],"sources":["../../src/components/collapsible.tsx"],"sourcesContent":["import * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\";\nimport { ChevronDown } from \"lucide-react\";\nimport * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { FOCUS_INSET, OVERLAY_MOTION } from \"./overlay\";\n\ntype RadixCollapsibleProps = React.ComponentPropsWithoutRef<typeof CollapsiblePrimitive.Root>;\ntype RadixCollapsibleTriggerProps = React.ComponentPropsWithoutRef<\n\ttypeof CollapsiblePrimitive.CollapsibleTrigger\n>;\ntype RadixCollapsibleContentProps = React.ComponentPropsWithoutRef<\n\ttypeof CollapsiblePrimitive.CollapsibleContent\n>;\n\nexport interface CollapsibleProps\n\textends Omit<\n\t\tRadixCollapsibleProps,\n\t\t\"open\" | \"defaultOpen\" | \"onOpenChange\" | \"disabled\" | \"asChild\" | \"children\"\n\t> {\n\t/**\n\t * Collapsible structure elements, typically CollapsibleTrigger and CollapsibleContent.\n\t */\n\tchildren?: React.ReactNode;\n\t/**\n\t * The controlled open state of the collapsible.\n\t */\n\topen?: RadixCollapsibleProps[\"open\"];\n\t/**\n\t * The uncontrolled initial open state of the collapsible.\n\t * @default false\n\t */\n\tdefaultOpen?: RadixCollapsibleProps[\"defaultOpen\"];\n\t/**\n\t * Called when the open state changes.\n\t */\n\tonOpenChange?: RadixCollapsibleProps[\"onOpenChange\"];\n\t/**\n\t * When true, prevents the user from interacting with the collapsible.\n\t * @default false\n\t */\n\tdisabled?: RadixCollapsibleProps[\"disabled\"];\n\t/**\n\t * Change the default rendered div element to the child element, merging props and behavior.\n\t * Note: Collapsible root is typed as React.FC and does not declare ref in its public Props;\n\t * forwards rest props and inherits native div attributes.\n\t * @default false\n\t */\n\tasChild?: RadixCollapsibleProps[\"asChild\"];\n}\n\nexport const Collapsible: React.FC<CollapsibleProps> = CollapsiblePrimitive.Root;\n\nexport interface CollapsibleTriggerProps\n\textends Omit<RadixCollapsibleTriggerProps, \"asChild\" | \"children\"> {\n\t/**\n\t * Content of the trigger button. When asChild is false, automatically renders\n\t * a text container span alongside an animated ChevronDown icon.\n\t */\n\tchildren?: React.ReactNode;\n\t/**\n\t * Change the default rendered button element to the child element, merging props and behavior.\n\t * When true, bypasses the default text span and ChevronDown icon wrapping.\n\t * CollapsibleTrigger forwards ref to HTMLButtonElement and inherits native button attributes.\n\t * @default false\n\t */\n\tasChild?: RadixCollapsibleTriggerProps[\"asChild\"];\n}\n\nexport const CollapsibleTrigger = React.forwardRef<\n\tReact.ElementRef<typeof CollapsiblePrimitive.CollapsibleTrigger>,\n\tCollapsibleTriggerProps\n>(({ className, children, asChild = false, ...props }, ref) => {\n\tif (asChild) {\n\t\treturn (\n\t\t\t<CollapsiblePrimitive.CollapsibleTrigger ref={ref} asChild className={className} {...props}>\n\t\t\t\t{children}\n\t\t\t</CollapsiblePrimitive.CollapsibleTrigger>\n\t\t);\n\t}\n\treturn (\n\t\t<CollapsiblePrimitive.CollapsibleTrigger\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"basalt-ui group/collapsible m-0 inline-flex min-w-0 cursor-pointer items-center gap-basalt-control-gap border-none bg-transparent p-0 text-left text-basalt-base font-medium leading-[var(--basalt-line-body)] text-basalt-foreground shadow-none select-none\",\n\t\t\t\tFOCUS_INSET,\n\t\t\t\tOVERLAY_MOTION,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"flex min-w-0 items-center gap-basalt-control-gap\">{children}</span>\n\t\t\t<ChevronDown\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tdata-slot=\"collapsible-chevron\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"size-basalt-icon-sm shrink-0 transition-transform basalt-motion duration-basalt-normal ease-basalt group-data-[state=open]/collapsible:rotate-180\",\n\t\t\t\t\tOVERLAY_MOTION,\n\t\t\t\t)}\n\t\t\t/>\n\t\t</CollapsiblePrimitive.CollapsibleTrigger>\n\t);\n});\nCollapsibleTrigger.displayName = CollapsiblePrimitive.CollapsibleTrigger.displayName;\n\nexport interface CollapsibleContentProps\n\textends Omit<RadixCollapsibleContentProps, \"unstyled\" | \"forceMount\" | \"asChild\"> {\n\t/**\n\t * Render children without the default inset border container.\n\t * Note: When unstyled is false (default), children are wrapped in an inner inset border div.\n\t * When combined with asChild, asChild slots onto that inner div unless unstyled={true} is set.\n\t * @default false\n\t */\n\tunstyled?: boolean;\n\t/**\n\t * Used to force mounting when more control is needed. Useful when\n\t * controlling animation with React animation libraries.\n\t */\n\tforceMount?: RadixCollapsibleContentProps[\"forceMount\"];\n\t/**\n\t * Change the default rendered div element to the child element, merging props and behavior.\n\t * Note: When unstyled is false, asChild operates within the inner inset div wrapper;\n\t * set unstyled={true} to slot directly onto the child element as the content/ref target.\n\t * CollapsibleContent forwards ref to HTMLDivElement and inherits native div attributes.\n\t * @default false\n\t */\n\tasChild?: RadixCollapsibleContentProps[\"asChild\"];\n}\n\nexport const CollapsibleContent = React.forwardRef<\n\tReact.ElementRef<typeof CollapsiblePrimitive.CollapsibleContent>,\n\tCollapsibleContentProps\n>(({ className, children, unstyled = false, ...props }, ref) => (\n\t<CollapsiblePrimitive.CollapsibleContent\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t\"overflow-hidden data-[state=closed]:animate-basalt-collapsible-up data-[state=open]:animate-basalt-collapsible-down\",\n\t\t\tOVERLAY_MOTION,\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t>\n\t\t{unstyled ? (\n\t\t\tchildren\n\t\t) : (\n\t\t\t<div className=\"my-basalt-layout-sm border-l-2 border-basalt-border px-basalt-card py-basalt-card-sm text-basalt-base text-basalt-foreground\">\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)}\n\t</CollapsiblePrimitive.CollapsibleContent>\n));\nCollapsibleContent.displayName = CollapsiblePrimitive.CollapsibleContent.displayName;\n"],"mappings":";;;;;;;;AAkDA,IAAaE,IAA0CD,EAAqB,MAkB/DE,IAAqBH,EAAM,YAGrC,EAAE,cAAW,aAAU,aAAU,IAAO,GAAGI,KAAS,MAClDC,IAEF,kBAACJ,EAAqB,oBAAtB;CAA8C;CAAK,SAAA;CAAmB;CAAW,GAAIG;CACnF;AACuC,CAAA,IAI1C,kBAACH,EAAqB,oBAAtB;CACM;CACL,WAAWK,EACV,iQACAC,GACAC,GACAC,CACD;CACA,GAAIL;CARL,UAAA,CAUC,kBAAC,QAAD;EAAM,WAAU;EAAoD;CAAe,CAAA,GACnF,kBAACM,GAAD;EACC,eAAY;EACZ,aAAU;EACV,WAAWJ,EACV,qJACAE,CACD;CACA,CAAA,CACuC;EAE1C;AACD,EAAmB,cAAcP,EAAqB,mBAAmB;AA0BzE,IAAaU,IAAqBX,EAAM,YAGrC,EAAE,cAAW,aAAU,cAAW,IAAO,GAAGI,KAAS,MACvD,kBAACH,EAAqB,oBAAtB;CACM;CACL,WAAWK,EACV,uHACAE,GACAC,CACD;CACA,GAAIL;CAEH,UAAAQ,IACAC,IAEA,kBAAC,OAAD;EAAK,WAAU;EACb;CACG,CAAA;AAEkC,CAAA,CACzC;AACD,EAAmB,cAAcZ,EAAqB,mBAAmB"}
|
|
1
|
+
{"version":3,"file":"collapsible.js","names":["React","CollapsiblePrimitive","Collapsible","CollapsibleTrigger","props","asChild","cn","FOCUS_INSET","OVERLAY_MOTION","className","ChevronDown","CollapsibleContent","unstyled","children"],"sources":["../../src/components/collapsible.tsx"],"sourcesContent":["import * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\";\nimport { ChevronDown } from \"lucide-react\";\nimport * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { FOCUS_INSET, OVERLAY_MOTION } from \"./overlay\";\n\ntype RadixCollapsibleProps = React.ComponentPropsWithoutRef<typeof CollapsiblePrimitive.Root>;\ntype RadixCollapsibleTriggerProps = React.ComponentPropsWithoutRef<\n\ttypeof CollapsiblePrimitive.CollapsibleTrigger\n>;\ntype RadixCollapsibleContentProps = React.ComponentPropsWithoutRef<\n\ttypeof CollapsiblePrimitive.CollapsibleContent\n>;\n\nexport interface CollapsibleProps\n\textends Omit<\n\t\tRadixCollapsibleProps,\n\t\t\"open\" | \"defaultOpen\" | \"onOpenChange\" | \"disabled\" | \"asChild\" | \"children\"\n\t> {\n\t/**\n\t * Collapsible structure elements, typically CollapsibleTrigger and CollapsibleContent.\n\t */\n\tchildren?: React.ReactNode;\n\t/**\n\t * The controlled open state of the collapsible.\n\t */\n\topen?: RadixCollapsibleProps[\"open\"];\n\t/**\n\t * The uncontrolled initial open state of the collapsible.\n\t * @default false\n\t */\n\tdefaultOpen?: RadixCollapsibleProps[\"defaultOpen\"];\n\t/**\n\t * Called when the open state changes.\n\t */\n\tonOpenChange?: RadixCollapsibleProps[\"onOpenChange\"];\n\t/**\n\t * When true, prevents the user from interacting with the collapsible.\n\t * @default false\n\t */\n\tdisabled?: RadixCollapsibleProps[\"disabled\"];\n\t/**\n\t * Change the default rendered div element to the child element, merging props and behavior.\n\t * Note: Collapsible root is typed as React.FC and does not declare ref in its public Props;\n\t * forwards rest props and inherits native div attributes.\n\t * @default false\n\t */\n\tasChild?: RadixCollapsibleProps[\"asChild\"];\n}\n\nexport const Collapsible: React.FC<CollapsibleProps> = CollapsiblePrimitive.Root;\n\nexport interface CollapsibleTriggerProps\n\textends Omit<RadixCollapsibleTriggerProps, \"asChild\" | \"children\"> {\n\t/**\n\t * Content of the trigger button. When asChild is false, automatically renders\n\t * a text container span alongside an animated ChevronDown icon.\n\t */\n\tchildren?: React.ReactNode;\n\t/**\n\t * Change the default rendered button element to the child element, merging props and behavior.\n\t * When true, bypasses the default text span and ChevronDown icon wrapping.\n\t * CollapsibleTrigger forwards ref to HTMLButtonElement and inherits native button attributes.\n\t * @default false\n\t */\n\tasChild?: RadixCollapsibleTriggerProps[\"asChild\"];\n}\n\nexport const CollapsibleTrigger = React.forwardRef<\n\tReact.ElementRef<typeof CollapsiblePrimitive.CollapsibleTrigger>,\n\tCollapsibleTriggerProps\n>(({ className, children, asChild = false, ...props }, ref) => {\n\tif (asChild) {\n\t\treturn (\n\t\t\t<CollapsiblePrimitive.CollapsibleTrigger ref={ref} asChild className={className} {...props}>\n\t\t\t\t{children}\n\t\t\t</CollapsiblePrimitive.CollapsibleTrigger>\n\t\t);\n\t}\n\treturn (\n\t\t<CollapsiblePrimitive.CollapsibleTrigger\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"basalt-ui group/collapsible m-0 inline-flex min-w-0 cursor-pointer items-center gap-basalt-control-gap border-none bg-transparent p-0 text-left text-basalt-base font-medium leading-[var(--basalt-line-body)] text-basalt-foreground shadow-none select-none\",\n\t\t\t\tFOCUS_INSET,\n\t\t\t\tOVERLAY_MOTION,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"flex min-w-0 items-center gap-basalt-control-gap\">{children}</span>\n\t\t\t<ChevronDown\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tdata-slot=\"collapsible-chevron\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"size-basalt-icon-sm shrink-0 transition-transform basalt-motion duration-basalt-normal ease-basalt group-data-[state=open]/collapsible:rotate-180\",\n\t\t\t\t\tOVERLAY_MOTION,\n\t\t\t\t)}\n\t\t\t/>\n\t\t</CollapsiblePrimitive.CollapsibleTrigger>\n\t);\n});\nCollapsibleTrigger.displayName = CollapsiblePrimitive.CollapsibleTrigger.displayName;\n\nexport interface CollapsibleContentProps\n\textends Omit<RadixCollapsibleContentProps, \"unstyled\" | \"forceMount\" | \"asChild\"> {\n\t/**\n\t * Render children without the default inset border container.\n\t * Note: When unstyled is false (default), children are wrapped in an inner inset border div.\n\t * When combined with asChild, asChild slots onto that inner div unless unstyled={true} is set.\n\t * @default false\n\t */\n\tunstyled?: boolean;\n\t/**\n\t * Used to force mounting when more control is needed. Useful when\n\t * controlling animation with React animation libraries.\n\t */\n\tforceMount?: RadixCollapsibleContentProps[\"forceMount\"];\n\t/**\n\t * Change the default rendered div element to the child element, merging props and behavior.\n\t * Note: When unstyled is false, asChild operates within the inner inset div wrapper;\n\t * set unstyled={true} to slot directly onto the child element as the content/ref target.\n\t * CollapsibleContent forwards ref to HTMLDivElement and inherits native div attributes.\n\t * @default false\n\t */\n\tasChild?: RadixCollapsibleContentProps[\"asChild\"];\n}\n\nexport const CollapsibleContent = React.forwardRef<\n\tReact.ElementRef<typeof CollapsiblePrimitive.CollapsibleContent>,\n\tCollapsibleContentProps\n>(({ className, children, unstyled = false, ...props }, ref) => (\n\t<CollapsiblePrimitive.CollapsibleContent\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t\"overflow-hidden data-[state=closed]:animate-basalt-collapsible-up data-[state=open]:animate-basalt-collapsible-down\",\n\t\t\tOVERLAY_MOTION,\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t>\n\t\t{unstyled ? (\n\t\t\tchildren\n\t\t) : (\n\t\t\t<div className=\"my-basalt-layout-sm border-l-2 border-basalt-border px-basalt-card py-basalt-card-sm text-basalt-base text-basalt-foreground\">\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)}\n\t</CollapsiblePrimitive.CollapsibleContent>\n));\nCollapsibleContent.displayName = CollapsiblePrimitive.CollapsibleContent.displayName;\n"],"mappings":";;;;;;;;AAkDA,IAAaE,IAA0CD,EAAqB,MAkB/DE,IAAqBH,EAAM,YAGrC,EAAE,cAAW,aAAU,aAAU,IAAO,GAAGI,KAAS,MAClDC,IAEF,kBAACJ,EAAqB,oBAAtB;CAA8C;CAAK,SAAA;CAAmB;CAAW,GAAIG;CACnF;AACuC,CAAA,IAI1C,kBAACH,EAAqB,oBAAtB;CACM;CACL,WAAWK,EACV,iQACAC,GACAC,GACAC,CACD;CACA,GAAIL;CARL,UAAA,CAUC,kBAAC,QAAD;EAAM,WAAU;EAAoD;CAAe,CAAA,GACnF,kBAACM,GAAD;EACC,eAAY;EACZ,aAAU;EACV,WAAWJ,EACV,qJACAE,CACD;CACA,CAAA,CACuC;A,EAE1C;AACD,EAAmB,cAAcP,EAAqB,mBAAmB;AA0BzE,IAAaU,IAAqBX,EAAM,YAGrC,EAAE,cAAW,aAAU,cAAW,IAAO,GAAGI,KAAS,MACvD,kBAACH,EAAqB,oBAAtB;CACM;CACL,WAAWK,EACV,uHACAE,GACAC,CACD;CACA,GAAIL;CAEH,UAAAQ,IACAC,IAEA,kBAAC,OAAD;EAAK,WAAU;EACb;CACG,CAAA;AAEkC,CAAA,CACzC;AACD,EAAmB,cAAcZ,EAAqB,mBAAmB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { TypeaheadField as e } from "./typeahead-field.js";
|
|
3
3
|
import { jsx as t } from "react/jsx-runtime";
|
|
4
|
-
|
|
4
|
+
// src/components/combobox.tsx
|
|
5
5
|
function n({ placeholder: n = "Select…", ...r }) {
|
|
6
6
|
return /* @__PURE__ */ t(e, {
|
|
7
7
|
placeholder: n,
|
|
@@ -9,7 +9,6 @@ function n({ placeholder: n = "Select…", ...r }) {
|
|
|
9
9
|
...r
|
|
10
10
|
});
|
|
11
11
|
}
|
|
12
|
-
//#endregion
|
|
13
12
|
export { n as Combobox };
|
|
14
13
|
|
|
15
14
|
//# sourceMappingURL=combobox.js.map
|
|
@@ -6,7 +6,7 @@ import * as o from "react";
|
|
|
6
6
|
import { Search as s } from "lucide-react";
|
|
7
7
|
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
8
8
|
import { Command as u } from "cmdk";
|
|
9
|
-
|
|
9
|
+
// src/components/command-palette.tsx
|
|
10
10
|
var d = o.forwardRef(({ className: t, ...n }, r) => /* @__PURE__ */ c(u, {
|
|
11
11
|
ref: r,
|
|
12
12
|
className: e("flex min-h-0 w-full flex-col overflow-hidden rounded-basalt-md bg-basalt-popover text-basalt-popover-foreground", t),
|
|
@@ -110,7 +110,6 @@ function x({ className: t, ...n }) {
|
|
|
110
110
|
});
|
|
111
111
|
}
|
|
112
112
|
x.displayName = "CommandShortcut";
|
|
113
|
-
//#endregion
|
|
114
113
|
export { _ as CommandEmpty, v as CommandGroup, m as CommandInput, b as CommandItem, g as CommandList, p as CommandPalette, f as CommandPaletteTrigger, y as CommandSeparator, x as CommandShortcut };
|
|
115
114
|
|
|
116
115
|
//# sourceMappingURL=command-palette.js.map
|
|
@@ -4,7 +4,7 @@ import { AlertDialog as t, AlertDialogContent as n, AlertDialogDescription as r,
|
|
|
4
4
|
import * as c from "@radix-ui/react-alert-dialog";
|
|
5
5
|
import * as l from "react";
|
|
6
6
|
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
7
|
-
|
|
7
|
+
// src/components/confirm-dialog.tsx
|
|
8
8
|
function f({ cancelLabel: f = "Cancel", confirmLabel: p = "Confirm", description: m, loading: h = !1, onConfirm: g, onCloseAutoFocus: _, onOpenChange: v, open: y, title: b, trigger: x, variant: S = "default" }) {
|
|
9
9
|
let C = l.useRef(null), w = l.useRef(null), T = l.useRef(null), E = l.useRef(null), D = l.useCallback(() => {
|
|
10
10
|
C.current?.isConnected ? C.current.focus() : E.current?.isConnected && E.current.focus(), E.current = null;
|
|
@@ -21,18 +21,10 @@ function f({ cancelLabel: f = "Cancel", confirmLabel: p = "Confirm", description
|
|
|
21
21
|
}) : null, /* @__PURE__ */ d(n, {
|
|
22
22
|
ref: w,
|
|
23
23
|
onOpenAutoFocus: (e) => {
|
|
24
|
-
|
|
25
|
-
T.current.focus();
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
w.current?.focus();
|
|
24
|
+
e.preventDefault(), !E.current?.isConnected && document.activeElement instanceof HTMLElement && !w.current?.contains(document.activeElement) && (E.current = document.activeElement), T.current && !T.current.disabled ? T.current.focus() : w.current?.focus();
|
|
29
25
|
},
|
|
30
26
|
onCloseAutoFocus: (e) => {
|
|
31
|
-
|
|
32
|
-
E.current = null;
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
e.preventDefault(), D();
|
|
27
|
+
_?.(e), e.defaultPrevented ? E.current = null : (e.preventDefault(), D());
|
|
36
28
|
},
|
|
37
29
|
children: [/* @__PURE__ */ d(a, { children: [/* @__PURE__ */ u(o, { children: b }), /* @__PURE__ */ u(r, { children: m })] }), /* @__PURE__ */ d(i, { children: [/* @__PURE__ */ u(c.Cancel, {
|
|
38
30
|
asChild: !0,
|
|
@@ -86,7 +78,6 @@ function p() {
|
|
|
86
78
|
}
|
|
87
79
|
};
|
|
88
80
|
}
|
|
89
|
-
//#endregion
|
|
90
81
|
export { f as ConfirmDialog, p as useConfirm };
|
|
91
82
|
|
|
92
83
|
//# sourceMappingURL=confirm-dialog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confirm-dialog.js","names":["AlertDialogPrimitive","React","ConfirmDialog","triggerRef","panelRef","cancelRef","openerRef","restoreFocus","AlertDialog","next","onOpenChange","trigger","AlertDialogTrigger","AlertDialogContent","event","onCloseAutoFocus","AlertDialogHeader","AlertDialogTitle","title","AlertDialogDescription","description","AlertDialogFooter","Button","loading","cancelLabel","onConfirm","confirmLabel","useConfirm","open","setOpen","options","setOptions","resolverRef","settle","resolve","value"],"sources":["../../src/components/confirm-dialog.tsx"],"sourcesContent":["import * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\nimport * as React from \"react\";\nimport {\n\tAlertDialog,\n\tAlertDialogContent,\n\ttype AlertDialogContentProps,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogTitle,\n\tAlertDialogTrigger,\n} from \"./alert-dialog\";\nimport { Button } from \"./button\";\n\nexport type ConfirmDialogVariant = \"default\" | \"destructive\";\n\nexport interface ConfirmDialogProps {\n\t/** Whether the confirmation dialog is shown. */\n\topen: boolean;\n\t/** Called when the dialog requests to open or close. */\n\tonOpenChange: (open: boolean) => void;\n\t/** Runs after the close focus trap releases. Prevent default to focus a replacement control. */\n\tonCloseAutoFocus?: AlertDialogContentProps[\"onCloseAutoFocus\"];\n\t/** Called once when the user confirms. The dialog does not close itself; caller manages loading and asynchronous errors. */\n\tonConfirm: () => void | Promise<void>;\n\t/** The dialog title. */\n\ttitle: React.ReactNode;\n\t/** Supporting copy that describes the action. */\n\tdescription: React.ReactNode;\n\t/**\n\t * Label for the confirm button.\n\t * @default \"Confirm\"\n\t */\n\tconfirmLabel?: React.ReactNode;\n\t/**\n\t * Label for the cancel button.\n\t * @default \"Cancel\"\n\t */\n\tcancelLabel?: React.ReactNode;\n\t/**\n\t * Appearance of the confirm button.\n\t * @default \"default\"\n\t */\n\tvariant?: ConfirmDialogVariant;\n\t/**\n\t * Disable both actions and ignore close requests while work is pending.\n\t * @default false\n\t */\n\tloading?: boolean;\n\t/**\n\t * Control that opens the dialog. When set, closing restores focus to it.\n\t */\n\ttrigger?: React.ReactElement;\n}\n\nexport interface UseConfirmOptions {\n\t/** The dialog title. */\n\ttitle: React.ReactNode;\n\t/** Supporting copy that describes the action. */\n\tdescription: React.ReactNode;\n\t/** Label for the confirm button. */\n\tconfirmLabel?: React.ReactNode;\n\t/** Label for the cancel button. */\n\tcancelLabel?: React.ReactNode;\n\t/** Appearance of the confirm button. */\n\tvariant?: ConfirmDialogVariant;\n}\n\nexport interface UseConfirmResult {\n\tconfirm: (options: UseConfirmOptions) => Promise<boolean>;\n\tdialogProps: ConfirmDialogProps;\n}\n\nexport function ConfirmDialog({\n\tcancelLabel = \"Cancel\",\n\tconfirmLabel = \"Confirm\",\n\tdescription,\n\tloading = false,\n\tonConfirm,\n\tonCloseAutoFocus,\n\tonOpenChange,\n\topen,\n\ttitle,\n\ttrigger,\n\tvariant = \"default\",\n}: ConfirmDialogProps) {\n\tconst triggerRef = React.useRef<HTMLButtonElement>(null);\n\tconst panelRef = React.useRef<HTMLDivElement>(null);\n\tconst cancelRef = React.useRef<HTMLButtonElement>(null);\n\tconst openerRef = React.useRef<HTMLElement | null>(null);\n\n\tconst restoreFocus = React.useCallback(() => {\n\t\tif (triggerRef.current?.isConnected) {\n\t\t\ttriggerRef.current.focus();\n\t\t} else if (openerRef.current?.isConnected) {\n\t\t\topenerRef.current.focus();\n\t\t}\n\t\topenerRef.current = null;\n\t}, []);\n\n\treturn (\n\t\t<AlertDialog\n\t\t\topen={open}\n\t\t\tonOpenChange={(next) => {\n\t\t\t\tif (loading && !next) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonOpenChange(next);\n\t\t\t}}\n\t\t>\n\t\t\t{React.isValidElement(trigger) ? (\n\t\t\t\t<AlertDialogTrigger ref={triggerRef} asChild>\n\t\t\t\t\t{trigger}\n\t\t\t\t</AlertDialogTrigger>\n\t\t\t) : null}\n\t\t\t<AlertDialogContent\n\t\t\t\tref={panelRef}\n\t\t\t\tonOpenAutoFocus={(event) => {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tif (\n\t\t\t\t\t\t!openerRef.current?.isConnected &&\n\t\t\t\t\t\tdocument.activeElement instanceof HTMLElement &&\n\t\t\t\t\t\t!panelRef.current?.contains(document.activeElement)\n\t\t\t\t\t) {\n\t\t\t\t\t\topenerRef.current = document.activeElement;\n\t\t\t\t\t}\n\t\t\t\t\tif (cancelRef.current && !cancelRef.current.disabled) {\n\t\t\t\t\t\tcancelRef.current.focus();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tpanelRef.current?.focus();\n\t\t\t\t}}\n\t\t\t\tonCloseAutoFocus={(event) => {\n\t\t\t\t\tonCloseAutoFocus?.(event);\n\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\topenerRef.current = null;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\trestoreFocus();\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<AlertDialogHeader>\n\t\t\t\t\t<AlertDialogTitle>{title}</AlertDialogTitle>\n\t\t\t\t\t<AlertDialogDescription>{description}</AlertDialogDescription>\n\t\t\t\t</AlertDialogHeader>\n\t\t\t\t<AlertDialogFooter>\n\t\t\t\t\t<AlertDialogPrimitive.Cancel asChild>\n\t\t\t\t\t\t<Button ref={cancelRef} disabled={loading} variant=\"outline\">\n\t\t\t\t\t\t\t{cancelLabel}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</AlertDialogPrimitive.Cancel>\n\t\t\t\t\t<AlertDialogPrimitive.Action asChild>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tloading={loading}\n\t\t\t\t\t\t\tvariant={variant}\n\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tif (!loading) {\n\t\t\t\t\t\t\t\t\tvoid onConfirm();\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\t\t{confirmLabel}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</AlertDialogPrimitive.Action>\n\t\t\t\t</AlertDialogFooter>\n\t\t\t</AlertDialogContent>\n\t\t</AlertDialog>\n\t);\n}\n\nexport function useConfirm(): UseConfirmResult {\n\tconst [open, setOpen] = React.useState(false);\n\tconst [options, setOptions] = React.useState<UseConfirmOptions>({\n\t\ttitle: \"\",\n\t\tdescription: \"\",\n\t});\n\tconst resolverRef = React.useRef<((value: boolean) => void) | null>(null);\n\n\tconst settle = React.useCallback((value: boolean) => {\n\t\tconst resolve = resolverRef.current;\n\t\tresolverRef.current = null;\n\t\tresolve?.(value);\n\t}, []);\n\n\tReact.useEffect(() => {\n\t\treturn () => {\n\t\t\tsettle(false);\n\t\t};\n\t}, [settle]);\n\n\tconst confirm = React.useCallback(\n\t\t(next: UseConfirmOptions) => {\n\t\t\tsettle(false);\n\t\t\tsetOptions(next);\n\t\t\tsetOpen(true);\n\t\t\treturn new Promise<boolean>((resolve) => {\n\t\t\t\tresolverRef.current = resolve;\n\t\t\t});\n\t\t},\n\t\t[settle],\n\t);\n\n\treturn {\n\t\tconfirm,\n\t\tdialogProps: {\n\t\t\topen,\n\t\t\ttitle: options.title,\n\t\t\tdescription: options.description,\n\t\t\tconfirmLabel: options.confirmLabel,\n\t\t\tcancelLabel: options.cancelLabel,\n\t\t\tvariant: options.variant,\n\t\t\tonOpenChange: (next) => {\n\t\t\t\tsetOpen(next);\n\t\t\t\tif (!next) {\n\t\t\t\t\tsettle(false);\n\t\t\t\t}\n\t\t\t},\n\t\t\tonConfirm: () => {\n\t\t\t\tsettle(true);\n\t\t\t\tsetOpen(false);\n\t\t\t},\n\t\t},\n\t};\n}\n"],"mappings":";;;;;;;AAyEA,SAAgBE,EAAc,EAC7B,iBAAc,UACd,kBAAe,WACf,gBACA,aAAU,IACV,cACA,qBACA,iBACA,SACA,UACA,YACA,aAAU,aACY;CACtB,IAAMC,IAAaF,EAAM,OAA0B,IAAI,GACjDG,IAAWH,EAAM,OAAuB,IAAI,GAC5CI,IAAYJ,EAAM,OAA0B,IAAI,GAChDK,IAAYL,EAAM,OAA2B,IAAI,GAEjDM,IAAeN,EAAM,kBAAkB;EAM5C,AALIE,EAAW,SAAS,cACvBA,EAAW,QAAQ,MAAM,IACfG,EAAU,SAAS,eAC7BA,EAAU,QAAQ,MAAM,GAEzB,EAAU,UAAU;CACrB,GAAG,CAAC,CAAC;CAEL,OACC,kBAACE,GAAD;EACO;EACN,eAAe,MAAS;GACvB,CAAI,MAAYC,MAGhBC,EAAaD,CAAI;EAClB;EAPD,UAAA,CASER,EAAM,eAAeU,CAAO,IAC5B,kBAACC,GAAD;GAAoB,KAAKT;GAAY,SAAA;GACnC,UAAAQ;EACkB,CAAA,IACjB,MACJ,kBAACE,GAAD;GACC,KAAKT;GACL,kBAAkB,MAAU;IAS3B,
|
|
1
|
+
{"version":3,"file":"confirm-dialog.js","names":["AlertDialogPrimitive","React","ConfirmDialog","triggerRef","panelRef","cancelRef","openerRef","restoreFocus","AlertDialog","next","onOpenChange","trigger","AlertDialogTrigger","AlertDialogContent","event","onCloseAutoFocus","AlertDialogHeader","AlertDialogTitle","title","AlertDialogDescription","description","AlertDialogFooter","Button","loading","cancelLabel","onConfirm","confirmLabel","useConfirm","open","setOpen","options","setOptions","resolverRef","settle","resolve","value"],"sources":["../../src/components/confirm-dialog.tsx"],"sourcesContent":["import * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\nimport * as React from \"react\";\nimport {\n\tAlertDialog,\n\tAlertDialogContent,\n\ttype AlertDialogContentProps,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogTitle,\n\tAlertDialogTrigger,\n} from \"./alert-dialog\";\nimport { Button } from \"./button\";\n\nexport type ConfirmDialogVariant = \"default\" | \"destructive\";\n\nexport interface ConfirmDialogProps {\n\t/** Whether the confirmation dialog is shown. */\n\topen: boolean;\n\t/** Called when the dialog requests to open or close. */\n\tonOpenChange: (open: boolean) => void;\n\t/** Runs after the close focus trap releases. Prevent default to focus a replacement control. */\n\tonCloseAutoFocus?: AlertDialogContentProps[\"onCloseAutoFocus\"];\n\t/** Called once when the user confirms. The dialog does not close itself; caller manages loading and asynchronous errors. */\n\tonConfirm: () => void | Promise<void>;\n\t/** The dialog title. */\n\ttitle: React.ReactNode;\n\t/** Supporting copy that describes the action. */\n\tdescription: React.ReactNode;\n\t/**\n\t * Label for the confirm button.\n\t * @default \"Confirm\"\n\t */\n\tconfirmLabel?: React.ReactNode;\n\t/**\n\t * Label for the cancel button.\n\t * @default \"Cancel\"\n\t */\n\tcancelLabel?: React.ReactNode;\n\t/**\n\t * Appearance of the confirm button.\n\t * @default \"default\"\n\t */\n\tvariant?: ConfirmDialogVariant;\n\t/**\n\t * Disable both actions and ignore close requests while work is pending.\n\t * @default false\n\t */\n\tloading?: boolean;\n\t/**\n\t * Control that opens the dialog. When set, closing restores focus to it.\n\t */\n\ttrigger?: React.ReactElement;\n}\n\nexport interface UseConfirmOptions {\n\t/** The dialog title. */\n\ttitle: React.ReactNode;\n\t/** Supporting copy that describes the action. */\n\tdescription: React.ReactNode;\n\t/** Label for the confirm button. */\n\tconfirmLabel?: React.ReactNode;\n\t/** Label for the cancel button. */\n\tcancelLabel?: React.ReactNode;\n\t/** Appearance of the confirm button. */\n\tvariant?: ConfirmDialogVariant;\n}\n\nexport interface UseConfirmResult {\n\tconfirm: (options: UseConfirmOptions) => Promise<boolean>;\n\tdialogProps: ConfirmDialogProps;\n}\n\nexport function ConfirmDialog({\n\tcancelLabel = \"Cancel\",\n\tconfirmLabel = \"Confirm\",\n\tdescription,\n\tloading = false,\n\tonConfirm,\n\tonCloseAutoFocus,\n\tonOpenChange,\n\topen,\n\ttitle,\n\ttrigger,\n\tvariant = \"default\",\n}: ConfirmDialogProps) {\n\tconst triggerRef = React.useRef<HTMLButtonElement>(null);\n\tconst panelRef = React.useRef<HTMLDivElement>(null);\n\tconst cancelRef = React.useRef<HTMLButtonElement>(null);\n\tconst openerRef = React.useRef<HTMLElement | null>(null);\n\n\tconst restoreFocus = React.useCallback(() => {\n\t\tif (triggerRef.current?.isConnected) {\n\t\t\ttriggerRef.current.focus();\n\t\t} else if (openerRef.current?.isConnected) {\n\t\t\topenerRef.current.focus();\n\t\t}\n\t\topenerRef.current = null;\n\t}, []);\n\n\treturn (\n\t\t<AlertDialog\n\t\t\topen={open}\n\t\t\tonOpenChange={(next) => {\n\t\t\t\tif (loading && !next) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonOpenChange(next);\n\t\t\t}}\n\t\t>\n\t\t\t{React.isValidElement(trigger) ? (\n\t\t\t\t<AlertDialogTrigger ref={triggerRef} asChild>\n\t\t\t\t\t{trigger}\n\t\t\t\t</AlertDialogTrigger>\n\t\t\t) : null}\n\t\t\t<AlertDialogContent\n\t\t\t\tref={panelRef}\n\t\t\t\tonOpenAutoFocus={(event) => {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tif (\n\t\t\t\t\t\t!openerRef.current?.isConnected &&\n\t\t\t\t\t\tdocument.activeElement instanceof HTMLElement &&\n\t\t\t\t\t\t!panelRef.current?.contains(document.activeElement)\n\t\t\t\t\t) {\n\t\t\t\t\t\topenerRef.current = document.activeElement;\n\t\t\t\t\t}\n\t\t\t\t\tif (cancelRef.current && !cancelRef.current.disabled) {\n\t\t\t\t\t\tcancelRef.current.focus();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tpanelRef.current?.focus();\n\t\t\t\t}}\n\t\t\t\tonCloseAutoFocus={(event) => {\n\t\t\t\t\tonCloseAutoFocus?.(event);\n\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\topenerRef.current = null;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\trestoreFocus();\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<AlertDialogHeader>\n\t\t\t\t\t<AlertDialogTitle>{title}</AlertDialogTitle>\n\t\t\t\t\t<AlertDialogDescription>{description}</AlertDialogDescription>\n\t\t\t\t</AlertDialogHeader>\n\t\t\t\t<AlertDialogFooter>\n\t\t\t\t\t<AlertDialogPrimitive.Cancel asChild>\n\t\t\t\t\t\t<Button ref={cancelRef} disabled={loading} variant=\"outline\">\n\t\t\t\t\t\t\t{cancelLabel}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</AlertDialogPrimitive.Cancel>\n\t\t\t\t\t<AlertDialogPrimitive.Action asChild>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tloading={loading}\n\t\t\t\t\t\t\tvariant={variant}\n\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tif (!loading) {\n\t\t\t\t\t\t\t\t\tvoid onConfirm();\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\t\t{confirmLabel}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</AlertDialogPrimitive.Action>\n\t\t\t\t</AlertDialogFooter>\n\t\t\t</AlertDialogContent>\n\t\t</AlertDialog>\n\t);\n}\n\nexport function useConfirm(): UseConfirmResult {\n\tconst [open, setOpen] = React.useState(false);\n\tconst [options, setOptions] = React.useState<UseConfirmOptions>({\n\t\ttitle: \"\",\n\t\tdescription: \"\",\n\t});\n\tconst resolverRef = React.useRef<((value: boolean) => void) | null>(null);\n\n\tconst settle = React.useCallback((value: boolean) => {\n\t\tconst resolve = resolverRef.current;\n\t\tresolverRef.current = null;\n\t\tresolve?.(value);\n\t}, []);\n\n\tReact.useEffect(() => {\n\t\treturn () => {\n\t\t\tsettle(false);\n\t\t};\n\t}, [settle]);\n\n\tconst confirm = React.useCallback(\n\t\t(next: UseConfirmOptions) => {\n\t\t\tsettle(false);\n\t\t\tsetOptions(next);\n\t\t\tsetOpen(true);\n\t\t\treturn new Promise<boolean>((resolve) => {\n\t\t\t\tresolverRef.current = resolve;\n\t\t\t});\n\t\t},\n\t\t[settle],\n\t);\n\n\treturn {\n\t\tconfirm,\n\t\tdialogProps: {\n\t\t\topen,\n\t\t\ttitle: options.title,\n\t\t\tdescription: options.description,\n\t\t\tconfirmLabel: options.confirmLabel,\n\t\t\tcancelLabel: options.cancelLabel,\n\t\t\tvariant: options.variant,\n\t\t\tonOpenChange: (next) => {\n\t\t\t\tsetOpen(next);\n\t\t\t\tif (!next) {\n\t\t\t\t\tsettle(false);\n\t\t\t\t}\n\t\t\t},\n\t\t\tonConfirm: () => {\n\t\t\t\tsettle(true);\n\t\t\t\tsetOpen(false);\n\t\t\t},\n\t\t},\n\t};\n}\n"],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ import { useContextCardsViewModel as a } from "../viewmodels/use-context-cards.j
|
|
|
8
8
|
import { useId as o } from "react";
|
|
9
9
|
import { ExternalLink as s, FileText as c, TextAlignStart as l } from "lucide-react";
|
|
10
10
|
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
11
|
-
|
|
11
|
+
// src/components/context-cards.tsx
|
|
12
12
|
function f({ chunks: f, title: p = "All chunks", totalCount: m, loading: h = !1, error: g, onRetry: _, className: v }) {
|
|
13
13
|
let y = a(f, m), b = o();
|
|
14
14
|
return /* @__PURE__ */ d("section", {
|
|
@@ -142,7 +142,6 @@ function f({ chunks: f, title: p = "All chunks", totalCount: m, loading: h = !1,
|
|
|
142
142
|
})]
|
|
143
143
|
});
|
|
144
144
|
}
|
|
145
|
-
//#endregion
|
|
146
145
|
export { f as ContextCards };
|
|
147
146
|
|
|
148
147
|
//# sourceMappingURL=context-cards.js.map
|
|
@@ -5,7 +5,7 @@ import { useHoverHighlight as r } from "../utils/use-hover-highlight.js";
|
|
|
5
5
|
import * as i from "react";
|
|
6
6
|
import { jsx as a } from "react/jsx-runtime";
|
|
7
7
|
import * as o from "@radix-ui/react-context-menu";
|
|
8
|
-
|
|
8
|
+
// src/components/context-menu.tsx
|
|
9
9
|
var s = o.Root, c = o.Trigger, l = o.Content, u = i.forwardRef(({ className: n, ...r }, i) => /* @__PURE__ */ a(o.Item, {
|
|
10
10
|
"data-basalt-hover-item": "",
|
|
11
11
|
ref: i,
|
|
@@ -24,7 +24,6 @@ function d({ className: t, ref: i, ...s }) {
|
|
|
24
24
|
})
|
|
25
25
|
});
|
|
26
26
|
}
|
|
27
|
-
//#endregion
|
|
28
27
|
export { s as ContextMenu, l as ContextMenuContent, u as ContextMenuItem, d as ContextMenuPanel, c as ContextMenuTrigger };
|
|
29
28
|
|
|
30
29
|
//# sourceMappingURL=context-menu.js.map
|
|
@@ -7,7 +7,7 @@ import { Pagination as i } from "./pagination.js";
|
|
|
7
7
|
import { Table as a, TableBody as o, TableCell as s, TableHead as c, TableHeader as l, TableRow as u, TableSortableHeader as d } from "./table.js";
|
|
8
8
|
import { useCallback as f, useEffect as ee, useLayoutEffect as te, useMemo as ne, useRef as p, useState as m } from "react";
|
|
9
9
|
import { jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
10
|
-
|
|
10
|
+
// src/components/data-table.tsx
|
|
11
11
|
function _(t, n, r) {
|
|
12
12
|
if (t === "attached") return e(n === 0 && "ps-basalt-table-edge", n === r - 1 && "pe-basalt-table-edge");
|
|
13
13
|
}
|
|
@@ -164,11 +164,7 @@ function S({ data: v, columns: S, filter: oe = "", loading: C = !1, empty: se =
|
|
|
164
164
|
Z
|
|
165
165
|
]);
|
|
166
166
|
let ke = !N && D && D > 0 ? q.rows.slice((X - 1) * D, X * D) : q.rows, $ = S.length + +!!J + +!!A, Ae = (e) => {
|
|
167
|
-
|
|
168
|
-
Ee(Y.includes(e) ? Y.filter((t) => t !== e) : [...Y, e]);
|
|
169
|
-
return;
|
|
170
|
-
}
|
|
171
|
-
Ee(Y.includes(e) ? [] : [e]);
|
|
167
|
+
Ee(le ? Y.includes(e) ? Y.filter((t) => t !== e) : [...Y, e] : Y.includes(e) ? [] : [e]);
|
|
172
168
|
};
|
|
173
169
|
return /* @__PURE__ */ g("div", {
|
|
174
170
|
className: "flex min-w-0 flex-col gap-basalt-space-lg",
|
|
@@ -313,7 +309,6 @@ function S({ data: v, columns: S, filter: oe = "", loading: C = !1, empty: se =
|
|
|
313
309
|
}) : null]
|
|
314
310
|
});
|
|
315
311
|
}
|
|
316
|
-
//#endregion
|
|
317
312
|
export { S as DataTable };
|
|
318
313
|
|
|
319
314
|
//# sourceMappingURL=data-table.js.map
|
|
@@ -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 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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"}
|
|
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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"}
|