twico-ui 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,22 +1,335 @@
1
1
  "use client";
2
- import * as React25 from 'react';
3
- import React25__default from 'react';
2
+ import * as React36 from 'react';
3
+ import React36__default from 'react';
4
4
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
5
5
  import { createPortal } from 'react-dom';
6
6
 
7
- // components/navigation/Accordion.jsx
8
- var SUPPORTS_STYLE_HOIST = parseInt(String(React25.version), 10) >= 19;
7
+ // components/TwicoProvider.jsx
8
+ var SUPPORTS_STYLE_HOIST = parseInt(String(React36.version), 10) >= 19;
9
+ var NonceContext = React36.createContext(void 0);
9
10
  function useScopedStyles(id, css) {
10
- React25.useInsertionEffect(() => {
11
+ const nonce = React36.useContext(NonceContext);
12
+ React36.useInsertionEffect(() => {
11
13
  if (SUPPORTS_STYLE_HOIST) return;
12
14
  if (typeof document === "undefined" || document.getElementById(id)) return;
13
15
  const el = document.createElement("style");
14
16
  el.id = id;
17
+ if (nonce) {
18
+ el.setAttribute("nonce", nonce);
19
+ el.nonce = nonce;
20
+ }
15
21
  el.textContent = css;
16
22
  document.head.appendChild(el);
17
- }, [id, css]);
18
- return SUPPORTS_STYLE_HOIST ? React25.createElement("style", { href: id, precedence: "twc-ui" }, css) : null;
23
+ }, [id, css, nonce]);
24
+ return SUPPORTS_STYLE_HOIST ? React36.createElement("style", { href: id, precedence: "twc-ui", nonce }, css) : null;
25
+ }
26
+
27
+ // components/TwicoProvider.jsx
28
+ function TwicoProvider({ nonce, children }) {
29
+ return React36__default.createElement(NonceContext.Provider, { value: nonce }, children);
30
+ }
31
+ var GROUPS = { colors: "color", space: "space", radius: "radius", font: "font", shadow: "shadow", motion: "" };
32
+ function createTheme(partial = {}) {
33
+ const vars = {};
34
+ for (const [group, prefix] of Object.entries(GROUPS)) {
35
+ const obj = partial[group];
36
+ if (!obj || typeof obj !== "object") continue;
37
+ for (const [key, value] of Object.entries(obj)) {
38
+ if (value == null) continue;
39
+ vars[`--${prefix ? `${prefix}-` : ""}${key}`] = String(value);
40
+ }
41
+ }
42
+ return vars;
43
+ }
44
+ function toVars(theme) {
45
+ if (!theme) return {};
46
+ return Object.keys(theme).some((k) => k.startsWith("--")) ? theme : createTheme(theme);
47
+ }
48
+ function ThemeProvider({ theme, mode = "inline", className = "", style, children, ...rest }) {
49
+ const vars = React36__default.useMemo(() => toVars(theme), [theme]);
50
+ const uid = React36__default.useId();
51
+ const scopeId = `twc-theme-${uid.replace(/[^a-zA-Z0-9]/g, "")}`;
52
+ const css = mode === "stylesheet" ? `[data-twc-theme="${scopeId}"] { ${Object.entries(vars).map(([k, v]) => `${k}: ${v};`).join(" ")} }` : "";
53
+ const __twcStyles = useScopedStyles(mode === "stylesheet" ? scopeId : "twc-theme-noop", css);
54
+ return /* @__PURE__ */ jsxs(
55
+ "div",
56
+ {
57
+ className: `twc-theme ${className}`.trim(),
58
+ "data-twc-theme": mode === "stylesheet" ? scopeId : void 0,
59
+ style: mode === "stylesheet" ? style : { ...vars, ...style },
60
+ ...rest,
61
+ children: [
62
+ mode === "stylesheet" ? __twcStyles : null,
63
+ children
64
+ ]
65
+ }
66
+ );
67
+ }
68
+ var FORM_CSS = `
69
+ .twc-form { display: flex; flex-direction: column; gap: var(--space-4); font-family: var(--font-sans); }
70
+ .twc-form__fieldset { border: 0; margin: 0; padding: 0; min-width: 0; display: flex; flex-direction: column; gap: inherit; }
71
+ `;
72
+ var Form = React36__default.forwardRef(function Form2({
73
+ onSubmit,
74
+ preventDefault = true,
75
+ loading = false,
76
+ disabled = false,
77
+ gap,
78
+ className = "",
79
+ style,
80
+ children,
81
+ ...rest
82
+ }, ref) {
83
+ const __twcStyles = useScopedStyles("twc-form-styles", FORM_CSS);
84
+ const handleSubmit = (e) => {
85
+ if (preventDefault) e.preventDefault();
86
+ onSubmit?.(e);
87
+ };
88
+ return /* @__PURE__ */ jsxs(
89
+ "form",
90
+ {
91
+ ref,
92
+ className: `twc-form ${className}`.trim(),
93
+ onSubmit: handleSubmit,
94
+ style: gap != null ? { gap: `var(--space-${gap})`, ...style } : style,
95
+ ...rest,
96
+ children: [
97
+ __twcStyles,
98
+ /* @__PURE__ */ jsx("fieldset", { className: "twc-form__fieldset", disabled: loading || disabled || void 0, "aria-busy": loading || void 0, children })
99
+ ]
100
+ }
101
+ );
102
+ });
103
+ Form.displayName = "Form";
104
+ var VH_CSS = `
105
+ .twc-visually-hidden { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; border: 0; }
106
+ `;
107
+ var VisuallyHidden = React36__default.forwardRef(function VisuallyHidden2({ as: Tag2 = "span", className = "", children, ...rest }, ref) {
108
+ const __twcStyles = useScopedStyles("twc-visually-hidden-styles", VH_CSS);
109
+ return /* @__PURE__ */ jsxs(Tag2, { ref, className: `twc-visually-hidden ${className}`.trim(), ...rest, children: [
110
+ __twcStyles,
111
+ children
112
+ ] });
113
+ });
114
+ VisuallyHidden.displayName = "VisuallyHidden";
115
+ var canUseDOM = typeof window !== "undefined" && typeof document !== "undefined";
116
+ var useIsoLayoutEffect = canUseDOM ? React36__default.useLayoutEffect : React36__default.useEffect;
117
+ var FOCUSABLE = 'a[href]:not([tabindex="-1"]), button:not([disabled]):not([tabindex="-1"]), textarea:not([disabled]):not([tabindex="-1"]), input:not([disabled]):not([tabindex="-1"]), select:not([disabled]):not([tabindex="-1"]), [tabindex]:not([tabindex="-1"])';
118
+ function useFocusTrap(ref, active = true, { restoreFocus = true, initialFocus } = {}) {
119
+ React36__default.useEffect(() => {
120
+ if (!active || !canUseDOM) return void 0;
121
+ const node = ref.current;
122
+ if (!node) return void 0;
123
+ const prevFocused = document.activeElement;
124
+ const target = (typeof initialFocus === "function" ? initialFocus() : initialFocus && initialFocus.current) || node.querySelector(FOCUSABLE);
125
+ (target || node).focus();
126
+ return () => {
127
+ if (restoreFocus && prevFocused && typeof prevFocused.focus === "function") prevFocused.focus();
128
+ };
129
+ }, [active]);
130
+ React36__default.useEffect(() => {
131
+ if (!active || !canUseDOM) return void 0;
132
+ const node = ref.current;
133
+ const onKey = (e) => {
134
+ if (e.key !== "Tab" || !node) return;
135
+ const f = Array.from(node.querySelectorAll(FOCUSABLE)).filter((el) => el.offsetParent !== null);
136
+ if (!f.length) {
137
+ e.preventDefault();
138
+ node.focus();
139
+ return;
140
+ }
141
+ const first = f[0], last = f[f.length - 1], ae = document.activeElement;
142
+ if (e.shiftKey) {
143
+ if (ae === first || ae === node || !node.contains(ae)) {
144
+ e.preventDefault();
145
+ last.focus();
146
+ }
147
+ } else if (ae === last || !node.contains(ae)) {
148
+ e.preventDefault();
149
+ first.focus();
150
+ }
151
+ };
152
+ document.addEventListener("keydown", onKey);
153
+ return () => document.removeEventListener("keydown", onKey);
154
+ }, [active]);
155
+ }
156
+ function usePortal() {
157
+ return React36__default.useCallback((node) => {
158
+ if (typeof document === "undefined") return null;
159
+ return typeof createPortal === "function" ? createPortal(node, document.body) : node;
160
+ }, []);
161
+ }
162
+ var __scrollLockCount = 0;
163
+ var __scrollLockSaved = { overflow: "", paddingRight: "" };
164
+ function useScrollLock(locked = true) {
165
+ useIsoLayoutEffect(() => {
166
+ if (!canUseDOM || !locked) return void 0;
167
+ if (__scrollLockCount === 0) {
168
+ const b = document.body;
169
+ __scrollLockSaved = { overflow: b.style.overflow, paddingRight: b.style.paddingRight };
170
+ const gutter = window.innerWidth - document.documentElement.clientWidth;
171
+ b.style.overflow = "hidden";
172
+ if (gutter > 0) b.style.paddingRight = `${(parseFloat(getComputedStyle(b).paddingRight) || 0) + gutter}px`;
173
+ }
174
+ __scrollLockCount += 1;
175
+ return () => {
176
+ __scrollLockCount -= 1;
177
+ if (__scrollLockCount === 0) {
178
+ document.body.style.overflow = __scrollLockSaved.overflow;
179
+ document.body.style.paddingRight = __scrollLockSaved.paddingRight;
180
+ }
181
+ };
182
+ }, [locked]);
19
183
  }
184
+ function useInertBackground(ref, active) {
185
+ React36__default.useEffect(() => {
186
+ if (!active || !canUseDOM) return void 0;
187
+ const node = ref.current;
188
+ if (!node) return void 0;
189
+ const changed = [];
190
+ Array.from(document.body.children).forEach((el) => {
191
+ if (el.contains(node) || el.hasAttribute("aria-hidden") || el.inert) return;
192
+ el.inert = true;
193
+ el.setAttribute("aria-hidden", "true");
194
+ changed.push(el);
195
+ });
196
+ return () => {
197
+ changed.forEach((el) => {
198
+ el.inert = false;
199
+ el.removeAttribute("aria-hidden");
200
+ });
201
+ };
202
+ }, [active]);
203
+ }
204
+
205
+ // components/layout/Portal.jsx
206
+ function Portal({ children }) {
207
+ const render = usePortal();
208
+ return render(children);
209
+ }
210
+ function getColorSchemeScript({ storageKey = "twico-theme", attribute = "class", defaultScheme } = {}) {
211
+ const k = JSON.stringify(storageKey);
212
+ const a = JSON.stringify(attribute);
213
+ const d = defaultScheme === "dark" || defaultScheme === "light" ? JSON.stringify(defaultScheme) : "null";
214
+ return `(function(){try{var k=${k},a=${a},d=${d},t=localStorage.getItem(k);if(t!=='light'){if(t!=='dark'){t=d?d:(window.matchMedia('(prefers-color-scheme: dark)').matches?'dark':'light');}}if(a==='class'){document.documentElement.classList.toggle('dark',t==='dark');}else{document.documentElement.setAttribute(a,t);}}catch(e){}})();`;
215
+ }
216
+ function ColorSchemeScript({ storageKey = "twico-theme", attribute = "class", nonce, defaultScheme }) {
217
+ return React36__default.createElement("script", { nonce }, getColorSchemeScript({ storageKey, attribute, defaultScheme }));
218
+ }
219
+ var KBD_CSS = `
220
+ .twc-kbd { display: inline-flex; align-items: center; justify-content: center; min-width: 20px; padding: 2px 6px;
221
+ font-family: var(--font-mono); font-size: 11px; font-weight: var(--font-semibold); line-height: 1; color: var(--color-text-muted);
222
+ background: var(--color-surface-sunken); border: var(--border-thin) solid var(--color-border);
223
+ border-bottom-width: 2px; border-radius: var(--radius-sm); }
224
+ `;
225
+ var Kbd = React36__default.forwardRef(function Kbd2({ className = "", children, ...rest }, ref) {
226
+ const __twcStyles = useScopedStyles("twc-kbd-styles", KBD_CSS);
227
+ return /* @__PURE__ */ jsxs("kbd", { ref, className: `twc-kbd ${className}`.trim(), ...rest, children: [
228
+ __twcStyles,
229
+ children
230
+ ] });
231
+ });
232
+ Kbd.displayName = "Kbd";
233
+ var PRE_CSS = `
234
+ .twc-pre { margin: 0; padding: var(--space-4); overflow-x: auto; max-width: 100%;
235
+ font-family: var(--font-mono); font-size: var(--text-sm); line-height: var(--leading-normal);
236
+ color: var(--color-text); background: var(--color-surface-sunken);
237
+ border: var(--border-thin) solid var(--color-border); border-radius: var(--radius-lg);
238
+ white-space: pre; -webkit-overflow-scrolling: touch; }
239
+ `;
240
+ var Pre = React36__default.forwardRef(function Pre2({ className = "", children, ...rest }, ref) {
241
+ const __twcStyles = useScopedStyles("twc-pre-styles", PRE_CSS);
242
+ return /* @__PURE__ */ jsxs("pre", { ref, className: `twc-pre ${className}`.trim(), ...rest, children: [
243
+ __twcStyles,
244
+ children
245
+ ] });
246
+ });
247
+ Pre.displayName = "Pre";
248
+ var ANCHOR_CSS = `
249
+ .twc-anchor { color: var(--color-primary); text-decoration: none; border-radius: var(--radius-sm);
250
+ transition: color var(--duration-fast) var(--ease-standard); }
251
+ .twc-anchor:hover { text-decoration: underline; color: var(--color-primary-hover, var(--color-primary)); }
252
+ .twc-anchor:focus-visible { outline: none; box-shadow: var(--ring); }
253
+ .twc-anchor__ext { display: inline-block; margin-inline-start: 3px; font-size: 0.85em; vertical-align: baseline; }
254
+ `;
255
+ function safeHref(url) {
256
+ if (url == null) return void 0;
257
+ const s = String(url).replace(/[\x00-\x20]+/g, "").toLowerCase();
258
+ return s.startsWith("javascript:") || s.startsWith("data:") || s.startsWith("vbscript:") ? void 0 : url;
259
+ }
260
+ var Anchor = React36__default.forwardRef(function Anchor2({ as: Tag2 = "a", href, external = false, className = "", children, ...rest }, ref) {
261
+ const __twcStyles = useScopedStyles("twc-anchor-styles", ANCHOR_CSS);
262
+ const extra = external ? { target: "_blank", rel: "noopener noreferrer" } : {};
263
+ return /* @__PURE__ */ jsxs(Tag2, { ref, className: `twc-anchor ${className}`.trim(), href: Tag2 === "a" ? safeHref(href) : href, ...extra, ...rest, children: [
264
+ __twcStyles,
265
+ children,
266
+ external ? /* @__PURE__ */ jsx("span", { className: "twc-anchor__ext", "aria-hidden": "true", children: "\u2197" }) : null
267
+ ] });
268
+ });
269
+ Anchor.displayName = "Anchor";
270
+ var LABEL_CSS = `
271
+ .twc-label { font-size: var(--text-sm); font-weight: var(--font-semibold); color: var(--color-text); display: inline-flex; gap: 4px; align-items: center; }
272
+ .twc-label[data-size="sm"] { font-size: var(--text-xs); }
273
+ .twc-label[data-size="lg"] { font-size: var(--text-base); }
274
+ .twc-label__req { color: var(--color-danger); }
275
+ `;
276
+ var Label = React36__default.forwardRef(function Label2({ htmlFor, required = false, size = "md", className = "", children, ...rest }, ref) {
277
+ const __twcStyles = useScopedStyles("twc-label-styles", LABEL_CSS);
278
+ return /* @__PURE__ */ jsxs("label", { ref, htmlFor, className: `twc-label ${className}`.trim(), "data-size": size, ...rest, children: [
279
+ __twcStyles,
280
+ children,
281
+ required ? /* @__PURE__ */ jsx("span", { className: "twc-label__req", "aria-hidden": "true", children: "*" }) : null
282
+ ] });
283
+ });
284
+ Label.displayName = "Label";
285
+ var IMAGE_CSS = `
286
+ .twc-image { display: block; max-width: 100%; }
287
+ .twc-image[data-fit] { width: 100%; height: 100%; }
288
+ `;
289
+ var Image = React36__default.forwardRef(function Image2({
290
+ src,
291
+ alt,
292
+ fit,
293
+ radius,
294
+ aspectRatio,
295
+ fallback,
296
+ loading = "lazy",
297
+ className = "",
298
+ style,
299
+ onError,
300
+ ...rest
301
+ }, ref) {
302
+ const __twcStyles = useScopedStyles("twc-image-styles", IMAGE_CSS);
303
+ const [failed, setFailed] = React36__default.useState(false);
304
+ const shownSrc = failed && fallback ? fallback : src;
305
+ const s = {
306
+ objectFit: fit,
307
+ borderRadius: radius ? `var(--radius-${radius})` : void 0,
308
+ aspectRatio,
309
+ ...style
310
+ };
311
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
312
+ __twcStyles,
313
+ /* @__PURE__ */ jsx(
314
+ "img",
315
+ {
316
+ ref,
317
+ src: shownSrc,
318
+ alt,
319
+ loading,
320
+ className: `twc-image ${className}`.trim(),
321
+ "data-fit": fit || void 0,
322
+ style: s,
323
+ onError: (e) => {
324
+ onError?.(e);
325
+ if (fallback && !failed) setFailed(true);
326
+ },
327
+ ...rest
328
+ }
329
+ )
330
+ ] });
331
+ });
332
+ Image.displayName = "Image";
20
333
  var ACCORDION_CSS = `
21
334
  .twc-accordion { display: flex; flex-direction: column; font-family: var(--font-sans);
22
335
  border: var(--border-thin) solid var(--color-border); border-radius: var(--radius-lg); overflow: hidden; background: var(--color-surface); }
@@ -56,10 +369,10 @@ function Accordion({
56
369
  ...rest
57
370
  }) {
58
371
  const __twcStyles = useScopedStyles("twc-accordion-styles", ACCORDION_CSS);
59
- const rootRef = React25__default.useRef(null);
60
- const [internal, setInternal] = React25__default.useState(() => new Set(defaultOpen));
372
+ const rootRef = React36__default.useRef(null);
373
+ const [internal, setInternal] = React36__default.useState(() => new Set(defaultOpen));
61
374
  const open = openProp !== void 0 ? new Set(openProp) : internal;
62
- const baseId = React25__default.useId();
375
+ const baseId = React36__default.useId();
63
376
  function toggle(val) {
64
377
  const item = items.find((x) => x.value === val);
65
378
  if (item?.disabled) return;
@@ -106,9 +419,9 @@ function Accordion({
106
419
  const triggerId = `${baseId}-trigger-${i}`;
107
420
  const panelId = `${baseId}-panel-${i}`;
108
421
  const lvl = Math.min(6, Math.max(1, it.headingLevel ?? headingLevel));
109
- const Heading2 = `h${lvl}`;
422
+ const Heading3 = `h${lvl}`;
110
423
  return /* @__PURE__ */ jsxs("div", { className: "twc-accordion__item", children: [
111
- /* @__PURE__ */ jsx(Heading2, { className: "twc-accordion__heading", children: /* @__PURE__ */ jsxs("button", { type: "button", id: triggerId, className: "twc-accordion__trigger", "data-open": isOpen || void 0, disabled: it.disabled || void 0, "aria-disabled": it.disabled || void 0, "data-disabled": it.disabled || void 0, "aria-expanded": isOpen, "aria-controls": panelId, onClick: () => toggle(it.value), children: [
424
+ /* @__PURE__ */ jsx(Heading3, { className: "twc-accordion__heading", children: /* @__PURE__ */ jsxs("button", { type: "button", id: triggerId, className: "twc-accordion__trigger", "data-open": isOpen || void 0, disabled: it.disabled || void 0, "aria-disabled": it.disabled || void 0, "data-disabled": it.disabled || void 0, "aria-expanded": isOpen, "aria-controls": panelId, onClick: () => toggle(it.value), children: [
112
425
  it.icon,
113
426
  /* @__PURE__ */ jsx("span", { className: "twc-accordion__label", children: it.label }),
114
427
  /* @__PURE__ */ jsx("span", { className: "twc-accordion__chevron", "aria-hidden": "true", children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "m6 9 6 6 6-6" }) }) })
@@ -245,7 +558,7 @@ function Avatar({
245
558
  ...rest
246
559
  }) {
247
560
  const __twcStyles = useScopedStyles("twc-avatar-styles", AVATAR_CSS);
248
- const [errored, setErrored] = React25__default.useState(false);
561
+ const [errored, setErrored] = React36__default.useState(false);
249
562
  const cleanSrc = safeSrc(src);
250
563
  const showImg = cleanSrc && !errored;
251
564
  const _statusLabel = status ? statusLabel ?? statusLabels?.[status] ?? STATUS_LABELS[status] : void 0;
@@ -303,7 +616,7 @@ var MENU_CSS = `
303
616
  .twc-menu__item-label { flex: 1 1 auto; min-width: 0; }
304
617
  .twc-menu__shortcut { margin-inline-start: auto; padding-inline-start: var(--space-3); font-size: var(--text-xs); color: var(--color-text-subtle); font-family: var(--font-mono); }
305
618
  `;
306
- var safeHref = (url) => {
619
+ var safeHref2 = (url) => {
307
620
  if (url == null) return void 0;
308
621
  const s = String(url).replace(/[\x00-\x20]+/g, "").toLowerCase();
309
622
  return s.startsWith("javascript:") || s.startsWith("data:") || s.startsWith("vbscript:") ? void 0 : url;
@@ -323,25 +636,25 @@ function Menu({
323
636
  ...rest
324
637
  }) {
325
638
  const __twcStyles = useScopedStyles("twc-menu-styles", MENU_CSS);
326
- const [openState, setOpenState] = React25__default.useState(defaultOpen);
327
- const [render, setRender] = React25__default.useState(false);
328
- const [pos, setPos] = React25__default.useState(null);
329
- const [active, setActive] = React25__default.useState(-1);
330
- const wrapRef = React25__default.useRef(null);
331
- const menuRef = React25__default.useRef(null);
332
- const typeBufRef = React25__default.useRef("");
333
- const typeTimerRef = React25__default.useRef(null);
334
- const menuId = React25__default.useId();
639
+ const [openState, setOpenState] = React36__default.useState(defaultOpen);
640
+ const [render, setRender] = React36__default.useState(false);
641
+ const [pos, setPos] = React36__default.useState(null);
642
+ const [active, setActive] = React36__default.useState(-1);
643
+ const wrapRef = React36__default.useRef(null);
644
+ const menuRef = React36__default.useRef(null);
645
+ const typeBufRef = React36__default.useRef("");
646
+ const typeTimerRef = React36__default.useRef(null);
647
+ const menuId = React36__default.useId();
335
648
  const headerId = `${menuId}-header`;
336
649
  const controlled = openProp !== void 0;
337
650
  const open = controlled ? !!openProp : openState;
338
- const openRef = React25__default.useRef(open);
651
+ const openRef = React36__default.useRef(open);
339
652
  openRef.current = open;
340
- const controlledRef = React25__default.useRef(controlled);
653
+ const controlledRef = React36__default.useRef(controlled);
341
654
  controlledRef.current = controlled;
342
- const onOpenChangeRef = React25__default.useRef(onOpenChange);
655
+ const onOpenChangeRef = React36__default.useRef(onOpenChange);
343
656
  onOpenChangeRef.current = onOpenChange;
344
- const setOpen = React25__default.useCallback((next) => {
657
+ const setOpen = React36__default.useCallback((next) => {
345
658
  const value = typeof next === "function" ? next(openRef.current) : next;
346
659
  if (value === openRef.current) return;
347
660
  if (!controlledRef.current) setOpenState(value);
@@ -349,7 +662,7 @@ function Menu({
349
662
  }, []);
350
663
  const RD = { createPortal: typeof createPortal === "function" ? createPortal : typeof window !== "undefined" && window.ReactDOM && window.ReactDOM.createPortal };
351
664
  const interactiveIdx = items.map((it, i) => !it.separator && !it.heading ? i : -1).filter((i) => i >= 0);
352
- const place = React25__default.useCallback(() => {
665
+ const place = React36__default.useCallback(() => {
353
666
  const t = wrapRef.current;
354
667
  if (!t) return;
355
668
  const r = t.getBoundingClientRect();
@@ -364,7 +677,7 @@ function Menu({
364
677
  const avail = (flip ? r.top : vh - r.bottom) - gap - M;
365
678
  setPos({ top, bottom, left, width: w, flip, maxHeight: Math.max(120, avail) });
366
679
  }, [align, width]);
367
- React25__default.useEffect(() => {
680
+ React36__default.useEffect(() => {
368
681
  if (!open) return;
369
682
  place();
370
683
  const onMove = () => place();
@@ -382,7 +695,7 @@ function Menu({
382
695
  document.removeEventListener("mousedown", onDown);
383
696
  };
384
697
  }, [open, place]);
385
- React25__default.useEffect(() => {
698
+ React36__default.useEffect(() => {
386
699
  if (open) {
387
700
  setRender(true);
388
701
  return;
@@ -475,7 +788,7 @@ function Menu({
475
788
  items.map((it, i) => {
476
789
  if (it.separator) return /* @__PURE__ */ jsx("div", { className: "twc-menu__sep", role: "separator" }, `s${i}`);
477
790
  if (it.label && it.heading) return /* @__PURE__ */ jsx("div", { className: "twc-menu__label", children: it.label }, `h${i}`);
478
- const href = !it.disabled ? safeHref(it.href) : void 0;
791
+ const href = !it.disabled ? safeHref2(it.href) : void 0;
479
792
  const Tag2 = href ? "a" : "button";
480
793
  return /* @__PURE__ */ jsxs(
481
794
  Tag2,
@@ -505,7 +818,7 @@ function Menu({
505
818
  }
506
819
  ) : null;
507
820
  const activeDescId = open && active >= 0 ? `${menuId}-item-${active}` : void 0;
508
- const triggerEl = React25__default.isValidElement(trigger) ? React25__default.cloneElement(trigger, {
821
+ const triggerEl = React36__default.isValidElement(trigger) ? React36__default.cloneElement(trigger, {
509
822
  onClick: (e) => {
510
823
  trigger.props.onClick?.(e);
511
824
  toggle();
@@ -656,7 +969,7 @@ a.twc-breadcrumb__item:hover, button.twc-breadcrumb__item:hover { color: var(--c
656
969
  .twc-breadcrumb__ellipsis { border: none; background: transparent; cursor: pointer; color: var(--color-text-subtle); padding: 3px 7px; border-radius: var(--radius-sm); font: inherit; }
657
970
  .twc-breadcrumb__ellipsis:hover { background: var(--color-surface-sunken); color: var(--color-text); }
658
971
  `;
