@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.
Files changed (192) hide show
  1. package/README.md +25 -19
  2. package/ai/COMPATIBILITY.md +41 -36
  3. package/ai/DESIGN.md +53 -47
  4. package/ai/INTEGRATION.md +814 -820
  5. package/ai/RECIPES.md +334 -135
  6. package/ai/USAGE.md +2 -2
  7. package/ai/registry.json +384 -27
  8. package/ai/sources.json +2 -2
  9. package/dist/assets/brand-mark.js +1 -2
  10. package/dist/charts/area.js +1 -2
  11. package/dist/charts/bar.js +1 -2
  12. package/dist/charts/bullet.js +1 -2
  13. package/dist/charts/chart-colors.js +1 -2
  14. package/dist/charts/charts.js +1 -2
  15. package/dist/charts/config.js +1 -2
  16. package/dist/charts/custom-chart.js +1 -2
  17. package/dist/charts/date-navigation.js +1 -2
  18. package/dist/charts/donut.js +1 -2
  19. package/dist/charts/frame.js +1 -2
  20. package/dist/charts/frame.js.map +1 -1
  21. package/dist/charts/funnel.js +1 -2
  22. package/dist/charts/gauge.js +1 -2
  23. package/dist/charts/grouped-bar.js +1 -2
  24. package/dist/charts/heatmap-calendar.js +3 -7
  25. package/dist/charts/heatmap-calendar.js.map +1 -1
  26. package/dist/charts/heatmap-matrix.js +1 -2
  27. package/dist/charts/item-list.js +1 -2
  28. package/dist/charts/legend.js +1 -2
  29. package/dist/charts/line.js +1 -2
  30. package/dist/charts/palette.js +1 -2
  31. package/dist/charts/radar.js +1 -2
  32. package/dist/charts/sample.js +1 -2
  33. package/dist/charts/sankey.js +1 -2
  34. package/dist/charts/series.js +1 -2
  35. package/dist/charts/slot-bar.js +1 -2
  36. package/dist/charts/sparkline.js +1 -2
  37. package/dist/charts/stacked-bar.js +1 -2
  38. package/dist/charts/stat-card.js +1 -2
  39. package/dist/charts/timeline.js +1 -2
  40. package/dist/charts/timeseries.js +1 -2
  41. package/dist/charts/tooltip.js +31 -27
  42. package/dist/charts/tooltip.js.map +1 -1
  43. package/dist/components/accordion.js +1 -2
  44. package/dist/components/alert-dialog.js +1 -2
  45. package/dist/components/app-header.js +1 -2
  46. package/dist/components/app-shell.js +1 -2
  47. package/dist/components/approval-card.js +1 -2
  48. package/dist/components/autocomplete.js +1 -2
  49. package/dist/components/avatar.js +1 -2
  50. package/dist/components/badge.js +1 -2
  51. package/dist/components/banner.js +1 -2
  52. package/dist/components/basalt-mark.js +1 -2
  53. package/dist/components/battery-meter.js +1 -2
  54. package/dist/components/breadcrumbs.js +1 -2
  55. package/dist/components/button.d.ts +1 -1
  56. package/dist/components/button.js +3 -3
  57. package/dist/components/button.js.map +1 -1
  58. package/dist/components/chat-bubble.js +1 -2
  59. package/dist/components/chat-composer.js +1 -2
  60. package/dist/components/chat-header.js +1 -2
  61. package/dist/components/chat-inbox.js +1 -2
  62. package/dist/components/chat-markdown.js +1 -2
  63. package/dist/components/chat-message.js +1 -2
  64. package/dist/components/checkbox.js +1 -2
  65. package/dist/components/clipboard-text.js +1 -2
  66. package/dist/components/code.js +1 -2
  67. package/dist/components/collapsible.js +1 -2
  68. package/dist/components/collapsible.js.map +1 -1
  69. package/dist/components/combobox.js +1 -2
  70. package/dist/components/command-palette.js +1 -2
  71. package/dist/components/confirm-dialog.js +3 -12
  72. package/dist/components/confirm-dialog.js.map +1 -1
  73. package/dist/components/context-cards.js +1 -2
  74. package/dist/components/context-menu.js +1 -2
  75. package/dist/components/data-table.js +2 -7
  76. package/dist/components/data-table.js.map +1 -1
  77. package/dist/components/date-picker.js +7 -18
  78. package/dist/components/date-picker.js.map +1 -1
  79. package/dist/components/delete-resource.js +1 -2
  80. package/dist/components/description-list.js +1 -2
  81. package/dist/components/dialog.js +1 -2
  82. package/dist/components/diff-table.js +1 -2
  83. package/dist/components/dock.js +1 -2
  84. package/dist/components/dock.js.map +1 -1
  85. package/dist/components/dropdown-menu.js +1 -2
  86. package/dist/components/editable-nav-item.js +1 -2
  87. package/dist/components/empty.js +1 -2
  88. package/dist/components/fab.js +1 -2
  89. package/dist/components/field.js +1 -2
  90. package/dist/components/file-dropzone.js +1 -2
  91. package/dist/components/filter-bar.js +1 -2
  92. package/dist/components/flow.js +1 -2
  93. package/dist/components/grid.js +1 -2
  94. package/dist/components/hover-card.js +1 -2
  95. package/dist/components/icon-picker.js +1 -2
  96. package/dist/components/inline-editable.js +1 -2
  97. package/dist/components/input-area.js +1 -2
  98. package/dist/components/input-group.js +2 -3
  99. package/dist/components/input-group.js.map +1 -1
  100. package/dist/components/input.js +1 -2
  101. package/dist/components/label.js +1 -2
  102. package/dist/components/layer-card.js +1 -2
  103. package/dist/components/link.js +1 -2
  104. package/dist/components/loader.js +1 -2
  105. package/dist/components/loading-screen.js +1 -2
  106. package/dist/components/menu-bar.js +1 -2
  107. package/dist/components/meter.js +1 -2
  108. package/dist/components/multi-select.js +1 -2
  109. package/dist/components/navigation-menu.js +1 -2
  110. package/dist/components/overlay.js +1 -2
  111. package/dist/components/page-header.js +1 -2
  112. package/dist/components/pagination.js +1 -2
  113. package/dist/components/popover.js +1 -2
  114. package/dist/components/prompt-bar.js +1 -2
  115. package/dist/components/radio.js +2 -7
  116. package/dist/components/radio.js.map +1 -1
  117. package/dist/components/recommendation-card.js +1 -2
  118. package/dist/components/resource-list.js +1 -2
  119. package/dist/components/responsive-master-detail.js +1 -2
  120. package/dist/components/scroll-area.js +1 -2
  121. package/dist/components/section-rule.js +1 -2
  122. package/dist/components/segment-control.js +1 -2
  123. package/dist/components/select.js +1 -2
  124. package/dist/components/sensitive-input.js +1 -2
  125. package/dist/components/separator.js +1 -2
  126. package/dist/components/sheet.js +1 -2
  127. package/dist/components/sidebar.d.ts +53 -19
  128. package/dist/components/sidebar.js +201 -100
  129. package/dist/components/sidebar.js.map +1 -1
  130. package/dist/components/skeleton-line.js +1 -2
  131. package/dist/components/slider.js +1 -2
  132. package/dist/components/stat-strip.js +1 -2
  133. package/dist/components/switch.js +1 -2
  134. package/dist/components/table-of-contents.js +1 -2
  135. package/dist/components/table-pager.js +1 -2
  136. package/dist/components/table.js +1 -2
  137. package/dist/components/tabs.js +1 -2
  138. package/dist/components/tag-badge.js +1 -2
  139. package/dist/components/tag-color-picker.js +1 -2
  140. package/dist/components/text.js +1 -2
  141. package/dist/components/theme-toggle.js +1 -2
  142. package/dist/components/thinking.js +1 -2
  143. package/dist/components/toast.js +1 -2
  144. package/dist/components/toggle-group.js +1 -2
  145. package/dist/components/toggle.js +1 -2
  146. package/dist/components/tool-chips.js +1 -2
  147. package/dist/components/toolbar.js +1 -2
  148. package/dist/components/tooltip.js +1 -2
  149. package/dist/components/typeahead-field.js +6 -21
  150. package/dist/components/typeahead-field.js.map +1 -1
  151. package/dist/components/upload-queue.js +1 -2
  152. package/dist/index.d.ts +1 -1
  153. package/dist/index.js +11 -11
  154. package/dist/models/agent-feedback.js +1 -2
  155. package/dist/models/avatar.js +1 -2
  156. package/dist/models/code.js +1 -2
  157. package/dist/models/context-cards.js +1 -2
  158. package/dist/models/diff-table.js +1 -2
  159. package/dist/models/recommendation.js +1 -2
  160. package/dist/providers/accent.js +2 -7
  161. package/dist/providers/accent.js.map +1 -1
  162. package/dist/providers/link.js +1 -2
  163. package/dist/providers/theme.js +2 -7
  164. package/dist/providers/theme.js.map +1 -1
  165. package/dist/styles/standalone.css +55 -11
  166. package/dist/styles/tailwind.css +2 -0
  167. package/dist/styles/tokens.css +51 -6
  168. package/dist/utils/cn.js +1 -2
  169. package/dist/utils/control-surface.js +1 -2
  170. package/dist/utils/navigation.d.ts +1 -1
  171. package/dist/utils/navigation.js +2 -3
  172. package/dist/utils/navigation.js.map +1 -1
  173. package/dist/utils/preference-store.js +1 -2
  174. package/dist/utils/selection-indicator.js +1 -2
  175. package/dist/utils/use-checkable-group.js +1 -2
  176. package/dist/utils/use-hover-highlight.js +2 -3
  177. package/dist/utils/use-hover-highlight.js.map +1 -1
  178. package/dist/viewmodels/use-approval-card.js +11 -13
  179. package/dist/viewmodels/use-approval-card.js.map +1 -1
  180. package/dist/viewmodels/use-chat-composer.js +1 -2
  181. package/dist/viewmodels/use-chat-message.js +1 -2
  182. package/dist/viewmodels/use-code-block.js +1 -2
  183. package/dist/viewmodels/use-code-block.js.map +1 -1
  184. package/dist/viewmodels/use-context-cards.js +1 -2
  185. package/dist/viewmodels/use-diff-table.js +1 -2
  186. package/dist/viewmodels/use-diff-table.js.map +1 -1
  187. package/dist/viewmodels/use-loader.js +1 -2
  188. package/dist/viewmodels/use-recommendation-card.js +1 -2
  189. package/dist/viewmodels/use-recommendation-card.js.map +1 -1
  190. package/dist/viewmodels/use-thinking.js +1 -2
  191. package/dist/viewmodels/use-tool-chips.js +1 -2
  192. 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
