@actioneer/ads 0.5.6 → 0.5.8

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 (149) hide show
  1. package/bin/ads-init.mjs +6 -0
  2. package/components/accordion.js +50 -48
  3. package/components/agent-icon.d.ts +12 -0
  4. package/components/agent-icon.js +135 -121
  5. package/components/ai-elements/chain-of-thought-icon.d.ts +10 -12
  6. package/components/ai-elements/chain-of-thought-icon.js +341 -201
  7. package/components/ai-elements/chain-of-thought.d.ts +2 -2
  8. package/components/ai-elements/chain-of-thought.js +108 -108
  9. package/components/ai-elements/chart.js +16 -14
  10. package/components/ai-elements/inline-citation.js +41 -41
  11. package/components/ai-elements/message.js +4 -4
  12. package/components/ai-elements/queue.js +7 -7
  13. package/components/ai-elements/research-activity.js +114 -114
  14. package/components/ai-elements/shimmer.d.ts +2 -2
  15. package/components/ai-elements/speech-input.js +28 -28
  16. package/components/ai-elements/task-progress.js +26 -16
  17. package/components/ai-elements/task.js +17 -17
  18. package/components/ai-elements/tool.js +6 -6
  19. package/components/ai-elements/transcript.js +6 -5
  20. package/components/ai-elements/voice.js +1 -1
  21. package/components/alert.js +10 -10
  22. package/components/answer-sources.d.ts +42 -0
  23. package/components/answer-sources.js +111 -0
  24. package/components/answer.js +115 -114
  25. package/components/assistant-ui/action-bar.js +94 -48
  26. package/components/assistant-ui/attachment.js +131 -103
  27. package/components/assistant-ui/badge.d.ts +1 -1
  28. package/components/assistant-ui/badge.js +17 -17
  29. package/components/assistant-ui/chain-of-thought.d.ts +1 -1
  30. package/components/assistant-ui/composer-add-context.js +9 -9
  31. package/components/assistant-ui/composer-deep-research.js +5 -5
  32. package/components/assistant-ui/composer-harness.js +12 -9
  33. package/components/assistant-ui/composer-trigger-popover.js +45 -34
  34. package/components/assistant-ui/composer.js +59 -59
  35. package/components/assistant-ui/error.js +14 -14
  36. package/components/assistant-ui/file.d.ts +1 -1
  37. package/components/assistant-ui/image.d.ts +1 -1
  38. package/components/assistant-ui/image.js +113 -103
  39. package/components/assistant-ui/markdown-text.js +18 -18
  40. package/components/assistant-ui/message.js +46 -45
  41. package/components/assistant-ui/quote.js +1 -1
  42. package/components/assistant-ui/reasoning.d.ts +1 -1
  43. package/components/assistant-ui/reasoning.js +66 -77
  44. package/components/assistant-ui/suggestions.js +4 -4
  45. package/components/assistant-ui/thread-context.d.ts +2 -0
  46. package/components/assistant-ui/thread.js +41 -40
  47. package/components/assistant-ui/tool-fallback.js +60 -63
  48. package/components/assistant-ui/tool-group.d.ts +1 -1
  49. package/components/assistant-ui/tool-group.js +36 -42
  50. package/components/audio-waveform.js +25 -24
  51. package/components/autocomplete.d.ts +1 -0
  52. package/components/autocomplete.js +45 -43
  53. package/components/avatar.js +30 -30
  54. package/components/badge.d.ts +1 -1
  55. package/components/breadcrumbs.js +2 -2
  56. package/components/button.d.ts +2 -2
  57. package/components/button.js +22 -20
  58. package/components/card.js +8 -8
  59. package/components/carousel.js +105 -104
  60. package/components/chart.js +9 -7
  61. package/components/checkbox.js +74 -38
  62. package/components/chip.d.ts +1 -1
  63. package/components/code-block.js +3 -3
  64. package/components/collapsible.js +67 -23
  65. package/components/connector-card.js +6 -6
  66. package/components/drawer.d.ts +15 -10
  67. package/components/drawer.js +78 -77
  68. package/components/dropdown.d.ts +3 -1
  69. package/components/dropdown.js +88 -79
  70. package/components/empty-state.d.ts +4 -4
  71. package/components/empty-state.js +7 -7
  72. package/components/field.d.ts +4 -0
  73. package/components/field.js +45 -34
  74. package/components/file-dropzone.js +12 -12
  75. package/components/index.d.ts +4 -0
  76. package/components/index.js +584 -553
  77. package/components/infinite-canvas.js +1 -1
  78. package/components/input-field.js +51 -46
  79. package/components/input.js +20 -20
  80. package/components/link.js +9 -9
  81. package/components/modal.js +105 -73
  82. package/components/navbar.d.ts +1 -1
  83. package/components/navbar.js +1 -1
  84. package/components/number-field.js +38 -29
  85. package/components/page-header.js +12 -12
  86. package/components/pagination.js +19 -19
  87. package/components/panel.js +2 -2
  88. package/components/pixel-blast-svg.js +3 -3
  89. package/components/pixel-icon.d.ts +3 -1
  90. package/components/pixel-icon.js +294 -215
  91. package/components/popover.d.ts +1 -1
  92. package/components/popover.js +66 -64
  93. package/components/progress-circle.js +36 -32
  94. package/components/progress.js +28 -24
  95. package/components/radio.js +59 -49
  96. package/components/resizable-panel.js +1 -1
  97. package/components/reveal.d.ts +2 -2
  98. package/components/ripple.d.ts +3 -3
  99. package/components/scroll-area.js +17 -16
  100. package/components/segmented.d.ts +4 -1
  101. package/components/segmented.js +26 -25
  102. package/components/select.d.ts +2 -0
  103. package/components/select.js +61 -57
  104. package/components/setting-row.js +45 -42
  105. package/components/sidebar.d.ts +2 -2
  106. package/components/sidebar.js +131 -127
  107. package/components/skeleton.js +5 -5
  108. package/components/spinner.d.ts +13 -4
  109. package/components/spinner.js +42 -42
  110. package/components/stepper.js +21 -21
  111. package/components/switch.js +52 -32
  112. package/components/table.d.ts +24 -7
  113. package/components/table.js +457 -220
  114. package/components/tabs.js +149 -137
  115. package/components/textarea.js +1 -2
  116. package/components/toast.js +66 -66
  117. package/components/tooltip.js +2 -2
  118. package/components/tree.js +62 -51
  119. package/components/typography.d.ts +2 -1
  120. package/components/typography.js +33 -32
  121. package/components/ui/button.d.ts +2 -2
  122. package/components/ui/button.js +19 -19
  123. package/components/ui/collapsible.d.ts +1 -5
  124. package/components/ui/dialog.d.ts +3 -3
  125. package/components/ui/dialog.js +95 -58
  126. package/components/ui/tooltip.d.ts +2 -2
  127. package/components/ui/tooltip.js +67 -33
  128. package/components/viz-charts.js +95 -95
  129. package/demo/components/add-to-artifact.js +341 -0
  130. package/demo/lib/artifact-library.js +134 -0
  131. package/fonts/aribau-grotesk-medium.woff2 +0 -0
  132. package/fonts/aribau-grotesk-regular.woff2 +0 -0
  133. package/fonts.css +11 -11
  134. package/hooks/agents-ui/use-agent-audio-visualizer-aura.js +17 -16
  135. package/hooks/agents-ui/use-agent-audio-visualizer-wave.js +21 -20
  136. package/lib/icons.d.ts +12 -0
  137. package/lib/icons.js +107 -104
  138. package/lib/motion.d.ts +42 -39
  139. package/lib/motion.js +112 -52
  140. package/lib/spinner-mark.d.ts +9 -0
  141. package/lib/spinner-mark.js +98 -0
  142. package/llms.txt +69 -26
  143. package/manifest.json +344 -42
  144. package/package.json +1 -1
  145. package/styles.css +175 -161
  146. package/theme.css +104 -128
  147. package/components/ui/collapsible.js +0 -35
  148. package/fonts/aribau-grotesk-500.otf +0 -0
  149. package/fonts/aribau-grotesk-600.woff2 +0 -0
