seam-react 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,501 @@
1
+ import { jsxs as N, jsx as a } from "react/jsx-runtime";
2
+ import { forwardRef as L, useId as S, useMemo as j, createContext as F, useContext as U, useRef as x, useSyncExternalStore as K, useEffect as z, useState as Q, useCallback as C } from "react";
3
+ import { createPortal as q } from "react-dom";
4
+ import { useControllableState as H, useEventCallback as Y, useLockBodyScroll as Z, useFocusTrap as ee } from "seam-hooks";
5
+ function y(...t) {
6
+ return t.filter(Boolean).join(" ");
7
+ }
8
+ const te = L(function({
9
+ variant: n = "primary",
10
+ size: i = "md",
11
+ loading: r = !1,
12
+ iconOnly: l = !1,
13
+ type: u = "button",
14
+ className: s,
15
+ children: h,
16
+ ...o
17
+ }, c) {
18
+ return /* @__PURE__ */ N(
19
+ "button",
20
+ {
21
+ ...o,
22
+ ref: c,
23
+ type: u,
24
+ className: y("uk-button", s),
25
+ "data-variant": n,
26
+ "data-size": i,
27
+ "data-loading": r ? "true" : void 0,
28
+ "data-icon-only": l ? "true" : void 0,
29
+ disabled: o.disabled || r,
30
+ "aria-busy": r || void 0,
31
+ children: [
32
+ r ? /* @__PURE__ */ a("span", { className: "uk-button__spinner", "aria-hidden": "true" }) : null,
33
+ h
34
+ ]
35
+ }
36
+ );
37
+ }), ke = L(function({
38
+ inputSize: n = "md",
39
+ invalid: i = !1,
40
+ className: r,
41
+ "aria-invalid": l,
42
+ ...u
43
+ }, s) {
44
+ return /* @__PURE__ */ a(
45
+ "input",
46
+ {
47
+ ...u,
48
+ ref: s,
49
+ className: y("uk-input", r),
50
+ "data-size": n,
51
+ "aria-invalid": i ? !0 : l
52
+ }
53
+ );
54
+ }), Te = L(function({
55
+ checked: n,
56
+ defaultChecked: i,
57
+ onCheckedChange: r,
58
+ disabled: l,
59
+ className: u,
60
+ children: s,
61
+ id: h,
62
+ ...o
63
+ }, c) {
64
+ const m = S(), g = h ?? m, [_, v] = H({
65
+ value: n,
66
+ defaultValue: i ?? !1,
67
+ onChange: r
68
+ });
69
+ return /* @__PURE__ */ N(
70
+ "label",
71
+ {
72
+ className: y("uk-switch", u),
73
+ "data-disabled": l ? "true" : void 0,
74
+ htmlFor: g,
75
+ children: [
76
+ /* @__PURE__ */ a(
77
+ "input",
78
+ {
79
+ ...o,
80
+ ref: c,
81
+ id: g,
82
+ type: "checkbox",
83
+ role: "switch",
84
+ className: "uk-switch__input",
85
+ checked: _,
86
+ disabled: l,
87
+ "aria-checked": _,
88
+ onChange: (p) => v(p.target.checked)
89
+ }
90
+ ),
91
+ /* @__PURE__ */ a("span", { className: "uk-switch__track", "aria-hidden": "true", children: /* @__PURE__ */ a("span", { className: "uk-switch__thumb" }) }),
92
+ s ? /* @__PURE__ */ a("span", { className: "uk-switch__label", children: s }) : null
93
+ ]
94
+ }
95
+ );
96
+ }), O = F(null);
97
+ function V(t) {
98
+ const n = U(O);
99
+ if (!n)
100
+ throw new Error(`<${t}> must be rendered inside <Tabs>`);
101
+ return n;
102
+ }
103
+ function W(t, n) {
104
+ return `${t}-tab-${encodeURIComponent(n)}`;
105
+ }
106
+ function X(t, n) {
107
+ return `${t}-panel-${encodeURIComponent(n)}`;
108
+ }
109
+ function ne({
110
+ value: t,
111
+ defaultValue: n,
112
+ onValueChange: i,
113
+ orientation: r = "horizontal",
114
+ className: l,
115
+ children: u
116
+ }) {
117
+ const s = S(), [h, o] = H({
118
+ value: t,
119
+ defaultValue: n ?? "",
120
+ onChange: i
121
+ }), c = j(
122
+ () => ({ baseId: s, value: h, setValue: o, orientation: r }),
123
+ [s, h, r, o]
124
+ );
125
+ return /* @__PURE__ */ a(O.Provider, { value: c, children: /* @__PURE__ */ a("div", { className: y("uk-tabs", l), "data-orientation": r, children: u }) });
126
+ }
127
+ const re = L(function({ className: n, onKeyDown: i, ...r }, l) {
128
+ const { orientation: u } = V("Tabs.List");
129
+ return /* @__PURE__ */ a(
130
+ "div",
131
+ {
132
+ ...r,
133
+ ref: l,
134
+ role: "tablist",
135
+ "aria-orientation": u,
136
+ tabIndex: -1,
137
+ className: y("uk-tabs__list", n),
138
+ onKeyDown: (s) => {
139
+ if (i?.(s), s.defaultPrevented)
140
+ return;
141
+ const o = s.target?.closest('[role="tab"]');
142
+ if (!o || o.hasAttribute("disabled"))
143
+ return;
144
+ const c = Array.from(
145
+ s.currentTarget.querySelectorAll(
146
+ '[role="tab"]:not([disabled])'
147
+ )
148
+ ), m = c.indexOf(o);
149
+ if (m === -1)
150
+ return;
151
+ const g = u === "horizontal" ? "ArrowRight" : "ArrowDown", _ = u === "horizontal" ? "ArrowLeft" : "ArrowUp";
152
+ let v = -1;
153
+ switch (s.key) {
154
+ case g:
155
+ v = (m + 1) % c.length;
156
+ break;
157
+ case _:
158
+ v = (m - 1 + c.length) % c.length;
159
+ break;
160
+ case "Home":
161
+ v = 0;
162
+ break;
163
+ case "End":
164
+ v = c.length - 1;
165
+ break;
166
+ default:
167
+ return;
168
+ }
169
+ s.preventDefault();
170
+ const p = c[v];
171
+ p && (p.focus(), p.click());
172
+ }
173
+ }
174
+ );
175
+ }), ae = L(function({ value: n, type: i = "button", className: r, onClick: l, ...u }, s) {
176
+ const h = V("Tabs.Trigger"), o = h.value === n;
177
+ return /* @__PURE__ */ a(
178
+ "button",
179
+ {
180
+ ...u,
181
+ ref: s,
182
+ type: i,
183
+ role: "tab",
184
+ id: W(h.baseId, n),
185
+ "aria-selected": o,
186
+ "aria-controls": X(h.baseId, n),
187
+ tabIndex: o ? 0 : -1,
188
+ "data-state": o ? "active" : "inactive",
189
+ className: y("uk-tabs__trigger", r),
190
+ onClick: (c) => {
191
+ l?.(c), c.defaultPrevented || h.setValue(n);
192
+ }
193
+ }
194
+ );
195
+ }), se = L(function({ value: n, className: i, ...r }, l) {
196
+ const u = V("Tabs.Content"), s = u.value === n;
197
+ return /* @__PURE__ */ a(
198
+ "div",
199
+ {
200
+ ...r,
201
+ ref: l,
202
+ role: "tabpanel",
203
+ id: X(u.baseId, n),
204
+ "aria-labelledby": W(u.baseId, n),
205
+ hidden: !s,
206
+ tabIndex: 0,
207
+ "data-state": s ? "active" : "inactive",
208
+ className: y("uk-tabs__panel", i)
209
+ }
210
+ );
211
+ }), _e = Object.assign(ne, {
212
+ List: re,
213
+ Trigger: ae,
214
+ Content: se
215
+ }), oe = () => () => {
216
+ }, ie = () => !0, ce = () => !1;
217
+ function Ce({
218
+ open: t,
219
+ onOpenChange: n,
220
+ title: i,
221
+ description: r,
222
+ footer: l,
223
+ children: u,
224
+ closeLabel: s = "Close",
225
+ showCloseButton: h = !0,
226
+ closeOnBackdropClick: o = !0,
227
+ closeOnEscape: c = !0,
228
+ initialFocusRef: m,
229
+ returnFocusRef: g,
230
+ className: _,
231
+ "aria-label": v
232
+ }) {
233
+ const p = x(null), w = x(null), k = x(t), R = S(), T = S(), E = K(
234
+ oe,
235
+ ie,
236
+ ce
237
+ ), I = Y(() => {
238
+ k.current && n(!1);
239
+ });
240
+ return Z(t), z(() => {
241
+ k.current = t;
242
+ }, [t]), z(() => {
243
+ const d = p.current;
244
+ d && (t && !d.open ? (w.current = document.activeElement instanceof HTMLElement ? document.activeElement : null, typeof d.showModal == "function" ? d.showModal() : d.setAttribute("open", "")) : !t && d.open && (typeof d.close == "function" ? d.close() : d.removeAttribute("open")));
245
+ }, [t]), ee({
246
+ active: t,
247
+ containerRef: p,
248
+ initialFocusRef: m,
249
+ returnFocusRef: g ?? w
250
+ }), z(() => {
251
+ const d = p.current;
252
+ if (!d)
253
+ return;
254
+ const A = () => I(), M = (e) => {
255
+ c || e.preventDefault();
256
+ }, $ = (e) => {
257
+ o && e.target === d && I();
258
+ };
259
+ return d.addEventListener("close", A), d.addEventListener("cancel", M), d.addEventListener("click", $), () => {
260
+ d.removeEventListener("close", A), d.removeEventListener("cancel", M), d.removeEventListener("click", $);
261
+ };
262
+ }, [o, c, I]), E ? q(
263
+ /* @__PURE__ */ a(
264
+ "dialog",
265
+ {
266
+ ref: p,
267
+ className: y("uk-dialog", _),
268
+ "aria-label": v,
269
+ "aria-labelledby": i ? R : void 0,
270
+ "aria-describedby": r ? T : void 0,
271
+ children: /* @__PURE__ */ N("div", { className: "uk-dialog__panel", children: [
272
+ i || r || h ? /* @__PURE__ */ N("header", { className: "uk-dialog__header", children: [
273
+ /* @__PURE__ */ N("div", { className: "uk-dialog__heading", children: [
274
+ i ? /* @__PURE__ */ a("h2", { id: R, className: "uk-dialog__title", children: i }) : null,
275
+ r ? /* @__PURE__ */ a("p", { id: T, className: "uk-dialog__description", children: r }) : null
276
+ ] }),
277
+ h ? /* @__PURE__ */ a(
278
+ te,
279
+ {
280
+ variant: "ghost",
281
+ size: "sm",
282
+ iconOnly: !0,
283
+ "aria-label": s,
284
+ className: "uk-dialog__close",
285
+ onClick: I,
286
+ children: /* @__PURE__ */ a(
287
+ "svg",
288
+ {
289
+ viewBox: "0 0 20 20",
290
+ width: "16",
291
+ height: "16",
292
+ "aria-hidden": "true",
293
+ children: /* @__PURE__ */ a(
294
+ "path",
295
+ {
296
+ d: "M5 5l10 10M15 5L5 15",
297
+ stroke: "currentColor",
298
+ strokeWidth: "1.8",
299
+ strokeLinecap: "round"
300
+ }
301
+ )
302
+ }
303
+ )
304
+ }
305
+ ) : null
306
+ ] }) : null,
307
+ /* @__PURE__ */ a("div", { className: "uk-dialog__body", children: u }),
308
+ l ? /* @__PURE__ */ a("footer", { className: "uk-dialog__footer", children: l }) : null
309
+ ] })
310
+ }
311
+ ),
312
+ document.body
313
+ ) : null;
314
+ }
315
+ const G = F(null), le = 200, ue = () => () => {
316
+ }, de = () => !0, fe = () => !1;
317
+ function he({
318
+ record: t,
319
+ closeLabel: n,
320
+ onDismiss: i,
321
+ onPause: r,
322
+ onResume: l
323
+ }) {
324
+ return /* @__PURE__ */ N(
325
+ "div",
326
+ {
327
+ className: "uk-toast",
328
+ "data-variant": t.variant,
329
+ "data-state": t.leaving ? "closed" : "open",
330
+ onMouseEnter: () => r(t.id),
331
+ onMouseLeave: () => l(t.id),
332
+ onFocusCapture: () => r(t.id),
333
+ onBlurCapture: () => l(t.id),
334
+ children: [
335
+ /* @__PURE__ */ N("div", { className: "uk-toast__body", children: [
336
+ t.title ? /* @__PURE__ */ a("div", { className: "uk-toast__title", children: t.title }) : null,
337
+ t.description ? /* @__PURE__ */ a("div", { className: "uk-toast__description", children: t.description }) : null
338
+ ] }),
339
+ /* @__PURE__ */ a(
340
+ "button",
341
+ {
342
+ type: "button",
343
+ className: "uk-toast__close",
344
+ "aria-label": n,
345
+ onClick: () => i(t.id),
346
+ children: /* @__PURE__ */ a("svg", { viewBox: "0 0 20 20", width: "14", height: "14", "aria-hidden": "true", children: /* @__PURE__ */ a(
347
+ "path",
348
+ {
349
+ d: "M5 5l10 10M15 5L5 15",
350
+ stroke: "currentColor",
351
+ strokeWidth: "1.8",
352
+ strokeLinecap: "round"
353
+ }
354
+ ) })
355
+ }
356
+ )
357
+ ]
358
+ }
359
+ );
360
+ }
361
+ function we({
362
+ children: t,
363
+ placement: n = "top-right",
364
+ duration: i = 4e3,
365
+ maxToasts: r = 4,
366
+ label: l = "Notifications",
367
+ closeLabel: u = "Close"
368
+ }) {
369
+ const [s, h] = Q([]), o = x([]), c = x(/* @__PURE__ */ new Map()), m = x(
370
+ /* @__PURE__ */ new Map()
371
+ ), g = x(
372
+ /* @__PURE__ */ new Map()
373
+ ), _ = x(0), v = S(), p = K(
374
+ ue,
375
+ de,
376
+ fe
377
+ ), w = C((e) => {
378
+ o.current = e, h(e);
379
+ }, []), k = C((e) => {
380
+ const f = m.current.get(e);
381
+ f !== void 0 && (clearTimeout(f), m.current.delete(e));
382
+ }, []), R = C((e) => {
383
+ const f = g.current.get(e);
384
+ f !== void 0 && (clearTimeout(f), g.current.delete(e));
385
+ }, []), T = C(
386
+ (e) => {
387
+ k(e), !(g.current.has(e) || !o.current.some((b) => b.id === e)) && (w(
388
+ o.current.map(
389
+ (b) => b.id === e ? { ...b, leaving: !0 } : b
390
+ )
391
+ ), g.current.set(
392
+ e,
393
+ setTimeout(() => {
394
+ g.current.delete(e), c.current.delete(e), w(o.current.filter((b) => b.id !== e));
395
+ }, le)
396
+ ));
397
+ },
398
+ [k, w]
399
+ ), E = C(
400
+ (e, f) => {
401
+ k(e), !(f <= 0) && m.current.set(
402
+ e,
403
+ setTimeout(() => {
404
+ m.current.delete(e), T(e);
405
+ }, f)
406
+ );
407
+ },
408
+ [k, T]
409
+ ), I = C(
410
+ (e) => {
411
+ const f = `${v}-${_.current}`;
412
+ _.current += 1;
413
+ const b = {
414
+ id: f,
415
+ title: e.title,
416
+ description: e.description,
417
+ variant: e.variant ?? "info",
418
+ duration: e.duration ?? i,
419
+ leaving: !1
420
+ }, D = [...o.current, b], P = Math.max(0, D.length - r);
421
+ (P > 0 ? D.slice(0, P) : []).forEach((B) => {
422
+ k(B.id), R(B.id), c.current.delete(B.id);
423
+ });
424
+ const J = P > 0 ? D.slice(P) : D;
425
+ return c.current.set(f, b.duration), w(J), E(f, b.duration), f;
426
+ },
427
+ [
428
+ v,
429
+ k,
430
+ R,
431
+ w,
432
+ i,
433
+ r,
434
+ E
435
+ ]
436
+ ), d = C(
437
+ (e) => {
438
+ k(e);
439
+ },
440
+ [k]
441
+ ), A = C(
442
+ (e) => {
443
+ const f = c.current.get(e);
444
+ f !== void 0 && E(e, f);
445
+ },
446
+ [E]
447
+ ), M = C(() => {
448
+ o.current.forEach((e) => T(e.id));
449
+ }, [T]), $ = j(
450
+ () => ({ toast: I, dismiss: T, dismissAll: M }),
451
+ [T, M, I]
452
+ );
453
+ return z(() => {
454
+ const e = m.current, f = g.current;
455
+ return () => {
456
+ e.forEach((b) => clearTimeout(b)), f.forEach((b) => clearTimeout(b)), e.clear(), f.clear();
457
+ };
458
+ }, []), /* @__PURE__ */ N(G.Provider, { value: $, children: [
459
+ t,
460
+ p ? q(
461
+ /* @__PURE__ */ a(
462
+ "section",
463
+ {
464
+ className: "uk-toast-viewport",
465
+ "data-placement": n,
466
+ "aria-label": l,
467
+ "aria-live": "polite",
468
+ "aria-atomic": "false",
469
+ children: s.map((e) => /* @__PURE__ */ a(
470
+ he,
471
+ {
472
+ record: e,
473
+ closeLabel: u,
474
+ onDismiss: T,
475
+ onPause: d,
476
+ onResume: A
477
+ },
478
+ e.id
479
+ ))
480
+ }
481
+ ),
482
+ document.body
483
+ ) : null
484
+ ] });
485
+ }
486
+ function xe() {
487
+ const t = U(G);
488
+ if (!t)
489
+ throw new Error("useToast must be used within <ToastProvider>");
490
+ return t;
491
+ }
492
+ export {
493
+ te as Button,
494
+ Ce as Dialog,
495
+ ke as Input,
496
+ Te as Switch,
497
+ _e as Tabs,
498
+ we as ToastProvider,
499
+ xe as useToast
500
+ };
501
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/utils/cx.ts","../src/Button.tsx","../src/Input.tsx","../src/Switch.tsx","../src/Tabs.tsx","../src/Dialog.tsx","../src/Toast.tsx"],"sourcesContent":["/**\n * 拼接 className,忽略 false / null / undefined。\n */\nexport function cx(\n ...values: Array<string | false | null | undefined>\n): string {\n return values.filter(Boolean).join(\" \");\n}\n","import {\n forwardRef,\n type ButtonHTMLAttributes,\n type ForwardRefExoticComponent,\n type ReactNode,\n type RefAttributes,\n} from \"react\";\nimport { cx } from \"./utils/cx\";\n\nexport type ButtonVariant =\n | \"primary\"\n | \"secondary\"\n | \"outline\"\n | \"ghost\"\n | \"danger\";\n\nexport type ButtonSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** 视觉层级,默认 primary。 */\n variant?: ButtonVariant;\n /** 尺寸,默认 md。 */\n size?: ButtonSize;\n /** 展示加载指示器并禁用点击。 */\n loading?: boolean;\n /** 仅包含图标时使用方形内边距,需自行提供 aria-label。 */\n iconOnly?: boolean;\n children?: ReactNode;\n}\n\n/**\n * 基础按钮。\n *\n * 样式由 data-variant / data-size 驱动,所有原生 button 属性都会透传。\n * loading 时自动设置 disabled 与 aria-busy,避免重复提交。\n */\nexport const Button: ForwardRefExoticComponent<\n ButtonProps & RefAttributes<HTMLButtonElement>\n> = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant = \"primary\",\n size = \"md\",\n loading = false,\n iconOnly = false,\n type = \"button\",\n className,\n children,\n ...rest\n },\n ref,\n) {\n return (\n <button\n {...rest}\n ref={ref}\n type={type}\n className={cx(\"uk-button\", className)}\n data-variant={variant}\n data-size={size}\n data-loading={loading ? \"true\" : undefined}\n data-icon-only={iconOnly ? \"true\" : undefined}\n disabled={rest.disabled || loading}\n aria-busy={loading || undefined}\n >\n {loading ? (\n <span className=\"uk-button__spinner\" aria-hidden=\"true\" />\n ) : null}\n {children}\n </button>\n );\n});\n","import {\n forwardRef,\n type ForwardRefExoticComponent,\n type InputHTMLAttributes,\n type RefAttributes,\n} from \"react\";\nimport { cx } from \"./utils/cx\";\n\nexport type InputSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface InputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"size\"\n> {\n /** 输入框尺寸,默认 md。原生 size 属性被该字段替代。 */\n inputSize?: InputSize;\n /** 标记校验失败状态,等同于 aria-invalid=\"true\"。 */\n invalid?: boolean;\n}\n\n/**\n * 文本输入框。\n *\n * 只负责样式与校验状态,label、提示文案与错误信息由调用方组合,\n * 这样表单结构可以完全自定义。\n */\nexport const Input: ForwardRefExoticComponent<\n InputProps & RefAttributes<HTMLInputElement>\n> = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n inputSize = \"md\",\n invalid = false,\n className,\n \"aria-invalid\": ariaInvalid,\n ...rest\n },\n ref,\n) {\n return (\n <input\n {...rest}\n ref={ref}\n className={cx(\"uk-input\", className)}\n data-size={inputSize}\n aria-invalid={invalid ? true : ariaInvalid}\n />\n );\n});\n","import {\n forwardRef,\n useId,\n type ForwardRefExoticComponent,\n type InputHTMLAttributes,\n type ReactNode,\n type RefAttributes,\n} from \"react\";\nimport { useControllableState } from \"seam-hooks\";\nimport { cx } from \"./utils/cx\";\n\nexport interface SwitchProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"size\" | \"checked\" | \"defaultChecked\" | \"onChange\"\n> {\n /** 受控选中状态。传入即进入受控模式。 */\n checked?: boolean;\n /** 非受控模式下的初始状态。 */\n defaultChecked?: boolean;\n /** 状态变化回调,受控与非受控都会触发。 */\n onCheckedChange?: (checked: boolean) => void;\n /** 显示在开关右侧的标签文本。 */\n children?: ReactNode;\n}\n\n/**\n * 开关。\n *\n * 底层是原生 checkbox(role=\"switch\"),所以表单提交、键盘操作和\n * 屏幕阅读器语义都是免费的;视觉部分由 track / thumb 两个 span 承担。\n */\nexport const Switch: ForwardRefExoticComponent<\n SwitchProps & RefAttributes<HTMLInputElement>\n> = forwardRef<HTMLInputElement, SwitchProps>(function Switch(\n {\n checked,\n defaultChecked,\n onCheckedChange,\n disabled,\n className,\n children,\n id,\n ...rest\n },\n ref,\n) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n\n const [current, setCurrent] = useControllableState<boolean>({\n value: checked,\n defaultValue: defaultChecked ?? false,\n onChange: onCheckedChange,\n });\n\n return (\n <label\n className={cx(\"uk-switch\", className)}\n data-disabled={disabled ? \"true\" : undefined}\n htmlFor={inputId}\n >\n <input\n {...rest}\n ref={ref}\n id={inputId}\n type=\"checkbox\"\n role=\"switch\"\n className=\"uk-switch__input\"\n checked={current}\n disabled={disabled}\n aria-checked={current}\n onChange={(event) => setCurrent(event.target.checked)}\n />\n <span className=\"uk-switch__track\" aria-hidden=\"true\">\n <span className=\"uk-switch__thumb\" />\n </span>\n {children ? <span className=\"uk-switch__label\">{children}</span> : null}\n </label>\n );\n});\n","import {\n createContext,\n forwardRef,\n useContext,\n useId,\n useMemo,\n type ButtonHTMLAttributes,\n type ForwardRefExoticComponent,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n type RefAttributes,\n} from \"react\";\nimport { useControllableState } from \"seam-hooks\";\nimport { cx } from \"./utils/cx\";\n\nexport type TabsOrientation = \"horizontal\" | \"vertical\";\n\ninterface TabsContextValue {\n baseId: string;\n value: string;\n setValue: (value: string) => void;\n orientation: TabsOrientation;\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null);\n\nfunction useTabsContext(component: string): TabsContextValue {\n const context = useContext(TabsContext);\n\n if (!context) {\n throw new Error(`<${component}> must be rendered inside <Tabs>`);\n }\n\n return context;\n}\n\nfunction tabId(baseId: string, value: string) {\n return `${baseId}-tab-${encodeURIComponent(value)}`;\n}\n\nfunction panelId(baseId: string, value: string) {\n return `${baseId}-panel-${encodeURIComponent(value)}`;\n}\n\ninterface TabsBaseProps {\n onValueChange?: (value: string) => void;\n orientation?: TabsOrientation;\n className?: string;\n children: ReactNode;\n}\n\nexport type TabsProps = TabsBaseProps &\n (\n | { value: string; defaultValue?: never }\n | { value?: never; defaultValue: string }\n );\n\nfunction TabsRoot({\n value,\n defaultValue,\n onValueChange,\n orientation = \"horizontal\",\n className,\n children,\n}: TabsProps): ReactElement {\n const baseId = useId();\n const [current, setValue] = useControllableState<string>({\n value,\n defaultValue: defaultValue ?? \"\",\n onChange: onValueChange,\n });\n\n const context = useMemo<TabsContextValue>(\n () => ({ baseId, value: current, setValue, orientation }),\n [baseId, current, orientation, setValue],\n );\n\n return (\n <TabsContext.Provider value={context}>\n <div className={cx(\"uk-tabs\", className)} data-orientation={orientation}>\n {children}\n </div>\n </TabsContext.Provider>\n );\n}\n\nexport interface TabsListProps extends HTMLAttributes<HTMLDivElement> {\n children?: ReactNode;\n}\n\nconst TabsList: ForwardRefExoticComponent<\n TabsListProps & RefAttributes<HTMLDivElement>\n> = forwardRef<HTMLDivElement, TabsListProps>(function TabsList(\n { className, onKeyDown, ...rest },\n ref,\n) {\n const { orientation } = useTabsContext(\"Tabs.List\");\n\n return (\n <div\n {...rest}\n ref={ref}\n role=\"tablist\"\n aria-orientation={orientation}\n tabIndex={-1}\n className={cx(\"uk-tabs__list\", className)}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n\n if (event.defaultPrevented) {\n return;\n }\n\n const target = event.target as HTMLElement | null;\n const trigger = target?.closest<HTMLElement>('[role=\"tab\"]');\n\n if (!trigger || trigger.hasAttribute(\"disabled\")) {\n return;\n }\n\n const triggers = Array.from(\n event.currentTarget.querySelectorAll<HTMLElement>(\n '[role=\"tab\"]:not([disabled])',\n ),\n );\n const index = triggers.indexOf(trigger);\n\n if (index === -1) {\n return;\n }\n\n const nextKey =\n orientation === \"horizontal\" ? \"ArrowRight\" : \"ArrowDown\";\n const previousKey =\n orientation === \"horizontal\" ? \"ArrowLeft\" : \"ArrowUp\";\n\n let nextIndex = -1;\n\n switch (event.key) {\n case nextKey:\n nextIndex = (index + 1) % triggers.length;\n break;\n case previousKey:\n nextIndex = (index - 1 + triggers.length) % triggers.length;\n break;\n case \"Home\":\n nextIndex = 0;\n break;\n case \"End\":\n nextIndex = triggers.length - 1;\n break;\n default:\n return;\n }\n\n event.preventDefault();\n\n const nextTrigger = triggers[nextIndex];\n\n if (nextTrigger) {\n nextTrigger.focus();\n nextTrigger.click();\n }\n }}\n />\n );\n});\n\nexport interface TabsTriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n value: string;\n children?: ReactNode;\n}\n\nconst TabsTrigger: ForwardRefExoticComponent<\n TabsTriggerProps & RefAttributes<HTMLButtonElement>\n> = forwardRef<HTMLButtonElement, TabsTriggerProps>(function TabsTrigger(\n { value, type = \"button\", className, onClick, ...rest },\n ref,\n) {\n const context = useTabsContext(\"Tabs.Trigger\");\n const selected = context.value === value;\n\n return (\n <button\n {...rest}\n ref={ref}\n type={type}\n role=\"tab\"\n id={tabId(context.baseId, value)}\n aria-selected={selected}\n aria-controls={panelId(context.baseId, value)}\n tabIndex={selected ? 0 : -1}\n data-state={selected ? \"active\" : \"inactive\"}\n className={cx(\"uk-tabs__trigger\", className)}\n onClick={(event) => {\n onClick?.(event);\n\n if (!event.defaultPrevented) {\n context.setValue(value);\n }\n }}\n />\n );\n});\n\nexport interface TabsContentProps extends HTMLAttributes<HTMLDivElement> {\n value: string;\n children?: ReactNode;\n}\n\nconst TabsContent: ForwardRefExoticComponent<\n TabsContentProps & RefAttributes<HTMLDivElement>\n> = forwardRef<HTMLDivElement, TabsContentProps>(function TabsContent(\n { value, className, ...rest },\n ref,\n) {\n const context = useTabsContext(\"Tabs.Content\");\n const selected = context.value === value;\n\n return (\n <div\n {...rest}\n ref={ref}\n role=\"tabpanel\"\n id={panelId(context.baseId, value)}\n aria-labelledby={tabId(context.baseId, value)}\n hidden={!selected}\n tabIndex={0}\n data-state={selected ? \"active\" : \"inactive\"}\n className={cx(\"uk-tabs__panel\", className)}\n />\n );\n});\n\n/**\n * 标签页。\n *\n * 组合式 API:Tabs / Tabs.List / Tabs.Trigger / Tabs.Content。\n * 实现 roving tabindex、方向键循环、Home/End 跳转,并自动生成\n * aria-controls / aria-labelledby 关联。\n */\nexport interface TabsComponent {\n (props: TabsProps): ReactElement;\n List: typeof TabsList;\n Trigger: typeof TabsTrigger;\n Content: typeof TabsContent;\n}\n\nexport const Tabs: TabsComponent = Object.assign(TabsRoot, {\n List: TabsList,\n Trigger: TabsTrigger,\n Content: TabsContent,\n});\n","import {\n useEffect,\n useId,\n useRef,\n useSyncExternalStore,\n type ReactElement,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useEventCallback, useFocusTrap, useLockBodyScroll } from \"seam-hooks\";\nimport { Button } from \"./Button\";\nimport { cx } from \"./utils/cx\";\n\nexport interface DialogProps {\n /** 是否打开。由调用方控制,配合 onOpenChange 使用。 */\n open: boolean;\n /** 打开状态变化时触发,用于同步外部 state。 */\n onOpenChange: (open: boolean) => void;\n title?: ReactNode;\n description?: ReactNode;\n footer?: ReactNode;\n children?: ReactNode;\n /** 关闭按钮的无障碍名称,默认 Close。 */\n closeLabel?: string;\n showCloseButton?: boolean;\n /** 点击遮罩是否关闭,默认 true。 */\n closeOnBackdropClick?: boolean;\n /** 按 Esc 是否关闭,默认 true。 */\n closeOnEscape?: boolean;\n /** 打开后优先聚焦的元素;不传则聚焦第一个可聚焦元素。 */\n initialFocusRef?: RefObject<HTMLElement | null>;\n /** 关闭后恢复焦点的元素;默认恢复到打开前的活动元素。 */\n returnFocusRef?: RefObject<HTMLElement | null>;\n className?: string;\n \"aria-label\"?: string;\n}\n\nconst subscribeToNothing = () => () => {};\nconst getClientSnapshot = () => true;\nconst getServerSnapshot = () => false;\n\n/**\n * 模态对话框。\n *\n * 基于原生 <dialog> + showModal():Esc 关闭、遮罩和顶层渲染由浏览器\n * 负责;焦点陷阱由 useFocusTrap 补上反向循环、外部聚焦回收与焦点恢复,\n * 组件本身额外提供受控开关、关闭按钮、遮罩点击与 body 滚动锁定。\n */\nexport function Dialog({\n open,\n onOpenChange,\n title,\n description,\n footer,\n children,\n closeLabel = \"Close\",\n showCloseButton = true,\n closeOnBackdropClick = true,\n closeOnEscape = true,\n initialFocusRef,\n returnFocusRef,\n className,\n \"aria-label\": ariaLabel,\n}: DialogProps): ReactElement | null {\n const dialogRef = useRef<HTMLDialogElement>(null);\n const openerRef = useRef<HTMLElement | null>(null);\n const openRef = useRef(open);\n const titleId = useId();\n const descriptionId = useId();\n const isClient = useSyncExternalStore(\n subscribeToNothing,\n getClientSnapshot,\n getServerSnapshot,\n );\n\n const requestClose = useEventCallback(() => {\n if (openRef.current) {\n onOpenChange(false);\n }\n });\n\n useLockBodyScroll(open);\n\n useEffect(() => {\n openRef.current = open;\n }, [open]);\n\n useEffect(() => {\n const dialog = dialogRef.current;\n\n if (!dialog) {\n return;\n }\n\n if (open && !dialog.open) {\n // 必须在 showModal() 之前记录,否则拿到的已经是对话框内部元素。\n openerRef.current =\n document.activeElement instanceof HTMLElement\n ? document.activeElement\n : null;\n\n if (typeof dialog.showModal === \"function\") {\n dialog.showModal();\n } else {\n dialog.setAttribute(\"open\", \"\");\n }\n } else if (!open && dialog.open) {\n if (typeof dialog.close === \"function\") {\n dialog.close();\n } else {\n dialog.removeAttribute(\"open\");\n }\n }\n }, [open]);\n\n // 声明顺序很关键:上面的 effect 先调用 showModal(),本 hook 再接管焦点。\n useFocusTrap({\n active: open,\n containerRef: dialogRef,\n initialFocusRef,\n returnFocusRef: returnFocusRef ?? openerRef,\n });\n\n useEffect(() => {\n const dialog = dialogRef.current;\n\n if (!dialog) {\n return;\n }\n\n const onClose = () => requestClose();\n const onCancel = (event: Event) => {\n if (!closeOnEscape) {\n event.preventDefault();\n }\n };\n const onClick = (event: MouseEvent) => {\n if (closeOnBackdropClick && event.target === dialog) {\n requestClose();\n }\n };\n\n dialog.addEventListener(\"close\", onClose);\n dialog.addEventListener(\"cancel\", onCancel);\n dialog.addEventListener(\"click\", onClick);\n\n return () => {\n dialog.removeEventListener(\"close\", onClose);\n dialog.removeEventListener(\"cancel\", onCancel);\n dialog.removeEventListener(\"click\", onClick);\n };\n }, [closeOnBackdropClick, closeOnEscape, requestClose]);\n\n if (!isClient) {\n return null;\n }\n\n return createPortal(\n <dialog\n ref={dialogRef}\n className={cx(\"uk-dialog\", className)}\n aria-label={ariaLabel}\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={description ? descriptionId : undefined}\n >\n <div className=\"uk-dialog__panel\">\n {title || description || showCloseButton ? (\n <header className=\"uk-dialog__header\">\n <div className=\"uk-dialog__heading\">\n {title ? (\n <h2 id={titleId} className=\"uk-dialog__title\">\n {title}\n </h2>\n ) : null}\n {description ? (\n <p id={descriptionId} className=\"uk-dialog__description\">\n {description}\n </p>\n ) : null}\n </div>\n {showCloseButton ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={closeLabel}\n className=\"uk-dialog__close\"\n onClick={requestClose}\n >\n <svg\n viewBox=\"0 0 20 20\"\n width=\"16\"\n height=\"16\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M5 5l10 10M15 5L5 15\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n </Button>\n ) : null}\n </header>\n ) : null}\n\n <div className=\"uk-dialog__body\">{children}</div>\n\n {footer ? (\n <footer className=\"uk-dialog__footer\">{footer}</footer>\n ) : null}\n </div>\n </dialog>,\n document.body,\n );\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type ToastVariant = \"info\" | \"success\" | \"warning\" | \"danger\";\n\nexport type ToastPlacement =\n | \"top-right\"\n | \"top-center\"\n | \"bottom-right\"\n | \"bottom-center\";\n\nexport interface ToastOptions {\n title?: ReactNode;\n description?: ReactNode;\n /** 视觉变体,默认 info。 */\n variant?: ToastVariant;\n /** 自动关闭时间(毫秒),0 表示常驻;默认取 Provider 配置。 */\n duration?: number;\n}\n\nexport interface ToastApi {\n /** 弹出一条提示,返回其 id。 */\n toast: (options: ToastOptions) => string;\n /** 关闭指定提示。 */\n dismiss: (id: string) => void;\n /** 关闭当前所有提示。 */\n dismissAll: () => void;\n}\n\nexport interface ToastProviderProps {\n children: ReactNode;\n /** 提示出现的位置,默认 top-right。 */\n placement?: ToastPlacement;\n /** 默认自动关闭时间,默认 4000ms。 */\n duration?: number;\n /** 同屏最多保留的提示数量,默认 4。 */\n maxToasts?: number;\n /** 提示区域的屏幕阅读器名称。 */\n label?: string;\n /** 关闭按钮的无障碍名称,默认 Close。 */\n closeLabel?: string;\n}\n\ninterface ToastRecord {\n id: string;\n title?: ReactNode;\n description?: ReactNode;\n variant: ToastVariant;\n duration: number;\n leaving: boolean;\n}\n\ninterface ToastViewProps {\n record: ToastRecord;\n closeLabel: string;\n onDismiss: (id: string) => void;\n onPause: (id: string) => void;\n onResume: (id: string) => void;\n}\n\nconst ToastContext = createContext<ToastApi | null>(null);\n\nconst EXIT_DURATION = 200;\n\nconst subscribeToNothing = () => () => {};\nconst getClientSnapshot = () => true;\nconst getServerSnapshot = () => false;\n\nfunction ToastView({\n record,\n closeLabel,\n onDismiss,\n onPause,\n onResume,\n}: ToastViewProps) {\n return (\n <div\n className=\"uk-toast\"\n data-variant={record.variant}\n data-state={record.leaving ? \"closed\" : \"open\"}\n onMouseEnter={() => onPause(record.id)}\n onMouseLeave={() => onResume(record.id)}\n onFocusCapture={() => onPause(record.id)}\n onBlurCapture={() => onResume(record.id)}\n >\n <div className=\"uk-toast__body\">\n {record.title ? (\n <div className=\"uk-toast__title\">{record.title}</div>\n ) : null}\n {record.description ? (\n <div className=\"uk-toast__description\">{record.description}</div>\n ) : null}\n </div>\n <button\n type=\"button\"\n className=\"uk-toast__close\"\n aria-label={closeLabel}\n onClick={() => onDismiss(record.id)}\n >\n <svg viewBox=\"0 0 20 20\" width=\"14\" height=\"14\" aria-hidden=\"true\">\n <path\n d=\"M5 5l10 10M15 5L5 15\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n );\n}\n\n/**\n * Toast 上下文。\n *\n * 负责队列、自动关闭、悬停/聚焦暂停、退出动画和 portal 渲染。\n * 必须包在应用外层,子组件通过 useToast() 获取 toast()。\n */\nexport function ToastProvider({\n children,\n placement = \"top-right\",\n duration = 4000,\n maxToasts = 4,\n label = \"Notifications\",\n closeLabel = \"Close\",\n}: ToastProviderProps): ReactElement {\n const [records, setRecords] = useState<ToastRecord[]>([]);\n const recordsRef = useRef<ToastRecord[]>([]);\n const durationsRef = useRef(new Map<string, number>());\n const autoTimersRef = useRef(\n new Map<string, ReturnType<typeof setTimeout>>(),\n );\n const exitTimersRef = useRef(\n new Map<string, ReturnType<typeof setTimeout>>(),\n );\n const counterRef = useRef(0);\n const baseId = useId();\n const isClient = useSyncExternalStore(\n subscribeToNothing,\n getClientSnapshot,\n getServerSnapshot,\n );\n\n const commit = useCallback((next: ToastRecord[]) => {\n recordsRef.current = next;\n setRecords(next);\n }, []);\n\n const clearAutoTimer = useCallback((id: string) => {\n const timer = autoTimersRef.current.get(id);\n\n if (timer !== undefined) {\n clearTimeout(timer);\n autoTimersRef.current.delete(id);\n }\n }, []);\n\n const clearExitTimer = useCallback((id: string) => {\n const timer = exitTimersRef.current.get(id);\n\n if (timer !== undefined) {\n clearTimeout(timer);\n exitTimersRef.current.delete(id);\n }\n }, []);\n\n const dismiss = useCallback(\n (id: string) => {\n clearAutoTimer(id);\n\n if (exitTimersRef.current.has(id)) {\n return;\n }\n\n const exists = recordsRef.current.some((record) => record.id === id);\n\n if (!exists) {\n return;\n }\n\n commit(\n recordsRef.current.map((record) =>\n record.id === id ? { ...record, leaving: true } : record,\n ),\n );\n\n exitTimersRef.current.set(\n id,\n setTimeout(() => {\n exitTimersRef.current.delete(id);\n durationsRef.current.delete(id);\n commit(recordsRef.current.filter((record) => record.id !== id));\n }, EXIT_DURATION),\n );\n },\n [clearAutoTimer, commit],\n );\n\n const scheduleAutoDismiss = useCallback(\n (id: string, delay: number) => {\n clearAutoTimer(id);\n\n if (delay <= 0) {\n return;\n }\n\n autoTimersRef.current.set(\n id,\n setTimeout(() => {\n autoTimersRef.current.delete(id);\n dismiss(id);\n }, delay),\n );\n },\n [clearAutoTimer, dismiss],\n );\n\n const toast = useCallback(\n (options: ToastOptions) => {\n const id = `${baseId}-${counterRef.current}`;\n counterRef.current += 1;\n\n const record: ToastRecord = {\n id,\n title: options.title,\n description: options.description,\n variant: options.variant ?? \"info\",\n duration: options.duration ?? duration,\n leaving: false,\n };\n\n const next = [...recordsRef.current, record];\n const overflow = Math.max(0, next.length - maxToasts);\n const dropped = overflow > 0 ? next.slice(0, overflow) : [];\n\n dropped.forEach((item) => {\n clearAutoTimer(item.id);\n clearExitTimer(item.id);\n durationsRef.current.delete(item.id);\n });\n\n const kept = overflow > 0 ? next.slice(overflow) : next;\n\n durationsRef.current.set(id, record.duration);\n commit(kept);\n scheduleAutoDismiss(id, record.duration);\n\n return id;\n },\n [\n baseId,\n clearAutoTimer,\n clearExitTimer,\n commit,\n duration,\n maxToasts,\n scheduleAutoDismiss,\n ],\n );\n\n const pause = useCallback(\n (id: string) => {\n clearAutoTimer(id);\n },\n [clearAutoTimer],\n );\n\n const resume = useCallback(\n (id: string) => {\n const delay = durationsRef.current.get(id);\n\n if (delay !== undefined) {\n scheduleAutoDismiss(id, delay);\n }\n },\n [scheduleAutoDismiss],\n );\n\n const dismissAll = useCallback(() => {\n recordsRef.current.forEach((record) => dismiss(record.id));\n }, [dismiss]);\n\n const api = useMemo<ToastApi>(\n () => ({ toast, dismiss, dismissAll }),\n [dismiss, dismissAll, toast],\n );\n\n useEffect(() => {\n const autoTimers = autoTimersRef.current;\n const exitTimers = exitTimersRef.current;\n\n return () => {\n autoTimers.forEach((timer) => clearTimeout(timer));\n exitTimers.forEach((timer) => clearTimeout(timer));\n autoTimers.clear();\n exitTimers.clear();\n };\n }, []);\n\n return (\n <ToastContext.Provider value={api}>\n {children}\n {isClient\n ? createPortal(\n <section\n className=\"uk-toast-viewport\"\n data-placement={placement}\n aria-label={label}\n aria-live=\"polite\"\n aria-atomic=\"false\"\n >\n {records.map((record) => (\n <ToastView\n key={record.id}\n record={record}\n closeLabel={closeLabel}\n onDismiss={dismiss}\n onPause={pause}\n onResume={resume}\n />\n ))}\n </section>,\n document.body,\n )\n : null}\n </ToastContext.Provider>\n );\n}\n\n/**\n * 获取 toast API。必须在 <ToastProvider> 内使用。\n */\nexport function useToast(): ToastApi {\n const context = useContext(ToastContext);\n\n if (!context) {\n throw new Error(\"useToast must be used within <ToastProvider>\");\n }\n\n return context;\n}\n"],"names":["cx","values","Button","forwardRef","variant","size","loading","iconOnly","type","className","children","rest","ref","jsxs","Input","inputSize","invalid","ariaInvalid","jsx","Switch","checked","defaultChecked","onCheckedChange","disabled","id","generatedId","useId","inputId","current","setCurrent","useControllableState","event","TabsContext","createContext","useTabsContext","component","context","useContext","tabId","baseId","value","panelId","TabsRoot","defaultValue","onValueChange","orientation","setValue","useMemo","TabsList","onKeyDown","trigger","triggers","index","nextKey","previousKey","nextIndex","nextTrigger","TabsTrigger","onClick","selected","TabsContent","Tabs","subscribeToNothing","getClientSnapshot","getServerSnapshot","Dialog","open","onOpenChange","title","description","footer","closeLabel","showCloseButton","closeOnBackdropClick","closeOnEscape","initialFocusRef","returnFocusRef","ariaLabel","dialogRef","useRef","openerRef","openRef","titleId","descriptionId","isClient","useSyncExternalStore","requestClose","useEventCallback","useLockBodyScroll","useEffect","dialog","useFocusTrap","onClose","onCancel","createPortal","ToastContext","EXIT_DURATION","ToastView","record","onDismiss","onPause","onResume","ToastProvider","placement","duration","maxToasts","label","records","setRecords","useState","recordsRef","durationsRef","autoTimersRef","exitTimersRef","counterRef","commit","useCallback","next","clearAutoTimer","timer","clearExitTimer","dismiss","scheduleAutoDismiss","delay","toast","options","overflow","item","kept","pause","resume","dismissAll","api","autoTimers","exitTimers","useToast"],"mappings":"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"}