- //#region src/components/chat-bubble.tsx
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
- //#region src/components/chat-composer.tsx
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
- //#region src/components/chat-header.tsx
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
- //#region src/components/chat-inbox.tsx
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
- //#region src/components/chat-markdown.tsx
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
- //#region src/components/chat-message.tsx
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
- //#region src/components/checkbox.tsx
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
- //#region src/components/clipboard-text.tsx
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
@@ -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
- //#region src/components/code.tsx
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
- //#region src/components/collapsible.tsx
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
- //#region src/components/combobox.tsx
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
- //#region src/components/command-palette.tsx
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
- //#region src/components/confirm-dialog.tsx
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
- if (e.preventDefault(), !E.current?.isConnected && document.activeElement instanceof HTMLElement && !w.current?.contains(document.activeElement) && (E.current = document.activeElement), T.current && !T.current.disabled) {
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
- if (_?.(e), e.defaultPrevented) {
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,IARAU,EAAM,eAAe,GAEpB,CAACR,EAAU,SAAS,eACpB,SAAS,yBAAyB,eAClC,CAACF,EAAS,SAAS,SAAS,SAAS,aAAa,MAElD,EAAU,UAAU,SAAS,gBAE1BC,EAAU,WAAW,CAACA,EAAU,QAAQ,UAAU;KACrD,EAAU,QAAQ,MAAM;KACxB;IACD;IACA,EAAS,SAAS,MAAM;GACzB;GACA,mBAAmB,MAAU;IAE5B,IADAU,IAAmBD,CAAK,GACpBA,EAAM,kBAAkB;KAC3B,EAAU,UAAU;KACpB;IACD;IAEA,AADAA,EAAM,eAAe,GACrBP,EAAa;GACd;GAzBD,UAAA,CA2BC,kBAACS,GAAD,EAAA,UAAA,CACC,kBAACC,GAAD,EAAA,UAAmBC,EAAwB,CAAA,GAC3C,kBAACC,GAAD,EAAA,UAAyBC,EAAoC,CAAA,CAC3C,EAAA,CAAA,GACnB,kBAACC,GAAD,EAAA,UAAA,CACC,kBAACrB,EAAqB,QAAtB;IAA6B,SAAA;IAC5B,UAAA,kBAACsB,GAAD;KAAQ,KAAKjB;KAAW,UAAUkB;KAAS,SAAQ;KACjD,UAAAC;IACM,CAAA;GACoB,CAAA,GAC7B,kBAACxB,EAAqB,QAAtB;IAA6B,SAAA;IAC5B,UAAA,kBAACsB,GAAD;KACU;KACA;KACT,UAAU,MAAU;MAEnB,AADAR,EAAM,eAAe,GAChBS,KACJE,EAAe;KAEjB;KAEC,UAAAC;IACM,CAAA;GACoB,CAAA,CACX,EAAA,CAAA,CACA;EACR,CAAA,CAAA;;AAEf;AAEA,SAAgBC,IAA+B;CAC9C,IAAM,CAACC,GAAMC,KAAW5B,EAAM,SAAS,EAAK,GACtC,CAAC6B,GAASC,KAAc9B,EAAM,SAA4B;EAC/D,OAAO;EACP,aAAa;CACd,CAAC,GACK+B,IAAc/B,EAAM,OAA0C,IAAI,GAElEgC,IAAShC,EAAM,aAAa,MAAmB;EACpD,IAAMiC,IAAUF,EAAY;EAE5B,AADA,EAAY,UAAU,MACtBE,IAAUC,CAAK;CAChB,GAAG,CAAC,CAAC;CAoBL,OAlBAlC,EAAM,sBACQ;EACZ,EAAO,EAAK;CACb,GACE,CAACgC,CAAM,CAAC,GAcJ;EACN,SAbehC,EAAM,aACpB,OACAgC,EAAO,EAAK,GACZF,EAAWtB,CAAI,GACfoB,EAAQ,EAAI,GACL,IAAI,SAAkB,MAAY;GACxC,EAAY,UAAUK;EACvB,CAAC,IAEF,CAACD,CAAM,CAIP;EACA,aAAa;GACZ;GACA,OAAOH,EAAQ;GACf,aAAaA,EAAQ;GACrB,cAAcA,EAAQ;GACtB,aAAaA,EAAQ;GACrB,SAASA,EAAQ;GACjB,eAAe,MAAS;IAEvB,AADAD,EAAQpB,CAAI,GACPA,KACJwB,EAAO,EAAK;GAEd;GACA,iBAAiB;IAEhB,AADAA,EAAO,EAAI,GACXJ,EAAQ,EAAK;GACd;EACD;CACD;AACD"}
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
- //#region src/components/context-cards.tsx
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
- //#region src/components/context-menu.tsx
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
- //#region src/components/data-table.tsx
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
- if (le) {
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":";;;;;;;;;;AA4BA,SAASA,EAAa,GAAiC,GAAe,GAAe;CACpF,IAAIC,MAAS,YACb,OAAOC,EAAGC,MAAU,KAAK,wBAAwBA,MAAUC,IAAQ,KAAK,sBAAsB;AAC/F;AA0BA,SAASC,EAAK,GAAwB;CAgBrC,OAfIC,MAAU,YACN,IAEJ,OAAOA,KAAU,YAAa,OAAOA,KAAU,YAAY,OAAO,SAASA,CAAK,IAC5E,IAEJA,MAAU,WACN,IAEJ,OAAOA,KAAU,WACb,IAEJ,OAAOA,KAAU,WACb,IAED;AACR;AAEA,SAASC,GAAe,GAAe,GAAwB;CAC9D,IAAMC,IAAWH,EAAKI,CAAI,GACpBC,IAAYL,EAAKM,CAAK;CAC5B,IAAIH,MAAaE,GAChB,OAAOF,IAAWE;CAEnB,IAAIF,MAAa,GAAG;EACnB,IAAMI,IAAIH,GACJI,IAAIF;EACV,OAAOC,IAAIC,IAAI,KAAK,MAAIA;CACzB;CACA,IAAMC,IAAU,OAAOL,CAAI,GACrBM,IAAW,OAAOJ,CAAK;CAC7B,OAAOG,IAAUC,IAAW,KAAK,MAAUA;AAC5C;AAEA,SAASC,GACR,GACA,GACA,GACA,GACS;CACT,IAAIC,MAAQ,MACX,OAAO;CAER,IAAIA,MAAQ,KAAA,GACX,OAAO;CAER,IAAI,OAAOA,KAAQ,UAAU;EAC5B,IAAIC,IAAMC,EAAQ,IAAIF,CAAG;EAKzB,OAJKC,MACJ,IAAM,eAAe,EAAI,aACzBC,EAAQ,IAAIF,GAAKC,CAAG,IAEdA;CACR;CACA,IAAME,IAAO,OAAOH;CAUpB,OATIG,MAAS,WACR,OAAO,GAAGH,GAAK,EAAE,IACb,mBAED,eAAe,OAAOA,CAAG,MAE7BG,MAAS,YAAYA,MAAS,YAAYA,MAAS,YAC/C,QAAQA,EAAK,GAAG,OAAOH,CAAG,MAE3B,QAAQd;AAChB;AAEA,SAASkB,EAAc,GAAa;CACnC,OAAOH,EAAI,WAAW,MAAM,KAAKA,EAAI,WAAW,MAAM;AACvD;AAEA,SAASI,EAAS,GAA6B;CAC9C,OAAO,OAAOL,KAAQ,cAAe,OAAOA,KAAQ,cAAYA;AACjE;AAEA,SAASM,GAAgB,GAA4B,GAAgB;CACpE,IAAIC,EAAO,aACV,OAAO,OAAOA,EAAO,YAAYP,CAAG,CAAC;CAEtC,IAAIO,EAAO,WACV,OAAO,OAAOA,EAAO,UAAUP,CAAG,CAAC;CAEpC,IAAMQ,IAAWD,EAAO,SAASP,CAAG;CAQpC,OANC,OAAOQ,KAAa,YACpB,OAAOA,KAAa,YACpB,OAAOA,KAAa,WAEb,OAAOA,CAAQ,IAEhB;AACR;AAEA,SAASC,EACR,GACA,GACA,GACA,GACS;CACT,IAAMC,IAAYC,IAAWX,GAAKd,CAAK;CAOvC,OANIwB,MAAc,KAAA,IAGdL,EAASL,CAAG,KAAK,QAAQA,KAAOA,EAAI,MAAM,OACtC,OAAOA,EAAI,EAAE,IAEdC,IALCS;AAMT;AAoGA,SAAgBE,EAAa,EAC5B,SACA,YACA,aAAS,IACT,aAAU,IACV,YAAQ,cACR,aACA,qBACA,qBACA,eAAW,IACX,SACA,kBAAc,GACd,aACA,iBACA,aACA,eACA,eACA,gBAAa,IACb,MAAMC,GACN,kBAAc,MACd,kBACA,mBAAgB,IAChB,sBAAmB,IACnB,qBAAkB,IAClB,UACA,UACA,YACA,iBAAa,aACb,cAAcC,IAAY,cAC1B,oBAAoBC,IACpB,WACqB;CACrB,IAAM,CAACC,IAAkBC,MAAuBC,EAA+BC,EAAW,GACpFC,IAAOP,MAAmB,KAAA,IAAYG,KAAmBH,GACzDQ,MAAe,MAAwB;EAE5C,AADIR,MAAmB,KAAA,KAAWI,GAAoBK,CAAI,GAC1DC,KAAeD,CAAI;CACpB,GACM,CAACE,IAAsBC,MAA2BP,EAAmBQ,MAAmB,CAAC,CAAC,GAC1F,CAACC,GAAkBC,MAAuBV,EAASW,EAAW,GAC9DC,IAASC,kBAAO,IAAI,QAAwB,CAAC,GAC7CC,IAASD,EAAO,CAAC,GACjBE,IAAeF,kBAAO,IAAI,QAA0B,CAAC,GACrDG,IAAYH,kBAAO,IAAI,IAAoB,CAAC,GAC5CI,KAAqBJ,kBAAO,IAAI,IAAoB,CAAC,GACrDK,KAAsBL,kBAAO,IAAI,IAAsB,CAAC,GACxDM,KAAaN,kBAAO,IAAI,IAAoB,CAAC,GAC7CO,IAAQC,GAAO,KAAK,CAAC,CAAC,YAAY,GAElCC,IAAOC,SAAc;EAC1B,IAAMC,KAAc,MAAgB;GACnC,IAAIC,IAASb,EAAO,QAAQ,IAAI9B,CAAG;GAKnC,OAJK2C,MACJ,IAAS,cAAc,EAAO,aAC9Bb,EAAO,QAAQ,IAAI9B,GAAK2C,CAAM,IAExBA;EACR,GACMC,KAAe,GAAQ,MAAkB;GAC9C,IAAMlC,IAAYC,IAAWX,GAAKd,CAAK;GACvC,IAAIwB,MAAc,KAAA,GACjB,OAAO,OAAOA;GAEf,IAAIL,EAASL,CAAG,KAAK,QAAQA,GAAK;IACjC,IAAM6C,IAAO7C,EAAwB;IACrC,IAAI6C,KAAO,MACV,OAAO,MAAM,OAAOA,CAAG;GAEzB;EACD,GACMC,oBAAO,IAAI,IAAY,GACvBC,oBAAc,IAAI,IAAoB,GACtCC,oBAAW,IAAI,IAAsB,GACrCC,oBAAe,IAAI,IAAsB,GACzCC,oBAAY,IAAI,IAAoB,GACpCC,KAAe,GAAQ,GAAe,GAAa,MAA6B;GACrF,IAAI,CAACC,GACJ;GAED,IAAMC,IAAOJ,EAAa,IAAIG,CAAS,KAAK,CAAC;GAG7C,AAFAC,EAAK,KAAKpD,CAAG,GACbgD,EAAa,IAAIG,GAAWC,CAAI,GAChCH,EAAU,IAAIjD,GAAKmD,CAAS;GAC5B,IAAME,IAAYV,EAAY5C,GAAKd,CAAK;GACxC,IAAKoE,MAGLP,EAAY,IAAIO,GAAWrD,CAAG,GAC1BG,EAAcH,CAAG,IAAG;IACvB,IAAMsD,IAAOP,EAAS,IAAIM,CAAS,KAAK,CAAC;IAEzC,AADAC,EAAK,KAAKtD,CAAG,GACb+C,EAAS,IAAIM,GAAWC,CAAI;GAC7B;EACD,GACMC,oBAAS,IAAI,QAAwB,GACrCC,IAAUC,EAAK,KAAK,GAAK,MAAU;GACxC,IAAMN,IAAY/C,EAASL,CAAG,IAAIA,IAAM,MAClC2D,IAAaP,IAAaI,EAAO,IAAIJ,CAAS,KAAK,IAAK;GAI9D,OAHIA,KACHI,EAAO,IAAIJ,GAAWO,IAAa,CAAC,GAE9B;IACN;IACA;IACA;IACA,KAAK,KAAA;GACN;EACD,CAAC;EACD,KAAK,IAAMC,KAAQH,GAAS;GAC3B,IAAML,IAAY/C,EAASuD,EAAK,GAAG,IAAIA,EAAK,MAAM;GAClD,IAAI,CAACR,GACJ;GAED,IAAMS,IAAW5B,EAAa,QAAQ,IAAImB,CAAS,CAAC,GAAGQ,EAAK;GAC5D,AAAKC,KAAY,GAAK,IAAIA,CAAQ,KAG9B3B,EAAU,QAAQ,IAAI2B,CAAQ,MAAMT,MACvC,EAAK,MAAMS,GACXf,EAAK,IAAIe,CAAQ;EAEnB;EACA,IAAMC,IAAQL,EAAQ,KAAK,EAAE,QAAK,UAAO,eAAY,KAAKM,QAAe;GACxE,IAAMX,IAAY/C,EAASL,CAAG,IAAIA,IAAM;GACxC,IAAI+D,GAEH,OADAZ,EAAYnD,GAAKd,GAAO6E,GAAUX,CAAS,GACpC;IACN;IACA,KAAKW;IACL,UAAUtD,EAAeT,GAAKd,GAAO6E,GAAUpD,CAAQ;GACxD;GAED,IAAMqD,IAAWL,IAAa,GAC1B1D,GACES,IAAYkC,EAAY5C,GAAKd,CAAK;GAIxC,IAHIwB,MACH,IAAMA,IAEH0C,GAAW;IACd,IAAMT,IAASD,EAAWU,CAAS;IACnC,IAAI,CAACnD,GACJ,IAAM+D,IAAW,OAAOrB,EAAO,GAAGgB,MAAe,OAAOhB;SAClD,IAAIG,EAAK,IAAI7C,CAAG,KAAK+D,GAI3B,KAHgB5B,GAAoB,QAAQ,IAAInC,CAAG,KAAK,CAAC,EAAA,CAAG,MAC1D,MAAc,CAAC6C,EAAK,IAAImB,CAAS,CAE7B,MAAWD,IAAW,OAAOrB,EAAO,GAAGgB,MAAe,OAAOhB;SAC7D;KACN,IAAMuB,IAAY/B,GAAmB,QAAQ,IAAIlC,CAAG;KACpD,AAAIiE,KAAa,CAACpB,EAAK,IAAIoB,CAAS,KAAK9D,EAAc8D,CAAS,MAC/D,IAAMA;IAER;GACD;GAEA,IADA,MAAanE,GAAaC,GAAKd,GAAOmD,GAAW,SAASL,CAAM,GAC5Dc,EAAK,IAAI7C,CAAG,GAAG;IAClB,IAAIkE,IAAI,GACJF,IAAY,OAAOhE,EAAI,GAAGkE;IAC9B,OAAOrB,EAAK,IAAImB,CAAS,IAExB,AADA,KAAK,GACL,IAAY,OAAOhE,EAAI,GAAGkE;IAE3B,IAAMF;GACP;GAGA,OAFAnB,EAAK,IAAI7C,CAAG,GACZkD,EAAYnD,GAAKd,GAAOe,GAAKmD,CAAS,GAC/B;IAAE;IAAK;IAAK,UAAU3C,EAAeT,GAAKd,GAAOe,GAAKU,CAAQ;GAAE;EACxE,CAAC,GACKyD,IACL9B,KAAS,CAAC+B,IACPP,EAAM,QAAQ,EAAE,aAChBQ,EAAQ,MAAM,MAAWhE,GAAaC,GAAQP,CAAG,CAAC,CAAC,YAAY,CAAC,CAAC,SAASsC,CAAK,CAAC,CACjF,IACCwB;EAgBJ,OAAO;GACN,aAhBqB;IACrB,IAAI,CAAC1C,KAAQmD,GACZ,OAAOH;IAER,IAAM7D,IAAS+D,EAAQ,MAAM,MAASV,EAAK,OAAOxC,EAAK,EAAE;IAIzD,OAHKb,IAGE,CAAC,GAAG6D,CAAQ,CAAC,CAAC,MAAM,GAAG,MAAM;KAGnC,IAAMI,IAAMlF,GAFCiB,EAAO,YAAYZ,EAAE,GAAG,KAAKY,EAAO,SAASZ,EAAE,GAAG,GACjDY,EAAO,YAAYX,EAAE,GAAG,KAAKW,EAAO,SAASX,EAAE,GAAG,CAC1B;KACtC,OAAOwB,EAAK,QAAQ,QAAQoD,IAAM,CAACA;IACpC,CAAC,IAPOJ;GAQT,EAAA,CAEO;GACN,UAAUnB;GACV,OAAOC;GACP,SAASH;GACT,MAAMC;EACP;CACD,GAAG;EAACsB;EAASZ;EAAM/C;EAAU2B;EAAOlB;EAAMiD;EAAiBE;CAAa,CAAC;CAEzE,SAAsB;EACrB,KAAK,IAAM,CAACnB,GAAWqB,MAASjC,EAAK,UACpC,EAAa,QAAQ,IAAIY,GAAWqB,CAAI;EAIzC,AAFA,EAAU,UAAUjC,EAAK,OACzB,GAAmB,UAAUA,EAAK,SAClC,GAAoB,UAAUA,EAAK;CACpC,GAAG,CAACA,CAAI,CAAC;CAET,IAAMkC,IACLC,MAAa,KAAA,KAAajD,OAAoB,KAAA,KAAakD,MAAqB,KAAA,GAC3EC,IAAcF,KAAYnD,IAC1BsD,KAAiBC,GACrB,MAAmB;EAInB,AAHIJ,MAAa,KAAA,KAChBlD,GAAwBH,CAAI,GAE7BsD,IAAmBtD,CAAI;CACxB,GACA,CAACsD,GAAkBD,CAAQ,CAC5B,GACMK,KAAWC,KAAoBC,MAAU,KAAA,IAAY,KAAK,IAAI,GAAGA,CAAK,IAAI1C,EAAK,KAAK,QACpF2C,KAAYC,KAAYA,IAAW,IAAI,KAAK,IAAI,GAAG,KAAK,KAAKJ,KAAWI,CAAQ,CAAC,IAAI,GACrFC,IAAe,KAAK,IAAIF,IAAW,KAAK,IAAI,GAAGG,KAAQ3D,CAAgB,CAAC,GACxE4D,IAAkBR,GACtB,MAAiB;EAIjB,AAHIO,MAAS,KAAA,KACZ1D,GAAoBN,CAAI,GAEzBkE,IAAelE,CAAI;CACpB,GACA,CAACkE,GAAcF,CAAI,CACpB,GACMG,IAAiB1D,EAAsB,IAAI;CACjD,SAAgB;EACf,IAAMrB,IAAY4E,KAAQ3D;EAC1B,IAAIjB,MAAc2E,KAAgBK,GAAS;GAC1C,EAAe,UAAU;GACzB;EACD;EACA,IAAMC,IAAa,GAAGjF,EAAU,GAAG2E;EACnC,AAAII,EAAe,YAAYE,MAC9B,EAAe,UAAUA,GACzBJ,EAAgBF,CAAY;CAE9B,GAAG;EAACC;EAAM3D;EAAkB0D;EAAcK;EAASH;CAAe,CAAC;CACnE,IAAMK,KACL,CAACX,KAAoBG,KAAYA,IAAW,IACzC5C,EAAK,KAAK,OAAO6C,IAAe,KAAKD,GAAUC,IAAeD,CAAQ,IACtE5C,EAAK,MACHqD,IAAWvB,EAAQ,SAAU,OAAuB,MACpDwB,MAAkB,MAAe;EACtC,AACChB,GADGiB,KAEFlB,EAAY,SAASmB,CAAE,IAAInB,EAAY,QAAQ,MAASjB,MAASoC,CAAE,IAAI,CAAC,GAAGnB,GAAamB,CAAE,IAI7EnB,EAAY,SAASmB,CAAE,IAAI,CAAC,IAAI,CAACA,CAAE,CADlD;CAED;CAEA,OACC,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACC,kBAAC,OAAD;GAAK,WAAU;GACd,UAAA,kBAAC,OAAD;IACC,MAAK;IACL,cAAY,GAAGlF,EAAU;IAEzB,UAAU;IACV,WAAU;IACV,OAAO,EAAE,cAAU;IAEnB,UAAA,kBAACmF,GAAD;KACC,WAAWhH,EAAG,UAAUiH,EAAS;KACjC,cAAYpF;KACZ,oBAAkBC;KAClB,aAAW2E,KAAW,KAAA;KACtB,0BAAuB;KALxB,UAAA,CAOC,kBAACS,GAAD,EAAA,UACC,kBAACC,GAAD,EAAA,UAAA;MACEC,KACA,kBAACC,GAAD;OACC,OAAM;OACN,WAAU;OACV,WAAWrH,EACV,mEACAF,EAAaC,GAAM,GAAG6G,CAAQ,CAC/B;OAND,UAAA,CAQC,kBAAC,QAAD;QAAM,eAAY;QAAO,UAAA;OAAO,CAAA,GAChC,kBAAC,QAAD;QAAM,WAAU;QAAU,UAAA;OAAgB,CAAA,CAChC;;MAEXnB,IACA,kBAAC4B,GAAD;OACC,OAAM;OACN,WAAWrH,EACV,+EACAF,EAAaC,GAAM,MAAoB6G,CAAQ,CAChD;OAEA,UAAA,kBAAC,QAAD;QAAM,WAAU;QAAU,UAAA;OAAY,CAAA;MAC5B,CAAA,IACR;MACHvB,EAAQ,KAAK,GAAQ,MACrB,kBAACgC,GAAD;OAEC,WAAW/F,EAAO;OAClB,WAAWtB,EACV,uCACAF,EACCC,GACC,OAAuB,OAAsBuH,GAC9CV,CACD,GACAtF,EAAO,eACR;OACA,OAAO;QAAE,OAAOA,EAAO;QAAO,UAAUA,EAAO;OAAM;OACrD,OAAM;OACN,aACCA,EAAO,aAAa,KACjB,KAAA,IACAa,GAAM,OAAOb,EAAO,KACnBa,EAAK,QAAQ,QACZ,cACA,eACD;OAGJ,UAAAb,EAAO,aAAa,KACpB,kBAAC,QAAD;QACC,WAAWtB,EACV,4CACAsB,EAAO,cAAc,SAAS,6BAC/B;QAEC,UAAAA,EAAO,iBAAiBA,EAAO;OAC3B,CAAA,IAEN,kBAACiG,GAAD;QACC,WAAWjG,EAAO;QAClB,QAAQa,GAAM,OAAOb,EAAO,KAAKa,EAAK,MAAM,KAAA;QAC5C,cAAYb,EAAO;QACnB,eACCc,GACCD,GAAM,OAAOb,EAAO,MAAMa,EAAK,QAAQ,QACpC;SAAE,IAAIb,EAAO;SAAI,KAAK;QAAO,IAC7B;SAAE,IAAIA,EAAO;SAAI,KAAK;QAAM,CAChC;QAGA,UAAAA,EAAO,iBAAiBA,EAAO;OACZ,CAAA;MAEZ,GAhDLA,EAAO,EAgDF,CACX;KACQ,EAAA,CAAA,EACE,CAAA,GACb,kBAACkG,GAAD,EAAA,UACEf,IACA,kBAACU,GAAD,EAAA,UACC,kBAACM,GAAD;MAAW,SAASb;MAAU,WAAW9G,EAAaC,GAAM,GAAG,CAAC;MAC/D,UAAA,kBAAC,OAAD;OACC,MAAK;OACL,WAAU;OAFX,UAAA;QAIC,kBAAC,QAAD;SAAM,WAAU;SAAU,UAAA;QAAa,CAAA;QACvC,kBAAC2H,GAAD,CAAe,CAAA;QACf,kBAACA,GAAD,CAAe,CAAA;QACf,kBAACA,GAAD,CAAe,CAAA;OACX;;KACK,CAAA,EACF,CAAA,IACPC,KAAS,QAAQA,MAAU,KAC9B,kBAACR,GAAD,EAAA,UACC,kBAACM,GAAD;MAAW,SAASb;MAAU,WAAW9G,EAAaC,GAAM,GAAG,CAAC;MAC/D,UAAA,kBAAC,OAAD;OACC,MAAK;OACL,WAAU;OAFX,UAAA,CAIC,kBAAC,OAAD,EAAA,UAAM4H,EAAW,CAAA,GAChBC,IACA,kBAACC,GAAD;QAAQ,SAAQ;QAAU,MAAK;QAAK,SAASD;QAC3C,UAAAE;OACM,CAAA,IACL,IACA;;KACK,CAAA,EACF,CAAA,IACPnB,GAAM,WAAW,IACpB,kBAACQ,GAAD,EAAA,UACC,kBAACM,GAAD;MAAW,SAASb;MAAU,WAAW9G,EAAaC,GAAM,GAAG,CAAC;MAC/D,UAAA,kBAAC,OAAD;OAAK,MAAK;OAAU,UAAAgI;MAAW,CAAA;KACrB,CAAA,EACF,CAAA,IAEVpB,GAAM,KAAK,EAAE,QAAK,QAAK,eAAY,MAAa;MAC/C,IAAMqB,IAAapC,EAAY,SAASqC,CAAQ;MAChD,OACC,kBAACd,GAAD;OAEC,SAASa,IAAa,aAAa;OACnC,iBAAevC,IAAauC,IAAa,KAAA;OAH1C,UAAA;QAKEZ,KACA,kBAACK,GAAD;SACC,mBAAgB;SAChB,WAAU;SACV,WAAWzH,EACV,+CACAF,EAAaC,GAAM,GAAG6G,CAAQ,CAC/B;SAEE,WAAAT,KAAYA,IAAW,KAAKC,IAAe,KAAKD,IAAW,KAC5D+B,IACA;QACS,CAAA;QAEXzC,IACA,kBAACgC,GAAD;SACC,WAAWzH,EACV,eACAF,EAAaC,GAAM,MAAoB6G,CAAQ,CAChD;SAEA,UAAA,kBAACuB,GAAD;UACC,SAASH;UACT,cAAY,UAAUC;UACtB,uBAAuBpB,GAAeoB,CAAQ;UAC9C,WAAU;SACV,CAAA;QACS,CAAA,IACR;QACH5C,EAAQ,KAAK,GAAQ,MAAgB;SACrC,IAAM+C,IAAO9G,EAAO,SAASP,CAAG;SAChC,OACC,kBAAC0G,GAAD;UAEC,WAAWnG,EAAO;UAClB,WAAWtB,EACVsB,EAAO,OAAO,kCAAkC,qBAChDxB,EACCC,GACC,OAAuB,OAAsBuH,GAC9CV,CACD,GACAtF,EAAO,aACR;UACA,OAAO,EAAE,UAAUA,EAAO,MAAM;UAE/B,UAAA,OAAO8G,KAAS,WAAW,OAAOA,CAAI,IAAIA;SACjC,GAdL9G,EAAO,EAcF;QAEb,CAAC;OACQ;MAtDJ,GAAAN,CAsDI;KAEZ,CAAC,EAEQ,CAAA,CACL;;GACH,CAAA;EACD,CAAA,GACJmF,KAAYA,IAAW,IACvB,kBAACkC,GAAD;GACC,MAAMjC;GACK;GACX,UAAUK;GACV,cAAcH;GACd,WAAWvG,MAAS,aAAa,wCAAwC,KAAA;EACzE,CAAA,IACE,IACA;;AAEP"}