@@ -1,31 +1,31 @@
1
1
  "use client";
2
- import { jsx as s, jsxs as z } from "react/jsx-runtime";
3
- import * as a from "react";
4
- import { cn as t } from "../lib/cn.js";
5
- import { Checkbox as j } from "./checkbox.js";
6
- import { ChevronUp as Q, ChevronDown as V, SortIcon as X } from "../lib/icons.js";
7
- const L = (o) => o === "center" ? "text-center" : o === "right" ? "text-right" : "text-left", O = (o, n = !1) => o === "left" ? t(
2
+ import { jsx as d, jsxs as _ } from "react/jsx-runtime";
3
+ import * as o from "react";
4
+ import { cn as u } from "../lib/cn.js";
5
+ import { Checkbox as re } from "./checkbox.js";
6
+ import { ChevronUp as be, ChevronDown as ge, SortIcon as he } from "../lib/icons.js";
7
+ const ne = (e) => e === "center" ? "text-center" : e === "right" ? "text-right" : "text-left", ae = (e, t = !1) => e === "left" ? u(
8
8
  "sticky left-0 z-10",
9
9
  // Scroll-aware: the smudge only appears once content is actually
10
10
  // hidden behind the pinned column (nothing to scroll back to at the
11
11
  // far left → no shadow).
12
12
  "group-data-[scroll-left=true]/table-shell:shadow-table-smudge-left"
13
- ) : o === "right" ? t(
13
+ ) : e === "right" ? u(
14
14
  "sticky right-0 z-10",
15
15
  // Backward-compatible fallback. Action columns should opt into the
16
16
  // Table-level elevation so one shadow spans the complete column.
17
- !n && "group-data-[scroll-right=true]/table-shell:shadow-table-smudge-right"
18
- ) : void 0, W = (o) => o === "right" ? t(
19
- "group-first/row:before:pointer-events-none group-first/row:before:absolute group-first/row:before:right-0 group-first/row:before:top-0 group-first/row:before:size-5 group-first/row:before:content-[''] group-first/row:before:[background:radial-gradient(circle_at_0%_100%,transparent_19.5px,var(--table-shell)_20px)]",
20
- "group-last/row:after:pointer-events-none group-last/row:after:absolute group-last/row:after:right-0 group-last/row:after:bottom-0 group-last/row:after:size-5 group-last/row:after:content-[''] group-last/row:after:[background:radial-gradient(circle_at_0%_0%,transparent_19.5px,var(--table-shell)_20px)]"
21
- ) : t(
22
- "group-first/row:before:pointer-events-none group-first/row:before:absolute group-first/row:before:left-0 group-first/row:before:top-0 group-first/row:before:size-5 group-first/row:before:content-[''] group-first/row:before:[background:radial-gradient(circle_at_100%_100%,transparent_19.5px,var(--table-shell)_20px)]",
23
- "group-last/row:after:pointer-events-none group-last/row:after:absolute group-last/row:after:left-0 group-last/row:after:bottom-0 group-last/row:after:size-5 group-last/row:after:content-[''] group-last/row:after:[background:radial-gradient(circle_at_100%_0%,transparent_19.5px,var(--table-shell)_20px)]"
24
- ), F = (o) => t(
17
+ !t && "group-data-[scroll-right=true]/table-shell:shadow-table-smudge-right"
18
+ ) : void 0, se = (e) => e === "right" ? u(
19
+ "group-first/row:before:pointer-events-none group-first/row:before:absolute group-first/row:before:right-0 group-first/row:before:top-0 group-first/row:before:size-3 group-first/row:before:content-[''] group-first/row:before:[background:radial-gradient(circle_at_0%_100%,transparent_11.5px,var(--table-shell)_12px)]",
20
+ "group-last/row:after:pointer-events-none group-last/row:after:absolute group-last/row:after:right-0 group-last/row:after:bottom-0 group-last/row:after:size-3 group-last/row:after:content-[''] group-last/row:after:[background:radial-gradient(circle_at_0%_0%,transparent_11.5px,var(--table-shell)_12px)]"
21
+ ) : u(
22
+ "group-first/row:before:pointer-events-none group-first/row:before:absolute group-first/row:before:left-0 group-first/row:before:top-0 group-first/row:before:size-3 group-first/row:before:content-[''] group-first/row:before:[background:radial-gradient(circle_at_100%_100%,transparent_11.5px,var(--table-shell)_12px)]",
23
+ "group-last/row:after:pointer-events-none group-last/row:after:absolute group-last/row:after:left-0 group-last/row:after:bottom-0 group-last/row:after:size-3 group-last/row:after:content-[''] group-last/row:after:[background:radial-gradient(circle_at_100%_0%,transparent_11.5px,var(--table-shell)_12px)]"
24
+ ), ie = (e) => u(
25
25
  "bg-card align-middle transition-colors",
26
26
  // Row separators — functional hairline, none under the last row.
27
27
  "border-b border-border group-last/row:border-b-0",
28
- !o && t(
28
+ !e && u(
29
29
  // Restore the original quiet neutral hover: the row softly sinks
30
30
  // toward the shell instead of picking up a brand tint or a new
31
31
  // rounded silhouette. The wash is pre-composited so scrolled text
@@ -33,167 +33,325 @@ const L = (o) => o === "center" ? "text-center" : o === "right" ? "text-right" :
33
33
  "group-hover/row:bg-(--table-row-hover) group-focus-within/row:bg-(--table-row-hover)",
34
34
  "group-data-[selected]/row:bg-(--table-row-selected)"
35
35
  )
36
- ), Y = t(
37
- "group-first/row:rounded-tl-[calc(var(--radius-2xl)-var(--spacing))]",
38
- "group-last/row:rounded-bl-[calc(var(--radius-2xl)-var(--spacing))]"
39
- ), Z = t(
40
- "group-first/row:first:rounded-tl-[calc(var(--radius-2xl)-var(--spacing))]",
41
- "group-first/row:last:rounded-tr-[calc(var(--radius-2xl)-var(--spacing))]",
42
- "group-last/row:first:rounded-bl-[calc(var(--radius-2xl)-var(--spacing))]",
43
- "group-last/row:last:rounded-br-[calc(var(--radius-2xl)-var(--spacing))]"
44
- ), I = t(
36
+ ), we = u(
37
+ "group-first/row:rounded-tl-(--table-card-radius)",
38
+ "group-last/row:rounded-bl-(--table-card-radius)"
39
+ ), ve = u(
40
+ "group-first/row:first:rounded-tl-(--table-card-radius)",
41
+ "group-first/row:last:rounded-tr-(--table-card-radius)",
42
+ "group-last/row:first:rounded-bl-(--table-card-radius)",
43
+ "group-last/row:last:rounded-br-(--table-card-radius)"
44
+ ), le = u(
45
45
  "after:pointer-events-none after:absolute after:right-0 after:top-1/2",
46
46
  "after:h-4 after:w-px after:-translate-y-1/2 after:rounded-sm",
47
47
  "after:bg-border-strong last:after:hidden"
48
- ), M = a.createContext(null), T = () => a.useContext(M), q = a.createContext("body"), D = a.forwardRef(
48
+ ), K = "__ads_table_column_", G = 64, xe = new Intl.Collator(void 0, {
49
+ numeric: !0,
50
+ sensitivity: "base"
51
+ });
52
+ function V(e) {
53
+ const t = [];
54
+ return o.Children.forEach(e, (a) => {
55
+ if (o.isValidElement(a) && a.type === o.Fragment) {
56
+ t.push(...V(a.props.children));
57
+ return;
58
+ }
59
+ t.push(a);
60
+ }), t;
61
+ }
62
+ function U(e) {
63
+ if (e == null || typeof e == "boolean")
64
+ return "";
65
+ if (typeof e == "number" || typeof e == "string") return e;
66
+ if (Array.isArray(e))
67
+ return e.map((n) => String(U(n))).join(" ").trim();
68
+ if (!o.isValidElement(e)) return "";
69
+ const t = e.props.sortValue;
70
+ if (typeof t == "string" || typeof t == "number" || t instanceof Date)
71
+ return t;
72
+ const a = U(e.props.children);
73
+ if (String(a).trim()) return a;
74
+ for (const n of [
75
+ "value",
76
+ "label",
77
+ "status",
78
+ "name",
79
+ "title",
80
+ "health"
81
+ ]) {
82
+ const s = e.props[n];
83
+ if (typeof s == "string" || typeof s == "number") return s;
84
+ }
85
+ return "";
86
+ }
87
+ function oe(e) {
88
+ if (e instanceof Date)
89
+ return { kind: "number", value: e.getTime() };
90
+ if (typeof e == "number")
91
+ return { kind: "number", value: e };
92
+ const t = e.trim();
93
+ if (!t || t === "—" || t === "-")
94
+ return { kind: "empty", value: "" };
95
+ const a = t.replace(/[,\s]/g, "").replace(/^[₹$€£]/, "").replace(/%$/, "");
96
+ if (/^[+-]?(?:\d+\.?\d*|\.\d+)$/.test(a))
97
+ return { kind: "number", value: Number(a) };
98
+ const s = /^\d{4}[-/]\d{1,2}[-/]\d{1,2}/.test(t) || /\b(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\b/i.test(t) ? Date.parse(t) : Number.NaN;
99
+ return Number.isNaN(s) ? { kind: "text", value: t } : { kind: "number", value: s };
100
+ }
101
+ function ye(e, t, a) {
102
+ const n = oe(e), s = oe(t);
103
+ if (n.kind === "empty") return s.kind === "empty" ? 0 : 1;
104
+ if (s.kind === "empty") return -1;
105
+ const l = n.kind === "number" && s.kind === "number" ? n.value - s.value : xe.compare(String(n.value), String(s.value));
106
+ return a === "ascending" ? l : -l;
107
+ }
108
+ const ce = o.createContext(null), q = () => o.useContext(ce), Q = o.createContext("body");
109
+ function Ce(e) {
110
+ const t = [], n = V(e.props.children).map((s, l) => {
111
+ if (!o.isValidElement(s) || s.type !== Y)
112
+ return s;
113
+ let i = 0;
114
+ const w = V(s.props.children).map((r) => {
115
+ if (!o.isValidElement(r)) return r;
116
+ for (; (t[i] ?? 0) > l; )
117
+ i += 1;
118
+ const T = Math.max(1, Number(r.props.colSpan ?? 1)), y = Math.max(1, Number(r.props.rowSpan ?? 1)), v = i;
119
+ for (let C = 0; C < T; C += 1)
120
+ t[v + C] = Math.max(
121
+ t[v + C] ?? 0,
122
+ l + y
123
+ );
124
+ return i += T, r.type !== fe ? r : o.cloneElement(r, { _sortColumnIndex: v });
125
+ });
126
+ return o.cloneElement(s, void 0, w);
127
+ });
128
+ return o.cloneElement(e, void 0, n);
129
+ }
130
+ function Ne(e, t, a) {
131
+ const n = V(e.props.children).map((s, l) => {
132
+ if (!o.isValidElement(s) || s.type !== Y)
133
+ return { row: s, index: l, value: "" };
134
+ const i = V(s.props.children);
135
+ return {
136
+ row: s,
137
+ index: l,
138
+ value: U(i[t])
139
+ };
140
+ });
141
+ return n.sort((s, l) => ye(s.value, l.value, a) || s.index - l.index), o.cloneElement(
142
+ e,
143
+ void 0,
144
+ n.map(({ row: s }) => s)
145
+ );
146
+ }
147
+ function ue(e, t) {
148
+ const a = t != null && t.column.startsWith(K) ? Number(t.column.slice(K.length)) : Number.NaN;
149
+ return o.Children.map(e, (n) => o.isValidElement(n) ? n.type === o.Fragment ? o.cloneElement(
150
+ n,
151
+ void 0,
152
+ ue(n.props.children, t)
153
+ ) : n.type === de ? Ce(n) : n.type === pe && t && Number.isInteger(a) && a >= 0 ? Ne(n, a, t.direction) : n : n);
154
+ }
155
+ const ze = o.forwardRef(
49
156
  ({
50
- className: o,
51
- wrapperClassName: n,
52
- footer: i,
53
- children: d,
54
- selectionMode: g = "none",
55
- selectedKeys: e,
56
- onSelectionChange: c,
57
- rowKeys: l,
58
- elevatedActionColumn: u = !1,
59
- actionColumnWidth: h = "4rem",
60
- sortDescriptor: b,
61
- onSortChange: w,
62
- isStatic: x = !1,
63
- ...U
64
- }, $) => {
65
- const v = a.useMemo(() => l ?? [], [l]), m = e === "all", f = m ? null : e ?? /* @__PURE__ */ new Set(), C = a.useCallback(
66
- (r) => m || !!(f != null && f.has(r)),
67
- [m, f]
68
- ), N = v.length > 0 && (m || v.every((r) => f == null ? void 0 : f.has(r))), H = !N && (m || v.some((r) => f == null ? void 0 : f.has(r))), P = a.useCallback(
69
- (r) => {
70
- if (!c) return;
71
- if (g === "single") {
72
- c(C(r) ? /* @__PURE__ */ new Set() : /* @__PURE__ */ new Set([r]));
157
+ className: e,
158
+ wrapperClassName: t,
159
+ footer: a,
160
+ children: n,
161
+ selectionMode: s = "none",
162
+ selectedKeys: l,
163
+ onSelectionChange: i,
164
+ rowKeys: h,
165
+ elevatedActionColumn: w = !1,
166
+ actionColumnWidth: r = "4rem",
167
+ sortDescriptor: T,
168
+ onSortChange: y,
169
+ allowsSorting: v = !0,
170
+ isStatic: C = !1,
171
+ resizableColumns: A = !0,
172
+ ...W
173
+ }, M) => {
174
+ const N = o.useMemo(() => h ?? [], [h]), z = l === "all", b = z ? null : l ?? /* @__PURE__ */ new Set(), E = o.useCallback(
175
+ (c) => z || !!(b != null && b.has(c)),
176
+ [z, b]
177
+ ), k = N.length > 0 && (z || N.every((c) => b == null ? void 0 : b.has(c))), B = !k && (z || N.some((c) => b == null ? void 0 : b.has(c))), O = o.useCallback(
178
+ (c) => {
179
+ if (!i) return;
180
+ if (s === "single") {
181
+ i(E(c) ? /* @__PURE__ */ new Set() : /* @__PURE__ */ new Set([c]));
73
182
  return;
74
183
  }
75
- const p = new Set(m ? v : f ?? /* @__PURE__ */ new Set());
76
- p.has(r) ? p.delete(r) : p.add(r), c(p);
184
+ const m = new Set(z ? N : b ?? /* @__PURE__ */ new Set());
185
+ m.has(c) ? m.delete(c) : m.add(c), i(m);
77
186
  },
78
- [c, g, C, m, v, f]
79
- ), A = a.useCallback(() => {
80
- c && c(N ? /* @__PURE__ */ new Set() : new Set(v));
81
- }, [c, N, v]), B = a.useCallback(
82
- (r) => {
83
- if (!w) return;
84
- const p = (b == null ? void 0 : b.column) === r && b.direction === "ascending" ? "descending" : "ascending";
85
- w({ column: r, direction: p });
187
+ [i, s, E, z, N, b]
188
+ ), I = o.useCallback(() => {
189
+ i && i(k ? /* @__PURE__ */ new Set() : new Set(N));
190
+ }, [i, k, N]), [F, H] = o.useState(), R = v && !y, x = R ? F ?? T : T, f = o.useCallback(
191
+ (c) => {
192
+ if (!v) return;
193
+ const m = (x == null ? void 0 : x.column) === c && x.direction === "ascending" ? "descending" : "ascending", g = { column: c, direction: m };
194
+ y ? y(g) : H(g);
86
195
  },
87
- [w, b]
88
- ), R = a.useRef(null), [S, G] = a.useState({
196
+ [x, v, y]
197
+ ), p = o.useMemo(
198
+ () => R ? ue(n, x) : n,
199
+ [x, R, n]
200
+ ), S = o.useRef(null), [D, X] = o.useState({
89
201
  left: !1,
90
202
  right: !1
91
- }), _ = a.useCallback(() => {
92
- const r = R.current;
93
- if (!r) return;
94
- const p = r.scrollWidth - r.clientWidth, y = r.scrollLeft > 1, E = r.scrollLeft < p - 1;
95
- G(
96
- (k) => k.left === y && k.right === E ? k : { left: y, right: E }
203
+ }), $ = o.useCallback(() => {
204
+ const c = S.current;
205
+ if (!c) return;
206
+ const m = c.scrollWidth - c.clientWidth, g = c.scrollLeft > 1, L = c.scrollLeft < m - 1;
207
+ X(
208
+ (J) => J.left === g && J.right === L ? J : { left: g, right: L }
97
209
  );
98
210
  }, []);
99
- a.useEffect(() => {
100
- _();
101
- const r = R.current;
102
- if (!r || typeof ResizeObserver > "u") return;
103
- const p = new ResizeObserver(_);
104
- p.observe(r);
105
- const y = r.querySelector("table");
106
- return y && p.observe(y), () => p.disconnect();
107
- }, [_]);
108
- const J = a.useMemo(
211
+ o.useEffect(() => {
212
+ $();
213
+ const c = S.current;
214
+ if (!c || typeof ResizeObserver > "u") return;
215
+ const m = new ResizeObserver($);
216
+ m.observe(c);
217
+ const g = c.querySelector("table");
218
+ return g && m.observe(g), () => m.disconnect();
219
+ }, [$]);
220
+ const [P, j] = o.useState(
221
+ null
222
+ ), Z = o.useCallback(
223
+ (c) => {
224
+ j(
225
+ (m) => m ?? Array.from(
226
+ c.cells,
227
+ (g) => g.getBoundingClientRect().width
228
+ )
229
+ );
230
+ },
231
+ []
232
+ ), ee = o.useCallback(
233
+ (c, m) => {
234
+ j((g) => {
235
+ if (!g) return g;
236
+ const L = [...g];
237
+ return L[c] = Math.max(G, m), L;
238
+ });
239
+ },
240
+ []
241
+ ), te = o.useCallback(
242
+ () => j(null),
243
+ []
244
+ ), me = o.useMemo(
109
245
  () => ({
110
- selectionMode: g,
111
- isSelected: C,
112
- toggleKey: P,
113
- toggleAll: A,
114
- allSelected: N,
115
- someSelected: H,
116
- isStatic: x,
117
- sortDescriptor: b,
118
- requestSort: w ? B : void 0,
119
- elevatedActionColumn: u
246
+ selectionMode: s,
247
+ isSelected: E,
248
+ toggleKey: O,
249
+ toggleAll: I,
250
+ allSelected: k,
251
+ someSelected: B,
252
+ isStatic: C,
253
+ sortDescriptor: x,
254
+ requestSort: v ? f : void 0,
255
+ automaticSorting: R,
256
+ elevatedActionColumn: w,
257
+ resizableColumns: A,
258
+ columnWidths: P,
259
+ snapshotColumnWidths: Z,
260
+ setColumnWidth: ee,
261
+ resetColumnWidths: te
120
262
  }),
121
263
  [
122
- g,
264
+ s,
265
+ E,
266
+ O,
267
+ I,
268
+ k,
269
+ B,
123
270
  C,
124
- P,
125
- A,
126
- N,
127
- H,
128
271
  x,
129
- b,
272
+ v,
273
+ R,
274
+ f,
130
275
  w,
131
- B,
132
- u
276
+ A,
277
+ P,
278
+ Z,
279
+ ee,
280
+ te
133
281
  ]
134
282
  );
135
- return /* @__PURE__ */ s(M.Provider, { value: J, children: /* @__PURE__ */ z(
283
+ return /* @__PURE__ */ d(ce.Provider, { value: me, children: /* @__PURE__ */ _(
136
284
  "div",
137
285
  {
138
- "data-scroll-left": S.left ? "true" : "false",
139
- "data-scroll-right": S.right ? "true" : "false",
140
- className: t(
286
+ "data-scroll-left": D.left ? "true" : "false",
287
+ "data-scroll-right": D.right ? "true" : "false",
288
+ className: u(
141
289
  "group/table-shell overflow-clip rounded-2xl bg-table-shell px-1 pb-1",
142
- n
290
+ // Concentric inner radius for the white body card: shell radius
291
+ // minus the 4px inset above. Every card corner (cells, viewport,
292
+ // pinned caps) derives from this one value.
293
+ "[--table-card-radius:calc(var(--radius-2xl)-0.25rem)]",
294
+ t
143
295
  ),
144
296
  children: [
145
- /* @__PURE__ */ z(
297
+ /* @__PURE__ */ _(
146
298
  "div",
147
299
  {
148
300
  className: "relative",
149
- style: u ? {
150
- "--table-action-column-width": h
301
+ style: w ? {
302
+ "--table-action-column-width": r
151
303
  } : void 0,
152
304
  children: [
153
- /* @__PURE__ */ s(
305
+ /* @__PURE__ */ d(
154
306
  "div",
155
307
  {
156
- ref: R,
157
- onScroll: _,
158
- className: "overflow-x-auto rounded-[calc(var(--radius-2xl)-var(--spacing))]",
159
- children: /* @__PURE__ */ s(
308
+ ref: S,
309
+ onScroll: $,
310
+ className: "overflow-x-auto rounded-(--table-card-radius)",
311
+ children: /* @__PURE__ */ _(
160
312
  "table",
161
313
  {
162
- ref: $,
314
+ ref: M,
163
315
  "data-slot": "table",
164
- className: t(
316
+ className: u(
165
317
  "w-full border-separate border-spacing-0 text-base",
166
- o
318
+ // Manual widths need fixed layout so the <colgroup> wins;
319
+ // until the first resize the automatic layout is untouched.
320
+ P && "table-fixed",
321
+ e
167
322
  ),
168
- ...U,
169
- children: d
323
+ ...W,
324
+ children: [
325
+ P && /* @__PURE__ */ d("colgroup", { children: P.map((c, m) => /* @__PURE__ */ d("col", { style: { width: c } }, m)) }),
326
+ p
327
+ ]
170
328
  }
171
329
  )
172
330
  }
173
331
  ),
174
- /* @__PURE__ */ s(
332
+ /* @__PURE__ */ d(
175
333
  "div",
176
334
  {
177
335
  "aria-hidden": "true",
178
336
  "data-slot": "table-scroll-hint",
179
- className: t(
337
+ className: u(
180
338
  "pointer-events-none absolute inset-y-0 z-20 w-10",
181
339
  "bg-gradient-to-l from-(--table-scroll-hint) to-transparent",
182
- "opacity-0 transition-opacity duration-(--duration-fast) ease-out motion-reduce:transition-none",
183
- S.right && "opacity-100",
184
- u ? "right-[var(--table-action-column-width)]" : "right-0"
340
+ "opacity-0 transition-opacity duration-150 ease-out motion-reduce:transition-none",
341
+ D.right && "opacity-100",
342
+ w ? "right-[var(--table-action-column-width)]" : "right-0"
185
343
  )
186
344
  }
187
345
  ),
188
- u && /* @__PURE__ */ s(
346
+ w && /* @__PURE__ */ d(
189
347
  "div",
190
348
  {
191
349
  "aria-hidden": "true",
192
350
  "data-slot": "table-action-column-elevation",
193
- className: t(
351
+ className: u(
194
352
  "pointer-events-none absolute inset-y-0 right-0 z-20",
195
353
  "w-[var(--table-action-column-width)]",
196
- "rounded-br-[calc(var(--radius-2xl)-var(--spacing))]"
354
+ "rounded-br-(--table-card-radius)"
197
355
  // No shadow of its own: while columns hide behind the pinned
198
356
  // surface the scroll-hint gradient is already washing the
199
357
  // seam — stacking a cast on top of it read harsh. The hint
@@ -204,113 +362,150 @@ const L = (o) => o === "center" ? "text-center" : o === "right" ? "text-right" :
204
362
  ]
205
363
  }
206
364
  ),
207
- i && /* @__PURE__ */ s("div", { className: "flex items-center px-4 py-2.5", children: i })
365
+ a && /* @__PURE__ */ d("div", { className: "flex items-center px-4 py-2.5", children: a })
208
366
  ]
209
367
  }
210
368
  ) });
211
369
  }
212
370
  );
213
- D.displayName = "Table";
214
- const K = a.forwardRef(({ className: o, ...n }, i) => {
215
- const d = T();
216
- return /* @__PURE__ */ s(q.Provider, { value: "header", children: /* @__PURE__ */ s(
371
+ ze.displayName = "Table";
372
+ const de = o.forwardRef(({ className: e, ...t }, a) => {
373
+ const n = q();
374
+ return /* @__PURE__ */ d(Q.Provider, { value: "header", children: /* @__PURE__ */ d(
217
375
  "thead",
218
376
  {
219
- ref: i,
220
- className: t(
377
+ ref: a,
378
+ className: u(
221
379
  "text-xs text-muted-foreground",
222
- (d == null ? void 0 : d.elevatedActionColumn) && "relative z-30 bg-table-shell",
223
- o
380
+ (n == null ? void 0 : n.elevatedActionColumn) && "relative z-30 bg-table-shell",
381
+ e
224
382
  ),
225
- ...n
383
+ ...t
226
384
  }
227
385
  ) });
228
386
  });
229
- K.displayName = "TableHeader";
230
- const ee = a.forwardRef(({ className: o, ...n }, i) => /* @__PURE__ */ s(q.Provider, { value: "body", children: /* @__PURE__ */ s("tbody", { ref: i, className: t(o), ...n }) }));
231
- ee.displayName = "TableBody";
232
- const re = a.forwardRef(
233
- ({ className: o, rowKey: n, children: i, ...d }, g) => {
234
- const e = T(), c = a.useContext(q), l = !!e && e.selectionMode !== "none", u = l && c === "body" && n !== void 0 ? e.isSelected(n) : !1;
235
- return /* @__PURE__ */ z(
387
+ de.displayName = "TableHeader";
388
+ const pe = o.forwardRef(({ className: e, ...t }, a) => /* @__PURE__ */ d(Q.Provider, { value: "body", children: /* @__PURE__ */ d("tbody", { ref: a, className: u(e), ...t }) }));
389
+ pe.displayName = "TableBody";
390
+ const Y = o.forwardRef(
391
+ ({ className: e, rowKey: t, children: a, ...n }, s) => {
392
+ const l = q(), i = o.useContext(Q), h = !!l && l.selectionMode !== "none", w = h && i === "body" && t !== void 0 ? l.isSelected(t) : !1;
393
+ return /* @__PURE__ */ _(
236
394
  "tr",
237
395
  {
238
- ref: g,
239
- "data-selected": u || void 0,
240
- className: t("group/row", o),
241
- ...d,
396
+ ref: s,
397
+ "data-selected": w || void 0,
398
+ className: u("group/row", e),
399
+ ...n,
242
400
  children: [
243
- l && (c === "header" ? /* @__PURE__ */ s(
401
+ h && (i === "header" ? /* @__PURE__ */ _(
244
402
  "th",
245
403
  {
246
404
  scope: "col",
247
- className: t(
405
+ className: u(
248
406
  "w-10 px-4 py-2.5",
249
- I,
407
+ le,
250
408
  // Sticky without the baked shadow — an always-on smudge
251
409
  // muddies the shell's corners (elevation = actionability).
252
410
  // (sticky is positioned, so the ::after tick anchors to it —
253
411
  // no `relative` needed, and it would conflict with sticky.)
254
412
  "sticky left-0 z-10 bg-table-shell"
255
413
  ),
256
- children: e.selectionMode === "multiple" && /* @__PURE__ */ s(
257
- j,
258
- {
259
- size: "sm",
260
- "aria-label": "Select all rows",
261
- checked: e.allSelected,
262
- indeterminate: e.someSelected,
263
- onChange: e.toggleAll
264
- }
265
- )
414
+ children: [
415
+ /* @__PURE__ */ d("span", { className: "sr-only", children: "Row selection" }),
416
+ l.selectionMode === "multiple" && /* @__PURE__ */ d(
417
+ re,
418
+ {
419
+ size: "sm",
420
+ "aria-label": "Select all rows",
421
+ checked: l.allSelected,
422
+ indeterminate: l.someSelected,
423
+ onChange: l.toggleAll
424
+ }
425
+ )
426
+ ]
266
427
  }
267
- ) : /* @__PURE__ */ s(
428
+ ) : /* @__PURE__ */ d(
268
429
  "td",
269
430
  {
270
- className: t(
431
+ className: u(
271
432
  "w-10 px-4 py-3",
272
- F(e.isStatic),
273
- Y,
433
+ ie(l.isStatic),
434
+ we,
274
435
  "sticky left-0 z-10",
275
436
  // Same white-behind-white corner problem as pinned data cells.
276
- W("left")
437
+ se("left")
277
438
  ),
278
- onClick: (h) => h.stopPropagation(),
279
- children: n !== void 0 && /* @__PURE__ */ s(
280
- j,
439
+ onClick: (r) => r.stopPropagation(),
440
+ children: t !== void 0 && /* @__PURE__ */ d(
441
+ re,
281
442
  {
282
443
  size: "sm",
283
- "aria-label": `Select ${n}`,
284
- checked: u,
285
- onChange: () => e.toggleKey(n)
444
+ "aria-label": `Select ${t}`,
445
+ checked: w,
446
+ onChange: () => l.toggleKey(t)
286
447
  }
287
448
  )
288
449
  }
289
450
  )),
290
- i
451
+ a
291
452
  ]
292
453
  }
293
454
  );
294
455
  }
295
456
  );
296
- re.displayName = "TableRow";
297
- const te = a.forwardRef(({ className: o, align: n, sticky: i, sortKey: d, children: g, ...e }, c) => {
298
- var w, x;
299
- const l = T(), u = !!d && !!(l != null && l.requestSort), h = u && ((w = l == null ? void 0 : l.sortDescriptor) == null ? void 0 : w.column) === d, b = (x = l == null ? void 0 : l.sortDescriptor) == null ? void 0 : x.direction;
300
- return /* @__PURE__ */ s(
457
+ Y.displayName = "TableRow";
458
+ const fe = o.forwardRef(({ className: e, align: t, sticky: a, sortKey: n, allowsSorting: s = !0, _sortColumnIndex: l, children: i, ...h }, w) => {
459
+ var H, R, x;
460
+ const r = q(), y = (r != null && r.automaticSorting && l !== void 0 ? `${K}${l}` : void 0) ?? n, v = Number(h.colSpan ?? 1) === 1, C = String(U(i)).trim(), A = C.length > 0, W = s && v && a !== "right" && A && !!y && !!(r != null && r.requestSort), M = W && ((H = r == null ? void 0 : r.sortDescriptor) == null ? void 0 : H.column) === y, N = (R = r == null ? void 0 : r.sortDescriptor) == null ? void 0 : R.direction, z = !!(r != null && r.resizableColumns) && v && a !== "right", b = o.useRef(null), [E, k] = o.useState(!1), B = (f) => {
461
+ if (f.button !== 0 || !r) return;
462
+ const p = f.currentTarget.parentElement, S = p == null ? void 0 : p.parentElement;
463
+ if (!(!p || !S)) {
464
+ r.snapshotColumnWidths(S), b.current = {
465
+ index: p.cellIndex,
466
+ startX: f.clientX,
467
+ startWidth: p.getBoundingClientRect().width
468
+ }, k(!0);
469
+ try {
470
+ f.currentTarget.setPointerCapture(f.pointerId);
471
+ } catch {
472
+ }
473
+ f.preventDefault();
474
+ }
475
+ }, O = (f) => {
476
+ const p = b.current;
477
+ !p || !r || r.setColumnWidth(
478
+ p.index,
479
+ p.startWidth + (f.clientX - p.startX)
480
+ );
481
+ }, I = () => {
482
+ b.current = null, k(!1);
483
+ }, F = (f) => {
484
+ if (f.key !== "ArrowLeft" && f.key !== "ArrowRight" || !r) return;
485
+ f.preventDefault();
486
+ const p = f.currentTarget.parentElement, S = p == null ? void 0 : p.parentElement;
487
+ if (!p || !S) return;
488
+ r.snapshotColumnWidths(S);
489
+ const D = f.shiftKey ? 32 : 8, X = f.key === "ArrowRight" ? D : -D;
490
+ r.setColumnWidth(p.cellIndex, p.getBoundingClientRect().width + X);
491
+ };
492
+ return /* @__PURE__ */ _(
301
493
  "th",
302
494
  {
303
- ref: c,
495
+ ref: w,
304
496
  scope: "col",
305
- "aria-sort": h ? b === "ascending" ? "ascending" : "descending" : u ? "none" : void 0,
306
- className: t(
497
+ "aria-sort": M ? N === "ascending" ? "ascending" : "descending" : W ? "none" : void 0,
498
+ className: u(
307
499
  // whitespace-nowrap: header labels hug their content — the table
308
500
  // scrolls horizontally, so wrapping "Null %" to two lines only
309
501
  // wastes header height without saving any width.
310
502
  "relative whitespace-nowrap px-4 py-2.5 font-normal",
311
- I,
312
- L(n),
313
- i && (i === "right" && (l != null && l.elevatedActionColumn) ? t(
503
+ le,
504
+ // The resize handle carries its own tick visual, so drop the
505
+ // decorative one; the last column never shows a handle.
506
+ z && "after:hidden [&:last-child>[data-slot=resize-handle]]:hidden",
507
+ ne(t),
508
+ a && (a === "right" && (r != null && r.elevatedActionColumn) ? u(
314
509
  // Preserve the semantic column width, but do not pin or paint
315
510
  // a blank header cell over the labels behind it. Only body
316
511
  // action cells participate in the sticky elevated surface.
@@ -318,69 +513,111 @@ const te = a.forwardRef(({ className: o, align: n, sticky: i, sortKey: d, childr
318
513
  "min-w-[var(--table-action-column-width)]",
319
514
  "max-w-[var(--table-action-column-width)]",
320
515
  "bg-transparent"
321
- ) : t(O(i), "bg-table-shell")),
322
- o
516
+ ) : u(ae(a), "bg-table-shell")),
517
+ e
323
518
  ),
324
- ...e,
325
- children: u ? /* @__PURE__ */ z(
326
- "button",
327
- {
328
- type: "button",
329
- onClick: () => l.requestSort(d),
330
- className: t(
331
- "group/sort -mx-1 inline-flex items-center gap-1 rounded px-1 outline-none transition-colors",
332
- "hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring",
333
- n === "right" && "flex-row-reverse",
334
- h && "text-foreground"
335
- ),
336
- children: [
337
- g,
338
- h ? b === "ascending" ? /* @__PURE__ */ s(Q, { className: "size-3.5" }) : /* @__PURE__ */ s(V, { className: "size-3.5" }) : /* @__PURE__ */ s(X, { className: "size-3.5 opacity-0 transition-opacity group-hover/sort:opacity-60" })
339
- ]
340
- }
341
- ) : g
519
+ ...h,
520
+ children: [
521
+ W ? /* @__PURE__ */ _(
522
+ "button",
523
+ {
524
+ type: "button",
525
+ onClick: () => r.requestSort(y),
526
+ className: u(
527
+ "group/sort -mx-1 inline-flex items-center gap-1 rounded px-1 outline-none transition-colors",
528
+ "hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring",
529
+ t === "right" && "flex-row-reverse",
530
+ M && "text-foreground"
531
+ ),
532
+ children: [
533
+ i,
534
+ M ? N === "ascending" ? /* @__PURE__ */ d(be, { className: "size-3.5" }) : /* @__PURE__ */ d(ge, { className: "size-3.5" }) : /* @__PURE__ */ d(he, { className: "size-3.5 opacity-0 transition-opacity group-hover/sort:opacity-60" })
535
+ ]
536
+ }
537
+ ) : A ? i : /* @__PURE__ */ d("span", { className: "sr-only", children: h["aria-label"] ?? "Table column" }),
538
+ z && /* @__PURE__ */ d(
539
+ "span",
540
+ {
541
+ "data-slot": "resize-handle",
542
+ role: "separator",
543
+ "aria-orientation": "vertical",
544
+ "aria-label": `Resize ${C || "this"} column`,
545
+ "aria-valuemin": G,
546
+ "aria-valuemax": 2e3,
547
+ "aria-valuenow": ((x = r == null ? void 0 : r.columnWidths) == null ? void 0 : x[l ?? -1]) ?? G,
548
+ tabIndex: 0,
549
+ "data-resizing": E ? "true" : void 0,
550
+ onPointerDown: B,
551
+ onPointerMove: O,
552
+ onPointerUp: I,
553
+ onPointerCancel: I,
554
+ onKeyDown: F,
555
+ onDoubleClick: () => r == null ? void 0 : r.resetColumnWidths(),
556
+ className: u(
557
+ // 12px hit area straddling the column edge; the 1px tick inside
558
+ // is the visible affordance (it replaces the decorative one).
559
+ "group/resize absolute -right-1.5 top-0 z-10 flex h-full w-3 cursor-col-resize touch-none select-none items-center justify-center rounded-sm outline-none",
560
+ "focus-visible:ring-2 focus-visible:ring-ring"
561
+ ),
562
+ children: /* @__PURE__ */ d(
563
+ "span",
564
+ {
565
+ "aria-hidden": "true",
566
+ className: u(
567
+ "h-4 w-px rounded-sm bg-border-strong",
568
+ "transition-[transform,background-color] duration-150 ease-out motion-reduce:transition-none",
569
+ "group-hover/resize:scale-y-125 group-hover/resize:bg-foreground/60",
570
+ "group-focus-visible/resize:scale-y-125 group-focus-visible/resize:bg-foreground/60",
571
+ "group-data-[resizing]/resize:scale-y-125 group-data-[resizing]/resize:bg-foreground/60"
572
+ )
573
+ }
574
+ )
575
+ }
576
+ )
577
+ ]
342
578
  }
343
579
  );
344
580
  });
345
- te.displayName = "TableColumn";
346
- const oe = a.forwardRef(
347
- ({ className: o, align: n, sticky: i, ...d }, g) => {
348
- const e = T(), c = i === "right" && (e == null ? void 0 : e.elevatedActionColumn);
349
- return /* @__PURE__ */ s(
581
+ fe.displayName = "TableColumn";
582
+ const Se = o.forwardRef(
583
+ ({ className: e, align: t, sticky: a, sortValue: n, ...s }, l) => {
584
+ const i = q(), h = a === "right" && (i == null ? void 0 : i.elevatedActionColumn);
585
+ return /* @__PURE__ */ d(
350
586
  "td",
351
587
  {
352
- ref: g,
353
- className: t(
588
+ ref: l,
589
+ "data-sort-value": n instanceof Date ? n.toISOString() : n,
590
+ className: u(
354
591
  // whitespace-nowrap: cell content never wraps — the table's
355
592
  // overflow-x-auto viewport scrolls horizontally instead, matching the
356
593
  // header cells. Opt back into wrapping with `whitespace-normal` for
357
594
  // deliberate multi-line content (e.g. an EmptyState in a colSpan cell).
358
595
  "whitespace-nowrap px-4 py-3",
359
- F((e == null ? void 0 : e.isStatic) ?? !1),
360
- Z,
361
- L(n),
362
- i && O(i, e == null ? void 0 : e.elevatedActionColumn),
363
- i && W(i),
364
- c && t(
596
+ ie((i == null ? void 0 : i.isStatic) ?? !1),
597
+ ve,
598
+ ne(t),
599
+ a && ae(a, i == null ? void 0 : i.elevatedActionColumn),
600
+ a && se(a),
601
+ h && u(
365
602
  "w-[var(--table-action-column-width)]",
366
603
  "min-w-[var(--table-action-column-width)]",
367
604
  "max-w-[var(--table-action-column-width)]",
368
605
  "bg-elevated",
369
606
  "group-hover/row:bg-elevated group-focus-within/row:bg-elevated"
370
607
  ),
371
- o
608
+ e
372
609
  ),
373
- ...d
610
+ ...s
374
611
  }
375
612
  );
376
613
  }
377
614
  );
378
- oe.displayName = "TableCell";
615
+ Se.displayName = "TableCell";
379
616
  export {
380
- D as Table,
381
- ee as TableBody,
382
- oe as TableCell,
383
- te as TableColumn,
384
- K as TableHeader,
385
- re as TableRow
617
+ ze as Table,
618
+ pe as TableBody,
619
+ Se as TableCell,
620
+ fe as TableColumn,
621
+ de as TableHeader,
622
+ Y as TableRow
386
623
  };