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/CHANGELOG.md +251 -0
- package/README.md +4 -0
- package/dist/index.cjs +939 -630
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +145 -7
- package/dist/index.d.ts +145 -7
- package/dist/index.mjs +927 -631
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -2
package/dist/index.mjs
CHANGED
|
@@ -1,22 +1,335 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import * as
|
|
3
|
-
import
|
|
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/
|
|
8
|
-
var SUPPORTS_STYLE_HOIST = parseInt(String(
|
|
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
|
-
|
|
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 ?
|
|
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 =
|
|
60
|
-
const [internal, setInternal] =
|
|
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 =
|
|
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
|
|
422
|
+
const Heading3 = `h${lvl}`;
|
|
110
423
|
return /* @__PURE__ */ jsxs("div", { className: "twc-accordion__item", children: [
|
|
111
|
-
/* @__PURE__ */ jsx(
|
|
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] =
|
|
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
|
|
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] =
|
|
327
|
-
const [render, setRender] =
|
|
328
|
-
const [pos, setPos] =
|
|
329
|
-
const [active, setActive] =
|
|
330
|
-
const wrapRef =
|
|
331
|
-
const menuRef =
|
|
332
|
-
const typeBufRef =
|
|
333
|
-
const typeTimerRef =
|
|
334
|
-
const menuId =
|
|
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 =
|
|
651
|
+
const openRef = React36__default.useRef(open);
|
|
339
652
|
openRef.current = open;
|
|
340
|
-
const controlledRef =
|
|
653
|
+
const controlledRef = React36__default.useRef(controlled);
|
|
341
654
|
controlledRef.current = controlled;
|
|
342
|
-
const onOpenChangeRef =
|
|
655
|
+
const onOpenChangeRef = React36__default.useRef(onOpenChange);
|
|
343
656
|
onOpenChangeRef.current = onOpenChange;
|
|
344
|
-
const setOpen =
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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 ?
|
|
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 =
|
|
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
|
|
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] =
|
|
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(
|
|
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
|
-
) :
|
|
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
|
|
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] =
|
|
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 :
|
|
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 =
|
|
1315
|
+
const slides = React36__default.Children.toArray(children);
|
|
1003
1316
|
const count = slides.length;
|
|
1004
|
-
const [internal, setInternal] =
|
|
1317
|
+
const [internal, setInternal] = React36__default.useState(defaultIndex);
|
|
1005
1318
|
const index = indexProp !== void 0 ? indexProp : internal;
|
|
1006
|
-
const [paused, setPaused] =
|
|
1007
|
-
const [userPaused, setUserPaused] =
|
|
1008
|
-
const [prefersReduced, setPrefersReduced] =
|
|
1009
|
-
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
1593
|
+
const ref = React36__default.useRef(null);
|
|
1281
1594
|
const mixed = indeterminate && !checked;
|
|
1282
|
-
|
|
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] =
|
|
1738
|
+
const [internal, setInternal] = React36__default.useState(defaultValue);
|
|
1426
1739
|
const hex = (value !== void 0 ? value : internal) || "#000000";
|
|
1427
|
-
const lastValidRef =
|
|
1740
|
+
const lastValidRef = React36__default.useRef(hex);
|
|
1428
1741
|
if (/^#[0-9a-f]{6}$/i.test(hex)) lastValidRef.current = hex;
|
|
1429
|
-
const [open, setOpen] =
|
|
1430
|
-
const [hsv, setHsv] =
|
|
1431
|
-
const [coords, setCoords] =
|
|
1432
|
-
const wrapRef =
|
|
1433
|
-
const triggerRef =
|
|
1434
|
-
const popRef =
|
|
1435
|
-
const areaRef =
|
|
1436
|
-
const hueRef =
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
1773
|
+
const labelId = React36__default.useId();
|
|
1461
1774
|
const descId = `${labelId}-desc`;
|
|
1462
1775
|
const invalid = Boolean(error);
|
|
1463
|
-
|
|
1776
|
+
React36__default.useEffect(() => {
|
|
1464
1777
|
if (disabled) setOpen(false);
|
|
1465
1778
|
}, [disabled]);
|
|
1466
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
1819
|
-
const flat =
|
|
1820
|
-
const autoId =
|
|
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] =
|
|
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] =
|
|
1826
|
-
const [query, setQuery] =
|
|
1827
|
-
const [active, setActive] =
|
|
1828
|
-
const [coords, setCoords] =
|
|
1829
|
-
const wrapRef =
|
|
1830
|
-
const controlRef =
|
|
1831
|
-
const inputRef =
|
|
1832
|
-
const popRef =
|
|
1833
|
-
const listRef =
|
|
1834
|
-
const activeRef =
|
|
1835
|
-
const fGroups =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2188
|
+
React36__default.useEffect(() => {
|
|
1886
2189
|
setActive(0);
|
|
1887
2190
|
}, [query]);
|
|
1888
|
-
|
|
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
|
-
|
|
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(
|
|
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] =
|
|
2226
|
-
const [active, setActive] =
|
|
2227
|
-
const inputRef =
|
|
2228
|
-
const listRef =
|
|
2229
|
-
const paletteRef =
|
|
2230
|
-
const baseId =
|
|
2231
|
-
const [mounted, setMounted] =
|
|
2232
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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] =
|
|
2689
|
+
const [internal, setInternal] = React36__default.useState(() => clampPrecision(String(defaultValue ?? ""), prec));
|
|
2476
2690
|
const shown = controlled ? clampPrecision(String(value ?? ""), prec) : internal;
|
|
2477
|
-
|
|
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 =
|
|
2672
|
-
const bufferTimerRef =
|
|
2673
|
-
const groups =
|
|
2674
|
-
const flat =
|
|
2675
|
-
const autoId =
|
|
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] =
|
|
2891
|
+
const [internal, setInternal] = React36__default.useState(defaultValue);
|
|
2678
2892
|
const current = value !== void 0 ? value : internal;
|
|
2679
|
-
const [open, setOpen] =
|
|
2680
|
-
const [render, setRender] =
|
|
2681
|
-
const [active, setActive] =
|
|
2682
|
-
const [coords, setCoords] =
|
|
2683
|
-
const [query, setQuery] =
|
|
2684
|
-
const wrapRef =
|
|
2685
|
-
const triggerRef =
|
|
2686
|
-
const popRef =
|
|
2687
|
-
const listRef =
|
|
2688
|
-
const activeRef =
|
|
2689
|
-
const searchRef =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2963
|
+
React36__default.useEffect(() => {
|
|
2750
2964
|
setActive(0);
|
|
2751
2965
|
}, [query]);
|
|
2752
|
-
|
|
2966
|
+
React36__default.useEffect(() => {
|
|
2753
2967
|
if (open) ensureVisible2(listRef.current, activeRef.current);
|
|
2754
2968
|
}, [active, open]);
|
|
2755
|
-
|
|
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 =
|
|
2764
|
-
|
|
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(
|
|
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 =
|
|
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] =
|
|
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] =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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] =
|
|
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] =
|
|
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 =
|
|
3445
|
-
const flat =
|
|
3446
|
-
const autoId =
|
|
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] =
|
|
3662
|
+
const [internal, setInternal] = React36__default.useState(defaultValue);
|
|
3449
3663
|
const selected = value !== void 0 ? value : internal;
|
|
3450
|
-
const [open, setOpen] =
|
|
3451
|
-
const [query, setQuery] =
|
|
3452
|
-
const [active, setActive] =
|
|
3453
|
-
const [coords, setCoords] =
|
|
3454
|
-
const wrapRef =
|
|
3455
|
-
const controlRef =
|
|
3456
|
-
const inputRef =
|
|
3457
|
-
const popRef =
|
|
3458
|
-
const listRef =
|
|
3459
|
-
const activeRef =
|
|
3460
|
-
const fGroups =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
3726
|
+
React36__default.useEffect(() => {
|
|
3513
3727
|
setActive(0);
|
|
3514
3728
|
}, [query]);
|
|
3515
|
-
|
|
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(
|
|
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] =
|
|
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] =
|
|
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 =
|
|
3880
|
-
const [show, setShow] =
|
|
3881
|
-
const [coords, setCoords] =
|
|
3882
|
-
const timer =
|
|
3883
|
-
const closeTimer =
|
|
3884
|
-
const wrapRef =
|
|
3885
|
-
const tipRef =
|
|
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
|
-
|
|
4113
|
+
React36__default.useEffect(() => () => {
|
|
3900
4114
|
clearTimeout(timer.current);
|
|
3901
4115
|
clearTimeout(closeTimer.current);
|
|
3902
4116
|
}, []);
|
|
3903
|
-
const place =
|
|
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
|
-
|
|
4140
|
+
React36__default.useEffect(() => {
|
|
3927
4141
|
place();
|
|
3928
4142
|
}, [place]);
|
|
3929
|
-
|
|
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
|
-
|
|
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 =
|
|
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] =
|
|
4557
|
-
const cfg =
|
|
4558
|
-
const place =
|
|
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 =
|
|
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 =
|
|
4788
|
+
const close = React36__default.useCallback(() => {
|
|
4575
4789
|
cfg.current = null;
|
|
4576
4790
|
setPos(null);
|
|
4577
4791
|
}, []);
|
|
4578
4792
|
const isOpen = pos != null;
|
|
4579
|
-
|
|
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 =
|
|
4817
|
+
const ref = React36__default.useRef(null);
|
|
4604
4818
|
const isSelect = col.editType === "select" || options && col.editType !== "text";
|
|
4605
|
-
|
|
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 =
|
|
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 =
|
|
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] =
|
|
4861
|
-
const [filters, setFilters] =
|
|
4862
|
-
const [hidden, setHidden] =
|
|
4863
|
-
const [showRowNum, setShowRowNum] =
|
|
4864
|
-
const [wrapped, setWrapped] =
|
|
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] =
|
|
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] =
|
|
4879
|
-
const [quick, setQuick] =
|
|
4880
|
-
const [selected, setSelected] =
|
|
4881
|
-
const [activeRow, setActiveRow] =
|
|
4882
|
-
const [activeCell, setActiveCell] =
|
|
4883
|
-
const [page, setPage] =
|
|
4884
|
-
const [rowsPerPage, setRowsPerPage] =
|
|
4885
|
-
const [colQuery, setColQuery] =
|
|
4886
|
-
const [widths, setWidths] =
|
|
4887
|
-
const [order, setOrder] =
|
|
4888
|
-
const [drag, setDrag] =
|
|
4889
|
-
const [aggOn, setAggOn] =
|
|
4890
|
-
const [focus, setFocus] =
|
|
4891
|
-
const gridRef =
|
|
4892
|
-
const [groupBy, setGroupBy] =
|
|
4893
|
-
const [collapsed, setCollapsed] =
|
|
4894
|
-
const [pinnedRows, setPinnedRows] =
|
|
4895
|
-
const [headH, setHeadH] =
|
|
4896
|
-
const theadRef =
|
|
4897
|
-
const [rowOrder, setRowOrder] =
|
|
4898
|
-
const [rowHeights, setRowHeights] =
|
|
4899
|
-
const [rowDrag, setRowDrag] =
|
|
4900
|
-
const [rowGrab, setRowGrab] =
|
|
4901
|
-
const [reorderMsg, setReorderMsg] =
|
|
4902
|
-
const rowFocusRef =
|
|
4903
|
-
const rootRef =
|
|
4904
|
-
const [compact, setCompact] =
|
|
4905
|
-
|
|
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 =
|
|
4919
|
-
const [scrollTop, setScrollTop] =
|
|
4920
|
-
const [viewportH, setViewportH] =
|
|
4921
|
-
const [pivotOn, setPivotOn] =
|
|
4922
|
-
const [aggConfig, setAggConfig] =
|
|
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] =
|
|
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
|
-
|
|
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
|
-
|
|
5158
|
+
React36__default.useEffect(() => {
|
|
4945
5159
|
setDensity(densityProp);
|
|
4946
5160
|
}, [densityProp]);
|
|
4947
|
-
|
|
5161
|
+
React36__default.useEffect(() => {
|
|
4948
5162
|
setAggOn(showAggregation);
|
|
4949
5163
|
}, [showAggregation]);
|
|
4950
5164
|
const rowGroupingKey = (rowGrouping || []).join("\0");
|
|
4951
|
-
const rowGroupingKeyRef =
|
|
4952
|
-
|
|
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] =
|
|
5172
|
+
const [colMenu, setColMenu] = React36__default.useState(null);
|
|
4959
5173
|
const [menuPos, openMenu, closeMenu] = useFloating();
|
|
4960
|
-
const [panel, setPanel] =
|
|
5174
|
+
const [panel, setPanel] = React36__default.useState(null);
|
|
4961
5175
|
const [panelPos, openPanel, closePanel] = useFloating();
|
|
4962
|
-
const [rowMenu, setRowMenu] =
|
|
5176
|
+
const [rowMenu, setRowMenu] = React36__default.useState(null);
|
|
4963
5177
|
const [rowMenuPos, openRowMenu, closeRowMenu] = useFloating();
|
|
4964
|
-
const [exportOpen, setExportOpen] =
|
|
5178
|
+
const [exportOpen, setExportOpen] = React36__default.useState(false);
|
|
4965
5179
|
const [exportPos, openExport, closeExport] = useFloating();
|
|
4966
|
-
const menuTriggerRef =
|
|
4967
|
-
const colMenuRef =
|
|
4968
|
-
const rowMenuRef =
|
|
4969
|
-
const exportMenuRef =
|
|
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
|
-
|
|
5222
|
+
React36__default.useEffect(() => {
|
|
5009
5223
|
if (colMenu) focusFirstItem(colMenuRef.current);
|
|
5010
5224
|
}, [colMenu]);
|
|
5011
|
-
|
|
5225
|
+
React36__default.useEffect(() => {
|
|
5012
5226
|
if (rowMenu) focusFirstItem(rowMenuRef.current);
|
|
5013
5227
|
}, [rowMenu]);
|
|
5014
|
-
|
|
5228
|
+
React36__default.useEffect(() => {
|
|
5015
5229
|
if (exportOpen) focusFirstItem(exportMenuRef.current);
|
|
5016
5230
|
}, [exportOpen]);
|
|
5017
|
-
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
5349
|
+
React36__default.useEffect(() => {
|
|
5136
5350
|
if (page > totalPages - 1) setPage(0);
|
|
5137
5351
|
}, [totalPages]);
|
|
5138
|
-
const activeGroupBy =
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
5338
|
-
const [measureTick, setMeasureTick] =
|
|
5339
|
-
const offsets =
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
5607
|
+
const onServerChangeRef = React36__default.useRef(onServerChange);
|
|
5394
5608
|
onServerChangeRef.current = onServerChange;
|
|
5395
|
-
|
|
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 =
|
|
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] =
|
|
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" && !
|
|
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
|
-
|
|
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 =
|
|
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] =
|
|
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 =
|
|
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] =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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] =
|
|
7535
|
+
const [internal, setInternal] = React36__default.useState(defaultValue);
|
|
7322
7536
|
const selected = value !== void 0 ? value : internal;
|
|
7323
|
-
const [open, setOpen] =
|
|
7324
|
-
const [view, setView] =
|
|
7325
|
-
const [mode, setMode] =
|
|
7326
|
-
const [focusDate, setFocusDate] =
|
|
7327
|
-
const [
|
|
7328
|
-
const
|
|
7329
|
-
const
|
|
7330
|
-
const
|
|
7331
|
-
const
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
7376
|
-
|
|
7377
|
-
|
|
7378
|
-
|
|
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
|
-
|
|
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: () =>
|
|
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] =
|
|
7880
|
+
const [internal, setInternal] = React36__default.useState(defaultValue);
|
|
7646
7881
|
const range = value !== void 0 ? value : internal;
|
|
7647
|
-
const [open, setOpen] =
|
|
7648
|
-
const [view, setView] =
|
|
7649
|
-
const [hover, setHover] =
|
|
7650
|
-
const [
|
|
7651
|
-
const
|
|
7652
|
-
const
|
|
7653
|
-
const
|
|
7654
|
-
const
|
|
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
|
-
|
|
7894
|
+
React36__default.useEffect(() => {
|
|
7658
7895
|
if (disabled) setOpen(false);
|
|
7659
7896
|
}, [disabled]);
|
|
7660
7897
|
const POP_W = 420;
|
|
7661
|
-
const place =
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
7724
|
-
const dows =
|
|
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 =
|
|
8196
|
+
const autoId = React36__default.useId();
|
|
7912
8197
|
const titleId = `${autoId}-title`;
|
|
7913
8198
|
const descId = `${autoId}-desc`;
|
|
7914
|
-
const dialogRef =
|
|
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] =
|
|
7918
|
-
|
|
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
|
-
|
|
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 =
|
|
8361
|
+
const autoId = React36__default.useId();
|
|
8077
8362
|
const titleId = `${autoId}-title`;
|
|
8078
8363
|
const descId = `${autoId}-desc`;
|
|
8079
|
-
const panelRef =
|
|
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] =
|
|
8083
|
-
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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] =
|
|
8564
|
+
const [internal, setInternal] = React36__default.useState(defaultValue);
|
|
8280
8565
|
const files = value !== void 0 ? value : internal;
|
|
8281
|
-
const [drag, setDrag] =
|
|
8282
|
-
const inputRef =
|
|
8283
|
-
const autoId =
|
|
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] =
|
|
8791
|
+
const [internal, setInternal] = React36__default.useState(cards ?? defaultCards ?? []);
|
|
8507
8792
|
const items = cards !== void 0 ? cards : internal;
|
|
8508
|
-
const [drag, setDrag] =
|
|
8509
|
-
const [overCol, setOverCol] =
|
|
8510
|
-
const [grab, setGrab] =
|
|
8511
|
-
const [announce, setAnnounce] =
|
|
8512
|
-
const rootRef =
|
|
8513
|
-
const focusIdRef =
|
|
8514
|
-
|
|
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
|
|
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 =
|
|
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
|
|
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:
|
|
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 =
|
|
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] =
|
|
8825
|
-
const [render, setRender] =
|
|
8826
|
-
const [pos, setPos] =
|
|
8827
|
-
const wrapRef =
|
|
8828
|
-
const popRef =
|
|
8829
|
-
const popId =
|
|
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 =
|
|
9117
|
+
const openRef = React36__default.useRef(open);
|
|
8833
9118
|
openRef.current = open;
|
|
8834
|
-
const controlledRef =
|
|
9119
|
+
const controlledRef = React36__default.useRef(controlled);
|
|
8835
9120
|
controlledRef.current = controlled;
|
|
8836
|
-
const onOpenChangeRef =
|
|
9121
|
+
const onOpenChangeRef = React36__default.useRef(onOpenChange);
|
|
8837
9122
|
onOpenChangeRef.current = onOpenChange;
|
|
8838
|
-
const setOpen =
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
9199
|
+
React36__default.useEffect(() => {
|
|
8915
9200
|
if (render && open) place();
|
|
8916
9201
|
}, [render, place]);
|
|
8917
|
-
const restoreRef =
|
|
8918
|
-
const needFocusRef =
|
|
8919
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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] =
|
|
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
|
-
)) :
|
|
9218
|
-
if (!
|
|
9502
|
+
)) : React36__default.Children.map(children, (child) => {
|
|
9503
|
+
if (!React36__default.isValidElement(child)) return child;
|
|
9219
9504
|
const v = child.props.value;
|
|
9220
|
-
return
|
|
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] =
|
|
9301
|
-
const [hover, setHover] =
|
|
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 =
|
|
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 =
|
|
9493
|
-
const panelRef =
|
|
9777
|
+
const navId = React36__default.useId();
|
|
9778
|
+
const panelRef = React36__default.useRef(null);
|
|
9494
9779
|
const renderPortal = usePortal();
|
|
9495
|
-
const [internal, setInternal] =
|
|
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] =
|
|
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] =
|
|
9509
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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(
|
|
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 =
|
|
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] =
|
|
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 =
|
|
9762
|
-
const [dragging, setDragging] =
|
|
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 =
|
|
9794
|
-
|
|
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] =
|
|
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 =
|
|
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 =
|
|
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] =
|
|
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 =
|
|
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] =
|
|
10699
|
+
const [internal, setInternal] = React36__default.useState(defaultValue ?? items[0]?.value);
|
|
10415
10700
|
const active = value ?? internal;
|
|
10416
|
-
const listRef =
|
|
10417
|
-
const [ind, setInd] =
|
|
10418
|
-
const baseId =
|
|
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 =
|
|
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
|
-
|
|
10716
|
+
React36__default.useEffect(() => {
|
|
10432
10717
|
updateIndicator();
|
|
10433
10718
|
}, [active, updateIndicator, items, orientation]);
|
|
10434
|
-
|
|
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" ?
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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] =
|
|
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 =
|
|
10824
|
-
|
|
11108
|
+
const onCloseRef = React36__default.useRef(onClose);
|
|
11109
|
+
React36__default.useEffect(() => {
|
|
10825
11110
|
onCloseRef.current = onClose;
|
|
10826
11111
|
}, [onClose]);
|
|
10827
|
-
const timer =
|
|
10828
|
-
const stop =
|
|
10829
|
-
const start =
|
|
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
|
-
|
|
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 ?
|
|
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 =
|
|
11171
|
+
var ToastContext = React36__default.createContext(null);
|
|
10887
11172
|
function useToast() {
|
|
10888
|
-
const ctx =
|
|
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] =
|
|
10894
|
-
const idRef =
|
|
10895
|
-
const limitRef =
|
|
10896
|
-
|
|
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 =
|
|
11184
|
+
const dismiss = React36__default.useCallback((id) => {
|
|
10900
11185
|
setToasts((s) => s.filter((t) => t.id !== id));
|
|
10901
11186
|
}, []);
|
|
10902
|
-
const clear =
|
|
10903
|
-
const api =
|
|
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 =
|
|
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] =
|
|
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] =
|
|
11319
|
+
const [selInternal, setSelInternal] = React36__default.useState(defaultSelectedId);
|
|
11035
11320
|
const selectedId = selectedProp !== void 0 ? selectedProp : selInternal;
|
|
11036
|
-
const [focusId, setFocusId] =
|
|
11037
|
-
const rowRefs =
|
|
11038
|
-
const taRef =
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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 =
|
|
11383
|
-
const kids = divider != null ?
|
|
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
|
|
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 =
|
|
11448
|
-
const rootRef =
|
|
11449
|
-
const [copied, setCopied] =
|
|
11450
|
-
const timerRef =
|
|
11451
|
-
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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 ?
|
|
11866
|
+
var useIsomorphicLayoutEffect = canUseDOM2 ? React36__default.useLayoutEffect : React36__default.useEffect;
|
|
11571
11867
|
function useMounted() {
|
|
11572
|
-
const [mounted, setMounted] =
|
|
11573
|
-
|
|
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 =
|
|
11580
|
-
|
|
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] =
|
|
11587
|
-
const toggle =
|
|
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] =
|
|
11594
|
-
const onOpen =
|
|
11595
|
-
const onClose =
|
|
11596
|
-
const onToggle =
|
|
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] =
|
|
11897
|
+
const [uncontrolled, setUncontrolled] = React36__default.useState(defaultValue);
|
|
11602
11898
|
const current = isControlled ? value : uncontrolled;
|
|
11603
|
-
const ref =
|
|
11899
|
+
const ref = React36__default.useRef({ current, isControlled, onChange });
|
|
11604
11900
|
useIsomorphicLayoutEffect(() => {
|
|
11605
11901
|
ref.current = { current, isControlled, onChange };
|
|
11606
11902
|
});
|
|
11607
|
-
const wasControlled =
|
|
11608
|
-
|
|
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 =
|
|
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] =
|
|
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 =
|
|
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] =
|
|
11655
|
-
const apply =
|
|
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 =
|
|
11977
|
+
const themeRef = React36__default.useRef(theme);
|
|
11682
11978
|
useIsomorphicLayoutEffect(() => {
|
|
11683
11979
|
themeRef.current = theme;
|
|
11684
11980
|
}, [theme]);
|
|
11685
|
-
const setTheme =
|
|
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 =
|
|
11992
|
+
const toggle = React36__default.useCallback(() => {
|
|
11697
11993
|
setTheme(themeRef.current === "dark" ? "light" : "dark");
|
|
11698
11994
|
}, [setTheme]);
|
|
11699
|
-
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
12028
|
+
const saved = React36__default.useRef(handler);
|
|
11733
12029
|
useIsomorphicLayoutEffect(() => {
|
|
11734
12030
|
saved.current = handler;
|
|
11735
12031
|
}, [handler]);
|
|
11736
|
-
|
|
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] =
|
|
11772
|
-
const setValue =
|
|
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] =
|
|
11789
|
-
const copy =
|
|
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
|
-
|
|
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] =
|
|
11812
|
-
|
|
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 =
|
|
11820
|
-
const timer =
|
|
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
|
-
|
|
12120
|
+
React36__default.useEffect(() => () => {
|
|
11825
12121
|
if (timer.current) clearTimeout(timer.current);
|
|
11826
12122
|
}, []);
|
|
11827
|
-
return
|
|
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 =
|
|
12132
|
+
const saved = React36__default.useRef(callback);
|
|
11837
12133
|
useIsomorphicLayoutEffect(() => {
|
|
11838
12134
|
saved.current = callback;
|
|
11839
12135
|
}, [callback]);
|
|
11840
|
-
|
|
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 =
|
|
12143
|
+
const saved = React36__default.useRef(callback);
|
|
11848
12144
|
useIsomorphicLayoutEffect(() => {
|
|
11849
12145
|
saved.current = callback;
|
|
11850
12146
|
}, [callback]);
|
|
11851
|
-
|
|
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] =
|
|
12154
|
+
const [size, setSize] = React36__default.useState(() => ({
|
|
11859
12155
|
width: canUseDOM2 ? window.innerWidth : 0,
|
|
11860
12156
|
height: canUseDOM2 ? window.innerHeight : 0
|
|
11861
12157
|
}));
|
|
11862
|
-
|
|
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] =
|
|
11873
|
-
|
|
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] =
|
|
11890
|
-
|
|
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 =
|
|
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
|