659
- function safeHref2(url) {
972
+ function safeHref3(url) {
660
973
  if (url == null) return void 0;
661
974
  const s = String(url).replace(/[\x00-\x20]+/g, "").toLowerCase();
662
975
  return s.startsWith("javascript:") || s.startsWith("data:") || s.startsWith("vbscript:") ? void 0 : url;
@@ -670,7 +983,7 @@ function Breadcrumb({
670
983
  ...rest
671
984
  }) {
672
985
  const __twcStyles = useScopedStyles("twc-breadcrumb-styles", BREADCRUMB_CSS);
673
- const [expanded, setExpanded] = React25__default.useState(false);
986
+ const [expanded, setExpanded] = React36__default.useState(false);
674
987
  const sep = separator || /* @__PURE__ */ jsx(ChevronSep, {});
675
988
  let display = items;
676
989
  if (maxItems > 0 && items.length > maxItems && !expanded) {
@@ -683,7 +996,7 @@ function Breadcrumb({
683
996
  __twcStyles,
684
997
  display.map((it, i) => {
685
998
  const last = i === display.length - 1;
686
- return /* @__PURE__ */ jsxs(React25__default.Fragment, { children: [
999
+ return /* @__PURE__ */ jsxs(React36__default.Fragment, { children: [
687
1000
  it.ellipsis ? /* @__PURE__ */ jsx("button", { className: "twc-breadcrumb__ellipsis", "aria-label": "Show more", onClick: () => setExpanded(true), children: "\u2026" }) : last ? /* @__PURE__ */ jsxs(
688
1001
  "span",
689
1002
  {
@@ -695,7 +1008,7 @@ function Breadcrumb({
695
1008
  it.label
696
1009
  ]
697
1010
  }
698
- ) : safeHref2(it.href) ? /* @__PURE__ */ jsxs("a", { className: "twc-breadcrumb__item", href: safeHref2(it.href), onClick: it.onClick, children: [
1011
+ ) : safeHref3(it.href) ? /* @__PURE__ */ jsxs("a", { className: "twc-breadcrumb__item", href: safeHref3(it.href), onClick: it.onClick, children: [
699
1012
  it.icon ? /* @__PURE__ */ jsx("span", { "aria-hidden": "true", style: { display: "inline-flex" }, children: it.icon }) : null,
700
1013
  it.label
701
1014
  ] }) : it.onClick ? /* @__PURE__ */ jsxs("button", { type: "button", className: "twc-breadcrumb__item", onClick: it.onClick, children: [
@@ -803,7 +1116,7 @@ var CSS2 = `
803
1116
  animation: twico-ripple var(--duration-slow) var(--ease-out) forwards;
804
1117
  }
805
1118
  `;
806
- function safeHref3(url) {
1119
+ function safeHref4(url) {
807
1120
  if (url == null) return void 0;
808
1121
  const s = String(url).replace(/[\x00-\x20]+/g, "").toLowerCase();
809
1122
  return s.startsWith("javascript:") || s.startsWith("data:") || s.startsWith("vbscript:") ? void 0 : url;
@@ -825,7 +1138,7 @@ function Button({
825
1138
  ...rest
826
1139
  }) {
827
1140
  const __twcStyles = useScopedStyles("twc-btn-styles", CSS2);
828
- const [ripples, setRipples] = React25__default.useState([]);
1141
+ const [ripples, setRipples] = React36__default.useState([]);
829
1142
  const Tag2 = as;
830
1143
  const inert = Tag2 === "a" && (disabled || loading);
831
1144
  function handleClick(e) {
@@ -854,7 +1167,7 @@ function Button({
854
1167
  "data-block": fullWidth || void 0,
855
1168
  disabled: Tag2 === "button" ? disabled || loading : void 0,
856
1169
  type: Tag2 === "button" ? "button" : void 0,
857
- href: inert ? void 0 : safeHref3(href),
1170
+ href: inert ? void 0 : safeHref4(href),
858
1171
  "aria-disabled": inert || void 0,
859
1172
  tabIndex: inert ? -1 : void 0,
860
1173
  "aria-busy": loading || void 0,
@@ -999,14 +1312,14 @@ function Carousel({
999
1312
  ...rest
1000
1313
  }) {
1001
1314
  const __twcStyles = useScopedStyles("twc-carousel-styles", CAROUSEL_CSS);
1002
- const slides = React25__default.Children.toArray(children);
1315
+ const slides = React36__default.Children.toArray(children);
1003
1316
  const count = slides.length;
1004
- const [internal, setInternal] = React25__default.useState(defaultIndex);
1317
+ const [internal, setInternal] = React36__default.useState(defaultIndex);
1005
1318
  const index = indexProp !== void 0 ? indexProp : internal;
1006
- const [paused, setPaused] = React25__default.useState(false);
1007
- const [userPaused, setUserPaused] = React25__default.useState(false);
1008
- const [prefersReduced, setPrefersReduced] = React25__default.useState(false);
1009
- React25__default.useEffect(() => {
1319
+ const [paused, setPaused] = React36__default.useState(false);
1320
+ const [userPaused, setUserPaused] = React36__default.useState(false);
1321
+ const [prefersReduced, setPrefersReduced] = React36__default.useState(false);
1322
+ React36__default.useEffect(() => {
1010
1323
  if (typeof window === "undefined" || !window.matchMedia) return void 0;
1011
1324
  const mql = window.matchMedia("(prefers-reduced-motion: reduce)");
1012
1325
  const on = () => setPrefersReduced(mql.matches);
@@ -1014,15 +1327,15 @@ function Carousel({
1014
1327
  mql.addEventListener("change", on);
1015
1328
  return () => mql.removeEventListener("change", on);
1016
1329
  }, []);
1017
- const setIndex = React25__default.useCallback((i) => {
1330
+ const setIndex = React36__default.useCallback((i) => {
1018
1331
  if (indexProp === void 0) setInternal(i);
1019
1332
  onIndexChange?.(i);
1020
1333
  }, [indexProp, onIndexChange]);
1021
- const go = React25__default.useCallback((i) => {
1334
+ const go = React36__default.useCallback((i) => {
1022
1335
  setIndex(loop ? (i + count) % count : Math.min(Math.max(i, 0), count - 1));
1023
1336
  }, [count, loop, setIndex]);
1024
1337
  const autoRotating = autoPlay && !paused && !userPaused && !prefersReduced && count > 1;
1025
- React25__default.useEffect(() => {
1338
+ React36__default.useEffect(() => {
1026
1339
  if (!autoRotating) return void 0;
1027
1340
  const t = setInterval(() => {
1028
1341
  const next = loop ? (index + 1) % count : index + 1 >= count ? index : index + 1;
@@ -1117,7 +1430,7 @@ function Chart({
1117
1430
  ...rest
1118
1431
  }) {
1119
1432
  const __twcStyles = useScopedStyles("twc-chart-styles", CHART_CSS);
1120
- const uid = React25__default.useId();
1433
+ const uid = React36__default.useId();
1121
1434
  const tableId = tableFallback ? `${uid}-table` : void 0;
1122
1435
  const keys = series || ["value"];
1123
1436
  const palette = colors && colors.length ? colors : SERIES_COLORS;
@@ -1273,13 +1586,13 @@ function Checkbox({
1273
1586
  .twc-field { display: flex; flex-direction: column; gap: var(--space-1-5); font-family: var(--font-sans); }
1274
1587
  .twc-field__error { font-size: var(--text-xs); color: var(--color-danger-subtle-fg); font-weight: var(--font-medium); }
1275
1588
  `);
1276
- const autoId = React25__default.useId();
1589
+ const autoId = React36__default.useId();
1277
1590
  const fieldId = id || autoId;
1278
1591
  const errId = `${fieldId}-error`;
1279
1592
  const invalid = Boolean(error);
1280
- const ref = React25__default.useRef(null);
1593
+ const ref = React36__default.useRef(null);
1281
1594
  const mixed = indeterminate && !checked;
1282
- React25__default.useEffect(() => {
1595
+ React36__default.useEffect(() => {
1283
1596
  if (ref.current) ref.current.indeterminate = mixed;
1284
1597
  }, [mixed]);
1285
1598
  if (process.env.NODE_ENV !== "production" && !label && !description && !rest["aria-label"] && !rest["aria-labelledby"]) {
@@ -1422,20 +1735,20 @@ function ColorPicker({
1422
1735
  }) {
1423
1736
  const __twcStyles0 = useScopedStyles("twc-field-styles", FIELD_CSS);
1424
1737
  const __twcStyles1 = useScopedStyles("twc-colorpicker-styles", COLORPICKER_CSS);
1425
- const [internal, setInternal] = React25__default.useState(defaultValue);
1738
+ const [internal, setInternal] = React36__default.useState(defaultValue);
1426
1739
  const hex = (value !== void 0 ? value : internal) || "#000000";
1427
- const lastValidRef = React25__default.useRef(hex);
1740
+ const lastValidRef = React36__default.useRef(hex);
1428
1741
  if (/^#[0-9a-f]{6}$/i.test(hex)) lastValidRef.current = hex;
1429
- const [open, setOpen] = React25__default.useState(false);
1430
- const [hsv, setHsv] = React25__default.useState(() => hexToHsv(hex) || { h: 239, s: 60, v: 94 });
1431
- const [coords, setCoords] = React25__default.useState(null);
1432
- const wrapRef = React25__default.useRef(null);
1433
- const triggerRef = React25__default.useRef(null);
1434
- const popRef = React25__default.useRef(null);
1435
- const areaRef = React25__default.useRef(null);
1436
- const hueRef = React25__default.useRef(null);
1742
+ const [open, setOpen] = React36__default.useState(false);
1743
+ const [hsv, setHsv] = React36__default.useState(() => hexToHsv(hex) || { h: 239, s: 60, v: 94 });
1744
+ const [coords, setCoords] = React36__default.useState(null);
1745
+ const wrapRef = React36__default.useRef(null);
1746
+ const triggerRef = React36__default.useRef(null);
1747
+ const popRef = React36__default.useRef(null);
1748
+ const areaRef = React36__default.useRef(null);
1749
+ const hueRef = React36__default.useRef(null);
1437
1750
  const POP_W = 240;
1438
- const place = React25__default.useCallback(() => {
1751
+ const place = React36__default.useCallback(() => {
1439
1752
  const el = triggerRef.current;
1440
1753
  if (!el) return;
1441
1754
  const r = el.getBoundingClientRect();
@@ -1446,7 +1759,7 @@ function ColorPicker({
1446
1759
  left = Math.max(8, left);
1447
1760
  setCoords({ left, top: flip ? void 0 : Math.round(r.bottom + 6), bottom: flip ? Math.round(vh - r.top + 6) : void 0 });
1448
1761
  }, []);
1449
- React25__default.useEffect(() => {
1762
+ React36__default.useEffect(() => {
1450
1763
  if (!open) return void 0;
1451
1764
  place();
1452
1765
  const onMove = () => place();
@@ -1457,17 +1770,17 @@ function ColorPicker({
1457
1770
  window.removeEventListener("resize", onMove);
1458
1771
  };
1459
1772
  }, [open, place]);
1460
- const labelId = React25__default.useId();
1773
+ const labelId = React36__default.useId();
1461
1774
  const descId = `${labelId}-desc`;
1462
1775
  const invalid = Boolean(error);
1463
- React25__default.useEffect(() => {
1776
+ React36__default.useEffect(() => {
1464
1777
  if (disabled) setOpen(false);
1465
1778
  }, [disabled]);
1466
- React25__default.useEffect(() => {
1779
+ React36__default.useEffect(() => {
1467
1780
  const v = hexToHsv(hex);
1468
1781
  if (v && hsvToHex(v.h, v.s, v.v).toLowerCase() !== hsvToHex(hsv.h, hsv.s, hsv.v).toLowerCase()) setHsv(v);
1469
1782
  }, [hex]);
1470
- React25__default.useEffect(() => {
1783
+ React36__default.useEffect(() => {
1471
1784
  if (!open) return;
1472
1785
  const onDown = (e) => {
1473
1786
  if (wrapRef.current && wrapRef.current.contains(e.target)) return;
@@ -1484,18 +1797,7 @@ function ColorPicker({
1484
1797
  document.removeEventListener("keydown", onKey);
1485
1798
  };
1486
1799
  }, [open]);
1487
- const prevOpen = React25__default.useRef(false);
1488
- React25__default.useEffect(() => {
1489
- let id;
1490
- if (!prevOpen.current && open) {
1491
- id = setTimeout(() => areaRef.current?.focus({ preventScroll: true }), 20);
1492
- } else if (prevOpen.current && !open) {
1493
- const ae = typeof document !== "undefined" ? document.activeElement : null;
1494
- if (!ae || ae === document.body) triggerRef.current?.focus();
1495
- }
1496
- prevOpen.current = open;
1497
- return () => clearTimeout(id);
1498
- }, [open]);
1800
+ useFocusTrap(popRef, open && !!coords, { initialFocus: areaRef });
1499
1801
  const commit = (next) => {
1500
1802
  const h = hsvToHex(next.h, next.s, next.v);
1501
1803
  setHsv(next);
@@ -1588,6 +1890,7 @@ function ColorPicker({
1588
1890
  className: "twc-cp__pop",
1589
1891
  ref: popRef,
1590
1892
  role: "dialog",
1893
+ "aria-modal": "true",
1591
1894
  "aria-label": "Color picker",
1592
1895
  style: { position: "fixed", left: coords.left, right: "auto", top: coords.top, bottom: coords.bottom, zIndex: "var(--z-tooltip)" },
1593
1896
  children: [
@@ -1815,29 +2118,29 @@ function Combobox({
1815
2118
  ...rest
1816
2119
  }) {
1817
2120
  const __twcStyles = useScopedStyles("twc-combo-styles", COMBO_CSS);
1818
- const groups = React25__default.useMemo(() => normalizeGroups(options), [options]);
1819
- const flat = React25__default.useMemo(() => groups.flatMap((g) => g.options), [groups]);
1820
- const autoId = React25__default.useId();
2121
+ const groups = React36__default.useMemo(() => normalizeGroups(options), [options]);
2122
+ const flat = React36__default.useMemo(() => groups.flatMap((g) => g.options), [groups]);
2123
+ const autoId = React36__default.useId();
1821
2124
  const fieldId = id || autoId;
1822
- const [internal, setInternal] = React25__default.useState(defaultValue);
2125
+ const [internal, setInternal] = React36__default.useState(defaultValue);
1823
2126
  const current = value !== void 0 ? value : internal;
1824
2127
  const selected = flat.find((o) => o.value === current);
1825
- const [open, setOpen] = React25__default.useState(false);
1826
- const [query, setQuery] = React25__default.useState("");
1827
- const [active, setActive] = React25__default.useState(0);
1828
- const [coords, setCoords] = React25__default.useState(null);
1829
- const wrapRef = React25__default.useRef(null);
1830
- const controlRef = React25__default.useRef(null);
1831
- const inputRef = React25__default.useRef(null);
1832
- const popRef = React25__default.useRef(null);
1833
- const listRef = React25__default.useRef(null);
1834
- const activeRef = React25__default.useRef(null);
1835
- const fGroups = React25__default.useMemo(() => {
2128
+ const [open, setOpen] = React36__default.useState(false);
2129
+ const [query, setQuery] = React36__default.useState("");
2130
+ const [active, setActive] = React36__default.useState(0);
2131
+ const [coords, setCoords] = React36__default.useState(null);
2132
+ const wrapRef = React36__default.useRef(null);
2133
+ const controlRef = React36__default.useRef(null);
2134
+ const inputRef = React36__default.useRef(null);
2135
+ const popRef = React36__default.useRef(null);
2136
+ const listRef = React36__default.useRef(null);
2137
+ const activeRef = React36__default.useRef(null);
2138
+ const fGroups = React36__default.useMemo(() => {
1836
2139
  const q = query.trim();
1837
2140
  const fn = filter === false ? null : typeof filter === "function" ? filter : matches;
1838
2141
  return groups.map((g) => ({ group: g.group, options: fn ? g.options.filter((o) => fn(o, q)) : g.options })).filter((g) => g.options.length);
1839
2142
  }, [groups, query, filter]);
1840
- const visible = React25__default.useMemo(() => fGroups.flatMap((g) => g.options), [fGroups]);
2143
+ const visible = React36__default.useMemo(() => fGroups.flatMap((g) => g.options), [fGroups]);
1841
2144
  const nextEnabled = (from, dir) => {
1842
2145
  let i = from + dir;
1843
2146
  while (i >= 0 && i < visible.length) {
@@ -1846,7 +2149,7 @@ function Combobox({
1846
2149
  }
1847
2150
  return from;
1848
2151
  };
1849
- const place = React25__default.useCallback(() => {
2152
+ const place = React36__default.useCallback(() => {
1850
2153
  const el = controlRef.current;
1851
2154
  if (!el) return;
1852
2155
  const r = el.getBoundingClientRect();
@@ -1861,7 +2164,7 @@ function Combobox({
1861
2164
  flip
1862
2165
  });
1863
2166
  }, [placement, minWidth]);
1864
- React25__default.useEffect(() => {
2167
+ React36__default.useEffect(() => {
1865
2168
  if (!open || !portal) return;
1866
2169
  place();
1867
2170
  const onMove = () => place();
@@ -1872,7 +2175,7 @@ function Combobox({
1872
2175
  window.removeEventListener("resize", onMove);
1873
2176
  };
1874
2177
  }, [open, portal, place]);
1875
- React25__default.useEffect(() => {
2178
+ React36__default.useEffect(() => {
1876
2179
  if (!open) return;
1877
2180
  const onDown = (e) => {
1878
2181
  if (wrapRef.current && wrapRef.current.contains(e.target)) return;
@@ -1882,15 +2185,15 @@ function Combobox({
1882
2185
  document.addEventListener("mousedown", onDown);
1883
2186
  return () => document.removeEventListener("mousedown", onDown);
1884
2187
  }, [open]);
1885
- React25__default.useEffect(() => {
2188
+ React36__default.useEffect(() => {
1886
2189
  setActive(0);
1887
2190
  }, [query]);
1888
- React25__default.useEffect(() => {
2191
+ React36__default.useEffect(() => {
1889
2192
  if (!open) return;
1890
2193
  const idx = flat.findIndex((o) => o.value === current);
1891
2194
  setActive(idx >= 0 ? idx : 0);
1892
2195
  }, [open]);
1893
- React25__default.useEffect(() => {
2196
+ React36__default.useEffect(() => {
1894
2197
  if (open) ensureVisible(listRef.current, activeRef.current);
1895
2198
  }, [active, open]);
1896
2199
  function openMenu() {
@@ -1941,7 +2244,7 @@ function Combobox({
1941
2244
  const popInner = /* @__PURE__ */ jsx("div", { className: "twc-pop__list", ref: listRef, children: loading ? /* @__PURE__ */ jsxs("div", { className: "twc-pop__loading", role: "status", children: [
1942
2245
  /* @__PURE__ */ jsx("span", { className: "twc-pop__spinner", "aria-hidden": "true" }),
1943
2246
  "Loading\u2026"
1944
- ] }) : visible.length === 0 ? /* @__PURE__ */ jsx("div", { className: "twc-pop__empty", children: emptyText }) : fGroups.map((g, gi) => /* @__PURE__ */ jsxs(React25__default.Fragment, { children: [
2247
+ ] }) : visible.length === 0 ? /* @__PURE__ */ jsx("div", { className: "twc-pop__empty", children: emptyText }) : fGroups.map((g, gi) => /* @__PURE__ */ jsxs(React36__default.Fragment, { children: [
1945
2248
  g.group ? /* @__PURE__ */ jsx("div", { className: "twc-pop__group", children: g.group }) : null,
1946
2249
  g.options.map((o) => {
1947
2250
  counter += 1;
@@ -2086,95 +2389,6 @@ function Combobox({
2086
2389
  error ? /* @__PURE__ */ jsx("span", { id: descId, className: "twc-field__error", children: error }) : hint ? /* @__PURE__ */ jsx("span", { id: descId, className: "twc-field__hint", children: hint }) : null
2087
2390
  ] });
2088
2391
  }
2089
- var canUseDOM = typeof window !== "undefined" && typeof document !== "undefined";
2090
- var useIsoLayoutEffect = canUseDOM ? React25__default.useLayoutEffect : React25__default.useEffect;
2091
- var FOCUSABLE = 'a[href]:not([tabindex="-1"]), button:not([disabled]):not([tabindex="-1"]), textarea:not([disabled]):not([tabindex="-1"]), input:not([disabled]):not([tabindex="-1"]), select:not([disabled]):not([tabindex="-1"]), [tabindex]:not([tabindex="-1"])';
2092
- function useFocusTrap(ref, active = true, { restoreFocus = true } = {}) {
2093
- React25__default.useEffect(() => {
2094
- if (!active || !canUseDOM) return void 0;
2095
- const node = ref.current;
2096
- if (!node) return void 0;
2097
- const prevFocused = document.activeElement;
2098
- const first = node.querySelector(FOCUSABLE);
2099
- (first || node).focus();
2100
- return () => {
2101
- if (restoreFocus && prevFocused && typeof prevFocused.focus === "function") prevFocused.focus();
2102
- };
2103
- }, [active]);
2104
- React25__default.useEffect(() => {
2105
- if (!active || !canUseDOM) return void 0;
2106
- const node = ref.current;
2107
- const onKey = (e) => {
2108
- if (e.key !== "Tab" || !node) return;
2109
- const f = Array.from(node.querySelectorAll(FOCUSABLE)).filter((el) => el.offsetParent !== null);
2110
- if (!f.length) {
2111
- e.preventDefault();
2112
- node.focus();
2113
- return;
2114
- }
2115
- const first = f[0], last = f[f.length - 1], ae = document.activeElement;
2116
- if (e.shiftKey) {
2117
- if (ae === first || ae === node || !node.contains(ae)) {
2118
- e.preventDefault();
2119
- last.focus();
2120
- }
2121
- } else if (ae === last || !node.contains(ae)) {
2122
- e.preventDefault();
2123
- first.focus();
2124
- }
2125
- };
2126
- document.addEventListener("keydown", onKey);
2127
- return () => document.removeEventListener("keydown", onKey);
2128
- }, [active]);
2129
- }
2130
- function usePortal() {
2131
- return React25__default.useCallback((node) => {
2132
- if (typeof document === "undefined") return null;
2133
- return typeof createPortal === "function" ? createPortal(node, document.body) : node;
2134
- }, []);
2135
- }
2136
- var __scrollLockCount = 0;
2137
- var __scrollLockSaved = { overflow: "", paddingRight: "" };
2138
- function useScrollLock(locked = true) {
2139
- useIsoLayoutEffect(() => {
2140
- if (!canUseDOM || !locked) return void 0;
2141
- if (__scrollLockCount === 0) {
2142
- const b = document.body;
2143
- __scrollLockSaved = { overflow: b.style.overflow, paddingRight: b.style.paddingRight };
2144
- const gutter = window.innerWidth - document.documentElement.clientWidth;
2145
- b.style.overflow = "hidden";
2146
- if (gutter > 0) b.style.paddingRight = `${(parseFloat(getComputedStyle(b).paddingRight) || 0) + gutter}px`;
2147
- }
2148
- __scrollLockCount += 1;
2149
- return () => {
2150
- __scrollLockCount -= 1;
2151
- if (__scrollLockCount === 0) {
2152
- document.body.style.overflow = __scrollLockSaved.overflow;
2153
- document.body.style.paddingRight = __scrollLockSaved.paddingRight;
2154
- }
2155
- };
2156
- }, [locked]);
2157
- }
2158
- function useInertBackground(ref, active) {
2159
- React25__default.useEffect(() => {
2160
- if (!active || !canUseDOM) return void 0;
2161
- const node = ref.current;
2162
- if (!node) return void 0;
2163
- const changed = [];
2164
- Array.from(document.body.children).forEach((el) => {
2165
- if (el.contains(node) || el.hasAttribute("aria-hidden") || el.inert) return;
2166
- el.inert = true;
2167
- el.setAttribute("aria-hidden", "true");
2168
- changed.push(el);
2169
- });
2170
- return () => {
2171
- changed.forEach((el) => {
2172
- el.inert = false;
2173
- el.removeAttribute("aria-hidden");
2174
- });
2175
- };
2176
- }, [active]);
2177
- }
2178
2392
  var COMMAND_CSS = `
2179
2393
  .twc-cmdk__overlay { position: fixed; inset: 0; z-index: var(--z-modal); background: var(--color-overlay); backdrop-filter: blur(3px);
2180
2394
  display: flex; align-items: flex-start; justify-content: center; padding-top: 12vh; }
@@ -2222,14 +2436,14 @@ function CommandPalette({
2222
2436
  }) {
2223
2437
  const __twcStyles = useScopedStyles("twc-cmdk-styles", COMMAND_CSS);
2224
2438
  const renderPortal = usePortal();
2225
- const [query, setQuery] = React25__default.useState("");
2226
- const [active, setActive] = React25__default.useState(0);
2227
- const inputRef = React25__default.useRef(null);
2228
- const listRef = React25__default.useRef(null);
2229
- const paletteRef = React25__default.useRef(null);
2230
- const baseId = React25__default.useId();
2231
- const [mounted, setMounted] = React25__default.useState(open);
2232
- React25__default.useEffect(() => {
2439
+ const [query, setQuery] = React36__default.useState("");
2440
+ const [active, setActive] = React36__default.useState(0);
2441
+ const inputRef = React36__default.useRef(null);
2442
+ const listRef = React36__default.useRef(null);
2443
+ const paletteRef = React36__default.useRef(null);
2444
+ const baseId = React36__default.useId();
2445
+ const [mounted, setMounted] = React36__default.useState(open);
2446
+ React36__default.useEffect(() => {
2233
2447
  if (open) {
2234
2448
  setMounted(true);
2235
2449
  return;
@@ -2238,14 +2452,14 @@ function CommandPalette({
2238
2452
  return () => clearTimeout(t);
2239
2453
  }, [open]);
2240
2454
  useScrollLock(open);
2241
- React25__default.useEffect(() => {
2455
+ React36__default.useEffect(() => {
2242
2456
  if (open) {
2243
2457
  setQuery("");
2244
2458
  setActive(0);
2245
2459
  }
2246
2460
  }, [open]);
2247
2461
  useFocusTrap(paletteRef, open && mounted);
2248
- React25__default.useEffect(() => {
2462
+ React36__default.useEffect(() => {
2249
2463
  if (!open) return void 0;
2250
2464
  const onKey = (e) => {
2251
2465
  if (e.key === "Escape") {
@@ -2257,7 +2471,7 @@ function CommandPalette({
2257
2471
  return () => document.removeEventListener("keydown", onKey);
2258
2472
  }, [open, onClose]);
2259
2473
  const q = query.trim().toLowerCase();
2260
- const filtered = React25__default.useMemo(() => commands.filter(
2474
+ const filtered = React36__default.useMemo(() => commands.filter(
2261
2475
  (c) => !q || c.label.toLowerCase().includes(q) || (c.keywords || "").toLowerCase().includes(q) || (c.group || "").toLowerCase().includes(q)
2262
2476
  ), [commands, q]);
2263
2477
  const groups = [];
@@ -2272,7 +2486,7 @@ function CommandPalette({
2272
2486
  g.items.push(c);
2273
2487
  flat.push(c);
2274
2488
  });
2275
- React25__default.useEffect(() => {
2489
+ React36__default.useEffect(() => {
2276
2490
  setActive(0);
2277
2491
  }, [query]);
2278
2492
  const run = (cmd) => {
@@ -2292,7 +2506,7 @@ function CommandPalette({
2292
2506
  if (cmd) run(cmd);
2293
2507
  }
2294
2508
  }
2295
- React25__default.useEffect(() => {
2509
+ React36__default.useEffect(() => {
2296
2510
  const node = listRef.current?.querySelector('[data-active="true"]');
2297
2511
  if (node) node.scrollIntoView({ block: "nearest" });
2298
2512
  }, [active]);
@@ -2468,13 +2682,13 @@ function Currency({
2468
2682
  const prec = precision != null ? precision : meta.precision;
2469
2683
  const sym = symbol != null ? symbol : meta.symbol;
2470
2684
  const cur = code != null ? code : meta.code;
2471
- const autoId = React25__default.useId();
2685
+ const autoId = React36__default.useId();
2472
2686
  const fieldId = id || autoId;
2473
2687
  const invalid = Boolean(error);
2474
2688
  const controlled = value !== void 0;
2475
- const [internal, setInternal] = React25__default.useState(() => clampPrecision(String(defaultValue ?? ""), prec));
2689
+ const [internal, setInternal] = React36__default.useState(() => clampPrecision(String(defaultValue ?? ""), prec));
2476
2690
  const shown = controlled ? clampPrecision(String(value ?? ""), prec) : internal;
2477
- React25__default.useEffect(() => {
2691
+ React36__default.useEffect(() => {
2478
2692
  if (!controlled) return;
2479
2693
  const raw = String(value ?? "");
2480
2694
  if (shown !== raw) {
@@ -2668,32 +2882,32 @@ function Select({
2668
2882
  ...rest
2669
2883
  }) {
2670
2884
  const __twcStyles = useScopedStyles("twc-select-styles", SELECT_CSS);
2671
- const bufferRef = React25__default.useRef("");
2672
- const bufferTimerRef = React25__default.useRef(null);
2673
- const groups = React25__default.useMemo(() => normalizeGroups2(options), [options]);
2674
- const flat = React25__default.useMemo(() => groups.flatMap((g) => g.options), [groups]);
2675
- const autoId = React25__default.useId();
2885
+ const bufferRef = React36__default.useRef("");
2886
+ const bufferTimerRef = React36__default.useRef(null);
2887
+ const groups = React36__default.useMemo(() => normalizeGroups2(options), [options]);
2888
+ const flat = React36__default.useMemo(() => groups.flatMap((g) => g.options), [groups]);
2889
+ const autoId = React36__default.useId();
2676
2890
  const fieldId = id || autoId;
2677
- const [internal, setInternal] = React25__default.useState(defaultValue);
2891
+ const [internal, setInternal] = React36__default.useState(defaultValue);
2678
2892
  const current = value !== void 0 ? value : internal;
2679
- const [open, setOpen] = React25__default.useState(false);
2680
- const [render, setRender] = React25__default.useState(false);
2681
- const [active, setActive] = React25__default.useState(0);
2682
- const [coords, setCoords] = React25__default.useState(null);
2683
- const [query, setQuery] = React25__default.useState("");
2684
- const wrapRef = React25__default.useRef(null);
2685
- const triggerRef = React25__default.useRef(null);
2686
- const popRef = React25__default.useRef(null);
2687
- const listRef = React25__default.useRef(null);
2688
- const activeRef = React25__default.useRef(null);
2689
- const searchRef = React25__default.useRef(null);
2893
+ const [open, setOpen] = React36__default.useState(false);
2894
+ const [render, setRender] = React36__default.useState(false);
2895
+ const [active, setActive] = React36__default.useState(0);
2896
+ const [coords, setCoords] = React36__default.useState(null);
2897
+ const [query, setQuery] = React36__default.useState("");
2898
+ const wrapRef = React36__default.useRef(null);
2899
+ const triggerRef = React36__default.useRef(null);
2900
+ const popRef = React36__default.useRef(null);
2901
+ const listRef = React36__default.useRef(null);
2902
+ const activeRef = React36__default.useRef(null);
2903
+ const searchRef = React36__default.useRef(null);
2690
2904
  const showSearch = searchable === void 0 ? flat.length > 5 : searchable;
2691
- const fGroups = React25__default.useMemo(() => {
2905
+ const fGroups = React36__default.useMemo(() => {
2692
2906
  const q = query.trim().toLowerCase();
2693
2907
  if (!q) return groups;
2694
2908
  return groups.map((g) => ({ group: g.group, options: g.options.filter((o) => o.label.toLowerCase().includes(q) || o.description && o.description.toLowerCase().includes(q)) })).filter((g) => g.options.length);
2695
2909
  }, [groups, query]);
2696
- const visible = React25__default.useMemo(() => fGroups.flatMap((g) => g.options), [fGroups]);
2910
+ const visible = React36__default.useMemo(() => fGroups.flatMap((g) => g.options), [fGroups]);
2697
2911
  const selected = flat.find((o) => o.value === current);
2698
2912
  const nextEnabled = (from, dir) => {
2699
2913
  let i = from + dir;
@@ -2703,7 +2917,7 @@ function Select({
2703
2917
  }
2704
2918
  return from;
2705
2919
  };
2706
- const place = React25__default.useCallback(() => {
2920
+ const place = React36__default.useCallback(() => {
2707
2921
  const el = triggerRef.current;
2708
2922
  if (!el) return;
2709
2923
  const r = el.getBoundingClientRect();
@@ -2719,7 +2933,7 @@ function Select({
2719
2933
  flip
2720
2934
  });
2721
2935
  }, [placement, minWidth, matchTriggerWidth]);
2722
- React25__default.useEffect(() => {
2936
+ React36__default.useEffect(() => {
2723
2937
  if (!open || !portal) return;
2724
2938
  place();
2725
2939
  const onMove = () => place();
@@ -2730,7 +2944,7 @@ function Select({
2730
2944
  window.removeEventListener("resize", onMove);
2731
2945
  };
2732
2946
  }, [open, portal, place]);
2733
- React25__default.useEffect(() => {
2947
+ React36__default.useEffect(() => {
2734
2948
  if (!open) return;
2735
2949
  const idx = flat.findIndex((o) => o.value === current);
2736
2950
  setActive(idx >= 0 ? idx : 0);
@@ -2746,13 +2960,13 @@ function Select({
2746
2960
  document.addEventListener("mousedown", onDown);
2747
2961
  return () => document.removeEventListener("mousedown", onDown);
2748
2962
  }, [open]);
2749
- React25__default.useEffect(() => {
2963
+ React36__default.useEffect(() => {
2750
2964
  setActive(0);
2751
2965
  }, [query]);
2752
- React25__default.useEffect(() => {
2966
+ React36__default.useEffect(() => {
2753
2967
  if (open) ensureVisible2(listRef.current, activeRef.current);
2754
2968
  }, [active, open]);
2755
- React25__default.useEffect(() => {
2969
+ React36__default.useEffect(() => {
2756
2970
  if (open) {
2757
2971
  setRender(true);
2758
2972
  return;
@@ -2760,8 +2974,8 @@ function Select({
2760
2974
  const t = setTimeout(() => setRender(false), 170);
2761
2975
  return () => clearTimeout(t);
2762
2976
  }, [open]);
2763
- const prevOpen = React25__default.useRef(false);
2764
- React25__default.useEffect(() => {
2977
+ const prevOpen = React36__default.useRef(false);
2978
+ React36__default.useEffect(() => {
2765
2979
  if (prevOpen.current && !open) {
2766
2980
  const ae = typeof document !== "undefined" ? document.activeElement : null;
2767
2981
  if (popRef.current && ae && popRef.current.contains(ae)) triggerRef.current?.focus();
@@ -2855,7 +3069,7 @@ function Select({
2855
3069
  /* @__PURE__ */ jsx("div", { className: "twc-pop__list", ref: listRef, children: loading ? /* @__PURE__ */ jsxs("div", { className: "twc-pop__loading", role: "status", children: [
2856
3070
  /* @__PURE__ */ jsx("span", { className: "twc-pop__spinner", "aria-hidden": "true" }),
2857
3071
  "Loading\u2026"
2858
- ] }) : visible.length === 0 ? /* @__PURE__ */ jsx("div", { className: "twc-pop__empty", children: emptyText }) : fGroups.map((g, gi) => /* @__PURE__ */ jsxs(React25__default.Fragment, { children: [
3072
+ ] }) : visible.length === 0 ? /* @__PURE__ */ jsx("div", { className: "twc-pop__empty", children: emptyText }) : fGroups.map((g, gi) => /* @__PURE__ */ jsxs(React36__default.Fragment, { children: [
2859
3073
  g.group ? /* @__PURE__ */ jsx("div", { className: "twc-pop__group", children: g.group }) : null,
2860
3074
  g.options.map((o) => {
2861
3075
  counter += 1;
@@ -3038,21 +3252,21 @@ function CurrencyField({
3038
3252
  ...rest
3039
3253
  }) {
3040
3254
  const __twcStyles = useScopedStyles("twc-curf-styles", CURF_CSS);
3041
- const autoId = React25__default.useId();
3255
+ const autoId = React36__default.useId();
3042
3256
  const fieldId = id || autoId;
3043
3257
  const invalid = Boolean(error);
3044
3258
  const curControlled = currency !== void 0;
3045
- const [curInternal, setCurInternal] = React25__default.useState(defaultCurrency);
3259
+ const [curInternal, setCurInternal] = React36__default.useState(defaultCurrency);
3046
3260
  const cur = curControlled ? currency : curInternal;
3047
3261
  const meta = CURRENCIES[cur] || CURRENCIES.USD;
3048
3262
  const prec = meta.precision;
3049
3263
  const valControlled = value !== void 0;
3050
- const [valInternal, setValInternal] = React25__default.useState(() => clampPrecision(String(defaultValue ?? ""), prec));
3264
+ const [valInternal, setValInternal] = React36__default.useState(() => clampPrecision(String(defaultValue ?? ""), prec));
3051
3265
  const shown = valControlled ? clampPrecision(String(value ?? ""), prec) : valInternal;
3052
3266
  const descId = `${fieldId}-desc`;
3053
3267
  const describedBy = [error || hint ? descId : null, rest["aria-describedby"]].filter(Boolean).join(" ") || void 0;
3054
3268
  const ariaInvalid = invalid ? true : rest["aria-invalid"] ?? void 0;
3055
- React25__default.useEffect(() => {
3269
+ React36__default.useEffect(() => {
3056
3270
  if (!valControlled) {
3057
3271
  const clamped = clampPrecision(valInternal, prec);
3058
3272
  if (clamped !== valInternal) {
@@ -3068,7 +3282,7 @@ function CurrencyField({
3068
3282
  }
3069
3283
  }
3070
3284
  }, [prec, cur, shown, value, valControlled, valInternal]);
3071
- const options = React25__default.useMemo(() => {
3285
+ const options = React36__default.useMemo(() => {
3072
3286
  if (!currencies) return CURRENCY_OPTIONS;
3073
3287
  return currencies.map((c) => typeof c === "string" ? { value: c, label: `${c} \u2014 ${(CURRENCIES[c] || {}).label || c}` } : c);
3074
3288
  }, [currencies]);
@@ -3222,13 +3436,13 @@ function Input({
3222
3436
  }) {
3223
3437
  const __twcStyles = useScopedStyles("twc-field-styles", FIELD_CSS2);
3224
3438
  const __twcExtra = useScopedStyles("twc-input-extra-styles", INPUT_EXTRA_CSS);
3225
- const autoId = React25__default.useId();
3439
+ const autoId = React36__default.useId();
3226
3440
  const fieldId = id || autoId;
3227
3441
  const descId = `${fieldId}-desc`;
3228
3442
  const countId = `${fieldId}-count`;
3229
3443
  const invalid = Boolean(error);
3230
3444
  const countControlled = rest.value !== void 0;
3231
- const [len2, setLen] = React25__default.useState(() => String(rest.defaultValue ?? "").length);
3445
+ const [len2, setLen] = React36__default.useState(() => String(rest.defaultValue ?? "").length);
3232
3446
  const count = countControlled ? String(rest.value ?? "").length : len2;
3233
3447
  const max = rest.maxLength;
3234
3448
  const showCounter = showCount && max != null;
@@ -3240,7 +3454,7 @@ function Input({
3240
3454
  const ariaInvalid = invalid ? true : rest["aria-invalid"] ?? void 0;
3241
3455
  const describedBy = [error || hint ? descId : null, showCounter ? countId : null, rest["aria-describedby"]].filter(Boolean).join(" ") || void 0;
3242
3456
  const isPassword = type === "password";
3243
- const [revealed, setRevealed] = React25__default.useState(false);
3457
+ const [revealed, setRevealed] = React36__default.useState(false);
3244
3458
  const effectiveType = isPassword && revealed ? "text" : type;
3245
3459
  const suffix = rightIcon ? /* @__PURE__ */ jsx("span", { className: "twc-input__affix", children: rightIcon }) : isPassword ? /* @__PURE__ */ jsx(
3246
3460
  "button",
@@ -3441,27 +3655,27 @@ function MultiSelect({
3441
3655
  ...rest
3442
3656
  }) {
3443
3657
  const __twcStyles = useScopedStyles("twc-ms-styles", MULTI_CSS);
3444
- const groups = React25__default.useMemo(() => normalizeGroups3(options), [options]);
3445
- const flat = React25__default.useMemo(() => groups.flatMap((g) => g.options), [groups]);
3446
- const autoId = React25__default.useId();
3658
+ const groups = React36__default.useMemo(() => normalizeGroups3(options), [options]);
3659
+ const flat = React36__default.useMemo(() => groups.flatMap((g) => g.options), [groups]);
3660
+ const autoId = React36__default.useId();
3447
3661
  const fieldId = id || autoId;
3448
- const [internal, setInternal] = React25__default.useState(defaultValue);
3662
+ const [internal, setInternal] = React36__default.useState(defaultValue);
3449
3663
  const selected = value !== void 0 ? value : internal;
3450
- const [open, setOpen] = React25__default.useState(false);
3451
- const [query, setQuery] = React25__default.useState("");
3452
- const [active, setActive] = React25__default.useState(0);
3453
- const [coords, setCoords] = React25__default.useState(null);
3454
- const wrapRef = React25__default.useRef(null);
3455
- const controlRef = React25__default.useRef(null);
3456
- const inputRef = React25__default.useRef(null);
3457
- const popRef = React25__default.useRef(null);
3458
- const listRef = React25__default.useRef(null);
3459
- const activeRef = React25__default.useRef(null);
3460
- const fGroups = React25__default.useMemo(
3664
+ const [open, setOpen] = React36__default.useState(false);
3665
+ const [query, setQuery] = React36__default.useState("");
3666
+ const [active, setActive] = React36__default.useState(0);
3667
+ const [coords, setCoords] = React36__default.useState(null);
3668
+ const wrapRef = React36__default.useRef(null);
3669
+ const controlRef = React36__default.useRef(null);
3670
+ const inputRef = React36__default.useRef(null);
3671
+ const popRef = React36__default.useRef(null);
3672
+ const listRef = React36__default.useRef(null);
3673
+ const activeRef = React36__default.useRef(null);
3674
+ const fGroups = React36__default.useMemo(
3461
3675
  () => groups.map((g) => ({ group: g.group, options: g.options.filter((o) => matches2(o, query.trim())) })).filter((g) => g.options.length),
3462
3676
  [groups, query]
3463
3677
  );
3464
- const visible = React25__default.useMemo(() => fGroups.flatMap((g) => g.options), [fGroups]);
3678
+ const visible = React36__default.useMemo(() => fGroups.flatMap((g) => g.options), [fGroups]);
3465
3679
  const capReached = max != null && (value !== void 0 ? value : internal).length >= max;
3466
3680
  const isOptDisabled = (o) => o.disabled || capReached && !(value !== void 0 ? value : internal).includes(o.value);
3467
3681
  const nextEnabled = (from, dir) => {
@@ -3472,7 +3686,7 @@ function MultiSelect({
3472
3686
  }
3473
3687
  return from;
3474
3688
  };
3475
- const place = React25__default.useCallback(() => {
3689
+ const place = React36__default.useCallback(() => {
3476
3690
  const el = controlRef.current;
3477
3691
  if (!el) return;
3478
3692
  const r = el.getBoundingClientRect();
@@ -3487,7 +3701,7 @@ function MultiSelect({
3487
3701
  flip
3488
3702
  });
3489
3703
  }, [placement, minWidth]);
3490
- React25__default.useEffect(() => {
3704
+ React36__default.useEffect(() => {
3491
3705
  if (!open || !portal) return;
3492
3706
  place();
3493
3707
  const onMove = () => place();
@@ -3498,7 +3712,7 @@ function MultiSelect({
3498
3712
  window.removeEventListener("resize", onMove);
3499
3713
  };
3500
3714
  }, [open, portal, place]);
3501
- React25__default.useEffect(() => {
3715
+ React36__default.useEffect(() => {
3502
3716
  if (!open) return;
3503
3717
  const onDown = (e) => {
3504
3718
  if (wrapRef.current && wrapRef.current.contains(e.target)) return;
@@ -3509,10 +3723,10 @@ function MultiSelect({
3509
3723
  document.addEventListener("mousedown", onDown);
3510
3724
  return () => document.removeEventListener("mousedown", onDown);
3511
3725
  }, [open]);
3512
- React25__default.useEffect(() => {
3726
+ React36__default.useEffect(() => {
3513
3727
  setActive(0);
3514
3728
  }, [query]);
3515
- React25__default.useEffect(() => {
3729
+ React36__default.useEffect(() => {
3516
3730
  if (open) ensureVisible3(listRef.current, activeRef.current);
3517
3731
  }, [active, open]);
3518
3732
  function commit(next) {
@@ -3555,7 +3769,7 @@ function MultiSelect({
3555
3769
  const popInner = /* @__PURE__ */ jsx("div", { className: "twc-pop__list", id: listboxId, ref: listRef, role: "listbox", "aria-multiselectable": "true", children: loading ? /* @__PURE__ */ jsxs("div", { className: "twc-pop__loading", role: "status", children: [
3556
3770
  /* @__PURE__ */ jsx("span", { className: "twc-pop__spinner", "aria-hidden": "true" }),
3557
3771
  "Loading\u2026"
3558
- ] }) : visible.length === 0 ? /* @__PURE__ */ jsx("div", { className: "twc-pop__empty", children: emptyText }) : fGroups.map((g, gi) => /* @__PURE__ */ jsxs(React25__default.Fragment, { children: [
3772
+ ] }) : visible.length === 0 ? /* @__PURE__ */ jsx("div", { className: "twc-pop__empty", children: emptyText }) : fGroups.map((g, gi) => /* @__PURE__ */ jsxs(React36__default.Fragment, { children: [
3559
3773
  g.group ? /* @__PURE__ */ jsx("div", { className: "twc-pop__group", children: g.group }) : null,
3560
3774
  g.options.map((o) => {
3561
3775
  counter += 1;
@@ -3785,7 +3999,7 @@ function Pagination({
3785
3999
  }
3786
4000
  const jumperEnabled = showPageJumper ?? showJumper;
3787
4001
  const __twcStyles = useScopedStyles("twc-pagination-styles", PAGINATION_CSS);
3788
- const [internal, setInternal] = React25__default.useState(defaultPage);
4002
+ const [internal, setInternal] = React36__default.useState(defaultPage);
3789
4003
  const page = pageProp !== void 0 ? pageProp : internal;
3790
4004
  const pages = buildPages(page, total, siblings, boundaries);
3791
4005
  const go = (p) => {
@@ -3793,7 +4007,7 @@ function Pagination({
3793
4007
  if (pageProp === void 0) setInternal(p);
3794
4008
  onChange?.(p);
3795
4009
  };
3796
- const [jump, setJump] = React25__default.useState("");
4010
+ const [jump, setJump] = React36__default.useState("");
3797
4011
  const submitJump = () => {
3798
4012
  const n = parseInt(jump, 10);
3799
4013
  if (!Number.isNaN(n)) go(Math.min(Math.max(n, 1), total));
@@ -3876,13 +4090,13 @@ function Tooltip({
3876
4090
  ...rest
3877
4091
  }) {
3878
4092
  const __twcStyles = useScopedStyles("twc-tooltip-styles", TOOLTIP_CSS);
3879
- const id = React25__default.useId();
3880
- const [show, setShow] = React25__default.useState(false);
3881
- const [coords, setCoords] = React25__default.useState(null);
3882
- const timer = React25__default.useRef(null);
3883
- const closeTimer = React25__default.useRef(null);
3884
- const wrapRef = React25__default.useRef(null);
3885
- const tipRef = React25__default.useRef(null);
4093
+ const id = React36__default.useId();
4094
+ const [show, setShow] = React36__default.useState(false);
4095
+ const [coords, setCoords] = React36__default.useState(null);
4096
+ const timer = React36__default.useRef(null);
4097
+ const closeTimer = React36__default.useRef(null);
4098
+ const wrapRef = React36__default.useRef(null);
4099
+ const tipRef = React36__default.useRef(null);
3886
4100
  const open = () => {
3887
4101
  clearTimeout(closeTimer.current);
3888
4102
  clearTimeout(timer.current);
@@ -3896,11 +4110,11 @@ function Tooltip({
3896
4110
  const cancelClose = () => {
3897
4111
  clearTimeout(closeTimer.current);
3898
4112
  };
3899
- React25__default.useEffect(() => () => {
4113
+ React36__default.useEffect(() => () => {
3900
4114
  clearTimeout(timer.current);
3901
4115
  clearTimeout(closeTimer.current);
3902
4116
  }, []);
3903
- const place = React25__default.useCallback(() => {
4117
+ const place = React36__default.useCallback(() => {
3904
4118
  const el = wrapRef.current;
3905
4119
  if (!el) return;
3906
4120
  const r = el.getBoundingClientRect();
@@ -3923,10 +4137,10 @@ function Tooltip({
3923
4137
  else if (side === "right") setCoords({ ...base, top: clampY(cy), left: Math.round(r.right + gap) });
3924
4138
  else setCoords({ ...base, left: clampX(cx), bottom: Math.round(vh - r.top + gap) });
3925
4139
  }, [placement]);
3926
- React25__default.useEffect(() => {
4140
+ React36__default.useEffect(() => {
3927
4141
  place();
3928
4142
  }, [place]);
3929
- React25__default.useEffect(() => {
4143
+ React36__default.useEffect(() => {
3930
4144
  if (!show) return void 0;
3931
4145
  place();
3932
4146
  const onMove = () => place();
@@ -3937,7 +4151,7 @@ function Tooltip({
3937
4151
  window.removeEventListener("resize", onMove);
3938
4152
  };
3939
4153
  }, [show, place]);
3940
- React25__default.useEffect(() => {
4154
+ React36__default.useEffect(() => {
3941
4155
  if (!show) return;
3942
4156
  const onKeyDown = (e) => {
3943
4157
  if (e.key === "Escape") {
@@ -3949,7 +4163,7 @@ function Tooltip({
3949
4163
  return () => document.removeEventListener("keydown", onKeyDown);
3950
4164
  }, [show]);
3951
4165
  const describedBy = show ? id : void 0;
3952
- const trigger = React25__default.isValidElement(children) && children.type !== React25__default.Fragment ? React25__default.cloneElement(children, {
4166
+ const trigger = React36__default.isValidElement(children) && children.type !== React36__default.Fragment ? React36__default.cloneElement(children, {
3953
4167
  "aria-describedby": [children.props["aria-describedby"], describedBy].filter(Boolean).join(" ") || void 0
3954
4168
  }) : /* @__PURE__ */ jsx("span", { "aria-describedby": describedBy, children });
3955
4169
  return /* @__PURE__ */ jsxs(
@@ -4553,9 +4767,9 @@ function runDatatableQuery(rows, query, options = {}) {
4553
4767
  return { rows: page, total, filtered: out };
4554
4768
  }
4555
4769
  function useFloating() {
4556
- const [pos, setPos] = React25__default.useState(null);
4557
- const cfg = React25__default.useRef(null);
4558
- const place = React25__default.useCallback(() => {
4770
+ const [pos, setPos] = React36__default.useState(null);
4771
+ const cfg = React36__default.useRef(null);
4772
+ const place = React36__default.useCallback(() => {
4559
4773
  const c = cfg.current;
4560
4774
  if (!c || !c.el || !c.el.isConnected) return null;
4561
4775
  const r = c.el.getBoundingClientRect();
@@ -4566,17 +4780,17 @@ function useFloating() {
4566
4780
  const top = r.bottom + 6;
4567
4781
  return { top, left, width: c.width, anchorX: r.left + r.width / 2, maxHeight: Math.max(180, vh - top - M) };
4568
4782
  }, []);
4569
- const open = React25__default.useCallback((el, align = "left", width = 220) => {
4783
+ const open = React36__default.useCallback((el, align = "left", width = 220) => {
4570
4784
  cfg.current = { el, align, width };
4571
4785
  const p = place();
4572
4786
  if (p) setPos(p);
4573
4787
  }, [place]);
4574
- const close = React25__default.useCallback(() => {
4788
+ const close = React36__default.useCallback(() => {
4575
4789
  cfg.current = null;
4576
4790
  setPos(null);
4577
4791
  }, []);
4578
4792
  const isOpen = pos != null;
4579
- React25__default.useEffect(() => {
4793
+ React36__default.useEffect(() => {
4580
4794
  if (!isOpen) return void 0;
4581
4795
  const update = () => {
4582
4796
  const p = place();
@@ -4600,9 +4814,9 @@ function Caret({ pos }) {
4600
4814
  return /* @__PURE__ */ jsx("span", { className: "twc-dt__caret", style: { left } });
4601
4815
  }
4602
4816
  function EditCell({ col, value, options, onChange, onCommit, onCommitValue, onCancel, onKeyDown }) {
4603
- const ref = React25__default.useRef(null);
4817
+ const ref = React36__default.useRef(null);
4604
4818
  const isSelect = col.editType === "select" || options && col.editType !== "text";
4605
- React25__default.useEffect(() => {
4819
+ React36__default.useEffect(() => {
4606
4820
  if (isSelect) {
4607
4821
  const t = setTimeout(() => ref.current?.querySelector(".twc-sel__trigger")?.click(), 0);
4608
4822
  return () => clearTimeout(t);
@@ -4807,7 +5021,7 @@ function Datatable({
4807
5021
  ...rest
4808
5022
  }) {
4809
5023
  const __twcStyles = useScopedStyles("twc-dt-styles", DT_CSS);
4810
- const cols = React25__default.useMemo(() => {
5024
+ const cols = React36__default.useMemo(() => {
4811
5025
  const out = columns.map((c) => {
4812
5026
  const isActions = c.type === "actions";
4813
5027
  return {
@@ -4842,7 +5056,7 @@ function Datatable({
4842
5056
  }
4843
5057
  return out;
4844
5058
  }, [columns, rowPinning]);
4845
- const _autoKey = React25__default.useRef();
5059
+ const _autoKey = React36__default.useRef();
4846
5060
  if (!_autoKey.current) _autoKey.current = { map: /* @__PURE__ */ new WeakMap(), n: 0 };
4847
5061
  const keyOf = rowKey || ((r, i) => {
4848
5062
  if (r != null && r.id != null) return r.id;
@@ -4857,17 +5071,17 @@ function Datatable({
4857
5071
  }
4858
5072
  return i;
4859
5073
  });
4860
- const [sort, setSort] = React25__default.useState(null);
4861
- const [filters, setFilters] = React25__default.useState([]);
4862
- const [hidden, setHidden] = React25__default.useState(() => /* @__PURE__ */ new Set());
4863
- const [showRowNum, setShowRowNum] = React25__default.useState(rowNumbers);
4864
- const [wrapped, setWrapped] = React25__default.useState(() => new Set((columns || []).filter((c) => c.wrapText).map((c) => c.field)));
5074
+ const [sort, setSort] = React36__default.useState(null);
5075
+ const [filters, setFilters] = React36__default.useState([]);
5076
+ const [hidden, setHidden] = React36__default.useState(() => /* @__PURE__ */ new Set());
5077
+ const [showRowNum, setShowRowNum] = React36__default.useState(rowNumbers);
5078
+ const [wrapped, setWrapped] = React36__default.useState(() => new Set((columns || []).filter((c) => c.wrapText).map((c) => c.field)));
4865
5079
  const toggleWrap = (field) => setWrapped((w) => {
4866
5080
  const n = new Set(w);
4867
5081
  n.has(field) ? n.delete(field) : n.add(field);
4868
5082
  return n;
4869
5083
  });
4870
- const [pins, setPins] = React25__default.useState(() => {
5084
+ const [pins, setPins] = React36__default.useState(() => {
4871
5085
  const left = [], right = [];
4872
5086
  columns.forEach((c) => {
4873
5087
  if (c.pinned === "left") left.push(c.field);
@@ -4875,34 +5089,34 @@ function Datatable({
4875
5089
  });
4876
5090
  return { left, right };
4877
5091
  });
4878
- const [density, setDensity] = React25__default.useState(densityProp);
4879
- const [quick, setQuick] = React25__default.useState("");
4880
- const [selected, setSelected] = React25__default.useState(() => /* @__PURE__ */ new Set());
4881
- const [activeRow, setActiveRow] = React25__default.useState(null);
4882
- const [activeCell, setActiveCell] = React25__default.useState(null);
4883
- const [page, setPage] = React25__default.useState(0);
4884
- const [rowsPerPage, setRowsPerPage] = React25__default.useState(pageSize > 0 ? pageSize : 10);
4885
- const [colQuery, setColQuery] = React25__default.useState("");
4886
- const [widths, setWidths] = React25__default.useState({});
4887
- const [order, setOrder] = React25__default.useState(() => columns.map((c) => c.field));
4888
- const [drag, setDrag] = React25__default.useState({ from: null, over: null, after: false });
4889
- const [aggOn, setAggOn] = React25__default.useState(showAggregation);
4890
- const [focus, setFocus] = React25__default.useState({ r: 0, c: 0 });
4891
- const gridRef = React25__default.useRef(null);
4892
- const [groupBy, setGroupBy] = React25__default.useState(rowGrouping || []);
4893
- const [collapsed, setCollapsed] = React25__default.useState(() => /* @__PURE__ */ new Set());
4894
- const [pinnedRows, setPinnedRows] = React25__default.useState({ top: [], bottom: [] });
4895
- const [headH, setHeadH] = React25__default.useState(41);
4896
- const theadRef = React25__default.useRef(null);
4897
- const [rowOrder, setRowOrder] = React25__default.useState(null);
4898
- const [rowHeights, setRowHeights] = React25__default.useState({});
4899
- const [rowDrag, setRowDrag] = React25__default.useState({ from: null, over: null, after: false });
4900
- const [rowGrab, setRowGrab] = React25__default.useState(null);
4901
- const [reorderMsg, setReorderMsg] = React25__default.useState("");
4902
- const rowFocusRef = React25__default.useRef(null);
4903
- const rootRef = React25__default.useRef(null);
4904
- const [compact, setCompact] = React25__default.useState(false);
4905
- React25__default.useEffect(() => {
5092
+ const [density, setDensity] = React36__default.useState(densityProp);
5093
+ const [quick, setQuick] = React36__default.useState("");
5094
+ const [selected, setSelected] = React36__default.useState(() => /* @__PURE__ */ new Set());
5095
+ const [activeRow, setActiveRow] = React36__default.useState(null);
5096
+ const [activeCell, setActiveCell] = React36__default.useState(null);
5097
+ const [page, setPage] = React36__default.useState(0);
5098
+ const [rowsPerPage, setRowsPerPage] = React36__default.useState(pageSize > 0 ? pageSize : 10);
5099
+ const [colQuery, setColQuery] = React36__default.useState("");
5100
+ const [widths, setWidths] = React36__default.useState({});
5101
+ const [order, setOrder] = React36__default.useState(() => columns.map((c) => c.field));
5102
+ const [drag, setDrag] = React36__default.useState({ from: null, over: null, after: false });
5103
+ const [aggOn, setAggOn] = React36__default.useState(showAggregation);
5104
+ const [focus, setFocus] = React36__default.useState({ r: 0, c: 0 });
5105
+ const gridRef = React36__default.useRef(null);
5106
+ const [groupBy, setGroupBy] = React36__default.useState(rowGrouping || []);
5107
+ const [collapsed, setCollapsed] = React36__default.useState(() => /* @__PURE__ */ new Set());
5108
+ const [pinnedRows, setPinnedRows] = React36__default.useState({ top: [], bottom: [] });
5109
+ const [headH, setHeadH] = React36__default.useState(41);
5110
+ const theadRef = React36__default.useRef(null);
5111
+ const [rowOrder, setRowOrder] = React36__default.useState(null);
5112
+ const [rowHeights, setRowHeights] = React36__default.useState({});
5113
+ const [rowDrag, setRowDrag] = React36__default.useState({ from: null, over: null, after: false });
5114
+ const [rowGrab, setRowGrab] = React36__default.useState(null);
5115
+ const [reorderMsg, setReorderMsg] = React36__default.useState("");
5116
+ const rowFocusRef = React36__default.useRef(null);
5117
+ const rootRef = React36__default.useRef(null);
5118
+ const [compact, setCompact] = React36__default.useState(false);
5119
+ React36__default.useEffect(() => {
4906
5120
  const el = rootRef.current;
4907
5121
  if (!el) return void 0;
4908
5122
  const measure = () => setCompact((el.clientWidth || 0) < 720);
@@ -4915,11 +5129,11 @@ function Datatable({
4915
5129
  else if (typeof window !== "undefined") window.removeEventListener("resize", measure);
4916
5130
  };
4917
5131
  }, []);
4918
- const scrollRef = React25__default.useRef(null);
4919
- const [scrollTop, setScrollTop] = React25__default.useState(0);
4920
- const [viewportH, setViewportH] = React25__default.useState(0);
4921
- const [pivotOn, setPivotOn] = React25__default.useState(pivotMode);
4922
- const [aggConfig, setAggConfig] = React25__default.useState(() => {
5132
+ const scrollRef = React36__default.useRef(null);
5133
+ const [scrollTop, setScrollTop] = React36__default.useState(0);
5134
+ const [viewportH, setViewportH] = React36__default.useState(0);
5135
+ const [pivotOn, setPivotOn] = React36__default.useState(pivotMode);
5136
+ const [aggConfig, setAggConfig] = React36__default.useState(() => {
4923
5137
  const m = {};
4924
5138
  (columns || []).forEach((c) => {
4925
5139
  if (typeof c.aggregation === "string") m[c.field] = c.aggregation;
@@ -4927,13 +5141,13 @@ function Datatable({
4927
5141
  return m;
4928
5142
  });
4929
5143
  const aggOf = (c) => aggConfig[c.field] || (typeof c.aggregation === "function" ? c.aggregation : null);
4930
- const [pivotConfig, setPivotConfig] = React25__default.useState(() => ({
5144
+ const [pivotConfig, setPivotConfig] = React36__default.useState(() => ({
4931
5145
  rows: pivot && pivot.rows || [],
4932
5146
  columns: pivot && pivot.columns || [],
4933
5147
  values: pivot && pivot.values || []
4934
5148
  }));
4935
5149
  const pivotActive = pivotOn && pivotConfig.rows.length > 0 && pivotConfig.values.length > 0;
4936
- React25__default.useEffect(() => {
5150
+ React36__default.useEffect(() => {
4937
5151
  setOrder((prev) => {
4938
5152
  const fields = columns.map((c) => c.field);
4939
5153
  const kept = prev.filter((f) => fields.includes(f));
@@ -4941,32 +5155,32 @@ function Datatable({
4941
5155
  return [...kept, ...added];
4942
5156
  });
4943
5157
  }, [columns]);
4944
- React25__default.useEffect(() => {
5158
+ React36__default.useEffect(() => {
4945
5159
  setDensity(densityProp);
4946
5160
  }, [densityProp]);
4947
- React25__default.useEffect(() => {
5161
+ React36__default.useEffect(() => {
4948
5162
  setAggOn(showAggregation);
4949
5163
  }, [showAggregation]);
4950
5164
  const rowGroupingKey = (rowGrouping || []).join("\0");
4951
- const rowGroupingKeyRef = React25__default.useRef(rowGroupingKey);
4952
- React25__default.useEffect(() => {
5165
+ const rowGroupingKeyRef = React36__default.useRef(rowGroupingKey);
5166
+ React36__default.useEffect(() => {
4953
5167
  if (rowGroupingKeyRef.current === rowGroupingKey) return;
4954
5168
  rowGroupingKeyRef.current = rowGroupingKey;
4955
5169
  setGroupBy(rowGrouping || []);
4956
5170
  }, [rowGroupingKey]);
4957
5171
  const widthOf = (c) => widths[c.field] ?? c.width ?? 160;
4958
- const [colMenu, setColMenu] = React25__default.useState(null);
5172
+ const [colMenu, setColMenu] = React36__default.useState(null);
4959
5173
  const [menuPos, openMenu, closeMenu] = useFloating();
4960
- const [panel, setPanel] = React25__default.useState(null);
5174
+ const [panel, setPanel] = React36__default.useState(null);
4961
5175
  const [panelPos, openPanel, closePanel] = useFloating();
4962
- const [rowMenu, setRowMenu] = React25__default.useState(null);
5176
+ const [rowMenu, setRowMenu] = React36__default.useState(null);
4963
5177
  const [rowMenuPos, openRowMenu, closeRowMenu] = useFloating();
4964
- const [exportOpen, setExportOpen] = React25__default.useState(false);
5178
+ const [exportOpen, setExportOpen] = React36__default.useState(false);
4965
5179
  const [exportPos, openExport, closeExport] = useFloating();
4966
- const menuTriggerRef = React25__default.useRef(null);
4967
- const colMenuRef = React25__default.useRef(null);
4968
- const rowMenuRef = React25__default.useRef(null);
4969
- const exportMenuRef = React25__default.useRef(null);
5180
+ const menuTriggerRef = React36__default.useRef(null);
5181
+ const colMenuRef = React36__default.useRef(null);
5182
+ const rowMenuRef = React36__default.useRef(null);
5183
+ const exportMenuRef = React36__default.useRef(null);
4970
5184
  function focusFirstItem(container) {
4971
5185
  if (!container) return;
4972
5186
  const first = container.querySelector('[role="menuitem"]:not([disabled])');
@@ -5005,16 +5219,16 @@ function Datatable({
5005
5219
  restoreTriggerFocus();
5006
5220
  }
5007
5221
  }
5008
- React25__default.useEffect(() => {
5222
+ React36__default.useEffect(() => {
5009
5223
  if (colMenu) focusFirstItem(colMenuRef.current);
5010
5224
  }, [colMenu]);
5011
- React25__default.useEffect(() => {
5225
+ React36__default.useEffect(() => {
5012
5226
  if (rowMenu) focusFirstItem(rowMenuRef.current);
5013
5227
  }, [rowMenu]);
5014
- React25__default.useEffect(() => {
5228
+ React36__default.useEffect(() => {
5015
5229
  if (exportOpen) focusFirstItem(exportMenuRef.current);
5016
5230
  }, [exportOpen]);
5017
- React25__default.useEffect(() => {
5231
+ React36__default.useEffect(() => {
5018
5232
  if (!colMenu && !panel && !rowMenu) return;
5019
5233
  const closeAll = () => {
5020
5234
  setColMenu(null);
@@ -5037,7 +5251,7 @@ function Datatable({
5037
5251
  document.removeEventListener("keydown", onKey);
5038
5252
  };
5039
5253
  }, [colMenu, panel, rowMenu]);
5040
- React25__default.useEffect(() => {
5254
+ React36__default.useEffect(() => {
5041
5255
  if (!exportOpen) return;
5042
5256
  const close = () => {
5043
5257
  setExportOpen(false);
@@ -5056,9 +5270,9 @@ function Datatable({
5056
5270
  document.removeEventListener("keydown", onKey);
5057
5271
  };
5058
5272
  }, [exportOpen]);
5059
- const colByField = React25__default.useMemo(() => Object.fromEntries(cols.map((c) => [c.field, c])), [cols]);
5273
+ const colByField = React36__default.useMemo(() => Object.fromEntries(cols.map((c) => [c.field, c])), [cols]);
5060
5274
  const visibleCols = cols.filter((c) => !hidden.has(c.field));
5061
- const ordered = React25__default.useMemo(() => {
5275
+ const ordered = React36__default.useMemo(() => {
5062
5276
  const orderIdx = (f) => {
5063
5277
  const i = order.indexOf(f);
5064
5278
  return i === -1 ? 9999 : i;
@@ -5093,7 +5307,7 @@ function Datatable({
5093
5307
  }
5094
5308
  return {};
5095
5309
  };
5096
- const processed = React25__default.useMemo(() => {
5310
+ const processed = React36__default.useMemo(() => {
5097
5311
  if (serverMode) {
5098
5312
  if (rowOrder) {
5099
5313
  const idx = new Map(rowOrder.map((k, i) => [k, i]));
@@ -5132,10 +5346,10 @@ function Datatable({
5132
5346
  const totalRows = serverMode ? serverTotal : processed.length;
5133
5347
  const totalPages = paginated ? Math.max(1, Math.ceil(totalRows / rowsPerPage)) : 1;
5134
5348
  const paged = !paginated || serverMode ? processed : processed.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage);
5135
- React25__default.useEffect(() => {
5349
+ React36__default.useEffect(() => {
5136
5350
  if (page > totalPages - 1) setPage(0);
5137
5351
  }, [totalPages]);
5138
- const activeGroupBy = React25__default.useMemo(() => groupBy.filter((f) => colByField[f]), [groupBy, colByField]);
5352
+ const activeGroupBy = React36__default.useMemo(() => groupBy.filter((f) => colByField[f]), [groupBy, colByField]);
5139
5353
  function subtotalText(rowsIn) {
5140
5354
  const parts = [];
5141
5355
  for (const c of ordered) {
@@ -5162,7 +5376,7 @@ function Datatable({
5162
5376
  if (agg === "max") return Math.max(...nums);
5163
5377
  return null;
5164
5378
  }
5165
- const displayItems = React25__default.useMemo(() => {
5379
+ const displayItems = React36__default.useMemo(() => {
5166
5380
  if (!activeGroupBy.length) return null;
5167
5381
  const build = (rowsIn, depth, prefix) => {
5168
5382
  if (depth >= activeGroupBy.length) return rowsIn.map((row) => ({ kind: "leaf", row }));
@@ -5204,7 +5418,7 @@ function Datatable({
5204
5418
  return { top, bottom };
5205
5419
  });
5206
5420
  }
5207
- React25__default.useEffect(() => {
5421
+ React36__default.useEffect(() => {
5208
5422
  if (!rowPinning) return;
5209
5423
  const measure = () => {
5210
5424
  if (theadRef.current) setHeadH(theadRef.current.offsetHeight || 41);
@@ -5218,12 +5432,12 @@ function Datatable({
5218
5432
  const pinnedTopRows = canPinRows ? pinnedRows.top.map((k) => leafRows.find((r, i) => keyOf(r, i) === k)).filter(Boolean) : [];
5219
5433
  const pinnedBottomRows = canPinRows ? pinnedRows.bottom.map((k) => leafRows.find((r, i) => keyOf(r, i) === k)).filter(Boolean) : [];
5220
5434
  const middleRows = canPinRows ? leafRows.filter((r, i) => !pinSideOf(keyOf(r, i))) : leafRows;
5221
- const keyIndex = React25__default.useMemo(() => {
5435
+ const keyIndex = React36__default.useMemo(() => {
5222
5436
  const m = /* @__PURE__ */ new Map();
5223
5437
  leafRows.forEach((r, i) => m.set(keyOf(r, i), i));
5224
5438
  return m;
5225
5439
  }, [leafRows]);
5226
- const keyIndexMid = React25__default.useMemo(() => {
5440
+ const keyIndexMid = React36__default.useMemo(() => {
5227
5441
  const m = /* @__PURE__ */ new Map();
5228
5442
  middleRows.forEach((r, i) => m.set(keyOf(r, keyIndex.get(keyOf(r)) ?? i), i));
5229
5443
  return m;
@@ -5308,7 +5522,7 @@ function Datatable({
5308
5522
  setReorderMsg("Reorder cancelled.");
5309
5523
  }
5310
5524
  }
5311
- React25__default.useEffect(() => {
5525
+ React36__default.useEffect(() => {
5312
5526
  if (rowFocusRef.current == null) return;
5313
5527
  const key = rowFocusRef.current;
5314
5528
  rowFocusRef.current = null;
@@ -5320,7 +5534,7 @@ function Datatable({
5320
5534
  });
5321
5535
  const estRowH = rowHeight ?? (density === "compact" ? 36 : density === "comfortable" ? 56 : 44);
5322
5536
  const virtualizing = virtualized && !paginated && !activeGroupBy.length && !loading;
5323
- React25__default.useEffect(() => {
5537
+ React36__default.useEffect(() => {
5324
5538
  if (!virtualizing) return;
5325
5539
  const el = scrollRef.current;
5326
5540
  if (!el) return;
@@ -5330,13 +5544,13 @@ function Datatable({
5330
5544
  if (ro) ro.observe(el);
5331
5545
  return () => ro && ro.disconnect();
5332
5546
  }, [virtualizing, height]);
5333
- const onScrollVirtual = React25__default.useCallback((e) => {
5547
+ const onScrollVirtual = React36__default.useCallback((e) => {
5334
5548
  setScrollTop(e.currentTarget.scrollTop);
5335
5549
  }, []);
5336
5550
  const vh = viewportH || (typeof height === "number" ? height : 440);
5337
- const rowHRef = React25__default.useRef(/* @__PURE__ */ new Map());
5338
- const [measureTick, setMeasureTick] = React25__default.useState(0);
5339
- const offsets = React25__default.useMemo(() => {
5551
+ const rowHRef = React36__default.useRef(/* @__PURE__ */ new Map());
5552
+ const [measureTick, setMeasureTick] = React36__default.useState(0);
5553
+ const offsets = React36__default.useMemo(() => {
5340
5554
  if (!virtualizing) return null;
5341
5555
  const total = middleRows.length;
5342
5556
  const arr = new Float64Array(total + 1);
@@ -5346,7 +5560,7 @@ function Datatable({
5346
5560
  }
5347
5561
  return arr;
5348
5562
  }, [virtualizing, middleRows, estRowH, measureTick]);
5349
- const vWindow = React25__default.useMemo(() => {
5563
+ const vWindow = React36__default.useMemo(() => {
5350
5564
  if (!virtualizing || !offsets) return null;
5351
5565
  const total = middleRows.length;
5352
5566
  const totalH = offsets[total];
@@ -5375,7 +5589,7 @@ function Datatable({
5375
5589
  if (start > end) start = end;
5376
5590
  return { start, end, padTop: offsets[start], padBottom: Math.max(0, totalH - offsets[end]) };
5377
5591
  }, [virtualizing, offsets, middleRows.length, vh, scrollTop, overscan]);
5378
- React25__default.useLayoutEffect(() => {
5592
+ React36__default.useLayoutEffect(() => {
5379
5593
  if (!virtualizing) return;
5380
5594
  const el = scrollRef.current;
5381
5595
  if (!el) return;
@@ -5390,9 +5604,9 @@ function Datatable({
5390
5604
  }
5391
5605
  if (changed) setMeasureTick((t) => t + 1);
5392
5606
  });
5393
- const onServerChangeRef = React25__default.useRef(onServerChange);
5607
+ const onServerChangeRef = React36__default.useRef(onServerChange);
5394
5608
  onServerChangeRef.current = onServerChange;
5395
- React25__default.useEffect(() => {
5609
+ React36__default.useEffect(() => {
5396
5610
  if (!serverMode) return;
5397
5611
  const t = setTimeout(() => {
5398
5612
  onServerChangeRef.current?.({
@@ -5427,7 +5641,7 @@ function Datatable({
5427
5641
  return n;
5428
5642
  });
5429
5643
  }
5430
- const movableMidFields = React25__default.useMemo(
5644
+ const movableMidFields = React36__default.useMemo(
5431
5645
  () => ordered.filter((c) => !pins.left.includes(c.field) && !pins.right.includes(c.field) && c.reorderable !== false).map((c) => c.field),
5432
5646
  [ordered, pins]
5433
5647
  );
@@ -5458,7 +5672,7 @@ function Datatable({
5458
5672
  }
5459
5673
  return [...set].sort((a, b) => a.localeCompare(b)).map((v) => ({ value: v, label: v }));
5460
5674
  }
5461
- const [resizing, setResizing] = React25__default.useState(false);
5675
+ const [resizing, setResizing] = React36__default.useState(false);
5462
5676
  function startResize(e, field) {
5463
5677
  e.preventDefault();
5464
5678
  e.stopPropagation();
@@ -5565,7 +5779,7 @@ function Datatable({
5565
5779
  if (!agg) return null;
5566
5780
  if (aggregationValues && col.field in aggregationValues) {
5567
5781
  const pre = aggregationValues[col.field];
5568
- if (pre && typeof pre === "object" && !React25__default.isValidElement(pre)) {
5782
+ if (pre && typeof pre === "object" && !React36__default.isValidElement(pre)) {
5569
5783
  if (typeof agg === "string" && agg in pre) return pre[agg];
5570
5784
  } else {
5571
5785
  return pre;
@@ -5683,14 +5897,14 @@ function Datatable({
5683
5897
  focusCell(r, c);
5684
5898
  }
5685
5899
  }
5686
- React25__default.useEffect(() => {
5900
+ React36__default.useEffect(() => {
5687
5901
  setFocus((f) => ({ r: Math.min(f.r, Math.max(0, leafRows.length - 1)), c: Math.min(f.c, Math.max(0, ordered.length - 1)) }));
5688
5902
  }, [leafRows.length, ordered.length, page]);
5689
- const selectedRows = React25__default.useMemo(() => rows.filter((r, i) => selected.has(keyOf(r, i))), [rows, selected]);
5903
+ const selectedRows = React36__default.useMemo(() => rows.filter((r, i) => selected.has(keyOf(r, i))), [rows, selected]);
5690
5904
  function clearSelection() {
5691
5905
  setSelected(/* @__PURE__ */ new Set());
5692
5906
  }
5693
- const [editing, setEditing] = React25__default.useState(null);
5907
+ const [editing, setEditing] = React36__default.useState(null);
5694
5908
  const isColEditable = (c) => c.type !== "actions" && (c.editable ?? (editMode && c.editable !== false));
5695
5909
  function beginEdit(rowK, col, row) {
5696
5910
  if (!isColEditable(col)) return;
@@ -5725,17 +5939,17 @@ function Datatable({
5725
5939
  cancelEdit();
5726
5940
  }
5727
5941
  }
5728
- const batchEditableCols = React25__default.useMemo(
5942
+ const batchEditableCols = React36__default.useMemo(
5729
5943
  () => cols.filter((c) => c.type !== "actions" && (c.editable ?? (editMode && c.editable !== false))),
5730
5944
  [cols, editMode]
5731
5945
  );
5732
- const [batchEdit, setBatchEdit] = React25__default.useState(null);
5946
+ const [batchEdit, setBatchEdit] = React36__default.useState(null);
5733
5947
  const [batchEditPos, openBatchEdit, closeBatchEdit] = useFloating();
5734
5948
  function openBatchEditor(el) {
5735
5949
  setBatchEdit({ fields: {}, values: {} });
5736
5950
  openBatchEdit(el, "left", 320);
5737
5951
  }
5738
- React25__default.useEffect(() => {
5952
+ React36__default.useEffect(() => {
5739
5953
  if (!batchEdit) return;
5740
5954
  const close = () => {
5741
5955
  setBatchEdit(null);
@@ -5754,7 +5968,7 @@ function Datatable({
5754
5968
  document.removeEventListener("keydown", onKey);
5755
5969
  };
5756
5970
  }, [batchEdit]);
5757
- React25__default.useEffect(() => {
5971
+ React36__default.useEffect(() => {
5758
5972
  if (batchEdit && selected.size === 0) {
5759
5973
  setBatchEdit(null);
5760
5974
  closeBatchEdit();
@@ -5791,7 +6005,7 @@ function Datatable({
5791
6005
  setBatchEdit(null);
5792
6006
  closeBatchEdit();
5793
6007
  }
5794
- React25__default.useEffect(() => {
6008
+ React36__default.useEffect(() => {
5795
6009
  if (!editing) return;
5796
6010
  const onDown = (e) => {
5797
6011
  if (e.target.closest(".twc-dt__editor-wrap") || e.target.closest(".twc-pop")) return;
@@ -7314,23 +7528,24 @@ function DatePicker({
7314
7528
  }) {
7315
7529
  const __twcStyles0 = useScopedStyles("twc-field-styles", FIELD_CSS3);
7316
7530
  const __twcStyles1 = useScopedStyles("twc-datepicker-styles", DATEPICKER_CSS);
7317
- const autoId = React25__default.useId();
7531
+ const autoId = React36__default.useId();
7318
7532
  const fieldId = id || autoId;
7319
7533
  const descId = `${fieldId}-desc`;
7320
7534
  const invalid = Boolean(error);
7321
- const [internal, setInternal] = React25__default.useState(defaultValue);
7535
+ const [internal, setInternal] = React36__default.useState(defaultValue);
7322
7536
  const selected = value !== void 0 ? value : internal;
7323
- const [open, setOpen] = React25__default.useState(false);
7324
- const [view, setView] = React25__default.useState(selected || /* @__PURE__ */ new Date());
7325
- const [mode, setMode] = React25__default.useState("days");
7326
- const [focusDate, setFocusDate] = React25__default.useState(null);
7327
- const [coords, setCoords] = React25__default.useState(null);
7328
- const wrapRef = React25__default.useRef(null);
7329
- const triggerRef = React25__default.useRef(null);
7330
- const popRef = React25__default.useRef(null);
7331
- const gridRef = React25__default.useRef(null);
7537
+ const [open, setOpen] = React36__default.useState(false);
7538
+ const [view, setView] = React36__default.useState(selected || /* @__PURE__ */ new Date());
7539
+ const [mode, setMode] = React36__default.useState("days");
7540
+ const [focusDate, setFocusDate] = React36__default.useState(null);
7541
+ const [focusMonth, setFocusMonth] = React36__default.useState(null);
7542
+ const [coords, setCoords] = React36__default.useState(null);
7543
+ const wrapRef = React36__default.useRef(null);
7544
+ const triggerRef = React36__default.useRef(null);
7545
+ const popRef = React36__default.useRef(null);
7546
+ const gridRef = React36__default.useRef(null);
7332
7547
  const POP_W = 280;
7333
- const place = React25__default.useCallback(() => {
7548
+ const place = React36__default.useCallback(() => {
7334
7549
  const el = triggerRef.current;
7335
7550
  if (!el) return;
7336
7551
  const r = el.getBoundingClientRect();
@@ -7341,7 +7556,7 @@ function DatePicker({
7341
7556
  left = Math.max(8, left);
7342
7557
  setCoords({ left, top: flip ? void 0 : Math.round(r.bottom + 6), bottom: flip ? Math.round(vh - r.top + 6) : void 0 });
7343
7558
  }, []);
7344
- React25__default.useEffect(() => {
7559
+ React36__default.useEffect(() => {
7345
7560
  if (!open) return void 0;
7346
7561
  place();
7347
7562
  const onMove = () => place();
@@ -7352,7 +7567,7 @@ function DatePicker({
7352
7567
  window.removeEventListener("resize", onMove);
7353
7568
  };
7354
7569
  }, [open, place]);
7355
- React25__default.useEffect(() => {
7570
+ React36__default.useEffect(() => {
7356
7571
  if (!open) return;
7357
7572
  setView(selected || /* @__PURE__ */ new Date());
7358
7573
  setMode("days");
@@ -7372,21 +7587,10 @@ function DatePicker({
7372
7587
  document.removeEventListener("keydown", onKey);
7373
7588
  };
7374
7589
  }, [open]);
7375
- const prevOpen = React25__default.useRef(false);
7376
- React25__default.useEffect(() => {
7377
- let id2;
7378
- if (!prevOpen.current && open) {
7379
- id2 = setTimeout(() => gridRef.current?.querySelector('[tabindex="0"]')?.focus({ preventScroll: true }), 30);
7380
- } else if (prevOpen.current && !open) {
7381
- const ae = typeof document !== "undefined" ? document.activeElement : null;
7382
- if (!ae || ae === document.body) triggerRef.current?.focus();
7383
- }
7384
- prevOpen.current = open;
7385
- return () => clearTimeout(id2);
7386
- }, [open]);
7387
- const months = React25__default.useMemo(() => locale === void 0 ? MONTHS : monthNames(locale), [locale]);
7388
- const monthsShort = React25__default.useMemo(() => locale === void 0 ? MONTHS.map((n) => n.slice(0, 3)) : monthShortNames(locale), [locale]);
7389
- const dows = React25__default.useMemo(
7590
+ useFocusTrap(popRef, open && !!coords, { initialFocus: () => gridRef.current?.querySelector('[tabindex="0"]') });
7591
+ const months = React36__default.useMemo(() => locale === void 0 ? MONTHS : monthNames(locale), [locale]);
7592
+ const monthsShort = React36__default.useMemo(() => locale === void 0 ? MONTHS.map((n) => n.slice(0, 3)) : monthShortNames(locale), [locale]);
7593
+ const dows = React36__default.useMemo(
7390
7594
  () => locale === void 0 ? Array.from({ length: 7 }, (_, i) => DOW[(i + weekStartsOn) % 7]) : weekdayNames(locale, weekStartsOn),
7391
7595
  [locale, weekStartsOn]
7392
7596
  );
@@ -7414,10 +7618,34 @@ function DatePicker({
7414
7618
  };
7415
7619
  const cells = Array.from({ length: 42 }, (_, i) => new Date(gridStart.getFullYear(), gridStart.getMonth(), gridStart.getDate() + i));
7416
7620
  const tabbableDate = (focusDate && cells.some((c) => sameDay(c, focusDate)) ? focusDate : null) || (selected && cells.some((c) => sameDay(c, selected)) ? selected : null) || (cells.some((c) => sameDay(c, today)) ? today : null) || new Date(y, m, 1);
7417
- React25__default.useEffect(() => {
7621
+ React36__default.useEffect(() => {
7418
7622
  if (!open || mode !== "days" || !focusDate) return;
7419
7623
  gridRef.current?.querySelector(`[data-key="${keyOf(focusDate)}"]`)?.focus();
7420
7624
  }, [focusDate, open, mode]);
7625
+ React36__default.useEffect(() => {
7626
+ if (!open || mode !== "months" || focusMonth == null) return;
7627
+ gridRef.current?.querySelector(`[data-mo="${focusMonth}"]`)?.focus();
7628
+ }, [focusMonth, open, mode]);
7629
+ const onMonthsKeyDown = (e) => {
7630
+ const cur = focusMonth == null ? m : focusMonth;
7631
+ let next;
7632
+ if (e.key === "ArrowRight") next = cur + 1;
7633
+ else if (e.key === "ArrowLeft") next = cur - 1;
7634
+ else if (e.key === "ArrowDown") next = cur + 3;
7635
+ else if (e.key === "ArrowUp") next = cur - 3;
7636
+ else if (e.key === "Home") next = 0;
7637
+ else if (e.key === "End") next = 11;
7638
+ else return;
7639
+ e.preventDefault();
7640
+ if (next < 0) {
7641
+ setView(new Date(y - 1, 0, 1));
7642
+ next += 12;
7643
+ } else if (next > 11) {
7644
+ setView(new Date(y + 1, 0, 1));
7645
+ next -= 12;
7646
+ }
7647
+ setFocusMonth(next);
7648
+ };
7421
7649
  const onGridKeyDown = (e) => {
7422
7650
  const btn = e.target.closest?.("[data-key]");
7423
7651
  if (!btn) return;
@@ -7498,12 +7726,16 @@ function DatePicker({
7498
7726
  className: "twc-dp__pop",
7499
7727
  ref: popRef,
7500
7728
  role: "dialog",
7729
+ "aria-modal": "true",
7501
7730
  "aria-label": "Choose date",
7502
7731
  style: { position: "fixed", left: coords.left, right: "auto", top: coords.top, bottom: coords.bottom, zIndex: "var(--z-tooltip)" },
7503
7732
  children: [
7504
7733
  /* @__PURE__ */ jsxs("div", { className: "twc-dp__head", children: [
7505
7734
  /* @__PURE__ */ jsx("button", { type: "button", className: "twc-dp__nav", "aria-label": "Previous", onClick: () => setView(mode === "months" ? new Date(y - 1, m, 1) : new Date(y, m - 1, 1)), children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "m15 18-6-6 6-6" }) }) }),
7506
- /* @__PURE__ */ jsx("button", { type: "button", className: "twc-dp__title", onClick: () => setMode(mode === "days" ? "months" : "days"), children: mode === "days" ? `${months[m]} ${y}` : y }),
7735
+ /* @__PURE__ */ jsx("button", { type: "button", className: "twc-dp__title", onClick: () => {
7736
+ if (mode === "days") setFocusMonth(m);
7737
+ setMode(mode === "days" ? "months" : "days");
7738
+ }, children: mode === "days" ? `${months[m]} ${y}` : y }),
7507
7739
  /* @__PURE__ */ jsx("span", { className: "twc-dp__sr", "aria-live": "polite", children: mode === "days" ? `${months[m]} ${y}` : y }),
7508
7740
  /* @__PURE__ */ jsx("button", { type: "button", className: "twc-dp__nav", "aria-label": "Next", onClick: () => setView(mode === "months" ? new Date(y + 1, m, 1) : new Date(y, m + 1, 1)), children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "m9 18 6-6-6-6" }) }) })
7509
7741
  ] }),
@@ -7531,11 +7763,14 @@ function DatePicker({
7531
7763
  i
7532
7764
  );
7533
7765
  })
7534
- ] }) : /* @__PURE__ */ jsx("div", { className: "twc-dp__months", children: monthsShort.map((name, i) => /* @__PURE__ */ jsx(
7766
+ ] }) : /* @__PURE__ */ jsx("div", { className: "twc-dp__months", ref: gridRef, onKeyDown: onMonthsKeyDown, role: "grid", children: monthsShort.map((name, i) => /* @__PURE__ */ jsx(
7535
7767
  "button",
7536
7768
  {
7537
7769
  type: "button",
7538
7770
  className: "twc-dp__mo",
7771
+ role: "gridcell",
7772
+ "data-mo": i,
7773
+ tabIndex: i === (focusMonth ?? m) ? 0 : -1,
7539
7774
  "data-selected": selected && selected.getFullYear() === y && selected.getMonth() === i || void 0,
7540
7775
  onClick: () => {
7541
7776
  setView(new Date(y, i, 1));
@@ -7642,23 +7877,25 @@ function DateRangePicker({
7642
7877
  }) {
7643
7878
  const __twcStyles0 = useScopedStyles("twc-field-styles", FIELD_CSS4);
7644
7879
  const __twcStyles1 = useScopedStyles("twc-drp-styles", RANGE_CSS);
7645
- const [internal, setInternal] = React25__default.useState(defaultValue);
7880
+ const [internal, setInternal] = React36__default.useState(defaultValue);
7646
7881
  const range = value !== void 0 ? value : internal;
7647
- const [open, setOpen] = React25__default.useState(false);
7648
- const [view, setView] = React25__default.useState(range.start || /* @__PURE__ */ new Date());
7649
- const [hover, setHover] = React25__default.useState(null);
7650
- const [coords, setCoords] = React25__default.useState(null);
7651
- const wrapRef = React25__default.useRef(null);
7652
- const triggerRef = React25__default.useRef(null);
7653
- const popRef = React25__default.useRef(null);
7654
- const labelId = React25__default.useId();
7882
+ const [open, setOpen] = React36__default.useState(false);
7883
+ const [view, setView] = React36__default.useState(range.start || /* @__PURE__ */ new Date());
7884
+ const [hover, setHover] = React36__default.useState(null);
7885
+ const [focusDate, setFocusDate] = React36__default.useState(null);
7886
+ const [coords, setCoords] = React36__default.useState(null);
7887
+ const wrapRef = React36__default.useRef(null);
7888
+ const triggerRef = React36__default.useRef(null);
7889
+ const popRef = React36__default.useRef(null);
7890
+ const gridRef = React36__default.useRef(null);
7891
+ const labelId = React36__default.useId();
7655
7892
  const descId = `${labelId}-desc`;
7656
7893
  const invalid = Boolean(error);
7657
- React25__default.useEffect(() => {
7894
+ React36__default.useEffect(() => {
7658
7895
  if (disabled) setOpen(false);
7659
7896
  }, [disabled]);
7660
7897
  const POP_W = 420;
7661
- const place = React25__default.useCallback(() => {
7898
+ const place = React36__default.useCallback(() => {
7662
7899
  const el = triggerRef.current;
7663
7900
  if (!el) return;
7664
7901
  const r = el.getBoundingClientRect();
@@ -7669,7 +7906,7 @@ function DateRangePicker({
7669
7906
  left = Math.max(8, left);
7670
7907
  setCoords({ left, top: flip ? void 0 : Math.round(r.bottom + 6), bottom: flip ? Math.round(vh - r.top + 6) : void 0 });
7671
7908
  }, []);
7672
- React25__default.useEffect(() => {
7909
+ React36__default.useEffect(() => {
7673
7910
  if (!open) return void 0;
7674
7911
  place();
7675
7912
  const onMove = () => place();
@@ -7680,7 +7917,7 @@ function DateRangePicker({
7680
7917
  window.removeEventListener("resize", onMove);
7681
7918
  };
7682
7919
  }, [open, place]);
7683
- React25__default.useEffect(() => {
7920
+ React36__default.useEffect(() => {
7684
7921
  if (!open) return;
7685
7922
  const onDown = (e) => {
7686
7923
  if (wrapRef.current && wrapRef.current.contains(e.target)) return;
@@ -7701,7 +7938,52 @@ function DateRangePicker({
7701
7938
  if (value === void 0) setInternal(r);
7702
7939
  onChange?.(r);
7703
7940
  };
7941
+ useFocusTrap(popRef, open && !!coords, { initialFocus: () => gridRef.current?.querySelector('[tabindex="0"]') });
7704
7942
  const outOfRange = (d) => min && ymd(d) < ymd(min) || max && ymd(d) > ymd(max) || Boolean(disabledDate && disabledDate(d));
7943
+ const sameDay2 = (a, b) => a && b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
7944
+ const keyOf = (d) => `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;
7945
+ const addDays = (d, n) => new Date(d.getFullYear(), d.getMonth(), d.getDate() + n);
7946
+ const addMonths = (d, n) => {
7947
+ const last = new Date(d.getFullYear(), d.getMonth() + n + 1, 0);
7948
+ return new Date(last.getFullYear(), last.getMonth(), Math.min(d.getDate(), last.getDate()));
7949
+ };
7950
+ React36__default.useEffect(() => {
7951
+ if (!open) {
7952
+ setFocusDate(null);
7953
+ setHover(null);
7954
+ }
7955
+ }, [open]);
7956
+ React36__default.useEffect(() => {
7957
+ if (!open || !focusDate) return;
7958
+ gridRef.current?.querySelector(`[data-key="${keyOf(focusDate)}"]`)?.focus();
7959
+ }, [focusDate, open]);
7960
+ const onGridKeyDown = (e) => {
7961
+ const btn = e.target.closest && e.target.closest("[data-key]");
7962
+ if (!btn) return;
7963
+ const [fy, fm, fd] = btn.getAttribute("data-key").split("-").map(Number);
7964
+ const cur = new Date(fy, fm, fd);
7965
+ let step;
7966
+ if (e.key === "ArrowLeft") step = (d) => addDays(d, -1);
7967
+ else if (e.key === "ArrowRight") step = (d) => addDays(d, 1);
7968
+ else if (e.key === "ArrowUp") step = (d) => addDays(d, -7);
7969
+ else if (e.key === "ArrowDown") step = (d) => addDays(d, 7);
7970
+ else if (e.key === "Home") step = (d) => addDays(d, -((d.getDay() - weekStartsOn + 7) % 7));
7971
+ else if (e.key === "End") step = (d) => addDays(d, 6 - (d.getDay() - weekStartsOn + 7) % 7);
7972
+ else if (e.key === "PageUp") step = (d) => addMonths(d, -1);
7973
+ else if (e.key === "PageDown") step = (d) => addMonths(d, 1);
7974
+ else return;
7975
+ e.preventDefault();
7976
+ let next = step(cur), guard = 0;
7977
+ while (outOfRange(next) && guard < 366) {
7978
+ next = step(next);
7979
+ guard += 1;
7980
+ }
7981
+ if (outOfRange(next)) return;
7982
+ setFocusDate(next);
7983
+ setHover(next);
7984
+ if (next.getFullYear() !== view.getFullYear() || next.getMonth() !== view.getMonth()) setView(new Date(next.getFullYear(), next.getMonth(), 1));
7985
+ };
7986
+ const tabbableDate = focusDate || range.start || /* @__PURE__ */ new Date();
7705
7987
  const clickDay = (d) => {
7706
7988
  if (outOfRange(d)) return;
7707
7989
  if (!range.start || range.start && range.end) {
@@ -7720,8 +8002,8 @@ function DateRangePicker({
7720
8002
  setView(start);
7721
8003
  setOpen(false);
7722
8004
  };
7723
- const months = React25__default.useMemo(() => locale === void 0 ? MONTHS2 : monthNames2(locale), [locale]);
7724
- const dows = React25__default.useMemo(
8005
+ const months = React36__default.useMemo(() => locale === void 0 ? MONTHS2 : monthNames2(locale), [locale]);
8006
+ const dows = React36__default.useMemo(
7725
8007
  () => locale === void 0 ? Array.from({ length: 7 }, (_, i) => DOW2[(i + weekStartsOn) % 7]) : weekdayNames2(locale, weekStartsOn),
7726
8008
  [locale, weekStartsOn]
7727
8009
  );
@@ -7791,6 +8073,7 @@ function DateRangePicker({
7791
8073
  className: "twc-drp__pop",
7792
8074
  ref: popRef,
7793
8075
  role: "dialog",
8076
+ "aria-modal": "true",
7794
8077
  "aria-label": "Choose date range",
7795
8078
  style: { position: "fixed", left: coords.left, right: "auto", top: coords.top, bottom: coords.bottom, zIndex: "var(--z-tooltip)" },
7796
8079
  children: [
@@ -7810,7 +8093,7 @@ function DateRangePicker({
7810
8093
  ] }),
7811
8094
  /* @__PURE__ */ jsx("button", { type: "button", className: "twc-drp__nav", "aria-label": "Next month", onClick: () => setView(new Date(y, m + 1, 1)), children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "m9 18 6-6-6-6" }) }) })
7812
8095
  ] }),
7813
- /* @__PURE__ */ jsxs("div", { className: "twc-drp__grid", children: [
8096
+ /* @__PURE__ */ jsxs("div", { className: "twc-drp__grid", ref: gridRef, onKeyDown: onGridKeyDown, role: "grid", children: [
7814
8097
  dows.map((d, i) => /* @__PURE__ */ jsx("div", { className: "twc-drp__dow", children: d }, i)),
7815
8098
  Array.from({ length: 42 }).map((_, i) => {
7816
8099
  const d = new Date(gridStart.getFullYear(), gridStart.getMonth(), gridStart.getDate() + i);
@@ -7822,6 +8105,8 @@ function DateRangePicker({
7822
8105
  className: "twc-drp__day",
7823
8106
  "data-outside": outside || void 0,
7824
8107
  disabled: outOfRange(d) || void 0,
8108
+ "data-key": keyOf(d),
8109
+ tabIndex: sameDay2(d, tabbableDate) ? 0 : -1,
7825
8110
  "data-in": inRange(t) || void 0,
7826
8111
  "data-edge": edgeOf(t) || void 0,
7827
8112
  "aria-pressed": !!edgeOf(t),
@@ -7908,14 +8193,14 @@ function Dialog({
7908
8193
  className = "",
7909
8194
  ...rest
7910
8195
  }) {
7911
- const autoId = React25__default.useId();
8196
+ const autoId = React36__default.useId();
7912
8197
  const titleId = `${autoId}-title`;
7913
8198
  const descId = `${autoId}-desc`;
7914
- const dialogRef = React25__default.useRef(null);
8199
+ const dialogRef = React36__default.useRef(null);
7915
8200
  const __twcStyles = useScopedStyles("twc-dialog-styles", DIALOG_CSS);
7916
8201
  const renderPortal = usePortal();
7917
- const [mounted, setMounted] = React25__default.useState(open);
7918
- React25__default.useEffect(() => {
8202
+ const [mounted, setMounted] = React36__default.useState(open);
8203
+ React36__default.useEffect(() => {
7919
8204
  if (open) {
7920
8205
  setMounted(true);
7921
8206
  return;
@@ -7926,7 +8211,7 @@ function Dialog({
7926
8211
  useScrollLock(open);
7927
8212
  useInertBackground(dialogRef, open && mounted);
7928
8213
  useFocusTrap(dialogRef, open && mounted);
7929
- React25__default.useEffect(() => {
8214
+ React36__default.useEffect(() => {
7930
8215
  if (!open) return void 0;
7931
8216
  const onKey = (e) => {
7932
8217
  if (e.key === "Escape") {
@@ -8073,14 +8358,14 @@ function Drawer({
8073
8358
  style,
8074
8359
  ...rest
8075
8360
  }) {
8076
- const autoId = React25__default.useId();
8361
+ const autoId = React36__default.useId();
8077
8362
  const titleId = `${autoId}-title`;
8078
8363
  const descId = `${autoId}-desc`;
8079
- const panelRef = React25__default.useRef(null);
8364
+ const panelRef = React36__default.useRef(null);
8080
8365
  const __twcStyles = useScopedStyles("twc-drawer-styles", DRAWER_CSS);
8081
8366
  const renderPortal = usePortal();
8082
- const [mounted, setMounted] = React25__default.useState(open);
8083
- React25__default.useEffect(() => {
8367
+ const [mounted, setMounted] = React36__default.useState(open);
8368
+ React36__default.useEffect(() => {
8084
8369
  if (open) {
8085
8370
  setMounted(true);
8086
8371
  return;
@@ -8091,7 +8376,7 @@ function Drawer({
8091
8376
  useScrollLock(open);
8092
8377
  useInertBackground(panelRef, open && mounted);
8093
8378
  useFocusTrap(panelRef, open && mounted);
8094
- React25__default.useEffect(() => {
8379
+ React36__default.useEffect(() => {
8095
8380
  if (!open) return void 0;
8096
8381
  const onKey = (e) => {
8097
8382
  if (e.key === "Escape") {
@@ -8180,11 +8465,11 @@ function Field({
8180
8465
  ...rest
8181
8466
  }) {
8182
8467
  const __twcStyles = useScopedStyles("twc-field-styles", FIELD_CSS5);
8183
- const autoId = React25__default.useId();
8468
+ const autoId = React36__default.useId();
8184
8469
  const fieldId = id || autoId;
8185
8470
  const descId = `${fieldId}-desc`;
8186
8471
  const hasMsg = Boolean(error || hint);
8187
- const control = React25__default.isValidElement(children) ? React25__default.cloneElement(children, {
8472
+ const control = React36__default.isValidElement(children) ? React36__default.cloneElement(children, {
8188
8473
  "aria-describedby": [children.props["aria-describedby"], hasMsg ? descId : null].filter(Boolean).join(" ") || void 0,
8189
8474
  "aria-invalid": children.props["aria-invalid"] !== void 0 ? children.props["aria-invalid"] : error ? true : void 0
8190
8475
  }) : children;
@@ -8276,11 +8561,11 @@ function FileUpload({
8276
8561
  ...rest
8277
8562
  }) {
8278
8563
  const __twcStyles = useScopedStyles("twc-upload-styles", UPLOAD_CSS);
8279
- const [internal, setInternal] = React25__default.useState(defaultValue);
8564
+ const [internal, setInternal] = React36__default.useState(defaultValue);
8280
8565
  const files = value !== void 0 ? value : internal;
8281
- const [drag, setDrag] = React25__default.useState(false);
8282
- const inputRef = React25__default.useRef(null);
8283
- const autoId = React25__default.useId();
8566
+ const [drag, setDrag] = React36__default.useState(false);
8567
+ const inputRef = React36__default.useRef(null);
8568
+ const autoId = React36__default.useId();
8284
8569
  const fieldId = id || autoId;
8285
8570
  const descId = `${fieldId}-desc`;
8286
8571
  const invalid = Boolean(error);
@@ -8503,15 +8788,15 @@ function Kanban({
8503
8788
  ...rest
8504
8789
  }) {
8505
8790
  const __twcStyles = useScopedStyles("twc-kanban-styles", KANBAN_CSS);
8506
- const [internal, setInternal] = React25__default.useState(cards ?? defaultCards ?? []);
8791
+ const [internal, setInternal] = React36__default.useState(cards ?? defaultCards ?? []);
8507
8792
  const items = cards !== void 0 ? cards : internal;
8508
- const [drag, setDrag] = React25__default.useState(null);
8509
- const [overCol, setOverCol] = React25__default.useState(null);
8510
- const [grab, setGrab] = React25__default.useState(null);
8511
- const [announce, setAnnounce] = React25__default.useState("");
8512
- const rootRef = React25__default.useRef(null);
8513
- const focusIdRef = React25__default.useRef(null);
8514
- React25__default.useEffect(() => {
8793
+ const [drag, setDrag] = React36__default.useState(null);
8794
+ const [overCol, setOverCol] = React36__default.useState(null);
8795
+ const [grab, setGrab] = React36__default.useState(null);
8796
+ const [announce, setAnnounce] = React36__default.useState("");
8797
+ const rootRef = React36__default.useRef(null);
8798
+ const focusIdRef = React36__default.useRef(null);
8799
+ React36__default.useEffect(() => {
8515
8800
  if (focusIdRef.current == null) return void 0;
8516
8801
  const raf = requestAnimationFrame(() => {
8517
8802
  const id = focusIdRef.current;
@@ -8660,7 +8945,7 @@ var LIST_CSS = `
8660
8945
  `;
8661
8946
  function List({ items, plain = false, emptyMessage, className = "", ...rest }) {
8662
8947
  const __twcStyles = useScopedStyles("twc-list-styles", LIST_CSS);
8663
- const safeHref12 = (url) => {
8948
+ const safeHref13 = (url) => {
8664
8949
  if (url == null) return void 0;
8665
8950
  const s = String(url).replace(/[\x00-\x20]+/g, "").toLowerCase();
8666
8951
  return s.startsWith("javascript:") || s.startsWith("data:") || s.startsWith("vbscript:") ? void 0 : url;
@@ -8672,7 +8957,7 @@ function List({ items, plain = false, emptyMessage, className = "", ...rest }) {
8672
8957
  /* @__PURE__ */ jsxs("ul", { className: `twc-list ${className}`, role: "list", "data-plain": plain || void 0, ...rest, children: [
8673
8958
  __twcStyles,
8674
8959
  items.length === 0 ? /* @__PURE__ */ jsx("li", { role: "presentation", style: { display: "contents" }, children: /* @__PURE__ */ jsx("div", { className: "twc-list__empty", children: emptyMessage ?? "Nothing here yet" }) }) : items.map((it, i) => {
8675
- const href = safeHref12(it.href);
8960
+ const href = safeHref13(it.href);
8676
8961
  const interactive = Boolean(it.onClick || href);
8677
8962
  const Tag2 = href ? "a" : interactive ? "button" : "div";
8678
8963
  const content = /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -8728,7 +9013,7 @@ button.twc-navbar__brand, a.twc-navbar__brand { cursor: pointer; }
8728
9013
  .twc-navbar__menu-btn { display: inline-grid; }
8729
9014
  }
8730
9015
  `;
8731
- function safeHref4(url) {
9016
+ function safeHref5(url) {
8732
9017
  if (url == null) return void 0;
8733
9018
  const s = String(url).replace(/[\x00-\x20]+/g, "").toLowerCase();
8734
9019
  return s.startsWith("javascript:") || s.startsWith("data:") || s.startsWith("vbscript:") ? void 0 : url;
@@ -8751,9 +9036,9 @@ function Navbar({
8751
9036
  return /* @__PURE__ */ jsxs("header", { className: `twc-navbar ${className}`, "data-sticky": sticky || void 0, ...rest, children: [
8752
9037
  __twcStyles,
8753
9038
  onMenuClick ? /* @__PURE__ */ jsx("button", { type: "button", className: "twc-navbar__menu-btn", "aria-expanded": menuOpen, "aria-controls": menuControls, "aria-label": menuOpen ? "Close menu" : "Open menu", onClick: onMenuClick, children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M4 6h16M4 12h16M4 18h16" }) }) }) : null,
8754
- brand ? brandHref ? /* @__PURE__ */ jsx("a", { className: "twc-navbar__brand", href: safeHref4(brandHref), children: brand }) : onBrandClick ? /* @__PURE__ */ jsx("button", { type: "button", className: "twc-navbar__brand", onClick: onBrandClick, children: brand }) : /* @__PURE__ */ jsx("span", { className: "twc-navbar__brand", children: brand }) : null,
9039
+ brand ? brandHref ? /* @__PURE__ */ jsx("a", { className: "twc-navbar__brand", href: safeHref5(brandHref), children: brand }) : onBrandClick ? /* @__PURE__ */ jsx("button", { type: "button", className: "twc-navbar__brand", onClick: onBrandClick, children: brand }) : /* @__PURE__ */ jsx("span", { className: "twc-navbar__brand", children: brand }) : null,
8755
9040
  /* @__PURE__ */ jsx("nav", { className: "twc-navbar__links", "aria-label": navLabel, children: links.map((l, i) => {
8756
- const href = safeHref4(l.href);
9041
+ const href = safeHref5(l.href);
8757
9042
  const inner = /* @__PURE__ */ jsxs(Fragment, { children: [
8758
9043
  l.icon,
8759
9044
  l.label
@@ -8821,21 +9106,21 @@ function Popover({
8821
9106
  ...rest
8822
9107
  }) {
8823
9108
  const __twcStyles = useScopedStyles("twc-popover-styles", POPOVER_CSS);
8824
- const [openState, setOpenState] = React25__default.useState(defaultOpen);
8825
- const [render, setRender] = React25__default.useState(false);
8826
- const [pos, setPos] = React25__default.useState(null);
8827
- const wrapRef = React25__default.useRef(null);
8828
- const popRef = React25__default.useRef(null);
8829
- const popId = React25__default.useId();
9109
+ const [openState, setOpenState] = React36__default.useState(defaultOpen);
9110
+ const [render, setRender] = React36__default.useState(false);
9111
+ const [pos, setPos] = React36__default.useState(null);
9112
+ const wrapRef = React36__default.useRef(null);
9113
+ const popRef = React36__default.useRef(null);
9114
+ const popId = React36__default.useId();
8830
9115
  const controlled = openProp !== void 0;
8831
9116
  const open = controlled ? !!openProp : openState;
8832
- const openRef = React25__default.useRef(open);
9117
+ const openRef = React36__default.useRef(open);
8833
9118
  openRef.current = open;
8834
- const controlledRef = React25__default.useRef(controlled);
9119
+ const controlledRef = React36__default.useRef(controlled);
8835
9120
  controlledRef.current = controlled;
8836
- const onOpenChangeRef = React25__default.useRef(onOpenChange);
9121
+ const onOpenChangeRef = React36__default.useRef(onOpenChange);
8837
9122
  onOpenChangeRef.current = onOpenChange;
8838
- const setOpen = React25__default.useCallback((next) => {
9123
+ const setOpen = React36__default.useCallback((next) => {
8839
9124
  const value = typeof next === "function" ? next(openRef.current) : next;
8840
9125
  if (value === openRef.current) return;
8841
9126
  if (!controlledRef.current) setOpenState(value);
@@ -8843,7 +9128,7 @@ function Popover({
8843
9128
  }, []);
8844
9129
  const toggle = () => setOpen((o) => !o);
8845
9130
  const RD = { createPortal: typeof createPortal === "function" ? createPortal : typeof window !== "undefined" && window.ReactDOM && window.ReactDOM.createPortal };
8846
- const place = React25__default.useCallback(() => {
9131
+ const place = React36__default.useCallback(() => {
8847
9132
  const t = wrapRef.current;
8848
9133
  if (!t) return;
8849
9134
  const r = t.getBoundingClientRect();
@@ -8880,7 +9165,7 @@ function Popover({
8880
9165
  arrow = { top: Math.min(Math.max(cy - top - 5.5, 8), ph - 18), [onRight ? "left" : "right"]: -6 };
8881
9166
  setPos({ top, left, width: w, flip: false, arrow });
8882
9167
  }, [placement, align, width]);
8883
- React25__default.useEffect(() => {
9168
+ React36__default.useEffect(() => {
8884
9169
  if (!open) return;
8885
9170
  place();
8886
9171
  const onMove = () => place();
@@ -8903,7 +9188,7 @@ function Popover({
8903
9188
  document.removeEventListener("keydown", onKey);
8904
9189
  };
8905
9190
  }, [open, place]);
8906
- React25__default.useEffect(() => {
9191
+ React36__default.useEffect(() => {
8907
9192
  if (open) {
8908
9193
  setRender(true);
8909
9194
  return;
@@ -8911,12 +9196,12 @@ function Popover({
8911
9196
  const t = setTimeout(() => setRender(false), 170);
8912
9197
  return () => clearTimeout(t);
8913
9198
  }, [open]);
8914
- React25__default.useEffect(() => {
9199
+ React36__default.useEffect(() => {
8915
9200
  if (render && open) place();
8916
9201
  }, [render, place]);
8917
- const restoreRef = React25__default.useRef(null);
8918
- const needFocusRef = React25__default.useRef(false);
8919
- React25__default.useEffect(() => {
9202
+ const restoreRef = React36__default.useRef(null);
9203
+ const needFocusRef = React36__default.useRef(false);
9204
+ React36__default.useEffect(() => {
8920
9205
  if (open) {
8921
9206
  restoreRef.current = document.activeElement;
8922
9207
  needFocusRef.current = true;
@@ -8951,7 +9236,7 @@ function Popover({
8951
9236
  ]
8952
9237
  }
8953
9238
  ) : null;
8954
- const triggerEl = React25__default.isValidElement(trigger) ? React25__default.cloneElement(trigger, {
9239
+ const triggerEl = React36__default.isValidElement(trigger) ? React36__default.cloneElement(trigger, {
8955
9240
  onClick: (e) => {
8956
9241
  trigger.props.onClick?.(e);
8957
9242
  toggle();
@@ -8994,7 +9279,7 @@ function Progress({
8994
9279
  className = "",
8995
9280
  ...rest
8996
9281
  }) {
8997
- const labelId = React25__default.useId();
9282
+ const labelId = React36__default.useId();
8998
9283
  const { "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, ...restProps } = rest;
8999
9284
  const __twcStyles = useScopedStyles("twc-progress-styles", `
9000
9285
  .twc-progress-wrap { display: flex; flex-direction: column; gap: 6px; font-family: var(--font-sans); }
@@ -9117,7 +9402,7 @@ function Radio({
9117
9402
  .twc-field { display: flex; flex-direction: column; gap: var(--space-1-5); font-family: var(--font-sans); }
9118
9403
  .twc-field__error { font-size: var(--text-xs); color: var(--color-danger-subtle-fg); font-weight: var(--font-medium); }
9119
9404
  `);
9120
- const autoId = React25__default.useId();
9405
+ const autoId = React36__default.useId();
9121
9406
  const fieldId = id || autoId;
9122
9407
  const errId = `${fieldId}-error`;
9123
9408
  const invalid = Boolean(error);
@@ -9187,13 +9472,13 @@ function RadioGroup({
9187
9472
  ...rest
9188
9473
  }) {
9189
9474
  const __twcStyles = useScopedStyles("twc-radio-group-styles", RADIO_GROUP_CSS);
9190
- const autoId = React25__default.useId();
9475
+ const autoId = React36__default.useId();
9191
9476
  const fieldId = id || autoId;
9192
9477
  const labelId = `${fieldId}-label`;
9193
9478
  const descId = `${fieldId}-desc`;
9194
9479
  const groupName = name || `${fieldId}-name`;
9195
9480
  const invalid = Boolean(error);
9196
- const [internal, setInternal] = React25__default.useState(defaultValue);
9481
+ const [internal, setInternal] = React36__default.useState(defaultValue);
9197
9482
  const current = value !== void 0 ? value : internal;
9198
9483
  const select = (v) => {
9199
9484
  if (value === void 0) setInternal(v);
@@ -9214,10 +9499,10 @@ function RadioGroup({
9214
9499
  tone
9215
9500
  },
9216
9501
  o.value
9217
- )) : React25__default.Children.map(children, (child) => {
9218
- if (!React25__default.isValidElement(child)) return child;
9502
+ )) : React36__default.Children.map(children, (child) => {
9503
+ if (!React36__default.isValidElement(child)) return child;
9219
9504
  const v = child.props.value;
9220
- return React25__default.cloneElement(child, {
9505
+ return React36__default.cloneElement(child, {
9221
9506
  name: child.props.name ?? groupName,
9222
9507
  checked: child.props.checked ?? current === v,
9223
9508
  onChange: child.props.onChange ?? (() => select(v)),
@@ -9297,12 +9582,12 @@ function Rating({
9297
9582
  ...rest
9298
9583
  }) {
9299
9584
  const __twcStyles = useScopedStyles("twc-rating-styles", RATING_CSS);
9300
- const [internal, setInternal] = React25__default.useState(defaultValue);
9301
- const [hover, setHover] = React25__default.useState(0);
9585
+ const [internal, setInternal] = React36__default.useState(defaultValue);
9586
+ const [hover, setHover] = React36__default.useState(0);
9302
9587
  const val = value !== void 0 ? value : internal;
9303
9588
  const shown = hover || val;
9304
9589
  const interactive = !readOnly && !disabled;
9305
- const btnRefs = React25__default.useRef([]);
9590
+ const btnRefs = React36__default.useRef([]);
9306
9591
  const tabStar = Math.min(count, Math.max(1, Math.round(val) || 1));
9307
9592
  const fmt = (v) => format ? format(v) : Number.isInteger(v) ? String(v) : v.toFixed(1);
9308
9593
  if (process.env.NODE_ENV !== "production" && interactive && !Number.isInteger(val)) {
@@ -9489,24 +9774,24 @@ function Sidebar({
9489
9774
  ...rest
9490
9775
  }) {
9491
9776
  const __twcStyles = useScopedStyles("twc-sidebar-styles", SIDEBAR_CSS);
9492
- const navId = React25__default.useId();
9493
- const panelRef = React25__default.useRef(null);
9777
+ const navId = React36__default.useId();
9778
+ const panelRef = React36__default.useRef(null);
9494
9779
  const renderPortal = usePortal();
9495
- const [internal, setInternal] = React25__default.useState(defaultCollapsed);
9780
+ const [internal, setInternal] = React36__default.useState(defaultCollapsed);
9496
9781
  const collapsed = collapsedProp !== void 0 ? collapsedProp : internal;
9497
9782
  const toggle = () => {
9498
9783
  const next = !collapsed;
9499
9784
  if (collapsedProp === void 0) setInternal(next);
9500
9785
  onCollapsedChange?.(next);
9501
9786
  };
9502
- const [openInternal, setOpenInternal] = React25__default.useState(defaultOpen);
9787
+ const [openInternal, setOpenInternal] = React36__default.useState(defaultOpen);
9503
9788
  const open = openProp !== void 0 ? openProp : openInternal;
9504
9789
  const setOpen = (next) => {
9505
9790
  if (openProp === void 0) setOpenInternal(next);
9506
9791
  onOpenChange?.(next);
9507
9792
  };
9508
- const [mounted, setMounted] = React25__default.useState(open);
9509
- React25__default.useEffect(() => {
9793
+ const [mounted, setMounted] = React36__default.useState(open);
9794
+ React36__default.useEffect(() => {
9510
9795
  if (!overlay) return void 0;
9511
9796
  if (open) {
9512
9797
  setMounted(true);
@@ -9515,7 +9800,7 @@ function Sidebar({
9515
9800
  const t = setTimeout(() => setMounted(false), 170);
9516
9801
  return () => clearTimeout(t);
9517
9802
  }, [overlay, open]);
9518
- React25__default.useEffect(() => {
9803
+ React36__default.useEffect(() => {
9519
9804
  if (!overlay || !open) return void 0;
9520
9805
  const prev = document.body.style.overflow;
9521
9806
  document.body.style.overflow = "hidden";
@@ -9524,7 +9809,7 @@ function Sidebar({
9524
9809
  };
9525
9810
  }, [overlay, open]);
9526
9811
  useFocusTrap(panelRef, overlay && open && mounted);
9527
- React25__default.useEffect(() => {
9812
+ React36__default.useEffect(() => {
9528
9813
  if (!overlay || !open) return void 0;
9529
9814
  const onKey = (e) => {
9530
9815
  if (e.key === "Escape") {
@@ -9536,13 +9821,13 @@ function Sidebar({
9536
9821
  document.addEventListener("keydown", onKey);
9537
9822
  return () => document.removeEventListener("keydown", onKey);
9538
9823
  }, [overlay, open, openProp, onOpenChange]);
9539
- const safeHref12 = (url) => {
9824
+ const safeHref13 = (url) => {
9540
9825
  if (url == null) return void 0;
9541
9826
  const s = String(url).replace(/[\x00-\x20]+/g, "").toLowerCase();
9542
9827
  return s.startsWith("javascript:") || s.startsWith("data:") || s.startsWith("vbscript:") ? void 0 : url;
9543
9828
  };
9544
9829
  const renderItem = (it, i) => {
9545
- const href = safeHref12(it.href);
9830
+ const href = safeHref13(it.href);
9546
9831
  const labelStr = typeof it.label === "string" ? it.label : void 0;
9547
9832
  const inner = /* @__PURE__ */ jsxs(Fragment, { children: [
9548
9833
  it.icon ? /* @__PURE__ */ jsx("span", { className: "twc-sidebar__ic", "aria-hidden": "true", children: it.icon }) : labelStr != null ? /* @__PURE__ */ jsx("span", { className: "twc-sidebar__ic twc-sidebar__ic--initial", "aria-hidden": "true", children: labelStr.charAt(0) }) : null,
@@ -9576,7 +9861,7 @@ function Sidebar({
9576
9861
  const body = /* @__PURE__ */ jsxs(Fragment, { children: [
9577
9862
  __twcStyles,
9578
9863
  brand ? /* @__PURE__ */ jsx("div", { className: "twc-sidebar__head", children: /* @__PURE__ */ jsx("span", { className: "twc-sidebar__brand", children: brand }) }) : null,
9579
- /* @__PURE__ */ jsx("nav", { id: navId, className: "twc-sidebar__nav", "aria-label": navLabel, children: groups.map((g, gi) => /* @__PURE__ */ jsxs(React25__default.Fragment, { children: [
9864
+ /* @__PURE__ */ jsx("nav", { id: navId, className: "twc-sidebar__nav", "aria-label": navLabel, children: groups.map((g, gi) => /* @__PURE__ */ jsxs(React36__default.Fragment, { children: [
9580
9865
  g.section != null ? /* @__PURE__ */ jsx("div", { className: "twc-sidebar__section", id: g.sid, children: g.section }) : null,
9581
9866
  /* @__PURE__ */ jsx("ul", { className: "twc-sidebar__list", ...g.section != null ? { "aria-labelledby": g.sid } : {}, children: g.entries.map(({ it, i }) => /* @__PURE__ */ jsx("li", { children: renderItem(it) }, i)) })
9582
9867
  ] }, gi)) }),
@@ -9745,10 +10030,10 @@ function Slider({
9745
10030
  return Math.min(max, Math.max(min, Math.round(stepped * 1e6) / 1e6));
9746
10031
  };
9747
10032
  const __twcStyles = useScopedStyles("twc-slider-styles", SLIDER_CSS);
9748
- const autoId = React25__default.useId();
10033
+ const autoId = React36__default.useId();
9749
10034
  const fieldId = id || autoId;
9750
10035
  const isRange = range || Array.isArray(value) || Array.isArray(defaultValue);
9751
- const [internal, setInternal] = React25__default.useState(() => {
10036
+ const [internal, setInternal] = React36__default.useState(() => {
9752
10037
  if (isRange) {
9753
10038
  const dv = Array.isArray(defaultValue) ? defaultValue : [min, max];
9754
10039
  return [clampSnap(dv[0]), clampSnap(dv[1])];
@@ -9758,8 +10043,8 @@ function Slider({
9758
10043
  const rawVal = value !== void 0 ? value : internal;
9759
10044
  const clampedVals = (isRange ? [Number(rawVal[0]), Number(rawVal[1])] : [Number(rawVal)]).map((v) => Math.min(max, Math.max(min, Number.isFinite(v) ? v : min)));
9760
10045
  const indices = isRange ? [0, 1] : [0];
9761
- const trackRef = React25__default.useRef(null);
9762
- const [dragging, setDragging] = React25__default.useState(false);
10046
+ const trackRef = React36__default.useRef(null);
10047
+ const [dragging, setDragging] = React36__default.useState(false);
9763
10048
  const fmt = (v) => formatValue ? formatValue(v) : v.toFixed(decimals);
9764
10049
  const valueTextFor = (v) => {
9765
10050
  if (getAriaValueText) return getAriaValueText(v);
@@ -9790,8 +10075,8 @@ function Slider({
9790
10075
  const ratio = Math.min(1, Math.max(0, (clientX - r.left) / r.width));
9791
10076
  return clampSnap(min + ratio * (max - min));
9792
10077
  };
9793
- const dragCleanupRef = React25__default.useRef(null);
9794
- React25__default.useEffect(() => () => dragCleanupRef.current?.(), []);
10078
+ const dragCleanupRef = React36__default.useRef(null);
10079
+ React36__default.useEffect(() => () => dragCleanupRef.current?.(), []);
9795
10080
  function onPointerDown(e) {
9796
10081
  if (disabled) return;
9797
10082
  e.preventDefault();
@@ -10022,7 +10307,7 @@ function Stepper({
10022
10307
  ...rest
10023
10308
  }) {
10024
10309
  const __twcStyles = useScopedStyles("twc-stepper-styles", STEPPER_CSS);
10025
- const [activeInternal, setActiveInternal] = React25__default.useState(defaultActive);
10310
+ const [activeInternal, setActiveInternal] = React36__default.useState(defaultActive);
10026
10311
  const active = activeProp !== void 0 ? activeProp : activeInternal;
10027
10312
  const handleStep = (i) => {
10028
10313
  if (activeProp === void 0) setActiveInternal(i);
@@ -10154,7 +10439,7 @@ function Switch({
10154
10439
  .twc-field { display: flex; flex-direction: column; gap: var(--space-1-5); font-family: var(--font-sans); }
10155
10440
  .twc-field__error { font-size: var(--text-xs); color: var(--color-danger-subtle-fg); font-weight: var(--font-medium); }
10156
10441
  `);
10157
- const autoId = React25__default.useId();
10442
+ const autoId = React36__default.useId();
10158
10443
  const fieldId = id || autoId;
10159
10444
  const errId = `${fieldId}-error`;
10160
10445
  const invalid = Boolean(error);
@@ -10257,14 +10542,14 @@ function Table({
10257
10542
  ...rest
10258
10543
  }) {
10259
10544
  const __twcStyles = useScopedStyles("twc-table-styles", TABLE_CSS);
10260
- const cols = React25__default.useMemo(
10545
+ const cols = React36__default.useMemo(
10261
10546
  () => (columns || []).map((c) => ({ ...c, header: c.headerName, render: c.renderCell })),
10262
10547
  [columns]
10263
10548
  );
10264
10549
  const dataRows = rowsProp || [];
10265
- const [internalSort, setInternalSort] = React25__default.useState(defaultSort || { field: null, dir: "asc" });
10550
+ const [internalSort, setInternalSort] = React36__default.useState(defaultSort || { field: null, dir: "asc" });
10266
10551
  const sort = (sortProp !== void 0 ? sortProp : internalSort) || { field: null, dir: "asc" };
10267
- const rows = React25__default.useMemo(() => {
10552
+ const rows = React36__default.useMemo(() => {
10268
10553
  if (!sortable || !sort.field) return dataRows;
10269
10554
  const col = cols.find((c) => c.field === sort.field);
10270
10555
  if (!col) return dataRows;
@@ -10411,15 +10696,15 @@ function Tabs({
10411
10696
  }) {
10412
10697
  const vertical = orientation === "vertical";
10413
10698
  const __twcStyles = useScopedStyles("twc-tabs-styles", TABS_CSS);
10414
- const [internal, setInternal] = React25__default.useState(defaultValue ?? items[0]?.value);
10699
+ const [internal, setInternal] = React36__default.useState(defaultValue ?? items[0]?.value);
10415
10700
  const active = value ?? internal;
10416
- const listRef = React25__default.useRef(null);
10417
- const [ind, setInd] = React25__default.useState({ left: 0, width: 0, top: 0, height: 0 });
10418
- const baseId = React25__default.useId();
10701
+ const listRef = React36__default.useRef(null);
10702
+ const [ind, setInd] = React36__default.useState({ left: 0, width: 0, top: 0, height: 0 });
10703
+ const baseId = React36__default.useId();
10419
10704
  const tabIdAt = (i) => `${baseId}-tab-${i}`;
10420
10705
  const panelId = `${baseId}-panel`;
10421
10706
  const activeIndex = items.findIndex((it) => it.value === active);
10422
- const updateIndicator = React25__default.useCallback(() => {
10707
+ const updateIndicator = React36__default.useCallback(() => {
10423
10708
  const list = listRef.current;
10424
10709
  if (!list) return;
10425
10710
  const el = list.querySelector('[data-active="true"]');
@@ -10428,10 +10713,10 @@ function Tabs({
10428
10713
  if (!vertical) el.scrollIntoView?.({ inline: "nearest", block: "nearest" });
10429
10714
  }
10430
10715
  }, [vertical]);
10431
- React25__default.useEffect(() => {
10716
+ React36__default.useEffect(() => {
10432
10717
  updateIndicator();
10433
10718
  }, [active, updateIndicator, items, orientation]);
10434
- React25__default.useEffect(() => {
10719
+ React36__default.useEffect(() => {
10435
10720
  const r = () => updateIndicator();
10436
10721
  window.addEventListener("resize", r);
10437
10722
  if (typeof document !== "undefined" && document.fonts && document.fonts.ready) {
@@ -10576,7 +10861,7 @@ function Tag({
10576
10861
  }, "aria-label": _removeLabel, type: "button", children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.4", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M18 6 6 18M6 6l12 12" }) }) }) : null
10577
10862
  ] });
10578
10863
  }
10579
- var useIso = typeof document !== "undefined" ? React25__default.useLayoutEffect : React25__default.useEffect;
10864
+ var useIso = typeof document !== "undefined" ? React36__default.useLayoutEffect : React36__default.useEffect;
10580
10865
  var TEXTAREA_CSS = `
10581
10866
  .twc-field { display: flex; flex-direction: column; gap: var(--space-1-5); font-family: var(--font-sans); }
10582
10867
  .twc-field__label { font-size: var(--text-sm); font-weight: var(--font-semibold); color: var(--color-text); display: flex; gap: 4px; align-items: center; }
@@ -10612,7 +10897,7 @@ var TEXTAREA_CSS = `
10612
10897
  .twc-field__count { margin-inline-start: auto; font-size: var(--text-xs); color: var(--color-text-muted); font-variant-numeric: tabular-nums; flex: none; }
10613
10898
  .twc-field__count[data-danger="true"] { color: var(--color-danger-subtle-fg); }
10614
10899
  `;
10615
- var Textarea = React25__default.forwardRef(function Textarea2({
10900
+ var Textarea = React36__default.forwardRef(function Textarea2({
10616
10901
  label,
10617
10902
  hint,
10618
10903
  error,
@@ -10630,19 +10915,19 @@ var Textarea = React25__default.forwardRef(function Textarea2({
10630
10915
  ...rest
10631
10916
  }, ref) {
10632
10917
  const __twcStyles = useScopedStyles("twc-textarea-styles", TEXTAREA_CSS);
10633
- const autoId = React25__default.useId();
10918
+ const autoId = React36__default.useId();
10634
10919
  const fieldId = id || autoId;
10635
10920
  const descId = `${fieldId}-desc`;
10636
10921
  const countId = `${fieldId}-count`;
10637
10922
  const invalid = Boolean(error);
10638
- const innerRef = React25__default.useRef(null);
10923
+ const innerRef = React36__default.useRef(null);
10639
10924
  const setRef = (el) => {
10640
10925
  innerRef.current = el;
10641
10926
  if (typeof ref === "function") ref(el);
10642
10927
  else if (ref) ref.current = el;
10643
10928
  };
10644
10929
  const countControlled = rest.value !== void 0;
10645
- const [len2, setLen] = React25__default.useState(() => String(rest.defaultValue ?? "").length);
10930
+ const [len2, setLen] = React36__default.useState(() => String(rest.defaultValue ?? "").length);
10646
10931
  const count = countControlled ? String(rest.value ?? "").length : len2;
10647
10932
  const max = rest.maxLength;
10648
10933
  const showCounter = showCount && max != null;
@@ -10820,19 +11105,19 @@ function Toast({
10820
11105
  }) {
10821
11106
  const resolvedTone = tone === "neutral" ? "default" : tone;
10822
11107
  const __twcStyles = useScopedStyles("twc-toast-styles", TOAST_CSS);
10823
- const onCloseRef = React25__default.useRef(onClose);
10824
- React25__default.useEffect(() => {
11108
+ const onCloseRef = React36__default.useRef(onClose);
11109
+ React36__default.useEffect(() => {
10825
11110
  onCloseRef.current = onClose;
10826
11111
  }, [onClose]);
10827
- const timer = React25__default.useRef();
10828
- const stop = React25__default.useCallback(() => clearTimeout(timer.current), []);
10829
- const start = React25__default.useCallback(() => {
11112
+ const timer = React36__default.useRef();
11113
+ const stop = React36__default.useCallback(() => clearTimeout(timer.current), []);
11114
+ const start = React36__default.useCallback(() => {
10830
11115
  stop();
10831
11116
  if (duration && duration !== Infinity && onCloseRef.current) {
10832
11117
  timer.current = setTimeout(() => onCloseRef.current && onCloseRef.current(), duration);
10833
11118
  }
10834
11119
  }, [duration, stop]);
10835
- React25__default.useEffect(() => {
11120
+ React36__default.useEffect(() => {
10836
11121
  start();
10837
11122
  return stop;
10838
11123
  }, [start, stop]);
@@ -10877,30 +11162,30 @@ function Toast({
10877
11162
  }
10878
11163
  function ToastViewport({ children, limit, className = "", ...rest }) {
10879
11164
  const __twcStyles = useScopedStyles("twc-toast-styles", TOAST_CSS);
10880
- const shown = limit && limit > 0 ? React25__default.Children.toArray(children).slice(-limit) : children;
11165
+ const shown = limit && limit > 0 ? React36__default.Children.toArray(children).slice(-limit) : children;
10881
11166
  return /* @__PURE__ */ jsxs("div", { className: `twc-toast-viewport ${className}`, role: "region", "aria-label": "Notifications", ...rest, children: [
10882
11167
  __twcStyles,
10883
11168
  shown
10884
11169
  ] });
10885
11170
  }
10886
- var ToastContext = React25__default.createContext(null);
11171
+ var ToastContext = React36__default.createContext(null);
10887
11172
  function useToast() {
10888
- const ctx = React25__default.useContext(ToastContext);
11173
+ const ctx = React36__default.useContext(ToastContext);
10889
11174
  if (!ctx) throw new Error("useToast must be used within a <ToastProvider>.");
10890
11175
  return ctx;
10891
11176
  }
10892
11177
  function ToastProvider({ children, limit = 4, duration = 4500, ...viewportProps }) {
10893
- const [toasts, setToasts] = React25__default.useState([]);
10894
- const idRef = React25__default.useRef(0);
10895
- const limitRef = React25__default.useRef(limit);
10896
- React25__default.useEffect(() => {
11178
+ const [toasts, setToasts] = React36__default.useState([]);
11179
+ const idRef = React36__default.useRef(0);
11180
+ const limitRef = React36__default.useRef(limit);
11181
+ React36__default.useEffect(() => {
10897
11182
  limitRef.current = limit;
10898
11183
  }, [limit]);
10899
- const dismiss = React25__default.useCallback((id) => {
11184
+ const dismiss = React36__default.useCallback((id) => {
10900
11185
  setToasts((s) => s.filter((t) => t.id !== id));
10901
11186
  }, []);
10902
- const clear = React25__default.useCallback(() => setToasts([]), []);
10903
- const api = React25__default.useMemo(() => {
11187
+ const clear = React36__default.useCallback(() => setToasts([]), []);
11188
+ const api = React36__default.useMemo(() => {
10904
11189
  const push = (opts) => {
10905
11190
  const id = idRef.current += 1;
10906
11191
  const next = typeof opts === "string" ? { title: opts } : opts && typeof opts === "object" ? opts : {};
@@ -10921,7 +11206,7 @@ function ToastProvider({ children, limit = 4, duration = 4500, ...viewportProps
10921
11206
  toast.show = withTone("default");
10922
11207
  return { toast, dismiss, clear };
10923
11208
  }, [dismiss, clear]);
10924
- const value = React25__default.useMemo(() => ({ ...api, toasts }), [api, toasts]);
11209
+ const value = React36__default.useMemo(() => ({ ...api, toasts }), [api, toasts]);
10925
11210
  return /* @__PURE__ */ jsxs(ToastContext.Provider, { value, children: [
10926
11211
  children,
10927
11212
  /* @__PURE__ */ jsx(ToastViewport, { limit, ...viewportProps, children: toasts.map((t) => /* @__PURE__ */ jsx(
@@ -11029,13 +11314,13 @@ function TreeView({
11029
11314
  }) {
11030
11315
  const nodes = items;
11031
11316
  const __twcStyles = useScopedStyles("twc-tree-styles", TREE_CSS);
11032
- const [expInternal, setExpInternal] = React25__default.useState(() => new Set(defaultExpanded));
11317
+ const [expInternal, setExpInternal] = React36__default.useState(() => new Set(defaultExpanded));
11033
11318
  const expanded = expandedProp !== void 0 ? new Set(expandedProp) : expInternal;
11034
- const [selInternal, setSelInternal] = React25__default.useState(defaultSelectedId);
11319
+ const [selInternal, setSelInternal] = React36__default.useState(defaultSelectedId);
11035
11320
  const selectedId = selectedProp !== void 0 ? selectedProp : selInternal;
11036
- const [focusId, setFocusId] = React25__default.useState(null);
11037
- const rowRefs = React25__default.useRef(/* @__PURE__ */ new Map());
11038
- const taRef = React25__default.useRef({ str: "", t: 0 });
11321
+ const [focusId, setFocusId] = React36__default.useState(null);
11322
+ const rowRefs = React36__default.useRef(/* @__PURE__ */ new Map());
11323
+ const taRef = React36__default.useRef({ str: "", t: 0 });
11039
11324
  const toggle = (id) => {
11040
11325
  const n = new Set(expanded);
11041
11326
  n.has(id) ? n.delete(id) : n.add(id);
@@ -11167,7 +11452,7 @@ function AppShell({
11167
11452
  ...rest
11168
11453
  }) {
11169
11454
  const __twcStyles = useScopedStyles("twc-shell-styles", SHELL_CSS);
11170
- const wiredSidebar = React25__default.isValidElement(sidebar) && (sidebarOpen !== void 0 || onSidebarOpenChange !== void 0) ? React25__default.cloneElement(sidebar, {
11455
+ const wiredSidebar = React36__default.isValidElement(sidebar) && (sidebarOpen !== void 0 || onSidebarOpenChange !== void 0) ? React36__default.cloneElement(sidebar, {
11171
11456
  overlay: sidebar.props.overlay !== void 0 ? sidebar.props.overlay : true,
11172
11457
  open: sidebar.props.open !== void 0 ? sidebar.props.open : sidebarOpen,
11173
11458
  onOpenChange: sidebar.props.onOpenChange !== void 0 ? sidebar.props.onOpenChange : onSidebarOpenChange
@@ -11197,12 +11482,12 @@ function bgValue(bg) {
11197
11482
  if (BG[bg]) return `var(${BG[bg]})`;
11198
11483
  return String(bg).startsWith("--") ? `var(${bg})` : bg;
11199
11484
  }
11200
- function safeHref5(url) {
11485
+ function safeHref6(url) {
11201
11486
  if (url == null) return void 0;
11202
11487
  const s = String(url).replace(/[\x00-\x20]+/g, "").toLowerCase();
11203
11488
  return s.startsWith("javascript:") || s.startsWith("data:") || s.startsWith("vbscript:") ? void 0 : url;
11204
11489
  }
11205
- function Box({
11490
+ var Box = React36__default.forwardRef(function Box2({
11206
11491
  as: Tag2 = "div",
11207
11492
  p,
11208
11493
  px,
@@ -11226,7 +11511,7 @@ function Box({
11226
11511
  style,
11227
11512
  children,
11228
11513
  ...rest
11229
- }) {
11514
+ }, ref) {
11230
11515
  const s = {
11231
11516
  paddingTop: sp(pt ?? py ?? p),
11232
11517
  paddingRight: sp(pr ?? px ?? p),
@@ -11242,16 +11527,17 @@ function Box({
11242
11527
  boxShadow: shadow ? `var(--shadow-${shadow})` : void 0,
11243
11528
  ...style
11244
11529
  };
11245
- if (Tag2 === "a" && rest.href != null) rest.href = safeHref5(rest.href);
11246
- return /* @__PURE__ */ jsx(Tag2, { className: `twc-box ${className}`.trim(), style: s, ...rest, children });
11247
- }
11530
+ if (Tag2 === "a" && rest.href != null) rest.href = safeHref6(rest.href);
11531
+ return /* @__PURE__ */ jsx(Tag2, { ref, className: `twc-box ${className}`.trim(), style: s, ...rest, children });
11532
+ });
11533
+ Box.displayName = "Box";
11248
11534
  var SIZES = { sm: 640, md: 768, lg: 1024, xl: 1280, full: "100%" };
11249
- function safeHref6(url) {
11535
+ function safeHref7(url) {
11250
11536
  if (url == null) return void 0;
11251
11537
  const s = String(url).replace(/[\x00-\x20]+/g, "").toLowerCase();
11252
11538
  return s.startsWith("javascript:") || s.startsWith("data:") || s.startsWith("vbscript:") ? void 0 : url;
11253
11539
  }
11254
- function Container({
11540
+ var Container = React36__default.forwardRef(function Container2({
11255
11541
  as: Tag2 = "div",
11256
11542
  size = "lg",
11257
11543
  padded = true,
@@ -11259,12 +11545,13 @@ function Container({
11259
11545
  style,
11260
11546
  children,
11261
11547
  ...rest
11262
- }) {
11548
+ }, ref) {
11263
11549
  const max = SIZES[size] ?? size;
11264
- if (Tag2 === "a" && rest.href != null) rest.href = safeHref6(rest.href);
11550
+ if (Tag2 === "a" && rest.href != null) rest.href = safeHref7(rest.href);
11265
11551
  return /* @__PURE__ */ jsx(
11266
11552
  Tag2,
11267
11553
  {
11554
+ ref,
11268
11555
  className: `twc-container ${className}`.trim(),
11269
11556
  style: {
11270
11557
  width: "100%",
@@ -11277,7 +11564,8 @@ function Container({
11277
11564
  children
11278
11565
  }
11279
11566
  );
11280
- }
11567
+ });
11568
+ Container.displayName = "Container";
11281
11569
  function space(v) {
11282
11570
  if (v == null) return void 0;
11283
11571
  if (typeof v === "number") return `var(--space-${String(v).replace(".", "-")})`;
@@ -11287,12 +11575,12 @@ function len(v) {
11287
11575
  return typeof v === "number" ? `${v}px` : v;
11288
11576
  }
11289
11577
  var BP = { sm: 640, md: 768, lg: 1024, xl: 1280 };
11290
- function safeHref7(url) {
11578
+ function safeHref8(url) {
11291
11579
  if (url == null) return void 0;
11292
11580
  const s = String(url).replace(/[\x00-\x20]+/g, "").toLowerCase();
11293
11581
  return s.startsWith("javascript:") || s.startsWith("data:") || s.startsWith("vbscript:") ? void 0 : url;
11294
11582
  }
11295
- function Grid({
11583
+ var Grid = React36__default.forwardRef(function Grid2({
11296
11584
  as: Tag2 = "div",
11297
11585
  columns,
11298
11586
  minChildWidth,
@@ -11307,9 +11595,9 @@ function Grid({
11307
11595
  style,
11308
11596
  children,
11309
11597
  ...rest
11310
- }) {
11598
+ }, ref) {
11311
11599
  const responsive = columns != null && typeof columns === "object";
11312
- const uid = React25__default.useId();
11600
+ const uid = React36__default.useId();
11313
11601
  const gridId = responsive ? `g${uid.replace(/[^a-zA-Z0-9]/g, "")}` : null;
11314
11602
  let css = "";
11315
11603
  if (responsive) {
@@ -11323,10 +11611,11 @@ function Grid({
11323
11611
  }
11324
11612
  const __twcStyles = useScopedStyles(gridId ? `twc-grid-${gridId}` : "twc-grid", css);
11325
11613
  const templateColumns = minChildWidth ? `repeat(auto-fill, minmax(min(${len(minChildWidth)}, 100%), 1fr))` : responsive ? `repeat(var(--twc-grid-cols, ${columns.base ?? 1}), minmax(0, 1fr))` : `repeat(${columns || 1}, minmax(0, 1fr))`;
11326
- if (Tag2 === "a" && rest.href != null) rest.href = safeHref7(rest.href);
11614
+ if (Tag2 === "a" && rest.href != null) rest.href = safeHref8(rest.href);
11327
11615
  return /* @__PURE__ */ jsxs(
11328
11616
  Tag2,
11329
11617
  {
11618
+ ref,
11330
11619
  className: `twc-grid ${className}`.trim(),
11331
11620
  "data-twc-grid-id": gridId || void 0,
11332
11621
  style: {
@@ -11347,18 +11636,19 @@ function Grid({
11347
11636
  ]
11348
11637
  }
11349
11638
  );
11350
- }
11639
+ });
11640
+ Grid.displayName = "Grid";
11351
11641
  function space2(v) {
11352
11642
  if (v == null) return void 0;
11353
11643
  if (typeof v === "number") return `var(--space-${String(v).replace(".", "-")})`;
11354
11644
  return v;
11355
11645
  }
11356
- function safeHref8(url) {
11646
+ function safeHref9(url) {
11357
11647
  if (url == null) return void 0;
11358
11648
  const s = String(url).replace(/[\x00-\x20]+/g, "").toLowerCase();
11359
11649
  return s.startsWith("javascript:") || s.startsWith("data:") || s.startsWith("vbscript:") ? void 0 : url;
11360
11650
  }
11361
- function Stack({
11651
+ var Stack = React36__default.forwardRef(function Stack2({
11362
11652
  as: Tag2 = "div",
11363
11653
  direction = "column",
11364
11654
  gap = 4,
@@ -11378,12 +11668,13 @@ function Stack({
11378
11668
  style,
11379
11669
  children,
11380
11670
  ...rest
11381
- }) {
11382
- if (Tag2 === "a" && rest.href != null) rest.href = safeHref8(rest.href);
11383
- const kids = divider != null ? React25__default.Children.toArray(children).flatMap((child, i, arr) => i < arr.length - 1 ? [child, /* @__PURE__ */ jsx(React25__default.Fragment, { children: divider }, `twc-stack-div-${i}`)] : [child]) : children;
11671
+ }, ref) {
11672
+ if (Tag2 === "a" && rest.href != null) rest.href = safeHref9(rest.href);
11673
+ const kids = divider != null ? React36__default.Children.toArray(children).flatMap((child, i, arr) => i < arr.length - 1 ? [child, /* @__PURE__ */ jsx(React36__default.Fragment, { children: divider }, `twc-stack-div-${i}`)] : [child]) : children;
11384
11674
  return /* @__PURE__ */ jsx(
11385
11675
  Tag2,
11386
11676
  {
11677
+ ref,
11387
11678
  className: `twc-stack ${className}`.trim(),
11388
11679
  style: {
11389
11680
  display: inline ? "inline-flex" : "flex",
@@ -11403,7 +11694,8 @@ function Stack({
11403
11694
  children: kids
11404
11695
  }
11405
11696
  );
11406
- }
11697
+ });
11698
+ Stack.displayName = "Stack";
11407
11699
  var CODE_CSS = `
11408
11700
  .twc-code {
11409
11701
  font-family: var(--font-mono); font-size: 0.875em;
@@ -11427,7 +11719,7 @@ var CODE_CSS = `
11427
11719
  .twc-code__copy:focus-visible { outline: none; box-shadow: var(--ring); }
11428
11720
  .twc-code__copy svg { width: 15px; height: 15px; display: block; }
11429
11721
  `;
11430
- function safeHref9(url) {
11722
+ function safeHref10(url) {
11431
11723
  if (url == null) return void 0;
11432
11724
  const s = String(url).replace(/[\x00-\x20]+/g, "").toLowerCase();
11433
11725
  return s.startsWith("javascript:") || s.startsWith("data:") || s.startsWith("vbscript:") ? void 0 : url;
@@ -11444,11 +11736,11 @@ function Code({
11444
11736
  }) {
11445
11737
  const __twcStyles = useScopedStyles("twc-code-styles", CODE_CSS);
11446
11738
  const Tag2 = as ?? (block ? "pre" : "code");
11447
- if (Tag2 === "a" && rest.href != null) rest.href = safeHref9(rest.href);
11448
- const rootRef = React25__default.useRef(null);
11449
- const [copied, setCopied] = React25__default.useState(false);
11450
- const timerRef = React25__default.useRef(null);
11451
- React25__default.useEffect(() => () => clearTimeout(timerRef.current), []);
11739
+ if (Tag2 === "a" && rest.href != null) rest.href = safeHref10(rest.href);
11740
+ const rootRef = React36__default.useRef(null);
11741
+ const [copied, setCopied] = React36__default.useState(false);
11742
+ const timerRef = React36__default.useRef(null);
11743
+ React36__default.useEffect(() => () => clearTimeout(timerRef.current), []);
11452
11744
  const doCopy = () => {
11453
11745
  if (typeof navigator === "undefined" || !navigator.clipboard) return;
11454
11746
  const text = typeof children === "string" ? children : rootRef.current?.textContent ?? "";
@@ -11469,12 +11761,12 @@ function Code({
11469
11761
  ] });
11470
11762
  }
11471
11763
  var LEVEL_SIZE = { 1: "4xl", 2: "2xl", 3: "xl", 4: "lg", 5: "base", 6: "sm" };
11472
- function safeHref10(url) {
11764
+ function safeHref11(url) {
11473
11765
  if (url == null) return void 0;
11474
11766
  const s = String(url).replace(/[\x00-\x20]+/g, "").toLowerCase();
11475
11767
  return s.startsWith("javascript:") || s.startsWith("data:") || s.startsWith("vbscript:") ? void 0 : url;
11476
11768
  }
11477
- function Heading({
11769
+ var Heading = React36__default.forwardRef(function Heading2({
11478
11770
  as,
11479
11771
  level = 2,
11480
11772
  size,
@@ -11486,13 +11778,14 @@ function Heading({
11486
11778
  style,
11487
11779
  children,
11488
11780
  ...rest
11489
- }) {
11781
+ }, ref) {
11490
11782
  const Tag2 = as || `h${level}`;
11491
11783
  const sz = size || (display ? "display" : LEVEL_SIZE[level]) || "2xl";
11492
- if (Tag2 === "a" && rest.href != null) rest.href = safeHref10(rest.href);
11784
+ if (Tag2 === "a" && rest.href != null) rest.href = safeHref11(rest.href);
11493
11785
  return /* @__PURE__ */ jsx(
11494
11786
  Tag2,
11495
11787
  {
11788
+ ref,
11496
11789
  className: `twc-heading ${className}`.trim(),
11497
11790
  style: {
11498
11791
  margin: 0,
@@ -11510,7 +11803,8 @@ function Heading({
11510
11803
  children
11511
11804
  }
11512
11805
  );
11513
- }
11806
+ });
11807
+ Heading.displayName = "Heading";
11514
11808
  var TONE = {
11515
11809
  default: "--color-text",
11516
11810
  muted: "--color-text-muted",
@@ -11526,12 +11820,12 @@ var TONE = {
11526
11820
  // Adopt the surrounding color (e.g. inside a solid Button/Badge/Alert or a link).
11527
11821
  inherit: "inherit"
11528
11822
  };
11529
- function safeHref11(url) {
11823
+ function safeHref12(url) {
11530
11824
  if (url == null) return void 0;
11531
11825
  const s = String(url).replace(/[\x00-\x20]+/g, "").toLowerCase();
11532
11826
  return s.startsWith("javascript:") || s.startsWith("data:") || s.startsWith("vbscript:") ? void 0 : url;
11533
11827
  }
11534
- function Text({
11828
+ var Text = React36__default.forwardRef(function Text2({
11535
11829
  as: Tag2 = "p",
11536
11830
  size = "base",
11537
11831
  tone = "default",
@@ -11543,12 +11837,13 @@ function Text({
11543
11837
  style,
11544
11838
  children,
11545
11839
  ...rest
11546
- }) {
11547
- if (Tag2 === "a" && rest.href != null) rest.href = safeHref11(rest.href);
11840
+ }, ref) {
11841
+ if (Tag2 === "a" && rest.href != null) rest.href = safeHref12(rest.href);
11548
11842
  const toneToken = TONE[tone] || TONE.default;
11549
11843
  return /* @__PURE__ */ jsx(
11550
11844
  Tag2,
11551
11845
  {
11846
+ ref,
11552
11847
  className: `twc-text ${className}`.trim(),
11553
11848
  style: {
11554
11849
  margin: 0,
@@ -11565,47 +11860,48 @@ function Text({
11565
11860
  children
11566
11861
  }
11567
11862
  );
11568
- }
11863
+ });
11864
+ Text.displayName = "Text";
11569
11865
  var canUseDOM2 = typeof window !== "undefined" && typeof document !== "undefined";
11570
- var useIsomorphicLayoutEffect = canUseDOM2 ? React25__default.useLayoutEffect : React25__default.useEffect;
11866
+ var useIsomorphicLayoutEffect = canUseDOM2 ? React36__default.useLayoutEffect : React36__default.useEffect;
11571
11867
  function useMounted() {
11572
- const [mounted, setMounted] = React25__default.useState(false);
11573
- React25__default.useEffect(() => {
11868
+ const [mounted, setMounted] = React36__default.useState(false);
11869
+ React36__default.useEffect(() => {
11574
11870
  setMounted(true);
11575
11871
  }, []);
11576
11872
  return mounted;
11577
11873
  }
11578
11874
  function usePrevious(value) {
11579
- const ref = React25__default.useRef(void 0);
11580
- React25__default.useEffect(() => {
11875
+ const ref = React36__default.useRef(void 0);
11876
+ React36__default.useEffect(() => {
11581
11877
  ref.current = value;
11582
11878
  }, [value]);
11583
11879
  return ref.current;
11584
11880
  }
11585
11881
  function useToggle(initial = false) {
11586
- const [on, setOn] = React25__default.useState(initial);
11587
- const toggle = React25__default.useCallback((next) => {
11882
+ const [on, setOn] = React36__default.useState(initial);
11883
+ const toggle = React36__default.useCallback((next) => {
11588
11884
  setOn((prev) => typeof next === "boolean" ? next : !prev);
11589
11885
  }, []);
11590
11886
  return [on, toggle, setOn];
11591
11887
  }
11592
11888
  function useDisclosure(initial = false) {
11593
- const [open, setOpen] = React25__default.useState(initial);
11594
- const onOpen = React25__default.useCallback(() => setOpen(true), []);
11595
- const onClose = React25__default.useCallback(() => setOpen(false), []);
11596
- const onToggle = React25__default.useCallback(() => setOpen((p) => !p), []);
11889
+ const [open, setOpen] = React36__default.useState(initial);
11890
+ const onOpen = React36__default.useCallback(() => setOpen(true), []);
11891
+ const onClose = React36__default.useCallback(() => setOpen(false), []);
11892
+ const onToggle = React36__default.useCallback(() => setOpen((p) => !p), []);
11597
11893
  return { open, onOpen, onClose, onToggle, setOpen };
11598
11894
  }
11599
11895
  function useControllableState({ value, defaultValue, onChange } = {}) {
11600
11896
  const isControlled = value !== void 0;
11601
- const [uncontrolled, setUncontrolled] = React25__default.useState(defaultValue);
11897
+ const [uncontrolled, setUncontrolled] = React36__default.useState(defaultValue);
11602
11898
  const current = isControlled ? value : uncontrolled;
11603
- const ref = React25__default.useRef({ current, isControlled, onChange });
11899
+ const ref = React36__default.useRef({ current, isControlled, onChange });
11604
11900
  useIsomorphicLayoutEffect(() => {
11605
11901
  ref.current = { current, isControlled, onChange };
11606
11902
  });
11607
- const wasControlled = React25__default.useRef(isControlled);
11608
- React25__default.useEffect(() => {
11903
+ const wasControlled = React36__default.useRef(isControlled);
11904
+ React36__default.useEffect(() => {
11609
11905
  if (wasControlled.current !== isControlled) {
11610
11906
  warnOnce(
11611
11907
  "useControllableState:switch",
@@ -11614,7 +11910,7 @@ function useControllableState({ value, defaultValue, onChange } = {}) {
11614
11910
  wasControlled.current = isControlled;
11615
11911
  }
11616
11912
  });
11617
- const setValue = React25__default.useCallback((next) => {
11913
+ const setValue = React36__default.useCallback((next) => {
11618
11914
  const { current: cur, isControlled: ctrl, onChange: cb } = ref.current;
11619
11915
  const resolved = typeof next === "function" ? next(cur) : next;
11620
11916
  if (resolved === cur) return;
@@ -11625,7 +11921,7 @@ function useControllableState({ value, defaultValue, onChange } = {}) {
11625
11921
  }
11626
11922
  function useMediaQuery(query, { defaultValue = false, initializeWithValue = false } = {}) {
11627
11923
  const get = () => canUseDOM2 ? window.matchMedia(query).matches : defaultValue;
11628
- const [matches3, setMatches] = React25__default.useState(initializeWithValue ? get : defaultValue);
11924
+ const [matches3, setMatches] = React36__default.useState(initializeWithValue ? get : defaultValue);
11629
11925
  useIsomorphicLayoutEffect(() => {
11630
11926
  if (!canUseDOM2) return void 0;
11631
11927
  const mql = window.matchMedia(query);
@@ -11641,7 +11937,7 @@ function usePrefersReducedMotion() {
11641
11937
  }
11642
11938
  function useColorScheme({ storageKey = "twico-theme", attribute = "class", element, disableTransitionsOnChange = true } = {}) {
11643
11939
  const getTarget = () => element || (canUseDOM2 ? document.documentElement : null);
11644
- const firstApply = React25__default.useRef(true);
11940
+ const firstApply = React36__default.useRef(true);
11645
11941
  const read = () => {
11646
11942
  if (!canUseDOM2) return "light";
11647
11943
  try {
@@ -11651,8 +11947,8 @@ function useColorScheme({ storageKey = "twico-theme", attribute = "class", eleme
11651
11947
  }
11652
11948
  return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
11653
11949
  };
11654
- const [theme, setThemeState] = React25__default.useState(read);
11655
- const apply = React25__default.useCallback(
11950
+ const [theme, setThemeState] = React36__default.useState(read);
11951
+ const apply = React36__default.useCallback(
11656
11952
  (t) => {
11657
11953
  const target = getTarget();
11658
11954
  if (!target) return;
@@ -11678,11 +11974,11 @@ function useColorScheme({ storageKey = "twico-theme", attribute = "class", eleme
11678
11974
  useIsomorphicLayoutEffect(() => {
11679
11975
  apply(theme);
11680
11976
  }, [theme, apply]);
11681
- const themeRef = React25__default.useRef(theme);
11977
+ const themeRef = React36__default.useRef(theme);
11682
11978
  useIsomorphicLayoutEffect(() => {
11683
11979
  themeRef.current = theme;
11684
11980
  }, [theme]);
11685
- const setTheme = React25__default.useCallback(
11981
+ const setTheme = React36__default.useCallback(
11686
11982
  (t) => {
11687
11983
  setThemeState(t);
11688
11984
  try {
@@ -11693,10 +11989,10 @@ function useColorScheme({ storageKey = "twico-theme", attribute = "class", eleme
11693
11989
  },
11694
11990
  [storageKey]
11695
11991
  );
11696
- const toggle = React25__default.useCallback(() => {
11992
+ const toggle = React36__default.useCallback(() => {
11697
11993
  setTheme(themeRef.current === "dark" ? "light" : "dark");
11698
11994
  }, [setTheme]);
11699
- React25__default.useEffect(() => {
11995
+ React36__default.useEffect(() => {
11700
11996
  if (!canUseDOM2) return void 0;
11701
11997
  const sync = () => setThemeState(read());
11702
11998
  const onStorage = (e) => {
@@ -11712,14 +12008,14 @@ function useColorScheme({ storageKey = "twico-theme", attribute = "class", eleme
11712
12008
  return { theme, setTheme, toggle, isDark: theme === "dark" };
11713
12009
  }
11714
12010
  function useEventListener(eventName, handler, element, options) {
11715
- const saved = React25__default.useRef(handler);
12011
+ const saved = React36__default.useRef(handler);
11716
12012
  useIsomorphicLayoutEffect(() => {
11717
12013
  saved.current = handler;
11718
12014
  }, [handler]);
11719
12015
  const capture = typeof options === "boolean" ? options : options && options.capture;
11720
12016
  const passive = typeof options === "object" && options ? options.passive : void 0;
11721
12017
  const once = typeof options === "object" && options ? options.once : void 0;
11722
- React25__default.useEffect(() => {
12018
+ React36__default.useEffect(() => {
11723
12019
  const target = element && element.current || element || (canUseDOM2 ? window : null);
11724
12020
  if (!target || !target.addEventListener) return void 0;
11725
12021
  const opts = typeof options === "boolean" ? options : { capture, passive, once };
@@ -11729,11 +12025,11 @@ function useEventListener(eventName, handler, element, options) {
11729
12025
  }, [eventName, element, capture, passive, once]);
11730
12026
  }
11731
12027
  function useClickOutside(ref, handler, events = ["mousedown", "touchstart"]) {
11732
- const saved = React25__default.useRef(handler);
12028
+ const saved = React36__default.useRef(handler);
11733
12029
  useIsomorphicLayoutEffect(() => {
11734
12030
  saved.current = handler;
11735
12031
  }, [handler]);
11736
- React25__default.useEffect(() => {
12032
+ React36__default.useEffect(() => {
11737
12033
  if (!canUseDOM2) return void 0;
11738
12034
  const listener = (e) => {
11739
12035
  const el = ref && ref.current;
@@ -11768,8 +12064,8 @@ function useLocalStorage(key, initialValue) {
11768
12064
  return initialValue;
11769
12065
  }
11770
12066
  };
11771
- const [stored, setStored] = React25__default.useState(read);
11772
- const setValue = React25__default.useCallback(
12067
+ const [stored, setStored] = React36__default.useState(read);
12068
+ const setValue = React36__default.useCallback(
11773
12069
  (value) => {
11774
12070
  setStored((prev) => {
11775
12071
  const next = typeof value === "function" ? value(prev) : value;
@@ -11785,8 +12081,8 @@ function useLocalStorage(key, initialValue) {
11785
12081
  return [stored, setValue];
11786
12082
  }
11787
12083
  function useCopyToClipboard(timeout = 1500) {
11788
- const [copied, setCopied] = React25__default.useState(false);
11789
- const copy = React25__default.useCallback(async (text) => {
12084
+ const [copied, setCopied] = React36__default.useState(false);
12085
+ const copy = React36__default.useCallback(async (text) => {
11790
12086
  if (!canUseDOM2 || !navigator.clipboard) {
11791
12087
  setCopied(false);
11792
12088
  return false;
@@ -11800,7 +12096,7 @@ function useCopyToClipboard(timeout = 1500) {
11800
12096
  return false;
11801
12097
  }
11802
12098
  }, []);
11803
- React25__default.useEffect(() => {
12099
+ React36__default.useEffect(() => {
11804
12100
  if (!copied) return void 0;
11805
12101
  const t = setTimeout(() => setCopied(false), timeout);
11806
12102
  return () => clearTimeout(t);
@@ -11808,23 +12104,23 @@ function useCopyToClipboard(timeout = 1500) {
11808
12104
  return { copied, copy };
11809
12105
  }
11810
12106
  function useDebouncedValue(value, delay = 200) {
11811
- const [debounced, setDebounced] = React25__default.useState(value);
11812
- React25__default.useEffect(() => {
12107
+ const [debounced, setDebounced] = React36__default.useState(value);
12108
+ React36__default.useEffect(() => {
11813
12109
  const t = setTimeout(() => setDebounced(value), delay);
11814
12110
  return () => clearTimeout(t);
11815
12111
  }, [value, delay]);
11816
12112
  return debounced;
11817
12113
  }
11818
12114
  function useDebouncedCallback(callback, delay = 200) {
11819
- const saved = React25__default.useRef(callback);
11820
- const timer = React25__default.useRef(null);
12115
+ const saved = React36__default.useRef(callback);
12116
+ const timer = React36__default.useRef(null);
11821
12117
  useIsomorphicLayoutEffect(() => {
11822
12118
  saved.current = callback;
11823
12119
  }, [callback]);
11824
- React25__default.useEffect(() => () => {
12120
+ React36__default.useEffect(() => () => {
11825
12121
  if (timer.current) clearTimeout(timer.current);
11826
12122
  }, []);
11827
- return React25__default.useCallback(
12123
+ return React36__default.useCallback(
11828
12124
  (...args) => {
11829
12125
  if (timer.current) clearTimeout(timer.current);
11830
12126
  timer.current = setTimeout(() => saved.current(...args), delay);
@@ -11833,33 +12129,33 @@ function useDebouncedCallback(callback, delay = 200) {
11833
12129
  );
11834
12130
  }
11835
12131
  function useInterval(callback, delay) {
11836
- const saved = React25__default.useRef(callback);
12132
+ const saved = React36__default.useRef(callback);
11837
12133
  useIsomorphicLayoutEffect(() => {
11838
12134
  saved.current = callback;
11839
12135
  }, [callback]);
11840
- React25__default.useEffect(() => {
12136
+ React36__default.useEffect(() => {
11841
12137
  if (delay == null) return void 0;
11842
12138
  const id = setInterval(() => saved.current(), delay);
11843
12139
  return () => clearInterval(id);
11844
12140
  }, [delay]);
11845
12141
  }
11846
12142
  function useTimeout(callback, delay) {
11847
- const saved = React25__default.useRef(callback);
12143
+ const saved = React36__default.useRef(callback);
11848
12144
  useIsomorphicLayoutEffect(() => {
11849
12145
  saved.current = callback;
11850
12146
  }, [callback]);
11851
- React25__default.useEffect(() => {
12147
+ React36__default.useEffect(() => {
11852
12148
  if (delay == null) return void 0;
11853
12149
  const id = setTimeout(() => saved.current(), delay);
11854
12150
  return () => clearTimeout(id);
11855
12151
  }, [delay]);
11856
12152
  }
11857
12153
  function useWindowSize() {
11858
- const [size, setSize] = React25__default.useState(() => ({
12154
+ const [size, setSize] = React36__default.useState(() => ({
11859
12155
  width: canUseDOM2 ? window.innerWidth : 0,
11860
12156
  height: canUseDOM2 ? window.innerHeight : 0
11861
12157
  }));
11862
- React25__default.useEffect(() => {
12158
+ React36__default.useEffect(() => {
11863
12159
  if (!canUseDOM2) return void 0;
11864
12160
  const onResize = () => setSize({ width: window.innerWidth, height: window.innerHeight });
11865
12161
  onResize();
@@ -11869,8 +12165,8 @@ function useWindowSize() {
11869
12165
  return size;
11870
12166
  }
11871
12167
  function useHover(ref) {
11872
- const [hovered, setHovered] = React25__default.useState(false);
11873
- React25__default.useEffect(() => {
12168
+ const [hovered, setHovered] = React36__default.useState(false);
12169
+ React36__default.useEffect(() => {
11874
12170
  const el = ref && ref.current;
11875
12171
  if (!el) return void 0;
11876
12172
  const on = () => setHovered(true);
@@ -11886,8 +12182,8 @@ function useHover(ref) {
11886
12182
  }
11887
12183
  function useIntersectionObserver(ref, options = {}) {
11888
12184
  const { root = null, rootMargin = "0px", threshold = 0 } = options;
11889
- const [entry, setEntry] = React25__default.useState(null);
11890
- React25__default.useEffect(() => {
12185
+ const [entry, setEntry] = React36__default.useState(null);
12186
+ React36__default.useEffect(() => {
11891
12187
  const el = ref && ref.current;
11892
12188
  if (!canUseDOM2 || !el || typeof IntersectionObserver === "undefined") return void 0;
11893
12189
  const obs = new IntersectionObserver(([e]) => setEntry(e), { root, rootMargin, threshold });
@@ -11897,13 +12193,13 @@ function useIntersectionObserver(ref, options = {}) {
11897
12193
  return entry;
11898
12194
  }
11899
12195
  function useId(prefix = "twc") {
11900
- const raw = React25__default.useId();
12196
+ const raw = React36__default.useId();
11901
12197
  return prefix ? `${prefix}-${raw.replace(/:/g, "")}` : raw;
11902
12198
  }
11903
12199
  var useFocusTrap2 = useFocusTrap;
11904
12200
  var usePortal2 = usePortal;
11905
12201
  var useScrollLock2 = useScrollLock;
11906
12202
 
11907
- export { Accordion, Alert, AppShell, Avatar, AvatarMenu, Badge, Box, Breadcrumb, Button, Card, Carousel, Chart, Checkbox, Code, ColorPicker, Combobox, CommandPalette, Container, Currency, CurrencyField, Datatable, DatePicker, DateRangePicker, Dialog, Divider, Drawer, EmptyState, Field, FileUpload, Grid, Heading, IconButton, Input, Kanban, List, Menu, MultiSelect, Navbar, Pagination, Popover, Progress, Radio, RadioGroup, Rating, Select, Sidebar, Skeleton, Slider, Spinner, Stack, Stat, Stepper, Switch, Table, Tabs, Tag, Text, Textarea, Timeline, Toast, ToastProvider, ToastViewport, Tooltip, TreeView, runDatatableQuery, useClickOutside, useColorScheme, useControllableState, useCopyToClipboard, useDebouncedCallback, useDebouncedValue, useDisclosure, useEventListener, useFocusTrap2 as useFocusTrap, useHover, useId, useIntersectionObserver, useInterval, useIsomorphicLayoutEffect, useKeyPress, useLocalStorage, useMediaQuery, useMounted, usePortal2 as usePortal, usePrefersReducedMotion, usePrevious, useScrollLock2 as useScrollLock, useTimeout, useToast, useToggle, useWindowSize };
12203
+ export { Accordion, Alert, Anchor, AppShell, Avatar, AvatarMenu, Badge, Box, Breadcrumb, Button, Card, Carousel, Chart, Checkbox, Code, ColorPicker, ColorSchemeScript, Combobox, CommandPalette, Container, Currency, CurrencyField, Datatable, DatePicker, DateRangePicker, Dialog, Divider, Drawer, EmptyState, Field, FileUpload, Form, Grid, Heading, IconButton, Image, Input, Kanban, Kbd, Label, List, Menu, MultiSelect, Navbar, Pagination, Popover, Portal, Pre, Progress, Radio, RadioGroup, Rating, Select, Sidebar, Skeleton, Slider, Spinner, Stack, Stat, Stepper, Switch, Table, Tabs, Tag, Text, Textarea, ThemeProvider, Timeline, Toast, ToastProvider, ToastViewport, Tooltip, TreeView, TwicoProvider, VisuallyHidden, createTheme, getColorSchemeScript, runDatatableQuery, useClickOutside, useColorScheme, useControllableState, useCopyToClipboard, useDebouncedCallback, useDebouncedValue, useDisclosure, useEventListener, useFocusTrap2 as useFocusTrap, useHover, useId, useIntersectionObserver, useInterval, useIsomorphicLayoutEffect, useKeyPress, useLocalStorage, useMediaQuery, useMounted, usePortal2 as usePortal, usePrefersReducedMotion, usePrevious, useScrollLock2 as useScrollLock, useTimeout, useToast, useToggle, useWindowSize };
11908
12204
  //# sourceMappingURL=index.mjs.map
11909
12205
  //# sourceMappingURL=index.mjs.map