asterui 0.10.3 → 0.12.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/README.md +1 -100
- package/dist/components/Anchor.d.ts +45 -0
- package/dist/components/Diff.d.ts +12 -0
- package/dist/components/Kbd.d.ts +8 -0
- package/dist/components/Segmented.d.ts +37 -0
- package/dist/components/TextRotate.d.ts +13 -0
- package/dist/components/Tour.d.ts +61 -0
- package/dist/hooks/useClickOutside.d.ts +17 -0
- package/dist/hooks/useClipboard.d.ts +20 -0
- package/dist/hooks/useDebounce.d.ts +18 -0
- package/dist/hooks/useDisclosure.d.ts +20 -0
- package/dist/hooks/useHover.d.ts +18 -0
- package/dist/hooks/useKeyPress.d.ts +40 -0
- package/dist/hooks/useLocalStorage.d.ts +12 -0
- package/dist/hooks/usePrevious.d.ts +15 -0
- package/dist/hooks/useWindowSize.d.ts +21 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +205 -174
- package/dist/index.js.map +1 -1
- package/dist/index10.js +92 -30
- package/dist/index10.js.map +1 -1
- package/dist/index100.js +12 -20
- package/dist/index100.js.map +1 -1
- package/dist/index101.js +29 -22
- package/dist/index101.js.map +1 -1
- package/dist/index102.js +17 -19
- package/dist/index102.js.map +1 -1
- package/dist/index103.js +10788 -95
- package/dist/index103.js.map +1 -1
- package/dist/index104.js +5 -360
- package/dist/index104.js.map +1 -1
- package/dist/index105.js +40 -23
- package/dist/index105.js.map +1 -1
- package/dist/index106.js +2 -73
- package/dist/index106.js.map +1 -1
- package/dist/index107.js +6 -15
- package/dist/index107.js.map +1 -1
- package/dist/index108.js +147 -61
- package/dist/index108.js.map +1 -1
- package/dist/index109.js +26 -140
- package/dist/index109.js.map +1 -1
- package/dist/index11.js +28 -263
- package/dist/index11.js.map +1 -1
- package/dist/index110.js +30 -2
- package/dist/index110.js.map +1 -1
- package/dist/index111.js +2 -56
- package/dist/index111.js.map +1 -1
- package/dist/index112.js +72 -2
- package/dist/index112.js.map +1 -1
- package/dist/index113.js +39 -2
- package/dist/index113.js.map +1 -1
- package/dist/index114.js +26 -2
- package/dist/index114.js.map +1 -1
- package/dist/index115.js +21 -2
- package/dist/index115.js.map +1 -1
- package/dist/index116.js +24 -2
- package/dist/index116.js.map +1 -1
- package/dist/index117.js +20 -2
- package/dist/index117.js.map +1 -1
- package/dist/index118.js +100 -2
- package/dist/index118.js.map +1 -1
- package/dist/index119.js +359 -31
- package/dist/index119.js.map +1 -1
- package/dist/index12.js +259 -89
- package/dist/index12.js.map +1 -1
- package/dist/index120.js +25 -2
- package/dist/index120.js.map +1 -1
- package/dist/index121.js +72 -7
- package/dist/index121.js.map +1 -1
- package/dist/index122.js +16 -2
- package/dist/index122.js.map +1 -1
- package/dist/index123.js +66 -2
- package/dist/index123.js.map +1 -1
- package/dist/index124.js +143 -20
- package/dist/index124.js.map +1 -1
- package/dist/index125.js +2 -2
- package/dist/index126.js +55 -23
- package/dist/index126.js.map +1 -1
- package/dist/index127.js +2 -71
- package/dist/index127.js.map +1 -1
- package/dist/index128.js +2 -21
- package/dist/index128.js.map +1 -1
- package/dist/index129.js +2 -34
- package/dist/index129.js.map +1 -1
- package/dist/index13.js +90 -153
- package/dist/index13.js.map +1 -1
- package/dist/index130.js +2 -70
- package/dist/index130.js.map +1 -1
- package/dist/index131.js +2 -2
- package/dist/index132.js +2 -2
- package/dist/index133.js +2 -22
- package/dist/index133.js.map +1 -1
- package/dist/index134.js +2 -2
- package/dist/index135.js +32 -2
- package/dist/index135.js.map +1 -1
- package/dist/index136.js +2 -2
- package/dist/index137.js +8 -2
- package/dist/index137.js.map +1 -1
- package/dist/index138.js +2 -4
- package/dist/index138.js.map +1 -1
- package/dist/index139.js +5 -0
- package/dist/index139.js.map +1 -0
- package/dist/index14.js +154 -146
- package/dist/index14.js.map +1 -1
- package/dist/index140.js +24 -0
- package/dist/index140.js.map +1 -0
- package/dist/index141.js +5 -0
- package/dist/index141.js.map +1 -0
- package/dist/index142.js +27 -0
- package/dist/index142.js.map +1 -0
- package/dist/index143.js +74 -0
- package/dist/index143.js.map +1 -0
- package/dist/index144.js +24 -0
- package/dist/index144.js.map +1 -0
- package/dist/index145.js +37 -0
- package/dist/index145.js.map +1 -0
- package/dist/index146.js +73 -0
- package/dist/index146.js.map +1 -0
- package/dist/index147.js +5 -0
- package/dist/index147.js.map +1 -0
- package/dist/index148.js +25 -0
- package/dist/index148.js.map +1 -0
- package/dist/index149.js +5 -0
- package/dist/index149.js.map +1 -0
- package/dist/index15.js +150 -5
- package/dist/index15.js.map +1 -1
- package/dist/index150.js +5 -0
- package/dist/index150.js.map +1 -0
- package/dist/index151.js +5 -0
- package/dist/index151.js.map +1 -0
- package/dist/index152.js +5 -0
- package/dist/index152.js.map +1 -0
- package/dist/index153.js +7 -0
- package/dist/index153.js.map +1 -0
- package/dist/index16.js +5 -71
- package/dist/index16.js.map +1 -1
- package/dist/index17.js +71 -17
- package/dist/index17.js.map +1 -1
- package/dist/index18.js +15 -96
- package/dist/index18.js.map +1 -1
- package/dist/index19.js +89 -105
- package/dist/index19.js.map +1 -1
- package/dist/index20.js +107 -177
- package/dist/index20.js.map +1 -1
- package/dist/index21.js +181 -107
- package/dist/index21.js.map +1 -1
- package/dist/index22.js +107 -29
- package/dist/index22.js.map +1 -1
- package/dist/index23.js +19 -41
- package/dist/index23.js.map +1 -1
- package/dist/index24.js +31 -11
- package/dist/index24.js.map +1 -1
- package/dist/index25.js +41 -33
- package/dist/index25.js.map +1 -1
- package/dist/index26.js +12 -63
- package/dist/index26.js.map +1 -1
- package/dist/index27.js +33 -80
- package/dist/index27.js.map +1 -1
- package/dist/index28.js +63 -18
- package/dist/index28.js.map +1 -1
- package/dist/index29.js +78 -159
- package/dist/index29.js.map +1 -1
- package/dist/index3.js +96 -27
- package/dist/index3.js.map +1 -1
- package/dist/index30.js +16 -1080
- package/dist/index30.js.map +1 -1
- package/dist/index31.js +159 -16
- package/dist/index31.js.map +1 -1
- package/dist/index32.js +1081 -121
- package/dist/index32.js.map +1 -1
- package/dist/index33.js +17 -39
- package/dist/index33.js.map +1 -1
- package/dist/index34.js +121 -190
- package/dist/index34.js.map +1 -1
- package/dist/index35.js +37 -94
- package/dist/index35.js.map +1 -1
- package/dist/index36.js +186 -157
- package/dist/index36.js.map +1 -1
- package/dist/index37.js +89 -138
- package/dist/index37.js.map +1 -1
- package/dist/index38.js +161 -14
- package/dist/index38.js.map +1 -1
- package/dist/index39.js +146 -21
- package/dist/index39.js.map +1 -1
- package/dist/index4.js +26 -99
- package/dist/index4.js.map +1 -1
- package/dist/index40.js +12 -116
- package/dist/index40.js.map +1 -1
- package/dist/index41.js +18 -13
- package/dist/index41.js.map +1 -1
- package/dist/index42.js +21 -35
- package/dist/index42.js.map +1 -1
- package/dist/index43.js +117 -114
- package/dist/index43.js.map +1 -1
- package/dist/index44.js +13 -176
- package/dist/index44.js.map +1 -1
- package/dist/index45.js +34 -146
- package/dist/index45.js.map +1 -1
- package/dist/index46.js +116 -12
- package/dist/index46.js.map +1 -1
- package/dist/index47.js +176 -22
- package/dist/index47.js.map +1 -1
- package/dist/index48.js +147 -14
- package/dist/index48.js.map +1 -1
- package/dist/index49.js +10 -5
- package/dist/index49.js.map +1 -1
- package/dist/index5.js +100 -60
- package/dist/index5.js.map +1 -1
- package/dist/index50.js +21 -265
- package/dist/index50.js.map +1 -1
- package/dist/index51.js +10 -13
- package/dist/index51.js.map +1 -1
- package/dist/index52.js +7 -122
- package/dist/index52.js.map +1 -1
- package/dist/index53.js +262 -106
- package/dist/index53.js.map +1 -1
- package/dist/index54.js +14 -167
- package/dist/index54.js.map +1 -1
- package/dist/index55.js +121 -31
- package/dist/index55.js.map +1 -1
- package/dist/index56.js +107 -119
- package/dist/index56.js.map +1 -1
- package/dist/index57.js +161 -77
- package/dist/index57.js.map +1 -1
- package/dist/index58.js +31 -19
- package/dist/index58.js.map +1 -1
- package/dist/index59.js +117 -69
- package/dist/index59.js.map +1 -1
- package/dist/index6.js +61 -130
- package/dist/index6.js.map +1 -1
- package/dist/index60.js +82 -53
- package/dist/index60.js.map +1 -1
- package/dist/index61.js +19 -44
- package/dist/index61.js.map +1 -1
- package/dist/index62.js +70 -48
- package/dist/index62.js.map +1 -1
- package/dist/index63.js +55 -60
- package/dist/index63.js.map +1 -1
- package/dist/index64.js +39 -101
- package/dist/index64.js.map +1 -1
- package/dist/index65.js +52 -41
- package/dist/index65.js.map +1 -1
- package/dist/index66.js +62 -21
- package/dist/index66.js.map +1 -1
- package/dist/index67.js +104 -43
- package/dist/index67.js.map +1 -1
- package/dist/index68.js +41 -134
- package/dist/index68.js.map +1 -1
- package/dist/index69.js +65 -49
- package/dist/index69.js.map +1 -1
- package/dist/index7.js +130 -11
- package/dist/index7.js.map +1 -1
- package/dist/index70.js +21 -22
- package/dist/index70.js.map +1 -1
- package/dist/index71.js +46 -22
- package/dist/index71.js.map +1 -1
- package/dist/index72.js +126 -321
- package/dist/index72.js.map +1 -1
- package/dist/index73.js +52 -56
- package/dist/index73.js.map +1 -1
- package/dist/index74.js +22 -40
- package/dist/index74.js.map +1 -1
- package/dist/index75.js +22 -95
- package/dist/index75.js.map +1 -1
- package/dist/index76.js +311 -112
- package/dist/index76.js.map +1 -1
- package/dist/index77.js +52 -157
- package/dist/index77.js.map +1 -1
- package/dist/index78.js +40 -65
- package/dist/index78.js.map +1 -1
- package/dist/index79.js +23 -35
- package/dist/index79.js.map +1 -1
- package/dist/index8.js +11 -70
- package/dist/index8.js.map +1 -1
- package/dist/index80.js +92 -31
- package/dist/index80.js.map +1 -1
- package/dist/index81.js +116 -196
- package/dist/index81.js.map +1 -1
- package/dist/index82.js +155 -207
- package/dist/index82.js.map +1 -1
- package/dist/index83.js +60 -290
- package/dist/index83.js.map +1 -1
- package/dist/index84.js +34 -177
- package/dist/index84.js.map +1 -1
- package/dist/index85.js +227 -251
- package/dist/index85.js.map +1 -1
- package/dist/index86.js +34 -14
- package/dist/index86.js.map +1 -1
- package/dist/index87.js +208 -31
- package/dist/index87.js.map +1 -1
- package/dist/index88.js +206 -10786
- package/dist/index88.js.map +1 -1
- package/dist/index89.js +295 -5
- package/dist/index89.js.map +1 -1
- package/dist/index9.js +69 -91
- package/dist/index9.js.map +1 -1
- package/dist/index90.js +172 -36
- package/dist/index90.js.map +1 -1
- package/dist/index91.js +258 -2
- package/dist/index91.js.map +1 -1
- package/dist/index92.js +13 -6
- package/dist/index92.js.map +1 -1
- package/dist/index93.js +32 -151
- package/dist/index93.js.map +1 -1
- package/dist/index94.js +5 -29
- package/dist/index94.js.map +1 -1
- package/dist/index95.js +12 -28
- package/dist/index95.js.map +1 -1
- package/dist/index96.js +46 -2
- package/dist/index96.js.map +1 -1
- package/dist/index97.js +12 -71
- package/dist/index97.js.map +1 -1
- package/dist/index98.js +13 -37
- package/dist/index98.js.map +1 -1
- package/dist/index99.js +7 -25
- package/dist/index99.js.map +1 -1
- package/package.json +1 -1
package/dist/index29.js
CHANGED
|
@@ -1,164 +1,83 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
message: "Please enter a valid number"
|
|
16
|
-
}
|
|
17
|
-
};
|
|
18
|
-
function S() {
|
|
19
|
-
const t = _(j);
|
|
20
|
-
if (!t)
|
|
21
|
-
throw new Error("Form compound components must be used within Form");
|
|
22
|
-
return t;
|
|
23
|
-
}
|
|
24
|
-
function H({
|
|
25
|
-
form: t,
|
|
26
|
-
onFinish: a,
|
|
27
|
-
initialValues: r,
|
|
28
|
-
layout: i = "vertical",
|
|
29
|
-
size: c,
|
|
30
|
-
children: x,
|
|
31
|
-
className: m = "",
|
|
32
|
-
noValidate: h = !0,
|
|
33
|
-
...l
|
|
34
|
-
}) {
|
|
35
|
-
const p = q({
|
|
36
|
-
defaultValues: r
|
|
37
|
-
}), d = t || p, v = (F) => {
|
|
38
|
-
F.preventDefault(), a && d.handleSubmit(a)(F);
|
|
39
|
-
};
|
|
40
|
-
return /* @__PURE__ */ n(j.Provider, { value: { form: d, layout: i, size: c }, children: /* @__PURE__ */ n("form", { onSubmit: v, className: m, noValidate: h, ...l, children: x }) });
|
|
41
|
-
}
|
|
42
|
-
function U({
|
|
43
|
-
name: t,
|
|
44
|
-
label: a,
|
|
45
|
-
help: r,
|
|
46
|
-
required: i = !1,
|
|
47
|
-
rules: c,
|
|
48
|
-
valuePropName: x = "value",
|
|
49
|
-
inline: m = !1,
|
|
1
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
2
|
+
import { useState as g, useEffect as v } from "react";
|
|
3
|
+
const k = {
|
|
4
|
+
left: "tooltip-left",
|
|
5
|
+
right: "tooltip-right",
|
|
6
|
+
top: "tooltip-top",
|
|
7
|
+
bottom: "tooltip-bottom"
|
|
8
|
+
}, f = ({
|
|
9
|
+
children: s,
|
|
10
|
+
onClick: n,
|
|
11
|
+
type: d = "default",
|
|
12
|
+
shape: p = "circle",
|
|
13
|
+
position: l = "bottom-right",
|
|
14
|
+
offset: e = 24,
|
|
50
15
|
className: h = "",
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
let s = p.formState.errors;
|
|
61
|
-
for (const E of o) {
|
|
62
|
-
if (!s) break;
|
|
63
|
-
s = s[E];
|
|
64
|
-
}
|
|
65
|
-
return s;
|
|
66
|
-
})(N), b = A?.message, L = c ? Array.isArray(c) ? c : [c] : [], u = {}, P = [], w = [];
|
|
67
|
-
i && (u.required = "This field is required");
|
|
68
|
-
for (const e of L) {
|
|
69
|
-
if (e.required && (u.required = typeof e.required == "string" ? e.required : e.message || "This field is required"), e.type && $[e.type] && P.push({
|
|
70
|
-
pattern: $[e.type].value,
|
|
71
|
-
message: e.message || $[e.type].message
|
|
72
|
-
}), e.min !== void 0) {
|
|
73
|
-
const o = typeof e.min == "object" ? e.min.value : e.min, s = typeof e.min == "object" ? e.min.message : e.message || `Minimum length is ${o} characters`;
|
|
74
|
-
u.minLength = { value: o, message: s };
|
|
75
|
-
}
|
|
76
|
-
if (e.max !== void 0) {
|
|
77
|
-
const o = typeof e.max == "object" ? e.max.value : e.max, s = typeof e.max == "object" ? e.max.message : e.message || `Maximum length is ${o} characters`;
|
|
78
|
-
u.maxLength = { value: o, message: s };
|
|
79
|
-
}
|
|
80
|
-
if (e.pattern) {
|
|
81
|
-
const o = e.pattern instanceof RegExp ? e.pattern : e.pattern.value, s = e.pattern instanceof RegExp ? e.message || "Invalid format" : e.pattern.message;
|
|
82
|
-
P.push({ pattern: o, message: s });
|
|
83
|
-
}
|
|
84
|
-
e.validate && w.push(e.validate);
|
|
85
|
-
}
|
|
86
|
-
return (P.length > 0 || w.length > 0) && (u.validate = async (e) => {
|
|
87
|
-
if (!e && !u.required) return !0;
|
|
88
|
-
for (const { pattern: o, message: s } of P)
|
|
89
|
-
if (e && !o.test(e))
|
|
90
|
-
return s;
|
|
91
|
-
for (const o of w) {
|
|
92
|
-
const s = await o(e);
|
|
93
|
-
if (s !== !0)
|
|
94
|
-
return s;
|
|
95
|
-
}
|
|
96
|
-
return !0;
|
|
97
|
-
}), /* @__PURE__ */ n(
|
|
98
|
-
D,
|
|
16
|
+
tooltip: r,
|
|
17
|
+
tooltipPlacement: u = "left",
|
|
18
|
+
...i
|
|
19
|
+
}) => {
|
|
20
|
+
const c = [
|
|
21
|
+
"btn",
|
|
22
|
+
"btn-lg",
|
|
23
|
+
"shadow-lg",
|
|
24
|
+
p === "circle" ? "btn-circle" : "btn-square",
|
|
99
25
|
{
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
}
|
|
155
|
-
const Q = Object.assign(H, {
|
|
156
|
-
Item: U,
|
|
157
|
-
List: W,
|
|
158
|
-
useForm: Y
|
|
159
|
-
});
|
|
26
|
+
default: "btn-neutral",
|
|
27
|
+
primary: "btn-primary",
|
|
28
|
+
secondary: "btn-secondary",
|
|
29
|
+
accent: "btn-accent"
|
|
30
|
+
}[d],
|
|
31
|
+
h
|
|
32
|
+
].filter(Boolean).join(" "), a = {
|
|
33
|
+
position: "fixed",
|
|
34
|
+
zIndex: 1e3,
|
|
35
|
+
...l.includes("bottom") ? { bottom: e } : { top: e },
|
|
36
|
+
...l.includes("right") ? { right: e } : { left: e }
|
|
37
|
+
}, o = /* @__PURE__ */ t("button", { className: c, onClick: n, style: a, ...i, children: s || /* @__PURE__ */ t("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-6 w-6", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 4v16m8-8H4" }) }) });
|
|
38
|
+
return r ? /* @__PURE__ */ t("div", { className: `tooltip ${k[u]}`, "data-tip": r, style: a, children: /* @__PURE__ */ t("button", { className: c, onClick: n, style: { position: "static" }, ...i, children: s || /* @__PURE__ */ t("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-6 w-6", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 4v16m8-8H4" }) }) }) }) : o;
|
|
39
|
+
}, x = ({
|
|
40
|
+
visibilityHeight: s = 400,
|
|
41
|
+
target: n,
|
|
42
|
+
onClick: d,
|
|
43
|
+
children: p,
|
|
44
|
+
position: l = "bottom-right",
|
|
45
|
+
offset: e = 24,
|
|
46
|
+
className: h = "",
|
|
47
|
+
...r
|
|
48
|
+
}) => {
|
|
49
|
+
const [u, i] = g(!1);
|
|
50
|
+
v(() => {
|
|
51
|
+
const o = n ? n() : window, m = () => {
|
|
52
|
+
const b = o instanceof Window ? window.scrollY : o.scrollTop;
|
|
53
|
+
i(b >= s);
|
|
54
|
+
};
|
|
55
|
+
return o.addEventListener("scroll", m), m(), () => o.removeEventListener("scroll", m);
|
|
56
|
+
}, [n, s]);
|
|
57
|
+
const w = () => {
|
|
58
|
+
d?.();
|
|
59
|
+
const o = n ? n() : window;
|
|
60
|
+
o instanceof Window ? window.scrollTo({ top: 0, behavior: "smooth" }) : o.scrollTo({ top: 0, behavior: "smooth" });
|
|
61
|
+
};
|
|
62
|
+
if (!u) return null;
|
|
63
|
+
const c = [
|
|
64
|
+
"btn",
|
|
65
|
+
"btn-lg",
|
|
66
|
+
"btn-circle",
|
|
67
|
+
"btn-neutral",
|
|
68
|
+
"shadow-lg",
|
|
69
|
+
"transition-opacity",
|
|
70
|
+
h
|
|
71
|
+
].filter(Boolean).join(" "), a = {
|
|
72
|
+
position: "fixed",
|
|
73
|
+
zIndex: 1e3,
|
|
74
|
+
bottom: e,
|
|
75
|
+
...l.includes("right") ? { right: e } : { left: e }
|
|
76
|
+
};
|
|
77
|
+
return /* @__PURE__ */ t("button", { className: c, onClick: w, style: a, ...r, children: p || /* @__PURE__ */ t("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-6 w-6", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 10l7-7m0 0l7 7m-7-7v18" }) }) });
|
|
78
|
+
};
|
|
79
|
+
f.BackTop = x;
|
|
160
80
|
export {
|
|
161
|
-
|
|
162
|
-
Y as useFormInstance
|
|
81
|
+
f as FloatButton
|
|
163
82
|
};
|
|
164
83
|
//# sourceMappingURL=index29.js.map
|
package/dist/index29.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index29.js","sources":["../src/components/Form.tsx"],"sourcesContent":["import React, { createContext, useContext, cloneElement, isValidElement, useId } from 'react'\nimport { useForm, UseFormReturn, FieldValues, SubmitHandler, UseFormProps, Controller, useFieldArray, FieldArrayPath, FieldArray } from 'react-hook-form'\n\ninterface FormContextValue {\n form: UseFormReturn<any>\n layout?: 'vertical' | 'horizontal' | 'inline'\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n listName?: string\n}\n\nconst FormContext = createContext<FormContextValue | undefined>(undefined)\n\n// Built-in type validators\nconst TYPE_VALIDATORS = {\n email: {\n value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i,\n message: 'Please enter a valid email address',\n },\n url: {\n value: /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$/,\n message: 'Please enter a valid URL',\n },\n number: {\n value: /^-?\\d+(\\.\\d+)?$/,\n message: 'Please enter a valid number',\n },\n}\n\nexport interface FormProps<TFieldValues extends FieldValues = FieldValues>\n extends Omit<React.FormHTMLAttributes<HTMLFormElement>, 'onSubmit'> {\n form?: UseFormReturn<TFieldValues>\n onFinish?: SubmitHandler<TFieldValues>\n initialValues?: UseFormProps<TFieldValues>['defaultValues']\n layout?: 'vertical' | 'horizontal' | 'inline'\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n children: React.ReactNode\n}\n\nexport interface FormRule {\n required?: boolean | string\n type?: 'email' | 'url' | 'number'\n min?: number | { value: number; message: string }\n max?: number | { value: number; message: string }\n pattern?: RegExp | { value: RegExp; message: string }\n message?: string\n validate?: (value: any) => boolean | string | Promise<boolean | string>\n}\n\nexport interface FormItemProps {\n name?: string | string[]\n label?: string\n help?: string\n required?: boolean\n rules?: FormRule | FormRule[]\n valuePropName?: string\n inline?: boolean\n className?: string\n children: React.ReactElement\n}\n\nexport interface FormListProps<TFieldValues extends FieldValues = FieldValues> {\n name: FieldArrayPath<TFieldValues>\n children: (\n fields: FieldArray<TFieldValues>[],\n operations: {\n add: (value?: any) => void\n remove: (index: number) => void\n move: (from: number, to: number) => void\n }\n ) => React.ReactNode\n}\n\nfunction useFormContext() {\n const context = useContext(FormContext)\n if (!context) {\n throw new Error('Form compound components must be used within Form')\n }\n return context\n}\n\nfunction FormRoot<TFieldValues extends FieldValues = FieldValues>({\n form: externalForm,\n onFinish,\n initialValues,\n layout = 'vertical',\n size,\n children,\n className = '',\n noValidate = true,\n ...props\n}: FormProps<TFieldValues>) {\n const internalForm = useForm<TFieldValues>({\n defaultValues: initialValues,\n })\n\n const form = externalForm || internalForm\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n if (onFinish) {\n form.handleSubmit(onFinish)(e)\n }\n }\n\n return (\n <FormContext.Provider value={{ form, layout, size }}>\n <form onSubmit={handleSubmit} className={className} noValidate={noValidate} {...props}>\n {children}\n </form>\n </FormContext.Provider>\n )\n}\n\nfunction FormItem({\n name,\n label,\n help,\n required = false,\n rules,\n valuePropName = 'value',\n inline = false,\n className = '',\n children,\n}: FormItemProps) {\n const { form, size, listName, layout } = useFormContext()\n const inputId = useId()\n const errorId = useId()\n\n if (!name) {\n // Render without form control if no name provided\n return <div className={`form-control ${inline ? 'w-auto' : 'w-full'} ${className}`}>{children}</div>\n }\n\n // Handle nested field names (for Form.List)\n let fieldName: string\n if (Array.isArray(name)) {\n // If we're inside a Form.List, prepend the list name\n const fullPath = listName ? [listName, ...name] : name\n fieldName = fullPath.join('.')\n } else {\n fieldName = name\n }\n\n // Get error by traversing the error object path\n const getErrorByPath = (path: string) => {\n const keys = path.split('.')\n let error: any = form.formState.errors\n for (const key of keys) {\n if (!error) break\n error = error[key]\n }\n return error\n }\n\n const error = getErrorByPath(fieldName)\n const errorMessage = error?.message as string | undefined\n\n // Normalize rules to array\n const rulesArray: FormRule[] = rules\n ? Array.isArray(rules) ? rules : [rules]\n : []\n\n // Build validation rules\n const validationRules: any = {}\n const patternValidators: Array<{ pattern: RegExp; message: string }> = []\n const customValidators: Array<(value: any) => boolean | string | Promise<boolean | string>> = []\n\n // Handle top-level required prop\n if (required) {\n validationRules.required = 'This field is required'\n }\n\n // Process each rule\n for (const rule of rulesArray) {\n // Required\n if (rule.required) {\n validationRules.required = typeof rule.required === 'string'\n ? rule.required\n : rule.message || 'This field is required'\n }\n\n // Type validator\n if (rule.type && TYPE_VALIDATORS[rule.type]) {\n patternValidators.push({\n pattern: TYPE_VALIDATORS[rule.type].value,\n message: rule.message || TYPE_VALIDATORS[rule.type].message,\n })\n }\n\n // Min length\n if (rule.min !== undefined) {\n const minValue = typeof rule.min === 'object' ? rule.min.value : rule.min\n const minMessage = typeof rule.min === 'object'\n ? rule.min.message\n : rule.message || `Minimum length is ${minValue} characters`\n validationRules.minLength = { value: minValue, message: minMessage }\n }\n\n // Max length\n if (rule.max !== undefined) {\n const maxValue = typeof rule.max === 'object' ? rule.max.value : rule.max\n const maxMessage = typeof rule.max === 'object'\n ? rule.max.message\n : rule.message || `Maximum length is ${maxValue} characters`\n validationRules.maxLength = { value: maxValue, message: maxMessage }\n }\n\n // Pattern - collect all patterns\n if (rule.pattern) {\n const patternValue = rule.pattern instanceof RegExp ? rule.pattern : rule.pattern.value\n const patternMessage = rule.pattern instanceof RegExp\n ? rule.message || 'Invalid format'\n : rule.pattern.message\n patternValidators.push({ pattern: patternValue, message: patternMessage })\n }\n\n // Custom validator\n if (rule.validate) {\n customValidators.push(rule.validate)\n }\n }\n\n // Combine all pattern and custom validators into a single validate function\n if (patternValidators.length > 0 || customValidators.length > 0) {\n validationRules.validate = async (value: any) => {\n // Skip validation if empty (required rule handles that)\n if (!value && !validationRules.required) return true\n\n // Check all patterns\n for (const { pattern, message } of patternValidators) {\n if (value && !pattern.test(value)) {\n return message\n }\n }\n\n // Run all custom validators\n for (const validator of customValidators) {\n const result = await validator(value)\n if (result !== true) {\n return result\n }\n }\n\n return true\n }\n }\n\n return (\n <Controller\n name={fieldName}\n control={form.control}\n rules={validationRules}\n render={({ field }) => {\n const { value, onChange, onBlur, ref } = field\n\n // Clone the child element and inject form control props\n const childProps: any = {\n id: inputId,\n ref,\n onBlur,\n 'aria-invalid': error ? true : undefined,\n 'aria-describedby': error ? errorId : undefined,\n }\n\n // Handle different value prop names (e.g., 'checked' for checkboxes)\n if (valuePropName === 'checked') {\n childProps.checked = value\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => onChange(e.target.checked)\n } else {\n childProps.value = value || ''\n childProps.onChange = (eventOrValue: any) => {\n // Handle components that pass value directly (e.g., Range, Rating)\n // vs components that pass event object (e.g., Input, Select)\n if (eventOrValue && eventOrValue.target !== undefined) {\n onChange(eventOrValue.target.value)\n } else {\n onChange(eventOrValue)\n }\n }\n }\n\n // Apply size if specified at form level\n if (size && isValidElement(children)) {\n const existingProps = children.props as any\n if (!existingProps.size) {\n childProps.size = size\n }\n }\n\n // Apply error styling\n if (error) {\n childProps.color = 'error'\n }\n\n const enhancedChild = isValidElement(children)\n ? cloneElement(children as React.ReactElement<any>, childProps)\n : children\n\n const isHorizontal = layout === 'horizontal'\n\n return (\n <div className={`form-control ${inline ? 'w-auto' : 'w-full'} ${className}`}>\n <div className={isHorizontal ? 'flex items-center gap-4' : ''}>\n {label && (\n <label htmlFor={inputId} className={`label ${isHorizontal ? 'flex-shrink-0' : 'mb-2'}`}>\n <span className=\"label-text\">\n {label}\n {required && <span className=\"text-error ml-1\">*</span>}\n </span>\n </label>\n )}\n <div className={isHorizontal ? 'flex-1' : ''}>\n {enhancedChild}\n </div>\n </div>\n {!isHorizontal && !inline && (\n <div className=\"label\">\n <span id={errorId} className=\"label-text-alt text-error min-h-[1.25rem]\" role={errorMessage ? 'alert' : undefined}>\n {errorMessage || (help && <span className=\"text-base-content/70\">{help}</span>) || '\\u00A0'}\n </span>\n </div>\n )}\n {isHorizontal && (errorMessage || help) && (\n <div className=\"label\">\n <span id={errorId} className=\"label-text-alt text-error min-h-[1.25rem] ml-auto\" role={errorMessage ? 'alert' : undefined}>\n {errorMessage || (help && <span className=\"text-base-content/70\">{help}</span>)}\n </span>\n </div>\n )}\n </div>\n )\n }}\n />\n )\n}\n\nfunction FormList<TFieldValues extends FieldValues = FieldValues>({\n name,\n children,\n}: FormListProps<TFieldValues>) {\n const { form, layout, size } = useFormContext()\n\n const { fields, append, remove, move } = useFieldArray({\n control: form.control,\n name,\n })\n\n // Add name (index) to each field for proper path construction\n const fieldsWithName = fields.map((field, index) => ({\n ...field,\n name: index,\n }))\n\n return (\n <FormContext.Provider value={{ form, layout, size, listName: name as string }}>\n {children(fieldsWithName as any, {\n add: append,\n remove,\n move,\n })}\n </FormContext.Provider>\n )\n}\n\n// Enhanced hook to expose full form API\nexport function useFormInstance<TFieldValues extends FieldValues = FieldValues>() {\n const formInstance = useForm<TFieldValues>()\n\n // Add convenience methods to the instance\n const enhancedInstance = formInstance as typeof formInstance & {\n setFieldValue: typeof formInstance.setValue\n getFieldValue: (name: any) => any\n getFieldsValue: typeof formInstance.getValues\n setFieldsValue: (values: any) => void\n validateFields: typeof formInstance.trigger\n resetFields: typeof formInstance.reset\n isFieldTouched: (name: string) => boolean\n getFieldError: (name: string) => string | undefined\n }\n\n // Add the alias methods\n enhancedInstance.setFieldValue = formInstance.setValue\n enhancedInstance.getFieldValue = (name: any) => formInstance.getValues(name)\n enhancedInstance.getFieldsValue = formInstance.getValues\n enhancedInstance.setFieldsValue = (values: any) => {\n Object.keys(values).forEach((key) => {\n formInstance.setValue(key as any, values[key])\n })\n }\n enhancedInstance.validateFields = formInstance.trigger\n enhancedInstance.resetFields = formInstance.reset\n enhancedInstance.isFieldTouched = (name: string) => {\n const touched = formInstance.formState.touchedFields as any\n return !!touched[name]\n }\n enhancedInstance.getFieldError = (name: string) => {\n const errors = formInstance.formState.errors as any\n return errors[name]?.message as string | undefined\n }\n\n return enhancedInstance\n}\n\nexport const Form = Object.assign(FormRoot, {\n Item: FormItem,\n List: FormList,\n useForm: useFormInstance,\n})\n\nexport type { UseFormReturn as FormInstance }\n"],"names":["FormContext","createContext","TYPE_VALIDATORS","useFormContext","context","useContext","FormRoot","externalForm","onFinish","initialValues","layout","size","children","className","noValidate","props","internalForm","useForm","form","handleSubmit","e","jsx","FormItem","name","label","help","required","rules","valuePropName","inline","listName","inputId","useId","errorId","fieldName","error","path","keys","key","errorMessage","rulesArray","validationRules","patternValidators","customValidators","rule","minValue","minMessage","maxValue","maxMessage","patternValue","patternMessage","value","pattern","message","validator","result","Controller","field","onChange","onBlur","ref","childProps","eventOrValue","isValidElement","enhancedChild","cloneElement","isHorizontal","jsxs","FormList","fields","append","remove","move","useFieldArray","fieldsWithName","index","useFormInstance","formInstance","enhancedInstance","values","Form"],"mappings":";;;AAUA,MAAMA,IAAcC,EAA4C,MAAS,GAGnEC,IAAkB;AAAA,EACtB,OAAO;AAAA,IACL,OAAO;AAAA,IACP,SAAS;AAAA,EAAA;AAAA,EAEX,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SAAS;AAAA,EAAA;AAAA,EAEX,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,EAAA;AAEb;AA8CA,SAASC,IAAiB;AACxB,QAAMC,IAAUC,EAAWL,CAAW;AACtC,MAAI,CAACI;AACH,UAAM,IAAI,MAAM,mDAAmD;AAErE,SAAOA;AACT;AAEA,SAASE,EAAyD;AAAA,EAChE,MAAMC;AAAA,EACN,UAAAC;AAAA,EACA,eAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,YAAAC,IAAa;AAAA,EACb,GAAGC;AACL,GAA4B;AAC1B,QAAMC,IAAeC,EAAsB;AAAA,IACzC,eAAeR;AAAA,EAAA,CAChB,GAEKS,IAAOX,KAAgBS,GAEvBG,IAAe,CAACC,MAAwC;AAC5D,IAAAA,EAAE,eAAA,GACEZ,KACFU,EAAK,aAAaV,CAAQ,EAAEY,CAAC;AAAA,EAEjC;AAEA,2BACGpB,EAAY,UAAZ,EAAqB,OAAO,EAAE,MAAAkB,GAAM,QAAAR,GAAQ,MAAAC,EAAA,GAC3C,UAAA,gBAAAU,EAAC,QAAA,EAAK,UAAUF,GAAc,WAAAN,GAAsB,YAAAC,GAAyB,GAAGC,GAC7E,UAAAH,GACH,GACF;AAEJ;AAEA,SAASU,EAAS;AAAA,EAChB,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,OAAAC;AAAA,EACA,eAAAC,IAAgB;AAAA,EAChB,QAAAC,IAAS;AAAA,EACT,WAAAhB,IAAY;AAAA,EACZ,UAAAD;AACF,GAAkB;AAChB,QAAM,EAAE,MAAAM,GAAM,MAAAP,GAAM,UAAAmB,GAAU,QAAApB,EAAA,IAAWP,EAAA,GACnC4B,IAAUC,EAAA,GACVC,IAAUD,EAAA;AAEhB,MAAI,CAACT;AAEH,WAAO,gBAAAF,EAAC,OAAA,EAAI,WAAW,gBAAgBQ,IAAS,WAAW,QAAQ,IAAIhB,CAAS,IAAK,UAAAD,EAAA,CAAS;AAIhG,MAAIsB;AACJ,EAAI,MAAM,QAAQX,CAAI,IAGpBW,KADiBJ,IAAW,CAACA,GAAU,GAAGP,CAAI,IAAIA,GAC7B,KAAK,GAAG,IAE7BW,IAAYX;AAcd,QAAMY,KAViB,CAACC,MAAiB;AACvC,UAAMC,IAAOD,EAAK,MAAM,GAAG;AAC3B,QAAID,IAAajB,EAAK,UAAU;AAChC,eAAWoB,KAAOD,GAAM;AACtB,UAAI,CAACF,EAAO;AACZA,MAAAA,IAAQA,EAAMG,CAAG;AAAA,IACnB;AACA,WAAOH;AAAAA,EACT,GAE6BD,CAAS,GAChCK,IAAeJ,GAAO,SAGtBK,IAAyBb,IAC3B,MAAM,QAAQA,CAAK,IAAIA,IAAQ,CAACA,CAAK,IACrC,CAAA,GAGEc,IAAuB,CAAA,GACvBC,IAAiE,CAAA,GACjEC,IAAwF,CAAA;AAG9F,EAAIjB,MACFe,EAAgB,WAAW;AAI7B,aAAWG,KAAQJ,GAAY;AAiB7B,QAfII,EAAK,aACPH,EAAgB,WAAW,OAAOG,EAAK,YAAa,WAChDA,EAAK,WACLA,EAAK,WAAW,2BAIlBA,EAAK,QAAQ1C,EAAgB0C,EAAK,IAAI,KACxCF,EAAkB,KAAK;AAAA,MACrB,SAASxC,EAAgB0C,EAAK,IAAI,EAAE;AAAA,MACpC,SAASA,EAAK,WAAW1C,EAAgB0C,EAAK,IAAI,EAAE;AAAA,IAAA,CACrD,GAICA,EAAK,QAAQ,QAAW;AAC1B,YAAMC,IAAW,OAAOD,EAAK,OAAQ,WAAWA,EAAK,IAAI,QAAQA,EAAK,KAChEE,IAAa,OAAOF,EAAK,OAAQ,WACnCA,EAAK,IAAI,UACTA,EAAK,WAAW,qBAAqBC,CAAQ;AACjD,MAAAJ,EAAgB,YAAY,EAAE,OAAOI,GAAU,SAASC,EAAA;AAAA,IAC1D;AAGA,QAAIF,EAAK,QAAQ,QAAW;AAC1B,YAAMG,IAAW,OAAOH,EAAK,OAAQ,WAAWA,EAAK,IAAI,QAAQA,EAAK,KAChEI,IAAa,OAAOJ,EAAK,OAAQ,WACnCA,EAAK,IAAI,UACTA,EAAK,WAAW,qBAAqBG,CAAQ;AACjD,MAAAN,EAAgB,YAAY,EAAE,OAAOM,GAAU,SAASC,EAAA;AAAA,IAC1D;AAGA,QAAIJ,EAAK,SAAS;AAChB,YAAMK,IAAeL,EAAK,mBAAmB,SAASA,EAAK,UAAUA,EAAK,QAAQ,OAC5EM,IAAiBN,EAAK,mBAAmB,SAC3CA,EAAK,WAAW,mBAChBA,EAAK,QAAQ;AACjB,MAAAF,EAAkB,KAAK,EAAE,SAASO,GAAc,SAASC,GAAgB;AAAA,IAC3E;AAGA,IAAIN,EAAK,YACPD,EAAiB,KAAKC,EAAK,QAAQ;AAAA,EAEvC;AAGA,UAAIF,EAAkB,SAAS,KAAKC,EAAiB,SAAS,OAC5DF,EAAgB,WAAW,OAAOU,MAAe;AAE/C,QAAI,CAACA,KAAS,CAACV,EAAgB,SAAU,QAAO;AAGhD,eAAW,EAAE,SAAAW,GAAS,SAAAC,EAAA,KAAaX;AACjC,UAAIS,KAAS,CAACC,EAAQ,KAAKD,CAAK;AAC9B,eAAOE;AAKX,eAAWC,KAAaX,GAAkB;AACxC,YAAMY,IAAS,MAAMD,EAAUH,CAAK;AACpC,UAAII,MAAW;AACb,eAAOA;AAAA,IAEX;AAEA,WAAO;AAAA,EACT,IAIA,gBAAAlC;AAAA,IAACmC;AAAA,IAAA;AAAA,MACC,MAAMtB;AAAA,MACN,SAAShB,EAAK;AAAA,MACd,OAAOuB;AAAA,MACP,QAAQ,CAAC,EAAE,OAAAgB,QAAY;AACrB,cAAM,EAAE,OAAAN,GAAO,UAAAO,GAAU,QAAAC,GAAQ,KAAAC,MAAQH,GAGnCI,IAAkB;AAAA,UACtB,IAAI9B;AAAA,UACJ,KAAA6B;AAAA,UACA,QAAAD;AAAA,UACA,gBAAgBxB,IAAQ,KAAO;AAAA,UAC/B,oBAAoBA,IAAQF,IAAU;AAAA,QAAA;AAIxC,QAAIL,MAAkB,aACpBiC,EAAW,UAAUV,GACrBU,EAAW,WAAW,CAACzC,MAA2CsC,EAAStC,EAAE,OAAO,OAAO,MAE3FyC,EAAW,QAAQV,KAAS,IAC5BU,EAAW,WAAW,CAACC,MAAsB;AAG3C,UAAIA,KAAgBA,EAAa,WAAW,SAC1CJ,EAASI,EAAa,OAAO,KAAK,IAElCJ,EAASI,CAAY;AAAA,QAEzB,IAIEnD,KAAQoD,EAAenD,CAAQ,MACXA,EAAS,MACZ,SACjBiD,EAAW,OAAOlD,KAKlBwB,MACF0B,EAAW,QAAQ;AAGrB,cAAMG,IAAgBD,EAAenD,CAAQ,IACzCqD,EAAarD,GAAqCiD,CAAU,IAC5DjD,GAEEsD,IAAexD,MAAW;AAEhC,eACE,gBAAAyD,EAAC,SAAI,WAAW,gBAAgBtC,IAAS,WAAW,QAAQ,IAAIhB,CAAS,IACvE,UAAA;AAAA,UAAA,gBAAAsD,EAAC,OAAA,EAAI,WAAWD,IAAe,4BAA4B,IACxD,UAAA;AAAA,YAAA1C,KACC,gBAAAH,EAAC,SAAA,EAAM,SAASU,GAAS,WAAW,SAASmC,IAAe,kBAAkB,MAAM,IAClF,UAAA,gBAAAC,EAAC,QAAA,EAAK,WAAU,cACb,UAAA;AAAA,cAAA3C;AAAA,cACAE,KAAY,gBAAAL,EAAC,QAAA,EAAK,WAAU,mBAAkB,UAAA,IAAA,CAAC;AAAA,YAAA,EAAA,CAClD,EAAA,CACF;AAAA,8BAED,OAAA,EAAI,WAAW6C,IAAe,WAAW,IACvC,UAAAF,EAAA,CACH;AAAA,UAAA,GACF;AAAA,UACC,CAACE,KAAgB,CAACrC,KACjB,gBAAAR,EAAC,OAAA,EAAI,WAAU,SACb,UAAA,gBAAAA,EAAC,QAAA,EAAK,IAAIY,GAAS,WAAU,6CAA4C,MAAMM,IAAe,UAAU,QACrG,UAAAA,KAAiBd,KAAQ,gBAAAJ,EAAC,QAAA,EAAK,WAAU,wBAAwB,UAAAI,EAAA,CAAK,KAAY,IAAA,CACrF,GACF;AAAA,UAEDyC,MAAiB3B,KAAgBd,MAChC,gBAAAJ,EAAC,OAAA,EAAI,WAAU,SACb,UAAA,gBAAAA,EAAC,QAAA,EAAK,IAAIY,GAAS,WAAU,qDAAoD,MAAMM,IAAe,UAAU,QAC7G,UAAAA,KAAiBd,KAAQ,gBAAAJ,EAAC,QAAA,EAAK,WAAU,wBAAwB,UAAAI,EAAA,CAAK,EAAA,CACzE,EAAA,CACF;AAAA,QAAA,GAEJ;AAAA,MAEJ;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,SAAS2C,EAAyD;AAAA,EAChE,MAAA7C;AAAA,EACA,UAAAX;AACF,GAAgC;AAC9B,QAAM,EAAE,MAAAM,GAAM,QAAAR,GAAQ,MAAAC,EAAA,IAASR,EAAA,GAEzB,EAAE,QAAAkE,GAAQ,QAAAC,GAAQ,QAAAC,GAAQ,MAAAC,EAAA,IAASC,EAAc;AAAA,IACrD,SAASvD,EAAK;AAAA,IACd,MAAAK;AAAA,EAAA,CACD,GAGKmD,IAAiBL,EAAO,IAAI,CAACZ,GAAOkB,OAAW;AAAA,IACnD,GAAGlB;AAAA,IACH,MAAMkB;AAAA,EAAA,EACN;AAEF,SACE,gBAAAtD,EAACrB,EAAY,UAAZ,EAAqB,OAAO,EAAE,MAAAkB,GAAM,QAAAR,GAAQ,MAAAC,GAAM,UAAUY,EAAA,GAC1D,YAASmD,GAAuB;AAAA,IAC/B,KAAKJ;AAAA,IACL,QAAAC;AAAA,IACA,MAAAC;AAAA,EAAA,CACD,GACH;AAEJ;AAGO,SAASI,IAAkE;AAChF,QAAMC,IAAe5D,EAAA,GAGf6D,IAAmBD;AAYzB,SAAAC,EAAiB,gBAAgBD,EAAa,UAC9CC,EAAiB,gBAAgB,CAACvD,MAAcsD,EAAa,UAAUtD,CAAI,GAC3EuD,EAAiB,iBAAiBD,EAAa,WAC/CC,EAAiB,iBAAiB,CAACC,MAAgB;AACjD,WAAO,KAAKA,CAAM,EAAE,QAAQ,CAACzC,MAAQ;AACnC,MAAAuC,EAAa,SAASvC,GAAYyC,EAAOzC,CAAG,CAAC;AAAA,IAC/C,CAAC;AAAA,EACH,GACAwC,EAAiB,iBAAiBD,EAAa,SAC/CC,EAAiB,cAAcD,EAAa,OAC5CC,EAAiB,iBAAiB,CAACvD,MAE1B,CAAC,CADQsD,EAAa,UAAU,cACtBtD,CAAI,GAEvBuD,EAAiB,gBAAgB,CAACvD,MACjBsD,EAAa,UAAU,OACxBtD,CAAI,GAAG,SAGhBuD;AACT;AAEO,MAAME,IAAO,OAAO,OAAO1E,GAAU;AAAA,EAC1C,MAAMgB;AAAA,EACN,MAAM8C;AAAA,EACN,SAASQ;AACX,CAAC;"}
|
|
1
|
+
{"version":3,"file":"index29.js","sources":["../src/components/FloatButton.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react'\n\nexport interface FloatButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {\n /** Button content (icon or text) */\n children?: React.ReactNode\n /** Button type/color */\n type?: 'default' | 'primary' | 'secondary' | 'accent'\n /** Button shape */\n shape?: 'circle' | 'square'\n /** Position on screen */\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\n /** Distance from edge in pixels */\n offset?: number\n /** Tooltip text */\n tooltip?: string\n /** Tooltip placement */\n tooltipPlacement?: 'left' | 'right' | 'top' | 'bottom'\n}\n\nexport interface BackTopProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type' | 'onClick'> {\n /** Scroll threshold to show button (pixels) */\n visibilityHeight?: number\n /** Scroll target (default: window) */\n target?: () => HTMLElement | Window\n /** Click handler (called before scrolling) */\n onClick?: () => void\n /** Custom content */\n children?: React.ReactNode\n /** Position on screen */\n position?: 'bottom-right' | 'bottom-left'\n /** Distance from edge in pixels */\n offset?: number\n}\n\nconst tooltipPlacementClasses = {\n left: 'tooltip-left',\n right: 'tooltip-right',\n top: 'tooltip-top',\n bottom: 'tooltip-bottom',\n}\n\nexport const FloatButton: React.FC<FloatButtonProps> & { BackTop: React.FC<BackTopProps> } = ({\n children,\n onClick,\n type = 'default',\n shape = 'circle',\n position = 'bottom-right',\n offset = 24,\n className = '',\n tooltip,\n tooltipPlacement = 'left',\n ...rest\n}) => {\n const typeClasses = {\n default: 'btn-neutral',\n primary: 'btn-primary',\n secondary: 'btn-secondary',\n accent: 'btn-accent',\n }\n\n const buttonClasses = [\n 'btn',\n 'btn-lg',\n 'shadow-lg',\n shape === 'circle' ? 'btn-circle' : 'btn-square',\n typeClasses[type],\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const style: React.CSSProperties = {\n position: 'fixed',\n zIndex: 1000,\n ...(position.includes('bottom') ? { bottom: offset } : { top: offset }),\n ...(position.includes('right') ? { right: offset } : { left: offset }),\n }\n\n const button = (\n <button className={buttonClasses} onClick={onClick} style={style} {...rest}>\n {children || (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n )}\n </button>\n )\n\n if (tooltip) {\n return (\n <div className={`tooltip ${tooltipPlacementClasses[tooltipPlacement]}`} data-tip={tooltip} style={style}>\n <button className={buttonClasses} onClick={onClick} style={{ position: 'static' }} {...rest}>\n {children || (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n )}\n </button>\n </div>\n )\n }\n\n return button\n}\n\nconst BackTop: React.FC<BackTopProps> = ({\n visibilityHeight = 400,\n target,\n onClick,\n children,\n position = 'bottom-right',\n offset = 24,\n className = '',\n ...rest\n}) => {\n const [visible, setVisible] = useState(false)\n\n useEffect(() => {\n const scrollTarget = target ? target() : window\n\n const handleScroll = () => {\n const scrollTop =\n scrollTarget instanceof Window\n ? window.scrollY\n : (scrollTarget as HTMLElement).scrollTop\n\n setVisible(scrollTop >= visibilityHeight)\n }\n\n scrollTarget.addEventListener('scroll', handleScroll)\n handleScroll()\n\n return () => scrollTarget.removeEventListener('scroll', handleScroll)\n }, [target, visibilityHeight])\n\n const handleClick = () => {\n onClick?.()\n const scrollTarget = target ? target() : window\n if (scrollTarget instanceof Window) {\n window.scrollTo({ top: 0, behavior: 'smooth' })\n } else {\n (scrollTarget as HTMLElement).scrollTo({ top: 0, behavior: 'smooth' })\n }\n }\n\n if (!visible) return null\n\n const buttonClasses = [\n 'btn',\n 'btn-lg',\n 'btn-circle',\n 'btn-neutral',\n 'shadow-lg',\n 'transition-opacity',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const style: React.CSSProperties = {\n position: 'fixed',\n zIndex: 1000,\n bottom: offset,\n ...(position.includes('right') ? { right: offset } : { left: offset }),\n }\n\n return (\n <button className={buttonClasses} onClick={handleClick} style={style} {...rest}>\n {children || (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 10l7-7m0 0l7 7m-7-7v18\" />\n </svg>\n )}\n </button>\n )\n}\n\nFloatButton.BackTop = BackTop\n"],"names":["tooltipPlacementClasses","FloatButton","children","onClick","type","shape","position","offset","className","tooltip","tooltipPlacement","rest","buttonClasses","style","button","jsx","BackTop","visibilityHeight","target","visible","setVisible","useState","useEffect","scrollTarget","handleScroll","scrollTop","handleClick"],"mappings":";;AAkCA,MAAMA,IAA0B;AAAA,EAC9B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AACV,GAEaC,IAAgF,CAAC;AAAA,EAC5F,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,OAAAC,IAAQ;AAAA,EACR,UAAAC,IAAW;AAAA,EACX,QAAAC,IAAS;AAAA,EACT,WAAAC,IAAY;AAAA,EACZ,SAAAC;AAAA,EACA,kBAAAC,IAAmB;AAAA,EACnB,GAAGC;AACL,MAAM;AAQJ,QAAMC,IAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACAP,MAAU,WAAW,eAAe;AAAA,IAXlB;AAAA,MAClB,SAAS;AAAA,MACT,SAAS;AAAA,MACT,WAAW;AAAA,MACX,QAAQ;AAAA,IAAA,EAQID,CAAI;AAAA,IAChBI;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GAELK,IAA6B;AAAA,IACjC,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,GAAIP,EAAS,SAAS,QAAQ,IAAI,EAAE,QAAQC,EAAA,IAAW,EAAE,KAAKA,EAAA;AAAA,IAC9D,GAAID,EAAS,SAAS,OAAO,IAAI,EAAE,OAAOC,EAAA,IAAW,EAAE,MAAMA,EAAA;AAAA,EAAO,GAGhEO,IACJ,gBAAAC,EAAC,UAAA,EAAO,WAAWH,GAAe,SAAAT,GAAkB,OAAAU,GAAe,GAAGF,GACnE,UAAAT,KACC,gBAAAa,EAAC,OAAA,EAAI,OAAM,8BAA6B,WAAU,WAAU,MAAK,QAAO,SAAQ,aAAY,QAAO,gBACjG,4BAAC,QAAA,EAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,iBAAA,CAAiB,GACxF,GAEJ;AAGF,SAAIN,IAEA,gBAAAM,EAAC,SAAI,WAAW,WAAWf,EAAwBU,CAAgB,CAAC,IAAI,YAAUD,GAAS,OAAAI,GACzF,4BAAC,UAAA,EAAO,WAAWD,GAAe,SAAAT,GAAkB,OAAO,EAAE,UAAU,SAAA,GAAa,GAAGQ,GACpF,UAAAT,uBACE,OAAA,EAAI,OAAM,8BAA6B,WAAU,WAAU,MAAK,QAAO,SAAQ,aAAY,QAAO,gBACjG,UAAA,gBAAAa,EAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,iBAAA,CAAiB,GACxF,EAAA,CAEJ,EAAA,CACF,IAIGD;AACT,GAEME,IAAkC,CAAC;AAAA,EACvC,kBAAAC,IAAmB;AAAA,EACnB,QAAAC;AAAA,EACA,SAAAf;AAAA,EACA,UAAAD;AAAA,EACA,UAAAI,IAAW;AAAA,EACX,QAAAC,IAAS;AAAA,EACT,WAAAC,IAAY;AAAA,EACZ,GAAGG;AACL,MAAM;AACJ,QAAM,CAACQ,GAASC,CAAU,IAAIC,EAAS,EAAK;AAE5C,EAAAC,EAAU,MAAM;AACd,UAAMC,IAAeL,IAASA,EAAA,IAAW,QAEnCM,IAAe,MAAM;AACzB,YAAMC,IACJF,aAAwB,SACpB,OAAO,UACNA,EAA6B;AAEpC,MAAAH,EAAWK,KAAaR,CAAgB;AAAA,IAC1C;AAEA,WAAAM,EAAa,iBAAiB,UAAUC,CAAY,GACpDA,EAAA,GAEO,MAAMD,EAAa,oBAAoB,UAAUC,CAAY;AAAA,EACtE,GAAG,CAACN,GAAQD,CAAgB,CAAC;AAE7B,QAAMS,IAAc,MAAM;AACxB,IAAAvB,IAAA;AACA,UAAMoB,IAAeL,IAASA,EAAA,IAAW;AACzC,IAAIK,aAAwB,SAC1B,OAAO,SAAS,EAAE,KAAK,GAAG,UAAU,UAAU,IAE7CA,EAA6B,SAAS,EAAE,KAAK,GAAG,UAAU,UAAU;AAAA,EAEzE;AAEA,MAAI,CAACJ,EAAS,QAAO;AAErB,QAAMP,IAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACAJ;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GAELK,IAA6B;AAAA,IACjC,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQN;AAAA,IACR,GAAID,EAAS,SAAS,OAAO,IAAI,EAAE,OAAOC,EAAA,IAAW,EAAE,MAAMA,EAAA;AAAA,EAAO;AAGtE,SACE,gBAAAQ,EAAC,UAAA,EAAO,WAAWH,GAAe,SAASc,GAAa,OAAAb,GAAe,GAAGF,GACvE,UAAAT,KACC,gBAAAa,EAAC,OAAA,EAAI,OAAM,8BAA6B,WAAU,WAAU,MAAK,QAAO,SAAQ,aAAY,QAAO,gBACjG,4BAAC,QAAA,EAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,4BAAA,CAA4B,GACnG,GAEJ;AAEJ;AAEAd,EAAY,UAAUe;"}
|
package/dist/index3.js
CHANGED
|
@@ -1,31 +1,100 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import { jsx as m, jsxs as Y } from "react/jsx-runtime";
|
|
2
|
+
import { useState as y, useCallback as v, useEffect as N, createContext as z, useContext as D } from "react";
|
|
3
|
+
const $ = z(null), O = () => {
|
|
4
|
+
const o = D($);
|
|
5
|
+
if (!o)
|
|
6
|
+
throw new Error("Anchor.Link must be used within an Anchor");
|
|
7
|
+
return o;
|
|
8
|
+
}, H = ({
|
|
9
|
+
href: o,
|
|
10
|
+
title: d,
|
|
11
|
+
children: i,
|
|
12
|
+
className: r = ""
|
|
11
13
|
}) => {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
14
|
+
const { activeLink: s, direction: h, registerLink: u, unregisterLink: g, handleClick: k } = O();
|
|
15
|
+
N(() => (u(o), () => g(o)), [o, u, g]);
|
|
16
|
+
const x = s === o, l = h === "vertical";
|
|
17
|
+
return /* @__PURE__ */ Y("div", { className: l ? "" : "inline-block", children: [
|
|
18
|
+
/* @__PURE__ */ m(
|
|
19
|
+
"a",
|
|
20
|
+
{
|
|
21
|
+
href: `#${o}`,
|
|
22
|
+
onClick: (c) => k(c, o, d),
|
|
23
|
+
className: `
|
|
24
|
+
block text-sm transition-colors
|
|
25
|
+
${l ? "py-1 pl-3 border-l-2" : "px-3 py-1 border-b-2"}
|
|
26
|
+
${x ? "text-primary border-primary font-medium" : "text-base-content/70 border-transparent hover:text-base-content hover:border-base-content/30"}
|
|
27
|
+
${r}
|
|
28
|
+
`.trim(),
|
|
29
|
+
children: d
|
|
30
|
+
}
|
|
31
|
+
),
|
|
32
|
+
i && /* @__PURE__ */ m("div", { className: l ? "pl-3" : "inline-flex", children: i })
|
|
33
|
+
] });
|
|
34
|
+
}, P = ({
|
|
35
|
+
items: o,
|
|
36
|
+
direction: d = "vertical",
|
|
37
|
+
offsetTop: i = 0,
|
|
38
|
+
getContainer: r,
|
|
39
|
+
onChange: s,
|
|
40
|
+
onClick: h,
|
|
41
|
+
activeLink: u,
|
|
42
|
+
className: g = "",
|
|
43
|
+
children: k
|
|
44
|
+
}) => {
|
|
45
|
+
const [x, l] = y(""), [c, A] = y([]), w = u !== void 0, b = w ? u : x, I = v((n) => {
|
|
46
|
+
A((t) => t.includes(n) ? t : [...t, n]);
|
|
47
|
+
}, []), R = v((n) => {
|
|
48
|
+
A((t) => t.filter((e) => e !== n));
|
|
49
|
+
}, []), B = v((n) => {
|
|
50
|
+
const t = document.getElementById(n);
|
|
51
|
+
if (t) {
|
|
52
|
+
const e = r?.() ?? window, a = t.getBoundingClientRect().top, L = e === window ? 0 : e.getBoundingClientRect().top, f = e === window ? window.scrollY : e.scrollTop, p = a - L + f - i;
|
|
53
|
+
e === window ? window.scrollTo({ top: p, behavior: "smooth" }) : e.scrollTo({ top: p, behavior: "smooth" });
|
|
54
|
+
}
|
|
55
|
+
}, [r, i]), j = v((n, t, e) => {
|
|
56
|
+
n.preventDefault(), h?.(n, { href: t, title: e }), B(t), w || l(t), s?.(t);
|
|
57
|
+
}, [h, B, w, s]);
|
|
58
|
+
N(() => {
|
|
59
|
+
if (c.length === 0) return;
|
|
60
|
+
const n = r?.() ?? window, t = () => {
|
|
61
|
+
let e = "";
|
|
62
|
+
const a = n === window ? document.documentElement : n, L = n === window ? 0 : a.getBoundingClientRect().top, f = n === window ? window.scrollY : a.scrollTop, p = a.scrollHeight, V = n === window ? window.innerHeight : a.clientHeight;
|
|
63
|
+
if (f + V >= p - 10 && c.length > 0)
|
|
64
|
+
e = c[c.length - 1];
|
|
65
|
+
else {
|
|
66
|
+
for (const C of c) {
|
|
67
|
+
const T = document.getElementById(C);
|
|
68
|
+
T && T.getBoundingClientRect().top - L - i <= 10 && (e = C);
|
|
69
|
+
}
|
|
70
|
+
!e && c.length > 0 && (e = c[0]);
|
|
71
|
+
}
|
|
72
|
+
e && e !== b && (w || l(e), s?.(e));
|
|
73
|
+
};
|
|
74
|
+
return n.addEventListener("scroll", t, { passive: !0 }), t(), () => n.removeEventListener("scroll", t);
|
|
75
|
+
}, [c, r, i, b, w, s]);
|
|
76
|
+
const S = {
|
|
77
|
+
activeLink: b,
|
|
78
|
+
direction: d,
|
|
79
|
+
offsetTop: i,
|
|
80
|
+
registerLink: I,
|
|
81
|
+
unregisterLink: R,
|
|
82
|
+
handleClick: j
|
|
83
|
+
}, E = (n) => n.map((t) => /* @__PURE__ */ m(H, { href: t.href, title: t.title, children: t.children && E(t.children) }, t.href));
|
|
84
|
+
return /* @__PURE__ */ m($.Provider, { value: S, children: /* @__PURE__ */ m(
|
|
85
|
+
"nav",
|
|
86
|
+
{
|
|
87
|
+
className: `
|
|
88
|
+
${d === "horizontal" ? "flex items-center" : "flex flex-col"}
|
|
89
|
+
${g}
|
|
90
|
+
`.trim(),
|
|
91
|
+
children: o ? E(o) : k
|
|
92
|
+
}
|
|
93
|
+
) });
|
|
94
|
+
}, M = Object.assign(P, {
|
|
95
|
+
Link: H
|
|
96
|
+
});
|
|
28
97
|
export {
|
|
29
|
-
|
|
98
|
+
M as Anchor
|
|
30
99
|
};
|
|
31
100
|
//# sourceMappingURL=index3.js.map
|
package/dist/index3.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index3.js","sources":["../src/components/Alert.tsx"],"sourcesContent":["import React from 'react'\n\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n type?: 'info' | 'success' | 'warning' | 'error'\n outline?: boolean\n dash?: boolean\n soft?: boolean\n vertical?: boolean\n}\n\nexport const Alert: React.FC<AlertProps> = ({\n children,\n className = '',\n type,\n outline = false,\n dash = false,\n soft = false,\n vertical = false,\n ...rest\n}) => {\n const typeClasses = {\n info: 'alert-info',\n success: 'alert-success',\n warning: 'alert-warning',\n error: 'alert-error',\n }\n\n const classes = [\n 'alert',\n type && typeClasses[type],\n outline && 'alert-outline',\n dash && 'alert-dash',\n soft && 'alert-soft',\n vertical && 'alert-vertical',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div role=\"alert\" className={classes} {...rest}>\n {children}\n </div>\n )\n}\n"],"names":["Alert","children","className","type","outline","dash","soft","vertical","rest","classes","jsx"],"mappings":";AAWO,MAAMA,IAA8B,CAAC;AAAA,EAC1C,UAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,MAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,MAAAC,IAAO;AAAA,EACP,UAAAC,IAAW;AAAA,EACX,GAAGC;AACL,MAAM;AAQJ,QAAMC,IAAU;AAAA,IACd;AAAA,IACAN,KATkB;AAAA,MAClB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,IAAA,EAKaA,CAAI;AAAA,IACxBC,KAAW;AAAA,IACXC,KAAQ;AAAA,IACRC,KAAQ;AAAA,IACRC,KAAY;AAAA,IACZL;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAAQ,EAAC,SAAI,MAAK,SAAQ,WAAWD,GAAU,GAAGD,GACvC,UAAAP,GACH;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"index3.js","sources":["../src/components/Anchor.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback, createContext, useContext } from 'react'\n\nexport interface AnchorLinkItem {\n /** Target element id (without #) */\n href: string\n /** Link title */\n title: React.ReactNode\n /** Nested links */\n children?: AnchorLinkItem[]\n}\n\nexport interface AnchorProps {\n /** Anchor links (alternative to Anchor.Link children) */\n items?: AnchorLinkItem[]\n /** Layout direction */\n direction?: 'horizontal' | 'vertical'\n /** Offset from top when calculating scroll position */\n offsetTop?: number\n /** Target scroll container (default: window) */\n getContainer?: () => HTMLElement | Window\n /** Callback when active link changes */\n onChange?: (activeLink: string) => void\n /** Callback when link is clicked */\n onClick?: (e: React.MouseEvent, link: { href: string; title: React.ReactNode }) => void\n /** Currently active link (controlled) */\n activeLink?: string\n /** Custom class name */\n className?: string\n /** Anchor.Link children */\n children?: React.ReactNode\n}\n\nexport interface AnchorLinkProps {\n /** Target element id (without #) */\n href: string\n /** Link title */\n title: React.ReactNode\n /** Nested links */\n children?: React.ReactNode\n /** Custom class name */\n className?: string\n}\n\ninterface AnchorContextValue {\n activeLink: string\n direction: 'horizontal' | 'vertical'\n offsetTop: number\n registerLink: (href: string) => void\n unregisterLink: (href: string) => void\n handleClick: (e: React.MouseEvent, href: string, title: React.ReactNode) => void\n}\n\nconst AnchorContext = createContext<AnchorContextValue | null>(null)\n\nconst useAnchorContext = () => {\n const context = useContext(AnchorContext)\n if (!context) {\n throw new Error('Anchor.Link must be used within an Anchor')\n }\n return context\n}\n\nconst AnchorLink: React.FC<AnchorLinkProps> = ({\n href,\n title,\n children,\n className = '',\n}) => {\n const { activeLink, direction, registerLink, unregisterLink, handleClick } = useAnchorContext()\n\n useEffect(() => {\n registerLink(href)\n return () => unregisterLink(href)\n }, [href, registerLink, unregisterLink])\n\n const isActive = activeLink === href\n const isVertical = direction === 'vertical'\n\n return (\n <div className={isVertical ? '' : 'inline-block'}>\n <a\n href={`#${href}`}\n onClick={(e) => handleClick(e, href, title)}\n className={`\n block text-sm transition-colors\n ${isVertical ? 'py-1 pl-3 border-l-2' : 'px-3 py-1 border-b-2'}\n ${isActive\n ? 'text-primary border-primary font-medium'\n : 'text-base-content/70 border-transparent hover:text-base-content hover:border-base-content/30'\n }\n ${className}\n `.trim()}\n >\n {title}\n </a>\n {children && (\n <div className={isVertical ? 'pl-3' : 'inline-flex'}>\n {children}\n </div>\n )}\n </div>\n )\n}\n\nconst AnchorComponent: React.FC<AnchorProps> = ({\n items,\n direction = 'vertical',\n offsetTop = 0,\n getContainer,\n onChange,\n onClick,\n activeLink: controlledActiveLink,\n className = '',\n children,\n}) => {\n const [internalActiveLink, setInternalActiveLink] = useState('')\n const [links, setLinks] = useState<string[]>([])\n\n const isControlled = controlledActiveLink !== undefined\n const activeLink = isControlled ? controlledActiveLink : internalActiveLink\n\n const registerLink = useCallback((href: string) => {\n setLinks((prev) => (prev.includes(href) ? prev : [...prev, href]))\n }, [])\n\n const unregisterLink = useCallback((href: string) => {\n setLinks((prev) => prev.filter((link) => link !== href))\n }, [])\n\n const scrollToTarget = useCallback((href: string) => {\n const target = document.getElementById(href)\n if (target) {\n const container = getContainer?.() ?? window\n const targetTop = target.getBoundingClientRect().top\n const containerTop = container === window\n ? 0\n : (container as HTMLElement).getBoundingClientRect().top\n const scrollTop = container === window\n ? window.scrollY\n : (container as HTMLElement).scrollTop\n\n const top = targetTop - containerTop + scrollTop - offsetTop\n\n if (container === window) {\n window.scrollTo({ top, behavior: 'smooth' })\n } else {\n (container as HTMLElement).scrollTo({ top, behavior: 'smooth' })\n }\n }\n }, [getContainer, offsetTop])\n\n const handleClick = useCallback((\n e: React.MouseEvent,\n href: string,\n title: React.ReactNode\n ) => {\n e.preventDefault()\n onClick?.(e, { href, title })\n scrollToTarget(href)\n\n if (!isControlled) {\n setInternalActiveLink(href)\n }\n onChange?.(href)\n }, [onClick, scrollToTarget, isControlled, onChange])\n\n // Scroll spy\n useEffect(() => {\n if (links.length === 0) return\n\n const container = getContainer?.() ?? window\n\n const handleScroll = () => {\n let currentActive = ''\n const containerEl = container === window ? document.documentElement : container as HTMLElement\n const containerTop = container === window\n ? 0\n : containerEl.getBoundingClientRect().top\n\n // Check if scrolled to near the bottom\n const scrollTop = container === window ? window.scrollY : containerEl.scrollTop\n const scrollHeight = containerEl.scrollHeight\n const clientHeight = container === window ? window.innerHeight : containerEl.clientHeight\n const isNearBottom = scrollTop + clientHeight >= scrollHeight - 10\n\n // If near bottom, use the last link\n if (isNearBottom && links.length > 0) {\n currentActive = links[links.length - 1]\n } else {\n // Find the last element that has scrolled past the top (standard scroll spy behavior)\n for (const href of links) {\n const element = document.getElementById(href)\n if (element) {\n const rect = element.getBoundingClientRect()\n const distance = rect.top - containerTop - offsetTop\n\n // If element's top is at or above the threshold, it's the current section\n if (distance <= 10) {\n currentActive = href\n }\n }\n }\n\n // If nothing matched, use the first link\n if (!currentActive && links.length > 0) {\n currentActive = links[0]\n }\n }\n\n if (currentActive && currentActive !== activeLink) {\n if (!isControlled) {\n setInternalActiveLink(currentActive)\n }\n onChange?.(currentActive)\n }\n }\n\n container.addEventListener('scroll', handleScroll, { passive: true })\n handleScroll() // Initial check\n\n return () => container.removeEventListener('scroll', handleScroll)\n }, [links, getContainer, offsetTop, activeLink, isControlled, onChange])\n\n const contextValue: AnchorContextValue = {\n activeLink,\n direction,\n offsetTop,\n registerLink,\n unregisterLink,\n handleClick,\n }\n\n const renderItems = (linkItems: AnchorLinkItem[]): React.ReactNode => {\n return linkItems.map((item) => (\n <AnchorLink key={item.href} href={item.href} title={item.title}>\n {item.children && renderItems(item.children)}\n </AnchorLink>\n ))\n }\n\n return (\n <AnchorContext.Provider value={contextValue}>\n <nav\n className={`\n ${direction === 'horizontal' ? 'flex items-center' : 'flex flex-col'}\n ${className}\n `.trim()}\n >\n {items ? renderItems(items) : children}\n </nav>\n </AnchorContext.Provider>\n )\n}\n\nexport const Anchor = Object.assign(AnchorComponent, {\n Link: AnchorLink,\n})\n"],"names":["AnchorContext","createContext","useAnchorContext","context","useContext","AnchorLink","href","title","children","className","activeLink","direction","registerLink","unregisterLink","handleClick","useEffect","isActive","isVertical","jsxs","jsx","e","AnchorComponent","items","offsetTop","getContainer","onChange","onClick","controlledActiveLink","internalActiveLink","setInternalActiveLink","useState","links","setLinks","isControlled","useCallback","prev","link","scrollToTarget","target","container","targetTop","containerTop","scrollTop","top","handleScroll","currentActive","containerEl","scrollHeight","clientHeight","element","contextValue","renderItems","linkItems","item","Anchor"],"mappings":";;AAoDA,MAAMA,IAAgBC,EAAyC,IAAI,GAE7DC,IAAmB,MAAM;AAC7B,QAAMC,IAAUC,EAAWJ,CAAa;AACxC,MAAI,CAACG;AACH,UAAM,IAAI,MAAM,2CAA2C;AAE7D,SAAOA;AACT,GAEME,IAAwC,CAAC;AAAA,EAC7C,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC,IAAY;AACd,MAAM;AACJ,QAAM,EAAE,YAAAC,GAAY,WAAAC,GAAW,cAAAC,GAAc,gBAAAC,GAAgB,aAAAC,EAAA,IAAgBZ,EAAA;AAE7E,EAAAa,EAAU,OACRH,EAAaN,CAAI,GACV,MAAMO,EAAeP,CAAI,IAC/B,CAACA,GAAMM,GAAcC,CAAc,CAAC;AAEvC,QAAMG,IAAWN,MAAeJ,GAC1BW,IAAaN,MAAc;AAEjC,SACE,gBAAAO,EAAC,OAAA,EAAI,WAAWD,IAAa,KAAK,gBAChC,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM,IAAIb,CAAI;AAAA,QACd,SAAS,CAACc,MAAMN,EAAYM,GAAGd,GAAMC,CAAK;AAAA,QAC1C,WAAW;AAAA;AAAA,YAEPU,IAAa,yBAAyB,sBAAsB;AAAA,YAC5DD,IACE,4CACA,8FACJ;AAAA,YACEP,CAAS;AAAA,UACX,KAAA;AAAA,QAED,UAAAF;AAAA,MAAA;AAAA,IAAA;AAAA,IAEFC,KACC,gBAAAW,EAAC,OAAA,EAAI,WAAWF,IAAa,SAAS,eACnC,UAAAT,EAAA,CACH;AAAA,EAAA,GAEJ;AAEJ,GAEMa,IAAyC,CAAC;AAAA,EAC9C,OAAAC;AAAA,EACA,WAAAX,IAAY;AAAA,EACZ,WAAAY,IAAY;AAAA,EACZ,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAYC;AAAA,EACZ,WAAAlB,IAAY;AAAA,EACZ,UAAAD;AACF,MAAM;AACJ,QAAM,CAACoB,GAAoBC,CAAqB,IAAIC,EAAS,EAAE,GACzD,CAACC,GAAOC,CAAQ,IAAIF,EAAmB,CAAA,CAAE,GAEzCG,IAAeN,MAAyB,QACxCjB,IAAauB,IAAeN,IAAuBC,GAEnDhB,IAAesB,EAAY,CAAC5B,MAAiB;AACjD,IAAA0B,EAAS,CAACG,MAAUA,EAAK,SAAS7B,CAAI,IAAI6B,IAAO,CAAC,GAAGA,GAAM7B,CAAI,CAAE;AAAA,EACnE,GAAG,CAAA,CAAE,GAECO,IAAiBqB,EAAY,CAAC5B,MAAiB;AACnD,IAAA0B,EAAS,CAACG,MAASA,EAAK,OAAO,CAACC,MAASA,MAAS9B,CAAI,CAAC;AAAA,EACzD,GAAG,CAAA,CAAE,GAEC+B,IAAiBH,EAAY,CAAC5B,MAAiB;AACnD,UAAMgC,IAAS,SAAS,eAAehC,CAAI;AAC3C,QAAIgC,GAAQ;AACV,YAAMC,IAAYf,SAAoB,QAChCgB,IAAYF,EAAO,sBAAA,EAAwB,KAC3CG,IAAeF,MAAc,SAC/B,IACCA,EAA0B,wBAAwB,KACjDG,IAAYH,MAAc,SAC5B,OAAO,UACNA,EAA0B,WAEzBI,IAAMH,IAAYC,IAAeC,IAAYnB;AAEnD,MAAIgB,MAAc,SAChB,OAAO,SAAS,EAAE,KAAAI,GAAK,UAAU,UAAU,IAE1CJ,EAA0B,SAAS,EAAE,KAAAI,GAAK,UAAU,UAAU;AAAA,IAEnE;AAAA,EACF,GAAG,CAACnB,GAAcD,CAAS,CAAC,GAEtBT,IAAcoB,EAAY,CAC9Bd,GACAd,GACAC,MACG;AACH,IAAAa,EAAE,eAAA,GACFM,IAAUN,GAAG,EAAE,MAAAd,GAAM,OAAAC,EAAA,CAAO,GAC5B8B,EAAe/B,CAAI,GAEd2B,KACHJ,EAAsBvB,CAAI,GAE5BmB,IAAWnB,CAAI;AAAA,EACjB,GAAG,CAACoB,GAASW,GAAgBJ,GAAcR,CAAQ,CAAC;AAGpD,EAAAV,EAAU,MAAM;AACd,QAAIgB,EAAM,WAAW,EAAG;AAExB,UAAMQ,IAAYf,SAAoB,QAEhCoB,IAAe,MAAM;AACzB,UAAIC,IAAgB;AACpB,YAAMC,IAAcP,MAAc,SAAS,SAAS,kBAAkBA,GAChEE,IAAeF,MAAc,SAC/B,IACAO,EAAY,wBAAwB,KAGlCJ,IAAYH,MAAc,SAAS,OAAO,UAAUO,EAAY,WAChEC,IAAeD,EAAY,cAC3BE,IAAeT,MAAc,SAAS,OAAO,cAAcO,EAAY;AAI7E,UAHqBJ,IAAYM,KAAgBD,IAAe,MAG5ChB,EAAM,SAAS;AACjC,QAAAc,IAAgBd,EAAMA,EAAM,SAAS,CAAC;AAAA,WACjC;AAEL,mBAAWzB,KAAQyB,GAAO;AACxB,gBAAMkB,IAAU,SAAS,eAAe3C,CAAI;AAC5C,UAAI2C,KACWA,EAAQ,sBAAA,EACC,MAAMR,IAAelB,KAG3B,OACdsB,IAAgBvC;AAAA,QAGtB;AAGA,QAAI,CAACuC,KAAiBd,EAAM,SAAS,MACnCc,IAAgBd,EAAM,CAAC;AAAA,MAE3B;AAEA,MAAIc,KAAiBA,MAAkBnC,MAChCuB,KACHJ,EAAsBgB,CAAa,GAErCpB,IAAWoB,CAAa;AAAA,IAE5B;AAEA,WAAAN,EAAU,iBAAiB,UAAUK,GAAc,EAAE,SAAS,IAAM,GACpEA,EAAA,GAEO,MAAML,EAAU,oBAAoB,UAAUK,CAAY;AAAA,EACnE,GAAG,CAACb,GAAOP,GAAcD,GAAWb,GAAYuB,GAAcR,CAAQ,CAAC;AAEvE,QAAMyB,IAAmC;AAAA,IACvC,YAAAxC;AAAA,IACA,WAAAC;AAAA,IACA,WAAAY;AAAA,IACA,cAAAX;AAAA,IACA,gBAAAC;AAAA,IACA,aAAAC;AAAA,EAAA,GAGIqC,IAAc,CAACC,MACZA,EAAU,IAAI,CAACC,wBACnBhD,GAAA,EAA2B,MAAMgD,EAAK,MAAM,OAAOA,EAAK,OACtD,UAAAA,EAAK,YAAYF,EAAYE,EAAK,QAAQ,EAAA,GAD5BA,EAAK,IAEtB,CACD;AAGH,SACE,gBAAAlC,EAACnB,EAAc,UAAd,EAAuB,OAAOkD,GAC7B,UAAA,gBAAA/B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,YACPR,MAAc,eAAe,sBAAsB,eAAe;AAAA,YAClEF,CAAS;AAAA,UACX,KAAA;AAAA,MAED,UAAAa,IAAQ6B,EAAY7B,CAAK,IAAId;AAAA,IAAA;AAAA,EAAA,GAElC;AAEJ,GAEa8C,IAAS,OAAO,OAAOjC,GAAiB;AAAA,EACnD,MAAMhB;AACR,CAAC;"}
|