sa2kit 1.6.3 → 1.6.6
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/audioDetection/index.js.map +1 -1
- package/dist/audioDetection/index.mjs.map +1 -1
- package/dist/auth/index.d.mts +26 -1
- package/dist/auth/index.d.ts +26 -1
- package/dist/auth/index.js +51 -23
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/index.mjs +34 -3
- package/dist/auth/index.mjs.map +1 -1
- package/dist/auth/middleware/index.js +3 -3
- package/dist/auth/middleware/index.mjs +2 -2
- package/dist/auth/routes/index.js +14 -14
- package/dist/auth/routes/index.mjs +2 -2
- package/dist/auth/services/index.d.mts +1 -0
- package/dist/auth/services/index.d.ts +1 -0
- package/dist/auth/services/index.js +7 -7
- package/dist/auth/services/index.mjs +1 -1
- package/dist/calendar/index.d.mts +1197 -0
- package/dist/calendar/index.d.ts +1197 -0
- package/dist/calendar/index.js +5376 -0
- package/dist/calendar/index.js.map +1 -0
- package/dist/calendar/index.mjs +5311 -0
- package/dist/calendar/index.mjs.map +1 -0
- package/dist/calendar/routes/index.d.mts +118 -0
- package/dist/calendar/routes/index.d.ts +118 -0
- package/dist/calendar/routes/index.js +335 -0
- package/dist/calendar/routes/index.js.map +1 -0
- package/dist/calendar/routes/index.mjs +327 -0
- package/dist/calendar/routes/index.mjs.map +1 -0
- package/dist/calendar/server.d.mts +1184 -0
- package/dist/calendar/server.d.ts +1184 -0
- package/dist/calendar/server.js +219 -0
- package/dist/calendar/server.js.map +1 -0
- package/dist/calendar/server.mjs +165 -0
- package/dist/calendar/server.mjs.map +1 -0
- package/dist/{chunk-EBP7AE6F.js → chunk-2ODO4HEI.js} +48 -20
- package/dist/chunk-2ODO4HEI.js.map +1 -0
- package/dist/{chunk-RCNNVNLT.mjs → chunk-3BGPZN4X.mjs} +8 -3
- package/dist/chunk-3BGPZN4X.mjs.map +1 -0
- package/dist/{chunk-FV3FNHQY.js → chunk-6W5BMXJG.js} +4 -4
- package/dist/{chunk-FV3FNHQY.js.map → chunk-6W5BMXJG.js.map} +1 -1
- package/dist/chunk-6WXOA4BE.mjs +302 -0
- package/dist/chunk-6WXOA4BE.mjs.map +1 -0
- package/dist/{chunk-NMF4ANIC.js → chunk-7Z5LLJ3A.js} +8 -2
- package/dist/chunk-7Z5LLJ3A.js.map +1 -0
- package/dist/chunk-AXP7KROR.js +314 -0
- package/dist/chunk-AXP7KROR.js.map +1 -0
- package/dist/{chunk-42IJ7HEI.js → chunk-CD77U7LZ.js} +5 -5
- package/dist/{chunk-42IJ7HEI.js.map → chunk-CD77U7LZ.js.map} +1 -1
- package/dist/{chunk-6BL3AZGD.js → chunk-DUHZ7VZP.js} +2 -2
- package/dist/chunk-DUHZ7VZP.js.map +1 -0
- package/dist/{chunk-6VHWOPRR.mjs → chunk-ESRCX5TQ.mjs} +3 -3
- package/dist/{chunk-6VHWOPRR.mjs.map → chunk-ESRCX5TQ.mjs.map} +1 -1
- package/dist/{chunk-QKXKXAAV.js → chunk-G4AMEDO5.js} +2 -2
- package/dist/{chunk-QKXKXAAV.js.map → chunk-G4AMEDO5.js.map} +1 -1
- package/dist/chunk-GAC4J5GX.js +228 -0
- package/dist/chunk-GAC4J5GX.js.map +1 -0
- package/dist/chunk-IEA55H3G.js +106 -0
- package/dist/chunk-IEA55H3G.js.map +1 -0
- package/dist/{chunk-U2L6V7KD.mjs → chunk-OCR5DS4C.mjs} +2 -2
- package/dist/chunk-OCR5DS4C.mjs.map +1 -0
- package/dist/{chunk-IBLB7ARJ.mjs → chunk-QAT2RWAO.mjs} +3 -3
- package/dist/{chunk-IBLB7ARJ.mjs.map → chunk-QAT2RWAO.mjs.map} +1 -1
- package/dist/chunk-R2F4BXUU.mjs +100 -0
- package/dist/chunk-R2F4BXUU.mjs.map +1 -0
- package/dist/chunk-T6TE7GTY.mjs +218 -0
- package/dist/chunk-T6TE7GTY.mjs.map +1 -0
- package/dist/{chunk-MBG4DBGP.mjs → chunk-ZCLAF3XN.mjs} +47 -19
- package/dist/chunk-ZCLAF3XN.mjs.map +1 -0
- package/dist/{chunk-6LEA37ZM.mjs → chunk-ZYXF3L6T.mjs} +2 -2
- package/dist/{chunk-6LEA37ZM.mjs.map → chunk-ZYXF3L6T.mjs.map} +1 -1
- package/dist/imageCrop/index.js.map +1 -1
- package/dist/imageCrop/index.mjs.map +1 -1
- package/dist/{index-DtLpANUB.d.mts → index-DSel44Ke.d.mts} +24 -1
- package/dist/{index-DtLpANUB.d.ts → index-DSel44Ke.d.ts} +24 -1
- package/dist/index.d.mts +426 -3
- package/dist/index.d.ts +426 -3
- package/dist/index.js +2116 -65
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1949 -33
- package/dist/index.mjs.map +1 -1
- package/dist/mmd/index.d.mts +78 -1
- package/dist/mmd/index.d.ts +78 -1
- package/dist/mmd/index.js +397 -50
- package/dist/mmd/index.js.map +1 -1
- package/dist/mmd/index.mjs +399 -53
- package/dist/mmd/index.mjs.map +1 -1
- package/dist/music/index.d.mts +54 -5
- package/dist/music/index.d.ts +54 -5
- package/dist/music/index.js +35 -435
- package/dist/music/index.js.map +1 -1
- package/dist/music/index.mjs +2 -424
- package/dist/music/index.mjs.map +1 -1
- package/dist/music/server/index.d.mts +1 -1
- package/dist/music/server/index.d.ts +1 -1
- package/dist/music/server/index.js +14 -6
- package/dist/music/server/index.mjs +1 -1
- package/dist/testYourself/admin/index.js +3 -3
- package/dist/testYourself/admin/index.mjs +1 -1
- package/dist/testYourself/index.js +7 -7
- package/dist/testYourself/index.js.map +1 -1
- package/dist/testYourself/index.mjs +2 -2
- package/dist/testYourself/index.mjs.map +1 -1
- package/dist/universalFile/index.d.mts +125 -7
- package/dist/universalFile/index.d.ts +125 -7
- package/dist/universalFile/index.js +1253 -30
- package/dist/universalFile/index.js.map +1 -1
- package/dist/universalFile/index.mjs +1244 -23
- package/dist/universalFile/index.mjs.map +1 -1
- package/dist/utils/index.d.mts +5 -1
- package/dist/utils/index.d.ts +5 -1
- package/dist/utils/index.js +13 -9
- package/dist/utils/index.mjs +1 -1
- package/package.json +18 -3
- package/dist/chunk-6BL3AZGD.js.map +0 -1
- package/dist/chunk-EBP7AE6F.js.map +0 -1
- package/dist/chunk-MBG4DBGP.mjs.map +0 -1
- package/dist/chunk-NMF4ANIC.js.map +0 -1
- package/dist/chunk-RCNNVNLT.mjs.map +0 -1
- package/dist/chunk-U2L6V7KD.mjs.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,34 +1,78 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkIEA55H3G_js = require('./chunk-IEA55H3G.js');
|
|
4
|
+
var chunk7Z5LLJ3A_js = require('./chunk-7Z5LLJ3A.js');
|
|
4
5
|
var chunkLX4XX6W7_js = require('./chunk-LX4XX6W7.js');
|
|
5
6
|
require('./chunk-QU5OT4DF.js');
|
|
6
7
|
var chunk6PRFP5EG_js = require('./chunk-6PRFP5EG.js');
|
|
7
8
|
require('./chunk-DGUM43GV.js');
|
|
8
|
-
var
|
|
9
|
+
var React33 = require('react');
|
|
9
10
|
var tesseract_js = require('tesseract.js');
|
|
10
11
|
var lucideReact = require('lucide-react');
|
|
12
|
+
var reactSlot = require('@radix-ui/react-slot');
|
|
13
|
+
var classVarianceAuthority = require('class-variance-authority');
|
|
14
|
+
var LabelPrimitive = require('@radix-ui/react-label');
|
|
15
|
+
var TabsPrimitive = require('@radix-ui/react-tabs');
|
|
16
|
+
var DialogPrimitive = require('@radix-ui/react-dialog');
|
|
17
|
+
var AlertDialogPrimitive = require('@radix-ui/react-alert-dialog');
|
|
18
|
+
var DropdownMenuPrimitive = require('@radix-ui/react-dropdown-menu');
|
|
19
|
+
var PopoverPrimitive = require('@radix-ui/react-popover');
|
|
20
|
+
var ProgressPrimitive = require('@radix-ui/react-progress');
|
|
21
|
+
var ScrollAreaPrimitive = require('@radix-ui/react-scroll-area');
|
|
22
|
+
var SelectPrimitive = require('@radix-ui/react-select');
|
|
23
|
+
var SeparatorPrimitive = require('@radix-ui/react-separator');
|
|
24
|
+
var TooltipPrimitive = require('@radix-ui/react-tooltip');
|
|
25
|
+
var AvatarPrimitive = require('@radix-ui/react-avatar');
|
|
26
|
+
var reactDom = require('react-dom');
|
|
11
27
|
|
|
12
|
-
function
|
|
28
|
+
function _interopNamespace(e) {
|
|
29
|
+
if (e && e.__esModule) return e;
|
|
30
|
+
var n = Object.create(null);
|
|
31
|
+
if (e) {
|
|
32
|
+
Object.keys(e).forEach(function (k) {
|
|
33
|
+
if (k !== 'default') {
|
|
34
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
35
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
36
|
+
enumerable: true,
|
|
37
|
+
get: function () { return e[k]; }
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
n.default = e;
|
|
43
|
+
return Object.freeze(n);
|
|
44
|
+
}
|
|
13
45
|
|
|
14
|
-
var
|
|
46
|
+
var React33__namespace = /*#__PURE__*/_interopNamespace(React33);
|
|
47
|
+
var LabelPrimitive__namespace = /*#__PURE__*/_interopNamespace(LabelPrimitive);
|
|
48
|
+
var TabsPrimitive__namespace = /*#__PURE__*/_interopNamespace(TabsPrimitive);
|
|
49
|
+
var DialogPrimitive__namespace = /*#__PURE__*/_interopNamespace(DialogPrimitive);
|
|
50
|
+
var AlertDialogPrimitive__namespace = /*#__PURE__*/_interopNamespace(AlertDialogPrimitive);
|
|
51
|
+
var DropdownMenuPrimitive__namespace = /*#__PURE__*/_interopNamespace(DropdownMenuPrimitive);
|
|
52
|
+
var PopoverPrimitive__namespace = /*#__PURE__*/_interopNamespace(PopoverPrimitive);
|
|
53
|
+
var ProgressPrimitive__namespace = /*#__PURE__*/_interopNamespace(ProgressPrimitive);
|
|
54
|
+
var ScrollAreaPrimitive__namespace = /*#__PURE__*/_interopNamespace(ScrollAreaPrimitive);
|
|
55
|
+
var SelectPrimitive__namespace = /*#__PURE__*/_interopNamespace(SelectPrimitive);
|
|
56
|
+
var SeparatorPrimitive__namespace = /*#__PURE__*/_interopNamespace(SeparatorPrimitive);
|
|
57
|
+
var TooltipPrimitive__namespace = /*#__PURE__*/_interopNamespace(TooltipPrimitive);
|
|
58
|
+
var AvatarPrimitive__namespace = /*#__PURE__*/_interopNamespace(AvatarPrimitive);
|
|
15
59
|
|
|
16
60
|
var useOCR = (options = {}) => {
|
|
17
|
-
const [state, setState] =
|
|
61
|
+
const [state, setState] = React33.useState({
|
|
18
62
|
isProcessing: false,
|
|
19
63
|
progress: 0,
|
|
20
64
|
status: "idle",
|
|
21
65
|
error: null,
|
|
22
66
|
result: null
|
|
23
67
|
});
|
|
24
|
-
const workerRef =
|
|
25
|
-
const cleanup =
|
|
68
|
+
const workerRef = React33.useRef(null);
|
|
69
|
+
const cleanup = React33.useCallback(async () => {
|
|
26
70
|
if (workerRef.current) {
|
|
27
71
|
await workerRef.current.terminate();
|
|
28
72
|
workerRef.current = null;
|
|
29
73
|
}
|
|
30
74
|
}, []);
|
|
31
|
-
const recognize =
|
|
75
|
+
const recognize = React33.useCallback(
|
|
32
76
|
async (image) => {
|
|
33
77
|
setState((prev) => ({
|
|
34
78
|
...prev,
|
|
@@ -87,7 +131,7 @@ var useOCR = (options = {}) => {
|
|
|
87
131
|
},
|
|
88
132
|
[options]
|
|
89
133
|
);
|
|
90
|
-
|
|
134
|
+
React33.useEffect(() => {
|
|
91
135
|
return () => {
|
|
92
136
|
cleanup();
|
|
93
137
|
};
|
|
@@ -103,8 +147,8 @@ var OCRScanner = ({
|
|
|
103
147
|
className = "",
|
|
104
148
|
language = "eng"
|
|
105
149
|
}) => {
|
|
106
|
-
const [imagePreview, setImagePreview] =
|
|
107
|
-
const fileInputRef =
|
|
150
|
+
const [imagePreview, setImagePreview] = React33.useState(null);
|
|
151
|
+
const fileInputRef = React33.useRef(null);
|
|
108
152
|
const { recognize, isProcessing, progress, status, result, error } = useOCR({
|
|
109
153
|
language
|
|
110
154
|
});
|
|
@@ -140,43 +184,43 @@ var OCRScanner = ({
|
|
|
140
184
|
handleFileChange(mockEvent);
|
|
141
185
|
}
|
|
142
186
|
};
|
|
143
|
-
return /* @__PURE__ */
|
|
187
|
+
return /* @__PURE__ */ React33__namespace.default.createElement(
|
|
144
188
|
"div",
|
|
145
189
|
{
|
|
146
190
|
className: `p-6 border-2 border-dashed rounded-xl transition-all ${isProcessing ? "border-blue-400 bg-blue-50/10" : "border-gray-200 hover:border-blue-400"} ${className}`,
|
|
147
191
|
onDragOver: handleDragOver,
|
|
148
192
|
onDrop: handleDrop
|
|
149
193
|
},
|
|
150
|
-
!imagePreview ? /* @__PURE__ */
|
|
194
|
+
!imagePreview ? /* @__PURE__ */ React33__namespace.default.createElement(
|
|
151
195
|
"div",
|
|
152
196
|
{
|
|
153
197
|
className: "flex flex-col items-center justify-center cursor-pointer space-y-4",
|
|
154
198
|
onClick: () => fileInputRef.current?.click()
|
|
155
199
|
},
|
|
156
|
-
/* @__PURE__ */
|
|
157
|
-
/* @__PURE__ */
|
|
158
|
-
) : /* @__PURE__ */
|
|
200
|
+
/* @__PURE__ */ React33__namespace.default.createElement("div", { className: "p-4 bg-blue-50 rounded-full text-blue-500" }, /* @__PURE__ */ React33__namespace.default.createElement(lucideReact.Upload, { size: 32 })),
|
|
201
|
+
/* @__PURE__ */ React33__namespace.default.createElement("div", { className: "text-center" }, /* @__PURE__ */ React33__namespace.default.createElement("p", { className: "text-lg font-medium text-gray-700" }, "\u70B9\u51FB\u6216\u62D6\u62FD\u56FE\u7247\u8FDB\u884C OCR \u8BC6\u522B"), /* @__PURE__ */ React33__namespace.default.createElement("p", { className: "text-sm text-gray-500" }, "\u652F\u6301 JPG, PNG, WebP"))
|
|
202
|
+
) : /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "relative group rounded-lg overflow-hidden border border-gray-200" }, /* @__PURE__ */ React33__namespace.default.createElement(
|
|
159
203
|
"img",
|
|
160
204
|
{
|
|
161
205
|
src: imagePreview,
|
|
162
206
|
alt: "Preview",
|
|
163
207
|
className: `max-h-64 mx-auto object-contain transition-opacity ${isProcessing ? "opacity-50" : "opacity-100"}`
|
|
164
208
|
}
|
|
165
|
-
), !isProcessing && /* @__PURE__ */
|
|
209
|
+
), !isProcessing && /* @__PURE__ */ React33__namespace.default.createElement(
|
|
166
210
|
"button",
|
|
167
211
|
{
|
|
168
212
|
onClick: reset,
|
|
169
213
|
className: "absolute top-2 right-2 p-1 bg-white/80 rounded-full hover:bg-white text-gray-600 shadow-sm"
|
|
170
214
|
},
|
|
171
|
-
/* @__PURE__ */
|
|
172
|
-
), isProcessing && /* @__PURE__ */
|
|
215
|
+
/* @__PURE__ */ React33__namespace.default.createElement(lucideReact.X, { size: 18 })
|
|
216
|
+
), isProcessing && /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "absolute inset-0 flex flex-col items-center justify-center bg-black/5" }, /* @__PURE__ */ React33__namespace.default.createElement(lucideReact.Loader2, { className: "animate-spin text-blue-500 mb-2", size: 32 }), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "w-48 bg-gray-200 rounded-full h-1.5 overflow-hidden" }, /* @__PURE__ */ React33__namespace.default.createElement(
|
|
173
217
|
"div",
|
|
174
218
|
{
|
|
175
219
|
className: "bg-blue-500 h-full transition-all duration-300",
|
|
176
220
|
style: { width: `${progress * 100}%` }
|
|
177
221
|
}
|
|
178
|
-
)), /* @__PURE__ */
|
|
179
|
-
/* @__PURE__ */
|
|
222
|
+
)), /* @__PURE__ */ React33__namespace.default.createElement("p", { className: "text-xs font-medium text-blue-600 mt-2" }, status === "initializing" ? "\u6B63\u5728\u52A0\u8F7D\u5F15\u64CE..." : `\u8BC6\u522B\u4E2D ${Math.round(progress * 100)}%`))), result && !isProcessing && /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "bg-gray-50 p-4 rounded-lg border border-gray-100 animate-in fade-in slide-in-from-bottom-2" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "flex items-center gap-2 mb-2 text-gray-600 font-medium" }, /* @__PURE__ */ React33__namespace.default.createElement(lucideReact.FileText, { size: 18 }), /* @__PURE__ */ React33__namespace.default.createElement("span", null, "\u8BC6\u522B\u7ED3\u679C (\u7F6E\u4FE1\u5EA6: ", Math.round(result.confidence), "%)")), /* @__PURE__ */ React33__namespace.default.createElement("pre", { className: "text-sm text-gray-800 whitespace-pre-wrap font-sans" }, result.text)), error && /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100" }, "\u8BC6\u522B\u5931\u8D25: ", error.message)),
|
|
223
|
+
/* @__PURE__ */ React33__namespace.default.createElement(
|
|
180
224
|
"input",
|
|
181
225
|
{
|
|
182
226
|
type: "file",
|
|
@@ -190,7 +234,7 @@ var OCRScanner = ({
|
|
|
190
234
|
);
|
|
191
235
|
};
|
|
192
236
|
var useBackgroundRemoval = (options = {}) => {
|
|
193
|
-
const [state, setState] =
|
|
237
|
+
const [state, setState] = React33.useState({
|
|
194
238
|
isProcessing: false,
|
|
195
239
|
progress: 0,
|
|
196
240
|
status: "idle",
|
|
@@ -198,7 +242,7 @@ var useBackgroundRemoval = (options = {}) => {
|
|
|
198
242
|
resultBlob: null,
|
|
199
243
|
resultUrl: null
|
|
200
244
|
});
|
|
201
|
-
const remove =
|
|
245
|
+
const remove = React33.useCallback(async (image) => {
|
|
202
246
|
setState((prev) => ({
|
|
203
247
|
...prev,
|
|
204
248
|
isProcessing: true,
|
|
@@ -277,12 +321,12 @@ var useBackgroundRemoval = (options = {}) => {
|
|
|
277
321
|
throw err;
|
|
278
322
|
}
|
|
279
323
|
}, [options]);
|
|
280
|
-
const cleanup =
|
|
324
|
+
const cleanup = React33.useCallback(() => {
|
|
281
325
|
if (state.resultUrl) {
|
|
282
326
|
URL.revokeObjectURL(state.resultUrl);
|
|
283
327
|
}
|
|
284
328
|
}, [state.resultUrl]);
|
|
285
|
-
|
|
329
|
+
React33.useEffect(() => {
|
|
286
330
|
return () => cleanup();
|
|
287
331
|
}, [cleanup]);
|
|
288
332
|
return {
|
|
@@ -295,8 +339,8 @@ var BackgroundRemover = ({
|
|
|
295
339
|
onResult,
|
|
296
340
|
className = ""
|
|
297
341
|
}) => {
|
|
298
|
-
const [imagePreview, setImagePreview] =
|
|
299
|
-
const fileInputRef =
|
|
342
|
+
const [imagePreview, setImagePreview] = React33.useState(null);
|
|
343
|
+
const fileInputRef = React33.useRef(null);
|
|
300
344
|
const { remove, isProcessing, progress, status, resultUrl, error } = useBackgroundRemoval();
|
|
301
345
|
const handleFileChange = async (e) => {
|
|
302
346
|
const file = e.target.files?.[0];
|
|
@@ -324,37 +368,37 @@ var BackgroundRemover = ({
|
|
|
324
368
|
a.download = "removed_background.png";
|
|
325
369
|
a.click();
|
|
326
370
|
};
|
|
327
|
-
return /* @__PURE__ */
|
|
371
|
+
return /* @__PURE__ */ React33__namespace.default.createElement("div", { className: `p-6 border-2 border-dashed rounded-xl transition-all ${isProcessing ? "border-purple-400 bg-purple-50/10" : "border-gray-200 hover:border-purple-400"} ${className}` }, !imagePreview ? /* @__PURE__ */ React33__namespace.default.createElement(
|
|
328
372
|
"div",
|
|
329
373
|
{
|
|
330
374
|
className: "flex flex-col items-center justify-center cursor-pointer space-y-4",
|
|
331
375
|
onClick: () => fileInputRef.current?.click()
|
|
332
376
|
},
|
|
333
|
-
/* @__PURE__ */
|
|
334
|
-
/* @__PURE__ */
|
|
335
|
-
) : /* @__PURE__ */
|
|
377
|
+
/* @__PURE__ */ React33__namespace.default.createElement("div", { className: "p-4 bg-purple-50 rounded-full text-purple-500" }, /* @__PURE__ */ React33__namespace.default.createElement(lucideReact.Eraser, { size: 32 })),
|
|
378
|
+
/* @__PURE__ */ React33__namespace.default.createElement("div", { className: "text-center" }, /* @__PURE__ */ React33__namespace.default.createElement("p", { className: "text-lg font-medium text-gray-700" }, "\u4E0A\u4F20\u56FE\u7247\u79FB\u9664\u80CC\u666F"), /* @__PURE__ */ React33__namespace.default.createElement("p", { className: "text-sm text-gray-500" }, "\u5EFA\u8BAE\u4F7F\u7528\u4E3B\u4F53\u660E\u786E\u7684\u56FE\u7247"))
|
|
379
|
+
) : /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React33__namespace.default.createElement("p", { className: "text-xs font-medium text-gray-500 uppercase tracking-wider" }, "\u539F\u56FE"), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "relative rounded-lg overflow-hidden border border-gray-200 bg-gray-50" }, /* @__PURE__ */ React33__namespace.default.createElement("img", { src: imagePreview, alt: "Original", className: "max-h-64 mx-auto object-contain" }))), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React33__namespace.default.createElement("p", { className: "text-xs font-medium text-gray-500 uppercase tracking-wider" }, "\u5904\u7406\u7ED3\u679C"), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "relative rounded-lg overflow-hidden border border-gray-200 bg-grid-slate-100 bg-[size:20px_20px]" }, resultUrl ? /* @__PURE__ */ React33__namespace.default.createElement("img", { src: resultUrl, alt: "Result", className: "max-h-64 mx-auto object-contain animate-in fade-in zoom-in-95 duration-500" }) : /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "h-64 flex flex-col items-center justify-center text-gray-400" }, isProcessing ? /* @__PURE__ */ React33__namespace.default.createElement(React33__namespace.default.Fragment, null, /* @__PURE__ */ React33__namespace.default.createElement(lucideReact.Loader2, { className: "animate-spin text-purple-500 mb-2", size: 32 }), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "w-32 bg-gray-200 rounded-full h-1.5 overflow-hidden" }, /* @__PURE__ */ React33__namespace.default.createElement(
|
|
336
380
|
"div",
|
|
337
381
|
{
|
|
338
382
|
className: "bg-purple-500 h-full transition-all duration-300",
|
|
339
383
|
style: { width: `${progress * 100}%` }
|
|
340
384
|
}
|
|
341
|
-
)), /* @__PURE__ */
|
|
385
|
+
)), /* @__PURE__ */ React33__namespace.default.createElement("p", { className: "text-[10px] mt-2 font-mono uppercase" }, status.replace(/-/g, " "))) : /* @__PURE__ */ React33__namespace.default.createElement("span", { className: "text-sm italic" }, "\u7B49\u5F85\u5904\u7406..."))))), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "flex justify-between items-center pt-2" }, !isProcessing && /* @__PURE__ */ React33__namespace.default.createElement(
|
|
342
386
|
"button",
|
|
343
387
|
{
|
|
344
388
|
onClick: reset,
|
|
345
389
|
className: "flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-600 hover:text-gray-900 transition-colors"
|
|
346
390
|
},
|
|
347
|
-
/* @__PURE__ */
|
|
391
|
+
/* @__PURE__ */ React33__namespace.default.createElement(lucideReact.X, { size: 16 }),
|
|
348
392
|
"\u91CD\u65B0\u5F00\u59CB"
|
|
349
|
-
), resultUrl && !isProcessing && /* @__PURE__ */
|
|
393
|
+
), resultUrl && !isProcessing && /* @__PURE__ */ React33__namespace.default.createElement(
|
|
350
394
|
"button",
|
|
351
395
|
{
|
|
352
396
|
onClick: downloadResult,
|
|
353
397
|
className: "flex items-center gap-2 px-6 py-2 bg-purple-600 hover:bg-purple-700 text-white rounded-lg shadow-sm transition-all"
|
|
354
398
|
},
|
|
355
|
-
/* @__PURE__ */
|
|
399
|
+
/* @__PURE__ */ React33__namespace.default.createElement(lucideReact.Download, { size: 16 }),
|
|
356
400
|
"\u4E0B\u8F7D PNG"
|
|
357
|
-
)), error && /* @__PURE__ */
|
|
401
|
+
)), error && /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100" }, "\u5904\u7406\u5931\u8D25: ", error.message)), /* @__PURE__ */ React33__namespace.default.createElement(
|
|
358
402
|
"input",
|
|
359
403
|
{
|
|
360
404
|
type: "file",
|
|
@@ -367,14 +411,14 @@ var BackgroundRemover = ({
|
|
|
367
411
|
));
|
|
368
412
|
};
|
|
369
413
|
var useSentimentAnalysis = (options = {}) => {
|
|
370
|
-
const [state, setState] =
|
|
414
|
+
const [state, setState] = React33.useState({
|
|
371
415
|
isProcessing: false,
|
|
372
416
|
status: "idle",
|
|
373
417
|
error: null,
|
|
374
418
|
result: null
|
|
375
419
|
});
|
|
376
|
-
const pipelineRef =
|
|
377
|
-
const analyze =
|
|
420
|
+
const pipelineRef = React33.useRef(null);
|
|
421
|
+
const analyze = React33.useCallback(async (text) => {
|
|
378
422
|
setState((prev) => ({
|
|
379
423
|
...prev,
|
|
380
424
|
isProcessing: true,
|
|
@@ -458,7 +502,7 @@ var SentimentAnalyzer = ({
|
|
|
458
502
|
className = "",
|
|
459
503
|
placeholder = "\u8F93\u5165\u4E00\u6BB5\u4E2D\u6587\u6216\u82F1\u6587\uFF0C\u5206\u6790\u5176\u60C5\u611F\u503E\u5411..."
|
|
460
504
|
}) => {
|
|
461
|
-
const [text, setText] =
|
|
505
|
+
const [text, setText] = React33.useState("");
|
|
462
506
|
const { analyze, isProcessing, status, result, error } = useSentimentAnalysis();
|
|
463
507
|
const handleAnalyze = async () => {
|
|
464
508
|
if (!text.trim() || isProcessing) return;
|
|
@@ -473,11 +517,11 @@ var SentimentAnalyzer = ({
|
|
|
473
517
|
if (!result) return null;
|
|
474
518
|
switch (result.sentiment) {
|
|
475
519
|
case "positive":
|
|
476
|
-
return /* @__PURE__ */
|
|
520
|
+
return /* @__PURE__ */ React33__namespace.default.createElement(lucideReact.Smile, { className: "text-green-500", size: 24 });
|
|
477
521
|
case "negative":
|
|
478
|
-
return /* @__PURE__ */
|
|
522
|
+
return /* @__PURE__ */ React33__namespace.default.createElement(lucideReact.Frown, { className: "text-red-500", size: 24 });
|
|
479
523
|
default:
|
|
480
|
-
return /* @__PURE__ */
|
|
524
|
+
return /* @__PURE__ */ React33__namespace.default.createElement(lucideReact.Meh, { className: "text-yellow-500", size: 24 });
|
|
481
525
|
}
|
|
482
526
|
};
|
|
483
527
|
const getSentimentColor = () => {
|
|
@@ -491,7 +535,7 @@ var SentimentAnalyzer = ({
|
|
|
491
535
|
return "bg-yellow-50 border-yellow-200 text-yellow-700";
|
|
492
536
|
}
|
|
493
537
|
};
|
|
494
|
-
return /* @__PURE__ */
|
|
538
|
+
return /* @__PURE__ */ React33__namespace.default.createElement("div", { className: `p-6 border rounded-xl bg-white dark:bg-gray-800 shadow-sm ${className}` }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "flex items-center gap-2 mb-4 text-gray-700 dark:text-gray-300 font-medium" }, /* @__PURE__ */ React33__namespace.default.createElement(lucideReact.MessageSquare, { size: 20 }), /* @__PURE__ */ React33__namespace.default.createElement("span", null, "\u6587\u672C\u60C5\u611F\u5206\u6790")), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React33__namespace.default.createElement(
|
|
495
539
|
"textarea",
|
|
496
540
|
{
|
|
497
541
|
value: text,
|
|
@@ -500,25 +544,25 @@ var SentimentAnalyzer = ({
|
|
|
500
544
|
className: "w-full h-32 p-4 bg-gray-50 dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all outline-none resize-none text-gray-800 dark:text-gray-200",
|
|
501
545
|
disabled: isProcessing
|
|
502
546
|
}
|
|
503
|
-
), /* @__PURE__ */
|
|
547
|
+
), /* @__PURE__ */ React33__namespace.default.createElement(
|
|
504
548
|
"button",
|
|
505
549
|
{
|
|
506
550
|
onClick: handleAnalyze,
|
|
507
551
|
disabled: !text.trim() || isProcessing,
|
|
508
552
|
className: "absolute bottom-3 right-3 p-2 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 text-white rounded-md transition-colors shadow-sm"
|
|
509
553
|
},
|
|
510
|
-
isProcessing ? /* @__PURE__ */
|
|
511
|
-
)), isProcessing && /* @__PURE__ */
|
|
554
|
+
isProcessing ? /* @__PURE__ */ React33__namespace.default.createElement(lucideReact.Loader2, { className: "animate-spin", size: 18 }) : /* @__PURE__ */ React33__namespace.default.createElement(lucideReact.Send, { size: 18 })
|
|
555
|
+
)), isProcessing && /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "mt-4 flex items-center gap-2 text-sm text-blue-600 animate-pulse" }, /* @__PURE__ */ React33__namespace.default.createElement(lucideReact.Loader2, { size: 14, className: "animate-spin" }), /* @__PURE__ */ React33__namespace.default.createElement("span", null, "\u6B63\u5728\u5206\u6790 (\u9996\u6B21\u8FD0\u884C\u5C06\u52A0\u8F7D\u6A21\u578B\u8D44\u6E90)...")), result && !isProcessing && /* @__PURE__ */ React33__namespace.default.createElement("div", { className: `mt-4 p-4 border rounded-lg flex items-center gap-4 animate-in fade-in slide-in-from-top-2 ${getSentimentColor()}` }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "p-2 bg-white rounded-full shadow-sm" }, getSentimentIcon()), /* @__PURE__ */ React33__namespace.default.createElement("div", null, /* @__PURE__ */ React33__namespace.default.createElement("p", { className: "font-bold text-lg capitalize" }, result.sentiment), /* @__PURE__ */ React33__namespace.default.createElement("p", { className: "text-sm opacity-80" }, "\u7F6E\u4FE1\u5EA6: ", (result.score * 100).toFixed(1), "% (", result.label, ")"))), error && /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "mt-4 p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100" }, "\u5206\u6790\u5931\u8D25: ", error.message));
|
|
512
556
|
};
|
|
513
557
|
var useTextGeneration = (options = {}) => {
|
|
514
|
-
const [state, setState] =
|
|
558
|
+
const [state, setState] = React33.useState({
|
|
515
559
|
isProcessing: false,
|
|
516
560
|
status: "idle",
|
|
517
561
|
error: null,
|
|
518
562
|
result: null
|
|
519
563
|
});
|
|
520
|
-
const pipelineRef =
|
|
521
|
-
const generate =
|
|
564
|
+
const pipelineRef = React33.useRef(null);
|
|
565
|
+
const generate = React33.useCallback(async (prompt) => {
|
|
522
566
|
console.log("[AI] Generating for prompt:", prompt);
|
|
523
567
|
setState((prev) => ({
|
|
524
568
|
...prev,
|
|
@@ -600,11 +644,11 @@ var useTextGeneration = (options = {}) => {
|
|
|
600
644
|
return { ...state, generate };
|
|
601
645
|
};
|
|
602
646
|
var SmartAssistant = ({ className = "" }) => {
|
|
603
|
-
const [input, setInput] =
|
|
604
|
-
const [chatHistory, setChatHistory] =
|
|
605
|
-
const scrollRef =
|
|
647
|
+
const [input, setInput] = React33.useState("");
|
|
648
|
+
const [chatHistory, setChatHistory] = React33.useState([]);
|
|
649
|
+
const scrollRef = React33.useRef(null);
|
|
606
650
|
const { generate, isProcessing: isGenerating, status: genStatus } = useTextGeneration();
|
|
607
|
-
|
|
651
|
+
React33.useEffect(() => {
|
|
608
652
|
if (scrollRef.current) {
|
|
609
653
|
scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
|
|
610
654
|
}
|
|
@@ -648,7 +692,7 @@ AI\u56DE\u5E94\uFF1A\u201C`;
|
|
|
648
692
|
setChatHistory((prev) => [...prev, { role: "assistant", content: "\uFF08\u672C\u5730\u6A21\u578B\u601D\u8003\u8FC7\u5EA6\uFF0C\u6682\u65F6\u4F11\u606F\u4E2D...\uFF09" }]);
|
|
649
693
|
}
|
|
650
694
|
};
|
|
651
|
-
return /* @__PURE__ */
|
|
695
|
+
return /* @__PURE__ */ React33__namespace.default.createElement("div", { className: `flex flex-col h-[500px] bg-white dark:bg-gray-800 rounded-xl shadow-inner border border-gray-100 dark:border-gray-700 overflow-hidden ${className}` }, /* @__PURE__ */ React33__namespace.default.createElement("div", { ref: scrollRef, className: "flex-1 overflow-y-auto p-4 space-y-4 bg-gray-50/50 dark:bg-gray-900/50" }, chatHistory.length === 0 && /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "h-full flex flex-col items-center justify-center text-gray-400 space-y-2" }, /* @__PURE__ */ React33__namespace.default.createElement(lucideReact.Bot, { size: 48, className: "opacity-20" }), /* @__PURE__ */ React33__namespace.default.createElement("p", { className: "text-sm italic text-center px-8 text-gray-400 font-sans" }, "\u4F60\u597D\uFF01\u6211\u662F 100% \u672C\u5730\u8FD0\u884C\u7684 AI\u3002", /* @__PURE__ */ React33__namespace.default.createElement("br", null), "\u4F60\u53EF\u4EE5\u548C\u6211\u804A\u804A\u5929\uFF0C\u6211\u4F1A\u5C1D\u8BD5\u7406\u89E3\u4F60\u7684\u610F\u601D\u3002")), chatHistory.map((msg, i) => /* @__PURE__ */ React33__namespace.default.createElement("div", { key: i, className: `flex ${msg.role === "user" ? "justify-end" : "justify-start"} animate-in fade-in slide-in-from-bottom-2` }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: `flex gap-3 max-w-[85%] ${msg.role === "user" ? "flex-row-reverse" : ""}` }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: `p-2 rounded-lg h-fit ${msg.role === "user" ? "bg-blue-100 text-blue-600" : "bg-white dark:bg-gray-700 shadow-sm border border-gray-100 dark:border-gray-600 text-gray-400"}` }, msg.role === "user" ? /* @__PURE__ */ React33__namespace.default.createElement(lucideReact.User, { size: 18 }) : /* @__PURE__ */ React33__namespace.default.createElement(lucideReact.Bot, { size: 18 })), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: `p-3 rounded-2xl shadow-sm text-sm ${msg.role === "user" ? "bg-blue-600 text-white rounded-tr-none" : "bg-white dark:bg-gray-700 text-gray-800 dark:text-gray-200 rounded-tl-none border border-gray-100 dark:border-gray-600 leading-relaxed"}` }, msg.content)))), isGenerating && /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "flex justify-start" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "flex gap-3 items-center bg-white dark:bg-gray-700 p-3 rounded-2xl rounded-tl-none border border-gray-100 dark:border-gray-600" }, /* @__PURE__ */ React33__namespace.default.createElement(lucideReact.Loader2, { className: "animate-spin text-blue-500", size: 16 }), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ React33__namespace.default.createElement("span", { className: "text-xs text-gray-500 font-medium" }, "\u601D\u8003\u4E2D..."), /* @__PURE__ */ React33__namespace.default.createElement("span", { className: "text-[10px] text-blue-400 font-mono tracking-tighter" }, genStatus))))), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "p-4 bg-white dark:bg-gray-800 border-t border-gray-100 dark:border-gray-700" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "relative flex items-center gap-2" }, /* @__PURE__ */ React33__namespace.default.createElement(
|
|
652
696
|
"input",
|
|
653
697
|
{
|
|
654
698
|
type: "text",
|
|
@@ -659,48 +703,1954 @@ AI\u56DE\u5E94\uFF1A\u201C`;
|
|
|
659
703
|
className: "flex-1 bg-gray-50 dark:bg-gray-900 border-none rounded-full px-5 py-3 pr-12 text-sm focus:ring-2 focus:ring-blue-500 outline-none dark:text-white text-gray-800",
|
|
660
704
|
disabled: isGenerating
|
|
661
705
|
}
|
|
662
|
-
), /* @__PURE__ */
|
|
706
|
+
), /* @__PURE__ */ React33__namespace.default.createElement(
|
|
663
707
|
"button",
|
|
664
708
|
{
|
|
665
709
|
onClick: handleSend,
|
|
666
710
|
disabled: !input.trim() || isGenerating,
|
|
667
711
|
className: "absolute right-1 p-2.5 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 text-white rounded-full transition-all shadow-md active:scale-95 flex items-center justify-center"
|
|
668
712
|
},
|
|
669
|
-
/* @__PURE__ */
|
|
713
|
+
/* @__PURE__ */ React33__namespace.default.createElement(lucideReact.Send, { size: 18 })
|
|
714
|
+
))));
|
|
715
|
+
};
|
|
716
|
+
var buttonVariants = classVarianceAuthority.cva(
|
|
717
|
+
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
|
|
718
|
+
{
|
|
719
|
+
variants: {
|
|
720
|
+
variant: {
|
|
721
|
+
default: "bg-primary text-primary-foreground shadow hover:bg-primary/90",
|
|
722
|
+
destructive: "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
|
|
723
|
+
outline: "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
|
|
724
|
+
secondary: "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
|
|
725
|
+
ghost: "hover:bg-accent hover:text-accent-foreground",
|
|
726
|
+
link: "text-primary underline-offset-4 hover:underline"
|
|
727
|
+
},
|
|
728
|
+
size: {
|
|
729
|
+
default: "h-9 px-4 py-2",
|
|
730
|
+
sm: "h-8 rounded-md px-3 text-xs",
|
|
731
|
+
lg: "h-10 rounded-md px-8",
|
|
732
|
+
icon: "h-9 w-9"
|
|
733
|
+
}
|
|
734
|
+
},
|
|
735
|
+
defaultVariants: {
|
|
736
|
+
variant: "default",
|
|
737
|
+
size: "default"
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
);
|
|
741
|
+
var Button = React33__namespace.forwardRef(
|
|
742
|
+
({ className, variant, size, asChild = false, ...props }, ref) => {
|
|
743
|
+
const Comp = asChild ? reactSlot.Slot : "button";
|
|
744
|
+
return /* @__PURE__ */ React33__namespace.createElement(
|
|
745
|
+
Comp,
|
|
746
|
+
{
|
|
747
|
+
className: chunk7Z5LLJ3A_js.cn(buttonVariants({ variant, size, className })),
|
|
748
|
+
ref,
|
|
749
|
+
...props
|
|
750
|
+
}
|
|
751
|
+
);
|
|
752
|
+
}
|
|
753
|
+
);
|
|
754
|
+
Button.displayName = "Button";
|
|
755
|
+
var Card = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
756
|
+
"div",
|
|
757
|
+
{
|
|
758
|
+
ref,
|
|
759
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
760
|
+
"rounded-xl border bg-card text-card-foreground shadow",
|
|
761
|
+
className
|
|
762
|
+
),
|
|
763
|
+
...props
|
|
764
|
+
}
|
|
765
|
+
));
|
|
766
|
+
Card.displayName = "Card";
|
|
767
|
+
var CardHeader = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
768
|
+
"div",
|
|
769
|
+
{
|
|
770
|
+
ref,
|
|
771
|
+
className: chunk7Z5LLJ3A_js.cn("flex flex-col space-y-1.5 p-6", className),
|
|
772
|
+
...props
|
|
773
|
+
}
|
|
774
|
+
));
|
|
775
|
+
CardHeader.displayName = "CardHeader";
|
|
776
|
+
var CardTitle = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
777
|
+
"div",
|
|
778
|
+
{
|
|
779
|
+
ref,
|
|
780
|
+
className: chunk7Z5LLJ3A_js.cn("font-semibold leading-none tracking-tight", className),
|
|
781
|
+
...props
|
|
782
|
+
}
|
|
783
|
+
));
|
|
784
|
+
CardTitle.displayName = "CardTitle";
|
|
785
|
+
var CardDescription = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
786
|
+
"div",
|
|
787
|
+
{
|
|
788
|
+
ref,
|
|
789
|
+
className: chunk7Z5LLJ3A_js.cn("text-sm text-muted-foreground", className),
|
|
790
|
+
...props
|
|
791
|
+
}
|
|
792
|
+
));
|
|
793
|
+
CardDescription.displayName = "CardDescription";
|
|
794
|
+
var CardContent = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement("div", { ref, className: chunk7Z5LLJ3A_js.cn("p-6 pt-0", className), ...props }));
|
|
795
|
+
CardContent.displayName = "CardContent";
|
|
796
|
+
var CardFooter = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
797
|
+
"div",
|
|
798
|
+
{
|
|
799
|
+
ref,
|
|
800
|
+
className: chunk7Z5LLJ3A_js.cn("flex items-center p-6 pt-0", className),
|
|
801
|
+
...props
|
|
802
|
+
}
|
|
803
|
+
));
|
|
804
|
+
CardFooter.displayName = "CardFooter";
|
|
805
|
+
var badgeVariants = classVarianceAuthority.cva(
|
|
806
|
+
"inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
|
|
807
|
+
{
|
|
808
|
+
variants: {
|
|
809
|
+
variant: {
|
|
810
|
+
default: "border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",
|
|
811
|
+
secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
812
|
+
destructive: "border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",
|
|
813
|
+
outline: "text-foreground"
|
|
814
|
+
}
|
|
815
|
+
},
|
|
816
|
+
defaultVariants: {
|
|
817
|
+
variant: "default"
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
);
|
|
821
|
+
function Badge({ className, variant, ...props }) {
|
|
822
|
+
return /* @__PURE__ */ React33__namespace.createElement("div", { className: chunk7Z5LLJ3A_js.cn(badgeVariants({ variant }), className), ...props });
|
|
823
|
+
}
|
|
824
|
+
var Input = React33__namespace.forwardRef(
|
|
825
|
+
({ className, type, ...props }, ref) => {
|
|
826
|
+
return /* @__PURE__ */ React33__namespace.createElement(
|
|
827
|
+
"input",
|
|
828
|
+
{
|
|
829
|
+
type,
|
|
830
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
831
|
+
"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
|
|
832
|
+
className
|
|
833
|
+
),
|
|
834
|
+
ref,
|
|
835
|
+
...props
|
|
836
|
+
}
|
|
837
|
+
);
|
|
838
|
+
}
|
|
839
|
+
);
|
|
840
|
+
Input.displayName = "Input";
|
|
841
|
+
var labelVariants = classVarianceAuthority.cva(
|
|
842
|
+
"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
|
|
843
|
+
);
|
|
844
|
+
var Label = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
845
|
+
LabelPrimitive__namespace.Root,
|
|
846
|
+
{
|
|
847
|
+
ref,
|
|
848
|
+
className: chunk7Z5LLJ3A_js.cn(labelVariants(), className),
|
|
849
|
+
...props
|
|
850
|
+
}
|
|
851
|
+
));
|
|
852
|
+
Label.displayName = LabelPrimitive__namespace.Root.displayName;
|
|
853
|
+
var Tabs = TabsPrimitive__namespace.Root;
|
|
854
|
+
var TabsList = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
855
|
+
TabsPrimitive__namespace.List,
|
|
856
|
+
{
|
|
857
|
+
ref,
|
|
858
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
859
|
+
"inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground",
|
|
860
|
+
className
|
|
861
|
+
),
|
|
862
|
+
...props
|
|
863
|
+
}
|
|
864
|
+
));
|
|
865
|
+
TabsList.displayName = TabsPrimitive__namespace.List.displayName;
|
|
866
|
+
var TabsTrigger = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
867
|
+
TabsPrimitive__namespace.Trigger,
|
|
868
|
+
{
|
|
869
|
+
ref,
|
|
870
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
871
|
+
"inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow",
|
|
872
|
+
className
|
|
873
|
+
),
|
|
874
|
+
...props
|
|
875
|
+
}
|
|
876
|
+
));
|
|
877
|
+
TabsTrigger.displayName = TabsPrimitive__namespace.Trigger.displayName;
|
|
878
|
+
var TabsContent = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
879
|
+
TabsPrimitive__namespace.Content,
|
|
880
|
+
{
|
|
881
|
+
ref,
|
|
882
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
883
|
+
"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
|
|
884
|
+
className
|
|
885
|
+
),
|
|
886
|
+
...props
|
|
887
|
+
}
|
|
888
|
+
));
|
|
889
|
+
TabsContent.displayName = TabsPrimitive__namespace.Content.displayName;
|
|
890
|
+
var Dialog = DialogPrimitive__namespace.Root;
|
|
891
|
+
var DialogTrigger = DialogPrimitive__namespace.Trigger;
|
|
892
|
+
var DialogPortal = DialogPrimitive__namespace.Portal;
|
|
893
|
+
var DialogClose = DialogPrimitive__namespace.Close;
|
|
894
|
+
var DialogOverlay = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
895
|
+
DialogPrimitive__namespace.Overlay,
|
|
896
|
+
{
|
|
897
|
+
ref,
|
|
898
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
899
|
+
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
900
|
+
className
|
|
901
|
+
),
|
|
902
|
+
...props
|
|
903
|
+
}
|
|
904
|
+
));
|
|
905
|
+
DialogOverlay.displayName = DialogPrimitive__namespace.Overlay.displayName;
|
|
906
|
+
var DialogContent = React33__namespace.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(DialogPortal, null, /* @__PURE__ */ React33__namespace.createElement(DialogOverlay, null), /* @__PURE__ */ React33__namespace.createElement(
|
|
907
|
+
DialogPrimitive__namespace.Content,
|
|
908
|
+
{
|
|
909
|
+
ref,
|
|
910
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
911
|
+
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
|
|
912
|
+
className
|
|
913
|
+
),
|
|
914
|
+
...props
|
|
915
|
+
},
|
|
916
|
+
children,
|
|
917
|
+
/* @__PURE__ */ React33__namespace.createElement(DialogPrimitive__namespace.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground" }, /* @__PURE__ */ React33__namespace.createElement(lucideReact.X, { className: "h-4 w-4" }), /* @__PURE__ */ React33__namespace.createElement("span", { className: "sr-only" }, "Close"))
|
|
918
|
+
)));
|
|
919
|
+
DialogContent.displayName = DialogPrimitive__namespace.Content.displayName;
|
|
920
|
+
var DialogHeader = ({
|
|
921
|
+
className,
|
|
922
|
+
...props
|
|
923
|
+
}) => /* @__PURE__ */ React33__namespace.createElement(
|
|
924
|
+
"div",
|
|
925
|
+
{
|
|
926
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
927
|
+
"flex flex-col space-y-1.5 text-center sm:text-left",
|
|
928
|
+
className
|
|
929
|
+
),
|
|
930
|
+
...props
|
|
931
|
+
}
|
|
932
|
+
);
|
|
933
|
+
DialogHeader.displayName = "DialogHeader";
|
|
934
|
+
var DialogFooter = ({
|
|
935
|
+
className,
|
|
936
|
+
...props
|
|
937
|
+
}) => /* @__PURE__ */ React33__namespace.createElement(
|
|
938
|
+
"div",
|
|
939
|
+
{
|
|
940
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
941
|
+
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
|
|
942
|
+
className
|
|
943
|
+
),
|
|
944
|
+
...props
|
|
945
|
+
}
|
|
946
|
+
);
|
|
947
|
+
DialogFooter.displayName = "DialogFooter";
|
|
948
|
+
var DialogTitle = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
949
|
+
DialogPrimitive__namespace.Title,
|
|
950
|
+
{
|
|
951
|
+
ref,
|
|
952
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
953
|
+
"text-lg font-semibold leading-none tracking-tight",
|
|
954
|
+
className
|
|
955
|
+
),
|
|
956
|
+
...props
|
|
957
|
+
}
|
|
958
|
+
));
|
|
959
|
+
DialogTitle.displayName = DialogPrimitive__namespace.Title.displayName;
|
|
960
|
+
var DialogDescription = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
961
|
+
DialogPrimitive__namespace.Description,
|
|
962
|
+
{
|
|
963
|
+
ref,
|
|
964
|
+
className: chunk7Z5LLJ3A_js.cn("text-sm text-muted-foreground", className),
|
|
965
|
+
...props
|
|
966
|
+
}
|
|
967
|
+
));
|
|
968
|
+
DialogDescription.displayName = DialogPrimitive__namespace.Description.displayName;
|
|
969
|
+
var AlertDialog = AlertDialogPrimitive__namespace.Root;
|
|
970
|
+
var AlertDialogTrigger = AlertDialogPrimitive__namespace.Trigger;
|
|
971
|
+
var AlertDialogPortal = AlertDialogPrimitive__namespace.Portal;
|
|
972
|
+
var AlertDialogOverlay = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
973
|
+
AlertDialogPrimitive__namespace.Overlay,
|
|
974
|
+
{
|
|
975
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
976
|
+
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
977
|
+
className
|
|
978
|
+
),
|
|
979
|
+
...props,
|
|
980
|
+
ref
|
|
981
|
+
}
|
|
982
|
+
));
|
|
983
|
+
AlertDialogOverlay.displayName = AlertDialogPrimitive__namespace.Overlay.displayName;
|
|
984
|
+
var AlertDialogContent = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(AlertDialogPortal, null, /* @__PURE__ */ React33__namespace.createElement(AlertDialogOverlay, null), /* @__PURE__ */ React33__namespace.createElement(
|
|
985
|
+
AlertDialogPrimitive__namespace.Content,
|
|
986
|
+
{
|
|
987
|
+
ref,
|
|
988
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
989
|
+
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
|
|
990
|
+
className
|
|
991
|
+
),
|
|
992
|
+
...props
|
|
993
|
+
}
|
|
994
|
+
)));
|
|
995
|
+
AlertDialogContent.displayName = AlertDialogPrimitive__namespace.Content.displayName;
|
|
996
|
+
var AlertDialogHeader = ({
|
|
997
|
+
className,
|
|
998
|
+
...props
|
|
999
|
+
}) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1000
|
+
"div",
|
|
1001
|
+
{
|
|
1002
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1003
|
+
"flex flex-col space-y-2 text-center sm:text-left",
|
|
1004
|
+
className
|
|
1005
|
+
),
|
|
1006
|
+
...props
|
|
1007
|
+
}
|
|
1008
|
+
);
|
|
1009
|
+
AlertDialogHeader.displayName = "AlertDialogHeader";
|
|
1010
|
+
var AlertDialogFooter = ({
|
|
1011
|
+
className,
|
|
1012
|
+
...props
|
|
1013
|
+
}) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1014
|
+
"div",
|
|
1015
|
+
{
|
|
1016
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1017
|
+
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
|
|
1018
|
+
className
|
|
1019
|
+
),
|
|
1020
|
+
...props
|
|
1021
|
+
}
|
|
1022
|
+
);
|
|
1023
|
+
AlertDialogFooter.displayName = "AlertDialogFooter";
|
|
1024
|
+
var AlertDialogTitle = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1025
|
+
AlertDialogPrimitive__namespace.Title,
|
|
1026
|
+
{
|
|
1027
|
+
ref,
|
|
1028
|
+
className: chunk7Z5LLJ3A_js.cn("text-lg font-semibold", className),
|
|
1029
|
+
...props
|
|
1030
|
+
}
|
|
1031
|
+
));
|
|
1032
|
+
AlertDialogTitle.displayName = AlertDialogPrimitive__namespace.Title.displayName;
|
|
1033
|
+
var AlertDialogDescription = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1034
|
+
AlertDialogPrimitive__namespace.Description,
|
|
1035
|
+
{
|
|
1036
|
+
ref,
|
|
1037
|
+
className: chunk7Z5LLJ3A_js.cn("text-sm text-muted-foreground", className),
|
|
1038
|
+
...props
|
|
1039
|
+
}
|
|
1040
|
+
));
|
|
1041
|
+
AlertDialogDescription.displayName = AlertDialogPrimitive__namespace.Description.displayName;
|
|
1042
|
+
var AlertDialogAction = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1043
|
+
AlertDialogPrimitive__namespace.Action,
|
|
1044
|
+
{
|
|
1045
|
+
ref,
|
|
1046
|
+
className: chunk7Z5LLJ3A_js.cn(buttonVariants(), className),
|
|
1047
|
+
...props
|
|
1048
|
+
}
|
|
1049
|
+
));
|
|
1050
|
+
AlertDialogAction.displayName = AlertDialogPrimitive__namespace.Action.displayName;
|
|
1051
|
+
var AlertDialogCancel = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1052
|
+
AlertDialogPrimitive__namespace.Cancel,
|
|
1053
|
+
{
|
|
1054
|
+
ref,
|
|
1055
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1056
|
+
buttonVariants({ variant: "outline" }),
|
|
1057
|
+
"mt-2 sm:mt-0",
|
|
1058
|
+
className
|
|
1059
|
+
),
|
|
1060
|
+
...props
|
|
1061
|
+
}
|
|
1062
|
+
));
|
|
1063
|
+
AlertDialogCancel.displayName = AlertDialogPrimitive__namespace.Cancel.displayName;
|
|
1064
|
+
var DropdownMenu = DropdownMenuPrimitive__namespace.Root;
|
|
1065
|
+
var DropdownMenuTrigger = DropdownMenuPrimitive__namespace.Trigger;
|
|
1066
|
+
var DropdownMenuGroup = DropdownMenuPrimitive__namespace.Group;
|
|
1067
|
+
var DropdownMenuPortal = DropdownMenuPrimitive__namespace.Portal;
|
|
1068
|
+
var DropdownMenuSub = DropdownMenuPrimitive__namespace.Sub;
|
|
1069
|
+
var DropdownMenuRadioGroup = DropdownMenuPrimitive__namespace.RadioGroup;
|
|
1070
|
+
var DropdownMenuSubTrigger = React33__namespace.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1071
|
+
DropdownMenuPrimitive__namespace.SubTrigger,
|
|
1072
|
+
{
|
|
1073
|
+
ref,
|
|
1074
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1075
|
+
"flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
|
|
1076
|
+
inset && "pl-8",
|
|
1077
|
+
className
|
|
1078
|
+
),
|
|
1079
|
+
...props
|
|
1080
|
+
},
|
|
1081
|
+
children,
|
|
1082
|
+
/* @__PURE__ */ React33__namespace.createElement(lucideReact.ChevronRight, { className: "ml-auto" })
|
|
1083
|
+
));
|
|
1084
|
+
DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive__namespace.SubTrigger.displayName;
|
|
1085
|
+
var DropdownMenuSubContent = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1086
|
+
DropdownMenuPrimitive__namespace.SubContent,
|
|
1087
|
+
{
|
|
1088
|
+
ref,
|
|
1089
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1090
|
+
"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]",
|
|
1091
|
+
className
|
|
1092
|
+
),
|
|
1093
|
+
...props
|
|
1094
|
+
}
|
|
1095
|
+
));
|
|
1096
|
+
DropdownMenuSubContent.displayName = DropdownMenuPrimitive__namespace.SubContent.displayName;
|
|
1097
|
+
var DropdownMenuContent = React33__namespace.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(DropdownMenuPrimitive__namespace.Portal, null, /* @__PURE__ */ React33__namespace.createElement(
|
|
1098
|
+
DropdownMenuPrimitive__namespace.Content,
|
|
1099
|
+
{
|
|
1100
|
+
ref,
|
|
1101
|
+
sideOffset,
|
|
1102
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1103
|
+
"z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md",
|
|
1104
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]",
|
|
1105
|
+
className
|
|
1106
|
+
),
|
|
1107
|
+
...props
|
|
1108
|
+
}
|
|
1109
|
+
)));
|
|
1110
|
+
DropdownMenuContent.displayName = DropdownMenuPrimitive__namespace.Content.displayName;
|
|
1111
|
+
var DropdownMenuItem = React33__namespace.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1112
|
+
DropdownMenuPrimitive__namespace.Item,
|
|
1113
|
+
{
|
|
1114
|
+
ref,
|
|
1115
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1116
|
+
"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0",
|
|
1117
|
+
inset && "pl-8",
|
|
1118
|
+
className
|
|
1119
|
+
),
|
|
1120
|
+
...props
|
|
1121
|
+
}
|
|
1122
|
+
));
|
|
1123
|
+
DropdownMenuItem.displayName = DropdownMenuPrimitive__namespace.Item.displayName;
|
|
1124
|
+
var DropdownMenuCheckboxItem = React33__namespace.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1125
|
+
DropdownMenuPrimitive__namespace.CheckboxItem,
|
|
1126
|
+
{
|
|
1127
|
+
ref,
|
|
1128
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1129
|
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
1130
|
+
className
|
|
1131
|
+
),
|
|
1132
|
+
checked,
|
|
1133
|
+
...props
|
|
1134
|
+
},
|
|
1135
|
+
/* @__PURE__ */ React33__namespace.createElement("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center" }, /* @__PURE__ */ React33__namespace.createElement(DropdownMenuPrimitive__namespace.ItemIndicator, null, /* @__PURE__ */ React33__namespace.createElement(lucideReact.Check, { className: "h-4 w-4" }))),
|
|
1136
|
+
children
|
|
1137
|
+
));
|
|
1138
|
+
DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive__namespace.CheckboxItem.displayName;
|
|
1139
|
+
var DropdownMenuRadioItem = React33__namespace.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1140
|
+
DropdownMenuPrimitive__namespace.RadioItem,
|
|
1141
|
+
{
|
|
1142
|
+
ref,
|
|
1143
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1144
|
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
1145
|
+
className
|
|
1146
|
+
),
|
|
1147
|
+
...props
|
|
1148
|
+
},
|
|
1149
|
+
/* @__PURE__ */ React33__namespace.createElement("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center" }, /* @__PURE__ */ React33__namespace.createElement(DropdownMenuPrimitive__namespace.ItemIndicator, null, /* @__PURE__ */ React33__namespace.createElement(lucideReact.Circle, { className: "h-2 w-2 fill-current" }))),
|
|
1150
|
+
children
|
|
1151
|
+
));
|
|
1152
|
+
DropdownMenuRadioItem.displayName = DropdownMenuPrimitive__namespace.RadioItem.displayName;
|
|
1153
|
+
var DropdownMenuLabel = React33__namespace.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1154
|
+
DropdownMenuPrimitive__namespace.Label,
|
|
1155
|
+
{
|
|
1156
|
+
ref,
|
|
1157
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1158
|
+
"px-2 py-1.5 text-sm font-semibold",
|
|
1159
|
+
inset && "pl-8",
|
|
1160
|
+
className
|
|
1161
|
+
),
|
|
1162
|
+
...props
|
|
1163
|
+
}
|
|
1164
|
+
));
|
|
1165
|
+
DropdownMenuLabel.displayName = DropdownMenuPrimitive__namespace.Label.displayName;
|
|
1166
|
+
var DropdownMenuSeparator = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1167
|
+
DropdownMenuPrimitive__namespace.Separator,
|
|
1168
|
+
{
|
|
1169
|
+
ref,
|
|
1170
|
+
className: chunk7Z5LLJ3A_js.cn("-mx-1 my-1 h-px bg-muted", className),
|
|
1171
|
+
...props
|
|
1172
|
+
}
|
|
1173
|
+
));
|
|
1174
|
+
DropdownMenuSeparator.displayName = DropdownMenuPrimitive__namespace.Separator.displayName;
|
|
1175
|
+
var DropdownMenuShortcut = ({
|
|
1176
|
+
className,
|
|
1177
|
+
...props
|
|
1178
|
+
}) => {
|
|
1179
|
+
return /* @__PURE__ */ React33__namespace.createElement(
|
|
1180
|
+
"span",
|
|
1181
|
+
{
|
|
1182
|
+
className: chunk7Z5LLJ3A_js.cn("ml-auto text-xs tracking-widest opacity-60", className),
|
|
1183
|
+
...props
|
|
1184
|
+
}
|
|
1185
|
+
);
|
|
1186
|
+
};
|
|
1187
|
+
DropdownMenuShortcut.displayName = "DropdownMenuShortcut";
|
|
1188
|
+
var Popover = PopoverPrimitive__namespace.Root;
|
|
1189
|
+
var PopoverTrigger = PopoverPrimitive__namespace.Trigger;
|
|
1190
|
+
var PopoverAnchor = PopoverPrimitive__namespace.Anchor;
|
|
1191
|
+
var PopoverContent = React33__namespace.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(PopoverPrimitive__namespace.Portal, null, /* @__PURE__ */ React33__namespace.createElement(
|
|
1192
|
+
PopoverPrimitive__namespace.Content,
|
|
1193
|
+
{
|
|
1194
|
+
ref,
|
|
1195
|
+
align,
|
|
1196
|
+
sideOffset,
|
|
1197
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1198
|
+
"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin]",
|
|
1199
|
+
className
|
|
1200
|
+
),
|
|
1201
|
+
...props
|
|
1202
|
+
}
|
|
1203
|
+
)));
|
|
1204
|
+
PopoverContent.displayName = PopoverPrimitive__namespace.Content.displayName;
|
|
1205
|
+
var Progress = React33__namespace.forwardRef(({ className, value, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1206
|
+
ProgressPrimitive__namespace.Root,
|
|
1207
|
+
{
|
|
1208
|
+
ref,
|
|
1209
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1210
|
+
"relative h-2 w-full overflow-hidden rounded-full bg-primary/20",
|
|
1211
|
+
className
|
|
1212
|
+
),
|
|
1213
|
+
...props
|
|
1214
|
+
},
|
|
1215
|
+
/* @__PURE__ */ React33__namespace.createElement(
|
|
1216
|
+
ProgressPrimitive__namespace.Indicator,
|
|
1217
|
+
{
|
|
1218
|
+
className: "h-full w-full flex-1 bg-primary transition-all",
|
|
1219
|
+
style: { transform: `translateX(-${100 - (value || 0)}%)` }
|
|
1220
|
+
}
|
|
1221
|
+
)
|
|
1222
|
+
));
|
|
1223
|
+
Progress.displayName = ProgressPrimitive__namespace.Root.displayName;
|
|
1224
|
+
var ScrollArea = React33__namespace.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1225
|
+
ScrollAreaPrimitive__namespace.Root,
|
|
1226
|
+
{
|
|
1227
|
+
ref,
|
|
1228
|
+
className: chunk7Z5LLJ3A_js.cn("relative overflow-hidden", className),
|
|
1229
|
+
...props
|
|
1230
|
+
},
|
|
1231
|
+
/* @__PURE__ */ React33__namespace.createElement(ScrollAreaPrimitive__namespace.Viewport, { className: "h-full w-full rounded-[inherit]" }, children),
|
|
1232
|
+
/* @__PURE__ */ React33__namespace.createElement(ScrollBar, null),
|
|
1233
|
+
/* @__PURE__ */ React33__namespace.createElement(ScrollAreaPrimitive__namespace.Corner, null)
|
|
1234
|
+
));
|
|
1235
|
+
ScrollArea.displayName = ScrollAreaPrimitive__namespace.Root.displayName;
|
|
1236
|
+
var ScrollBar = React33__namespace.forwardRef(({ className, orientation = "vertical", ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1237
|
+
ScrollAreaPrimitive__namespace.ScrollAreaScrollbar,
|
|
1238
|
+
{
|
|
1239
|
+
ref,
|
|
1240
|
+
orientation,
|
|
1241
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1242
|
+
"flex touch-none select-none transition-colors",
|
|
1243
|
+
orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent p-[1px]",
|
|
1244
|
+
orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent p-[1px]",
|
|
1245
|
+
className
|
|
1246
|
+
),
|
|
1247
|
+
...props
|
|
1248
|
+
},
|
|
1249
|
+
/* @__PURE__ */ React33__namespace.createElement(ScrollAreaPrimitive__namespace.ScrollAreaThumb, { className: "relative flex-1 rounded-full bg-border" })
|
|
1250
|
+
));
|
|
1251
|
+
ScrollBar.displayName = ScrollAreaPrimitive__namespace.ScrollAreaScrollbar.displayName;
|
|
1252
|
+
var Select = SelectPrimitive__namespace.Root;
|
|
1253
|
+
var SelectGroup = SelectPrimitive__namespace.Group;
|
|
1254
|
+
var SelectValue = SelectPrimitive__namespace.Value;
|
|
1255
|
+
var SelectTrigger = React33__namespace.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1256
|
+
SelectPrimitive__namespace.Trigger,
|
|
1257
|
+
{
|
|
1258
|
+
ref,
|
|
1259
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1260
|
+
"flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",
|
|
1261
|
+
className
|
|
1262
|
+
),
|
|
1263
|
+
...props
|
|
1264
|
+
},
|
|
1265
|
+
children,
|
|
1266
|
+
/* @__PURE__ */ React33__namespace.createElement(SelectPrimitive__namespace.Icon, { asChild: true }, /* @__PURE__ */ React33__namespace.createElement(lucideReact.ChevronDown, { className: "h-4 w-4 opacity-50" }))
|
|
1267
|
+
));
|
|
1268
|
+
SelectTrigger.displayName = SelectPrimitive__namespace.Trigger.displayName;
|
|
1269
|
+
var SelectScrollUpButton = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1270
|
+
SelectPrimitive__namespace.ScrollUpButton,
|
|
1271
|
+
{
|
|
1272
|
+
ref,
|
|
1273
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1274
|
+
"flex cursor-default items-center justify-center py-1",
|
|
1275
|
+
className
|
|
1276
|
+
),
|
|
1277
|
+
...props
|
|
1278
|
+
},
|
|
1279
|
+
/* @__PURE__ */ React33__namespace.createElement(lucideReact.ChevronUp, { className: "h-4 w-4" })
|
|
1280
|
+
));
|
|
1281
|
+
SelectScrollUpButton.displayName = SelectPrimitive__namespace.ScrollUpButton.displayName;
|
|
1282
|
+
var SelectScrollDownButton = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1283
|
+
SelectPrimitive__namespace.ScrollDownButton,
|
|
1284
|
+
{
|
|
1285
|
+
ref,
|
|
1286
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1287
|
+
"flex cursor-default items-center justify-center py-1",
|
|
1288
|
+
className
|
|
1289
|
+
),
|
|
1290
|
+
...props
|
|
1291
|
+
},
|
|
1292
|
+
/* @__PURE__ */ React33__namespace.createElement(lucideReact.ChevronDown, { className: "h-4 w-4" })
|
|
1293
|
+
));
|
|
1294
|
+
SelectScrollDownButton.displayName = SelectPrimitive__namespace.ScrollDownButton.displayName;
|
|
1295
|
+
var SelectContent = React33__namespace.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(SelectPrimitive__namespace.Portal, null, /* @__PURE__ */ React33__namespace.createElement(
|
|
1296
|
+
SelectPrimitive__namespace.Content,
|
|
1297
|
+
{
|
|
1298
|
+
ref,
|
|
1299
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1300
|
+
"relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]",
|
|
1301
|
+
position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
|
|
1302
|
+
className
|
|
1303
|
+
),
|
|
1304
|
+
position,
|
|
1305
|
+
...props
|
|
1306
|
+
},
|
|
1307
|
+
/* @__PURE__ */ React33__namespace.createElement(SelectScrollUpButton, null),
|
|
1308
|
+
/* @__PURE__ */ React33__namespace.createElement(
|
|
1309
|
+
SelectPrimitive__namespace.Viewport,
|
|
1310
|
+
{
|
|
1311
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1312
|
+
"p-1",
|
|
1313
|
+
position === "popper" && "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"
|
|
1314
|
+
)
|
|
1315
|
+
},
|
|
1316
|
+
children
|
|
1317
|
+
),
|
|
1318
|
+
/* @__PURE__ */ React33__namespace.createElement(SelectScrollDownButton, null)
|
|
1319
|
+
)));
|
|
1320
|
+
SelectContent.displayName = SelectPrimitive__namespace.Content.displayName;
|
|
1321
|
+
var SelectLabel = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1322
|
+
SelectPrimitive__namespace.Label,
|
|
1323
|
+
{
|
|
1324
|
+
ref,
|
|
1325
|
+
className: chunk7Z5LLJ3A_js.cn("px-2 py-1.5 text-sm font-semibold", className),
|
|
1326
|
+
...props
|
|
1327
|
+
}
|
|
1328
|
+
));
|
|
1329
|
+
SelectLabel.displayName = SelectPrimitive__namespace.Label.displayName;
|
|
1330
|
+
var SelectItem = React33__namespace.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1331
|
+
SelectPrimitive__namespace.Item,
|
|
1332
|
+
{
|
|
1333
|
+
ref,
|
|
1334
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1335
|
+
"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
1336
|
+
className
|
|
1337
|
+
),
|
|
1338
|
+
...props
|
|
1339
|
+
},
|
|
1340
|
+
/* @__PURE__ */ React33__namespace.createElement("span", { className: "absolute right-2 flex h-3.5 w-3.5 items-center justify-center" }, /* @__PURE__ */ React33__namespace.createElement(SelectPrimitive__namespace.ItemIndicator, null, /* @__PURE__ */ React33__namespace.createElement(lucideReact.Check, { className: "h-4 w-4" }))),
|
|
1341
|
+
/* @__PURE__ */ React33__namespace.createElement(SelectPrimitive__namespace.ItemText, null, children)
|
|
1342
|
+
));
|
|
1343
|
+
SelectItem.displayName = SelectPrimitive__namespace.Item.displayName;
|
|
1344
|
+
var SelectSeparator = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1345
|
+
SelectPrimitive__namespace.Separator,
|
|
1346
|
+
{
|
|
1347
|
+
ref,
|
|
1348
|
+
className: chunk7Z5LLJ3A_js.cn("-mx-1 my-1 h-px bg-muted", className),
|
|
1349
|
+
...props
|
|
1350
|
+
}
|
|
1351
|
+
));
|
|
1352
|
+
SelectSeparator.displayName = SelectPrimitive__namespace.Separator.displayName;
|
|
1353
|
+
var Separator3 = React33__namespace.forwardRef(
|
|
1354
|
+
({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1355
|
+
SeparatorPrimitive__namespace.Root,
|
|
1356
|
+
{
|
|
1357
|
+
ref,
|
|
1358
|
+
decorative,
|
|
1359
|
+
orientation,
|
|
1360
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1361
|
+
"shrink-0 bg-border",
|
|
1362
|
+
orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]",
|
|
1363
|
+
className
|
|
1364
|
+
),
|
|
1365
|
+
...props
|
|
1366
|
+
}
|
|
1367
|
+
)
|
|
1368
|
+
);
|
|
1369
|
+
Separator3.displayName = SeparatorPrimitive__namespace.Root.displayName;
|
|
1370
|
+
var Sheet = DialogPrimitive__namespace.Root;
|
|
1371
|
+
var SheetTrigger = DialogPrimitive__namespace.Trigger;
|
|
1372
|
+
var SheetClose = DialogPrimitive__namespace.Close;
|
|
1373
|
+
var SheetPortal = DialogPrimitive__namespace.Portal;
|
|
1374
|
+
var SheetOverlay = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1375
|
+
DialogPrimitive__namespace.Overlay,
|
|
1376
|
+
{
|
|
1377
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1378
|
+
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
1379
|
+
className
|
|
1380
|
+
),
|
|
1381
|
+
...props,
|
|
1382
|
+
ref
|
|
1383
|
+
}
|
|
1384
|
+
));
|
|
1385
|
+
SheetOverlay.displayName = DialogPrimitive__namespace.Overlay.displayName;
|
|
1386
|
+
var sheetVariants = classVarianceAuthority.cva(
|
|
1387
|
+
"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
1388
|
+
{
|
|
1389
|
+
variants: {
|
|
1390
|
+
side: {
|
|
1391
|
+
top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
|
|
1392
|
+
bottom: "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
|
|
1393
|
+
left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
|
|
1394
|
+
right: "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm"
|
|
1395
|
+
}
|
|
1396
|
+
},
|
|
1397
|
+
defaultVariants: {
|
|
1398
|
+
side: "right"
|
|
1399
|
+
}
|
|
1400
|
+
}
|
|
1401
|
+
);
|
|
1402
|
+
var SheetContent = React33__namespace.forwardRef(({ side = "right", className, children, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(SheetPortal, null, /* @__PURE__ */ React33__namespace.createElement(SheetOverlay, null), /* @__PURE__ */ React33__namespace.createElement(
|
|
1403
|
+
DialogPrimitive__namespace.Content,
|
|
1404
|
+
{
|
|
1405
|
+
ref,
|
|
1406
|
+
className: chunk7Z5LLJ3A_js.cn(sheetVariants({ side }), className),
|
|
1407
|
+
...props
|
|
1408
|
+
},
|
|
1409
|
+
/* @__PURE__ */ React33__namespace.createElement(DialogPrimitive__namespace.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary" }, /* @__PURE__ */ React33__namespace.createElement(lucideReact.X, { className: "h-4 w-4" }), /* @__PURE__ */ React33__namespace.createElement("span", { className: "sr-only" }, "Close")),
|
|
1410
|
+
children
|
|
1411
|
+
)));
|
|
1412
|
+
SheetContent.displayName = DialogPrimitive__namespace.Content.displayName;
|
|
1413
|
+
var SheetHeader = ({
|
|
1414
|
+
className,
|
|
1415
|
+
...props
|
|
1416
|
+
}) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1417
|
+
"div",
|
|
1418
|
+
{
|
|
1419
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1420
|
+
"flex flex-col space-y-2 text-center sm:text-left",
|
|
1421
|
+
className
|
|
1422
|
+
),
|
|
1423
|
+
...props
|
|
1424
|
+
}
|
|
1425
|
+
);
|
|
1426
|
+
SheetHeader.displayName = "SheetHeader";
|
|
1427
|
+
var SheetFooter = ({
|
|
1428
|
+
className,
|
|
1429
|
+
...props
|
|
1430
|
+
}) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1431
|
+
"div",
|
|
1432
|
+
{
|
|
1433
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1434
|
+
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
|
|
1435
|
+
className
|
|
1436
|
+
),
|
|
1437
|
+
...props
|
|
1438
|
+
}
|
|
1439
|
+
);
|
|
1440
|
+
SheetFooter.displayName = "SheetFooter";
|
|
1441
|
+
var SheetTitle = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1442
|
+
DialogPrimitive__namespace.Title,
|
|
1443
|
+
{
|
|
1444
|
+
ref,
|
|
1445
|
+
className: chunk7Z5LLJ3A_js.cn("text-lg font-semibold text-foreground", className),
|
|
1446
|
+
...props
|
|
1447
|
+
}
|
|
1448
|
+
));
|
|
1449
|
+
SheetTitle.displayName = DialogPrimitive__namespace.Title.displayName;
|
|
1450
|
+
var SheetDescription = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1451
|
+
DialogPrimitive__namespace.Description,
|
|
1452
|
+
{
|
|
1453
|
+
ref,
|
|
1454
|
+
className: chunk7Z5LLJ3A_js.cn("text-sm text-muted-foreground", className),
|
|
1455
|
+
...props
|
|
1456
|
+
}
|
|
1457
|
+
));
|
|
1458
|
+
SheetDescription.displayName = DialogPrimitive__namespace.Description.displayName;
|
|
1459
|
+
var Textarea = React33__namespace.forwardRef(({ className, ...props }, ref) => {
|
|
1460
|
+
return /* @__PURE__ */ React33__namespace.createElement(
|
|
1461
|
+
"textarea",
|
|
1462
|
+
{
|
|
1463
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1464
|
+
"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
|
|
1465
|
+
className
|
|
1466
|
+
),
|
|
1467
|
+
ref,
|
|
1468
|
+
...props
|
|
1469
|
+
}
|
|
1470
|
+
);
|
|
1471
|
+
});
|
|
1472
|
+
Textarea.displayName = "Textarea";
|
|
1473
|
+
var TooltipProvider = TooltipPrimitive__namespace.Provider;
|
|
1474
|
+
var Tooltip = TooltipPrimitive__namespace.Root;
|
|
1475
|
+
var TooltipTrigger = TooltipPrimitive__namespace.Trigger;
|
|
1476
|
+
var TooltipContent = React33__namespace.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(TooltipPrimitive__namespace.Portal, null, /* @__PURE__ */ React33__namespace.createElement(
|
|
1477
|
+
TooltipPrimitive__namespace.Content,
|
|
1478
|
+
{
|
|
1479
|
+
ref,
|
|
1480
|
+
sideOffset,
|
|
1481
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1482
|
+
"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]",
|
|
1483
|
+
className
|
|
1484
|
+
),
|
|
1485
|
+
...props
|
|
1486
|
+
}
|
|
1487
|
+
)));
|
|
1488
|
+
TooltipContent.displayName = TooltipPrimitive__namespace.Content.displayName;
|
|
1489
|
+
var Avatar = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1490
|
+
AvatarPrimitive__namespace.Root,
|
|
1491
|
+
{
|
|
1492
|
+
ref,
|
|
1493
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1494
|
+
"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full",
|
|
1495
|
+
className
|
|
1496
|
+
),
|
|
1497
|
+
...props
|
|
1498
|
+
}
|
|
1499
|
+
));
|
|
1500
|
+
Avatar.displayName = AvatarPrimitive__namespace.Root.displayName;
|
|
1501
|
+
var AvatarImage = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1502
|
+
AvatarPrimitive__namespace.Image,
|
|
1503
|
+
{
|
|
1504
|
+
ref,
|
|
1505
|
+
className: chunk7Z5LLJ3A_js.cn("aspect-square h-full w-full", className),
|
|
1506
|
+
...props
|
|
1507
|
+
}
|
|
1508
|
+
));
|
|
1509
|
+
AvatarImage.displayName = AvatarPrimitive__namespace.Image.displayName;
|
|
1510
|
+
var AvatarFallback = React33__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React33__namespace.createElement(
|
|
1511
|
+
AvatarPrimitive__namespace.Fallback,
|
|
1512
|
+
{
|
|
1513
|
+
ref,
|
|
1514
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1515
|
+
"flex h-full w-full items-center justify-center rounded-full bg-muted",
|
|
1516
|
+
className
|
|
1517
|
+
),
|
|
1518
|
+
...props
|
|
1519
|
+
}
|
|
1520
|
+
));
|
|
1521
|
+
AvatarFallback.displayName = AvatarPrimitive__namespace.Fallback.displayName;
|
|
1522
|
+
function buildGridColsClasses(columns) {
|
|
1523
|
+
return [
|
|
1524
|
+
"grid-cols-1",
|
|
1525
|
+
// 默认单列
|
|
1526
|
+
columns.sm ? `sm:grid-cols-${columns.sm}` : "",
|
|
1527
|
+
columns.md ? `md:grid-cols-${columns.md}` : "md:grid-cols-2",
|
|
1528
|
+
columns.lg ? `lg:grid-cols-${columns.lg}` : "lg:grid-cols-3",
|
|
1529
|
+
columns.xl ? `xl:grid-cols-${columns.xl}` : ""
|
|
1530
|
+
].filter(Boolean).join(" ");
|
|
1531
|
+
}
|
|
1532
|
+
function getGapClassName(gap) {
|
|
1533
|
+
const gapClasses = {
|
|
1534
|
+
sm: "gap-3",
|
|
1535
|
+
md: "gap-6",
|
|
1536
|
+
lg: "gap-8",
|
|
1537
|
+
xl: "gap-10"
|
|
1538
|
+
};
|
|
1539
|
+
return gapClasses[gap];
|
|
1540
|
+
}
|
|
1541
|
+
function Grid({
|
|
1542
|
+
items,
|
|
1543
|
+
renderItem,
|
|
1544
|
+
columns = { md: 2, lg: 3 },
|
|
1545
|
+
gap = "md",
|
|
1546
|
+
className = "",
|
|
1547
|
+
style
|
|
1548
|
+
}) {
|
|
1549
|
+
const gridColsClasses = buildGridColsClasses(columns);
|
|
1550
|
+
const gapClass = getGapClassName(gap);
|
|
1551
|
+
return /* @__PURE__ */ React33__namespace.default.createElement(
|
|
1552
|
+
"div",
|
|
1553
|
+
{
|
|
1554
|
+
className: `grid ${gridColsClasses} ${gapClass} ${className}`.trim(),
|
|
1555
|
+
style
|
|
1556
|
+
},
|
|
1557
|
+
items.map((item, index) => /* @__PURE__ */ React33__namespace.default.createElement("div", { key: item.id }, renderItem(item, index)))
|
|
1558
|
+
);
|
|
1559
|
+
}
|
|
1560
|
+
var Timeline = ({ items = [] }) => {
|
|
1561
|
+
if (!items || items.length === 0) {
|
|
1562
|
+
return null;
|
|
1563
|
+
}
|
|
1564
|
+
return /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "relative" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "absolute left-4 top-0 bottom-0 w-0.5 bg-gray-200" }), items.map((item, index) => /* @__PURE__ */ React33__namespace.default.createElement("div", { key: index, className: "relative pl-12 pb-8" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "absolute left-0 w-8 h-8 rounded-full bg-blue-500 border-4 border-white shadow-md flex items-center justify-center" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "w-2 h-2 rounded-full bg-white" })), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "bg-white rounded-lg p-4 shadow-md" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "text-sm text-gray-500 mb-2" }, item.date), /* @__PURE__ */ React33__namespace.default.createElement("h4", { className: "text-lg font-semibold mb-2" }, item.title), /* @__PURE__ */ React33__namespace.default.createElement("p", { className: "text-gray-600" }, item.description)))));
|
|
1565
|
+
};
|
|
1566
|
+
var CollisionBalls = ({
|
|
1567
|
+
collisionBallsConfig: {
|
|
1568
|
+
balls,
|
|
1569
|
+
width,
|
|
1570
|
+
height
|
|
1571
|
+
}
|
|
1572
|
+
}) => {
|
|
1573
|
+
const canvasRef = React33.useRef(null);
|
|
1574
|
+
const containerRef = React33.useRef(null);
|
|
1575
|
+
const ballsRef = React33.useRef([]);
|
|
1576
|
+
const [isShaking, setIsShaking] = React33.useState(false);
|
|
1577
|
+
const [draggedBall, setDraggedBall] = React33.useState(null);
|
|
1578
|
+
const [mousePos, setMousePos] = React33.useState({ x: 0, y: 0 });
|
|
1579
|
+
const animationRef = React33.useRef(null);
|
|
1580
|
+
const updateCanvasSize = () => {
|
|
1581
|
+
const container = containerRef.current;
|
|
1582
|
+
const canvas = canvasRef.current;
|
|
1583
|
+
if (!container || !canvas) {
|
|
1584
|
+
console.error("Container or canvas not found");
|
|
1585
|
+
return;
|
|
1586
|
+
}
|
|
1587
|
+
const containerWidth = container.clientWidth;
|
|
1588
|
+
const containerHeight = container.clientHeight;
|
|
1589
|
+
console.log("Container size:", { containerWidth, containerHeight });
|
|
1590
|
+
canvas.width = containerWidth;
|
|
1591
|
+
canvas.height = containerHeight;
|
|
1592
|
+
canvas.style.width = `${containerWidth}px`;
|
|
1593
|
+
canvas.style.height = `${containerHeight}px`;
|
|
1594
|
+
console.log("Canvas size updated:", {
|
|
1595
|
+
width: canvas.width,
|
|
1596
|
+
height: canvas.height,
|
|
1597
|
+
containerWidth,
|
|
1598
|
+
containerHeight
|
|
1599
|
+
});
|
|
1600
|
+
};
|
|
1601
|
+
const initBalls = () => {
|
|
1602
|
+
const canvas = canvasRef.current;
|
|
1603
|
+
if (!canvas) {
|
|
1604
|
+
console.error("Canvas not found during ball initialization");
|
|
1605
|
+
return [];
|
|
1606
|
+
}
|
|
1607
|
+
console.log("Initializing balls with canvas size:", {
|
|
1608
|
+
width: canvas.width,
|
|
1609
|
+
height: canvas.height
|
|
1610
|
+
});
|
|
1611
|
+
return balls.map((ballConfig) => ({
|
|
1612
|
+
x: Math.random() * (canvas.width - 100) + 50,
|
|
1613
|
+
y: Math.random() * (canvas.height - 100) + 50,
|
|
1614
|
+
vx: (Math.random() - 0.5) * 4,
|
|
1615
|
+
vy: (Math.random() - 0.5) * 4,
|
|
1616
|
+
radius: ballConfig.size,
|
|
1617
|
+
color: ballConfig.color,
|
|
1618
|
+
text: ballConfig.label,
|
|
1619
|
+
isDragging: false
|
|
1620
|
+
}));
|
|
1621
|
+
};
|
|
1622
|
+
React33.useEffect(() => {
|
|
1623
|
+
const handleResize = () => {
|
|
1624
|
+
console.log("Window resized");
|
|
1625
|
+
updateCanvasSize();
|
|
1626
|
+
};
|
|
1627
|
+
if (typeof window !== "undefined") {
|
|
1628
|
+
window.addEventListener("resize", handleResize);
|
|
1629
|
+
updateCanvasSize();
|
|
1630
|
+
}
|
|
1631
|
+
return () => {
|
|
1632
|
+
if (typeof window !== "undefined") {
|
|
1633
|
+
window.removeEventListener("resize", handleResize);
|
|
1634
|
+
}
|
|
1635
|
+
};
|
|
1636
|
+
}, []);
|
|
1637
|
+
React33.useEffect(() => {
|
|
1638
|
+
const canvas = canvasRef.current;
|
|
1639
|
+
if (!canvas) {
|
|
1640
|
+
console.error("Canvas element not found");
|
|
1641
|
+
return;
|
|
1642
|
+
}
|
|
1643
|
+
const ctx = canvas.getContext("2d");
|
|
1644
|
+
if (!ctx) {
|
|
1645
|
+
console.error("Failed to get canvas context");
|
|
1646
|
+
return;
|
|
1647
|
+
}
|
|
1648
|
+
console.log("Starting animation setup...");
|
|
1649
|
+
updateCanvasSize();
|
|
1650
|
+
ballsRef.current = initBalls();
|
|
1651
|
+
console.log("Balls initialized:", ballsRef.current);
|
|
1652
|
+
let lastTime = performance.now();
|
|
1653
|
+
let frameCount = 0;
|
|
1654
|
+
const animate = (currentTime) => {
|
|
1655
|
+
try {
|
|
1656
|
+
frameCount++;
|
|
1657
|
+
if (currentTime - lastTime >= 1e3) {
|
|
1658
|
+
console.log(`FPS: ${frameCount}`);
|
|
1659
|
+
frameCount = 0;
|
|
1660
|
+
lastTime = currentTime;
|
|
1661
|
+
}
|
|
1662
|
+
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
1663
|
+
ballsRef.current.forEach((ball) => {
|
|
1664
|
+
if (!ball.isDragging) {
|
|
1665
|
+
updatePosition(ball, canvas.width, canvas.height);
|
|
1666
|
+
}
|
|
1667
|
+
for (let i = 0; i < ballsRef.current.length; i++) {
|
|
1668
|
+
for (let j = i + 1; j < ballsRef.current.length; j++) {
|
|
1669
|
+
const ball1 = ballsRef.current[i];
|
|
1670
|
+
const ball2 = ballsRef.current[j];
|
|
1671
|
+
if (ball1 && ball2) {
|
|
1672
|
+
checkCollision(ball1, ball2);
|
|
1673
|
+
}
|
|
1674
|
+
}
|
|
1675
|
+
}
|
|
1676
|
+
draw(ctx, ball);
|
|
1677
|
+
});
|
|
1678
|
+
animationRef.current = requestAnimationFrame(animate);
|
|
1679
|
+
} catch (error) {
|
|
1680
|
+
console.error("Animation error:", error);
|
|
1681
|
+
}
|
|
1682
|
+
};
|
|
1683
|
+
console.log("Starting animation loop...");
|
|
1684
|
+
animationRef.current = requestAnimationFrame(animate);
|
|
1685
|
+
return () => {
|
|
1686
|
+
console.log("Cleaning up animation...");
|
|
1687
|
+
if (animationRef.current) {
|
|
1688
|
+
cancelAnimationFrame(animationRef.current);
|
|
1689
|
+
animationRef.current = null;
|
|
1690
|
+
}
|
|
1691
|
+
};
|
|
1692
|
+
}, []);
|
|
1693
|
+
const shake = () => {
|
|
1694
|
+
setIsShaking(true);
|
|
1695
|
+
ballsRef.current.forEach((ball) => {
|
|
1696
|
+
ball.vx = (Math.random() - 0.5) * 10;
|
|
1697
|
+
ball.vy = (Math.random() - 0.5) * 10;
|
|
1698
|
+
});
|
|
1699
|
+
setTimeout(() => setIsShaking(false), 200);
|
|
1700
|
+
};
|
|
1701
|
+
const slowdown = () => {
|
|
1702
|
+
setIsShaking(true);
|
|
1703
|
+
ballsRef.current.forEach((ball) => {
|
|
1704
|
+
ball.vx = ball.vx * 0.5;
|
|
1705
|
+
ball.vy = ball.vy * 0.5;
|
|
1706
|
+
});
|
|
1707
|
+
setTimeout(() => setIsShaking(false), 200);
|
|
1708
|
+
};
|
|
1709
|
+
const checkCollision = (ball1, ball2) => {
|
|
1710
|
+
const dx = ball2.x - ball1.x;
|
|
1711
|
+
const dy = ball2.y - ball1.y;
|
|
1712
|
+
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
1713
|
+
if (distance < ball1.radius + ball2.radius) {
|
|
1714
|
+
const angle = Math.atan2(dy, dx);
|
|
1715
|
+
const overlap = (ball1.radius + ball2.radius - distance) / 2;
|
|
1716
|
+
if (ball1.isDragging || ball2.isDragging) {
|
|
1717
|
+
const draggedBall2 = ball1.isDragging ? ball1 : ball2;
|
|
1718
|
+
const otherBall = ball1.isDragging ? ball2 : ball1;
|
|
1719
|
+
otherBall.x += (draggedBall2 === ball1 ? 1 : -1) * overlap * Math.cos(angle);
|
|
1720
|
+
otherBall.y += (draggedBall2 === ball1 ? 1 : -1) * overlap * Math.sin(angle);
|
|
1721
|
+
const pushForce = 2;
|
|
1722
|
+
otherBall.vx = (draggedBall2 === ball1 ? -1 : 1) * Math.cos(angle) * pushForce;
|
|
1723
|
+
otherBall.vy = (draggedBall2 === ball1 ? -1 : 1) * Math.sin(angle) * pushForce;
|
|
1724
|
+
return;
|
|
1725
|
+
}
|
|
1726
|
+
const sin = Math.sin(angle);
|
|
1727
|
+
const cos = Math.cos(angle);
|
|
1728
|
+
const vx1 = ball1.vx * cos + ball1.vy * sin;
|
|
1729
|
+
const vy1 = ball1.vy * cos - ball1.vx * sin;
|
|
1730
|
+
const vx2 = ball2.vx * cos + ball2.vy * sin;
|
|
1731
|
+
const vy2 = ball2.vy * cos - ball2.vx * sin;
|
|
1732
|
+
const newVx1 = vx2;
|
|
1733
|
+
const newVx2 = vx1;
|
|
1734
|
+
ball1.vx = newVx1 * cos - vy1 * sin;
|
|
1735
|
+
ball1.vy = vy1 * cos + newVx1 * sin;
|
|
1736
|
+
ball2.vx = newVx2 * cos - vy2 * sin;
|
|
1737
|
+
ball2.vy = vy2 * cos + newVx2 * sin;
|
|
1738
|
+
ball1.x -= overlap * Math.cos(angle);
|
|
1739
|
+
ball1.y -= overlap * Math.sin(angle);
|
|
1740
|
+
ball2.x += overlap * Math.cos(angle);
|
|
1741
|
+
ball2.y += overlap * Math.sin(angle);
|
|
1742
|
+
}
|
|
1743
|
+
};
|
|
1744
|
+
const updatePosition = (ball, width2, height2) => {
|
|
1745
|
+
const handleBoundaryCollision = (velocity, position, boundary, radius) => {
|
|
1746
|
+
let newVelocity = velocity;
|
|
1747
|
+
let newPosition = position;
|
|
1748
|
+
if (position - radius < 0) {
|
|
1749
|
+
newPosition = radius;
|
|
1750
|
+
newVelocity = Math.abs(velocity);
|
|
1751
|
+
} else if (position + radius > boundary) {
|
|
1752
|
+
newPosition = boundary - radius;
|
|
1753
|
+
newVelocity = -Math.abs(velocity);
|
|
1754
|
+
}
|
|
1755
|
+
return [newVelocity, newPosition];
|
|
1756
|
+
};
|
|
1757
|
+
const [newVx, newX] = handleBoundaryCollision(
|
|
1758
|
+
ball.vx,
|
|
1759
|
+
ball.x,
|
|
1760
|
+
width2,
|
|
1761
|
+
ball.radius
|
|
1762
|
+
);
|
|
1763
|
+
const [newVy, newY] = handleBoundaryCollision(
|
|
1764
|
+
ball.vy,
|
|
1765
|
+
ball.y,
|
|
1766
|
+
height2,
|
|
1767
|
+
ball.radius
|
|
1768
|
+
);
|
|
1769
|
+
ball.vx = newVx;
|
|
1770
|
+
ball.vy = newVy;
|
|
1771
|
+
ball.x = newX;
|
|
1772
|
+
ball.y = newY;
|
|
1773
|
+
};
|
|
1774
|
+
const draw = (ctx, ball) => {
|
|
1775
|
+
ctx.beginPath();
|
|
1776
|
+
ctx.arc(ball.x, ball.y, ball.radius, 0, Math.PI * 2);
|
|
1777
|
+
ctx.fillStyle = ball.color;
|
|
1778
|
+
ctx.fill();
|
|
1779
|
+
ctx.closePath();
|
|
1780
|
+
if (ball.text) {
|
|
1781
|
+
ctx.font = "14px Arial";
|
|
1782
|
+
ctx.fillStyle = "#fff";
|
|
1783
|
+
ctx.textAlign = "center";
|
|
1784
|
+
ctx.textBaseline = "middle";
|
|
1785
|
+
ctx.fillText(ball.text, ball.x, ball.y);
|
|
1786
|
+
}
|
|
1787
|
+
};
|
|
1788
|
+
const handleMouseDown = (event) => {
|
|
1789
|
+
const mousePos2 = getMousePos(event);
|
|
1790
|
+
const ball = ballsRef.current.find((b) => {
|
|
1791
|
+
const dx = b.x - mousePos2.x;
|
|
1792
|
+
const dy = b.y - mousePos2.y;
|
|
1793
|
+
return Math.sqrt(dx * dx + dy * dy) < b.radius;
|
|
1794
|
+
});
|
|
1795
|
+
if (ball) {
|
|
1796
|
+
ball.isDragging = true;
|
|
1797
|
+
setDraggedBall(ball);
|
|
1798
|
+
}
|
|
1799
|
+
};
|
|
1800
|
+
const handleMouseMove = (event) => {
|
|
1801
|
+
const mousePos2 = getMousePos(event);
|
|
1802
|
+
setMousePos(mousePos2);
|
|
1803
|
+
if (draggedBall) {
|
|
1804
|
+
draggedBall.x = mousePos2.x;
|
|
1805
|
+
draggedBall.y = mousePos2.y;
|
|
1806
|
+
draggedBall.vx = 0;
|
|
1807
|
+
draggedBall.vy = 0;
|
|
1808
|
+
}
|
|
1809
|
+
};
|
|
1810
|
+
const handleMouseUp = () => {
|
|
1811
|
+
if (draggedBall) {
|
|
1812
|
+
draggedBall.isDragging = false;
|
|
1813
|
+
setDraggedBall(null);
|
|
1814
|
+
}
|
|
1815
|
+
};
|
|
1816
|
+
const getMousePos = (event) => {
|
|
1817
|
+
const canvas = canvasRef.current;
|
|
1818
|
+
if (!canvas) return { x: 0, y: 0 };
|
|
1819
|
+
const rect = canvas.getBoundingClientRect();
|
|
1820
|
+
const scaleX = canvas.width / rect.width;
|
|
1821
|
+
const scaleY = canvas.height / rect.height;
|
|
1822
|
+
return {
|
|
1823
|
+
x: (event.clientX - rect.left) * scaleX,
|
|
1824
|
+
y: (event.clientY - rect.top) * scaleY
|
|
1825
|
+
};
|
|
1826
|
+
};
|
|
1827
|
+
return /* @__PURE__ */ React33__namespace.default.createElement("div", { style: { width: "100%", height: "100%", position: "relative", backgroundColor: "#f9fafb", borderRadius: "0.5rem" } }, /* @__PURE__ */ React33__namespace.default.createElement("div", { ref: containerRef, style: { width: "100%", height: "100%", position: "absolute", top: 0, left: 0 } }, /* @__PURE__ */ React33__namespace.default.createElement(
|
|
1828
|
+
"canvas",
|
|
1829
|
+
{
|
|
1830
|
+
ref: canvasRef,
|
|
1831
|
+
style: {
|
|
1832
|
+
width: "100%",
|
|
1833
|
+
height: "100%",
|
|
1834
|
+
display: "block"
|
|
1835
|
+
// 确保canvas正确显示
|
|
1836
|
+
},
|
|
1837
|
+
onMouseDown: handleMouseDown,
|
|
1838
|
+
onMouseMove: handleMouseMove,
|
|
1839
|
+
onMouseUp: handleMouseUp,
|
|
1840
|
+
onMouseLeave: handleMouseUp
|
|
1841
|
+
}
|
|
1842
|
+
)), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "absolute bottom-4 right-4 flex gap-2" }, /* @__PURE__ */ React33__namespace.default.createElement(
|
|
1843
|
+
"button",
|
|
1844
|
+
{
|
|
1845
|
+
onClick: shake,
|
|
1846
|
+
className: `px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 transition-colors ${isShaking ? "animate-pulse" : ""}`
|
|
1847
|
+
},
|
|
1848
|
+
"\u6447\u4E00\u6447"
|
|
1849
|
+
), /* @__PURE__ */ React33__namespace.default.createElement(
|
|
1850
|
+
"button",
|
|
1851
|
+
{
|
|
1852
|
+
onClick: slowdown,
|
|
1853
|
+
className: `px-4 py-2 bg-green-500 text-white rounded-lg hover:bg-green-600 transition-colors ${isShaking ? "animate-pulse" : ""}`
|
|
1854
|
+
},
|
|
1855
|
+
"\u51CF\u901F"
|
|
1856
|
+
)));
|
|
1857
|
+
};
|
|
1858
|
+
var themeStyles = {
|
|
1859
|
+
light: "",
|
|
1860
|
+
dark: "bg-[#222] text-[#eee] border-[#444]",
|
|
1861
|
+
blue: "bg-[#f0f8ff] border-[#1890ff]/20"
|
|
1862
|
+
};
|
|
1863
|
+
var ProfileModal = ({
|
|
1864
|
+
isOpen,
|
|
1865
|
+
onClose,
|
|
1866
|
+
data,
|
|
1867
|
+
showAvatar = true,
|
|
1868
|
+
showContacts = true,
|
|
1869
|
+
showSocial = true,
|
|
1870
|
+
showBio = true,
|
|
1871
|
+
avatarSize = 80,
|
|
1872
|
+
onAvatarClick,
|
|
1873
|
+
onSocialLinkClick,
|
|
1874
|
+
onContactClick,
|
|
1875
|
+
themeName = "light",
|
|
1876
|
+
className
|
|
1877
|
+
}) => {
|
|
1878
|
+
const renderSocialLinks = () => {
|
|
1879
|
+
if (!data.socialLinks || data.socialLinks.length === 0) return null;
|
|
1880
|
+
return /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "flex gap-3 mt-2" }, data.socialLinks.map((link, index) => /* @__PURE__ */ React33__namespace.default.createElement(
|
|
1881
|
+
"a",
|
|
1882
|
+
{
|
|
1883
|
+
key: index,
|
|
1884
|
+
href: link.url,
|
|
1885
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1886
|
+
"w-8 h-8 flex items-center justify-center rounded-full no-underline transition-all hover:-translate-y-0.5",
|
|
1887
|
+
themeName === "dark" ? "bg-gray-800 text-gray-200 hover:bg-gray-700" : "bg-gray-100 text-gray-800 hover:bg-gray-200"
|
|
1888
|
+
),
|
|
1889
|
+
title: link.type,
|
|
1890
|
+
target: "_blank",
|
|
1891
|
+
rel: "noopener noreferrer",
|
|
1892
|
+
onClick: (e) => {
|
|
1893
|
+
if (onSocialLinkClick) {
|
|
1894
|
+
e.preventDefault();
|
|
1895
|
+
onSocialLinkClick(link.url, link.type);
|
|
1896
|
+
}
|
|
1897
|
+
}
|
|
1898
|
+
},
|
|
1899
|
+
link.icon ? /* @__PURE__ */ React33__namespace.default.createElement("span", { className: "text-base" }, link.icon) : /* @__PURE__ */ React33__namespace.default.createElement("span", { className: "text-[10px] font-semibold" }, link.type)
|
|
1900
|
+
)));
|
|
1901
|
+
};
|
|
1902
|
+
const renderContacts = () => {
|
|
1903
|
+
if (!data.contacts || Object.keys(data.contacts).length === 0) return null;
|
|
1904
|
+
return /* @__PURE__ */ React33__namespace.default.createElement("div", { className: chunk7Z5LLJ3A_js.cn(
|
|
1905
|
+
"mt-4 border-t pt-4",
|
|
1906
|
+
themeName === "dark" ? "border-gray-800" : "border-gray-100"
|
|
1907
|
+
) }, Object.entries(data.contacts).map(([type, value], index) => /* @__PURE__ */ React33__namespace.default.createElement(
|
|
1908
|
+
"div",
|
|
1909
|
+
{
|
|
1910
|
+
key: index,
|
|
1911
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
1912
|
+
"flex mb-2 cursor-pointer py-1.5 px-2 rounded transition-colors",
|
|
1913
|
+
themeName === "dark" ? "hover:bg-gray-800" : "hover:bg-gray-50"
|
|
1914
|
+
),
|
|
1915
|
+
onClick: () => onContactClick && onContactClick(type, value)
|
|
1916
|
+
},
|
|
1917
|
+
/* @__PURE__ */ React33__namespace.default.createElement("span", { className: chunk7Z5LLJ3A_js.cn(
|
|
1918
|
+
"font-medium w-[70px] shrink-0",
|
|
1919
|
+
themeName === "dark" ? "text-gray-400" : "text-gray-500"
|
|
1920
|
+
) }, type, ":"),
|
|
1921
|
+
/* @__PURE__ */ React33__namespace.default.createElement("span", { className: themeName === "dark" ? "text-gray-200" : "text-gray-800" }, value)
|
|
1922
|
+
)));
|
|
1923
|
+
};
|
|
1924
|
+
return /* @__PURE__ */ React33__namespace.default.createElement(Dialog, { open: isOpen, onOpenChange: (open) => !open && onClose() }, /* @__PURE__ */ React33__namespace.default.createElement(DialogContent, { className: chunk7Z5LLJ3A_js.cn(
|
|
1925
|
+
"sm:max-w-[500px] p-0 overflow-hidden border-none shadow-2xl",
|
|
1926
|
+
themeStyles[themeName] || "",
|
|
1927
|
+
className
|
|
1928
|
+
) }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "p-6" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "flex gap-5 mb-5" }, showAvatar && /* @__PURE__ */ React33__namespace.default.createElement(
|
|
1929
|
+
"div",
|
|
1930
|
+
{
|
|
1931
|
+
className: "shrink-0",
|
|
1932
|
+
onClick: onAvatarClick,
|
|
1933
|
+
style: { cursor: onAvatarClick ? "pointer" : "default" }
|
|
1934
|
+
},
|
|
1935
|
+
/* @__PURE__ */ React33__namespace.default.createElement(Avatar, { className: "border-2 border-primary/10 shadow-sm", style: { width: avatarSize, height: avatarSize } }, data.avatar && /* @__PURE__ */ React33__namespace.default.createElement(AvatarImage, { src: data.avatar, alt: data.name, className: "object-cover" }), /* @__PURE__ */ React33__namespace.default.createElement(AvatarFallback, { className: "text-xl" }, data.name.substring(0, 2).toUpperCase()))
|
|
1936
|
+
), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "flex-1 min-w-0 flex flex-col justify-center" }, /* @__PURE__ */ React33__namespace.default.createElement("h2", { className: chunk7Z5LLJ3A_js.cn(
|
|
1937
|
+
"text-2xl font-bold m-0 mb-1",
|
|
1938
|
+
themeName === "dark" ? "text-white" : "text-gray-900"
|
|
1939
|
+
) }, data.name), data.title && /* @__PURE__ */ React33__namespace.default.createElement("div", { className: chunk7Z5LLJ3A_js.cn(
|
|
1940
|
+
"text-sm mb-2",
|
|
1941
|
+
themeName === "dark" ? "text-gray-400" : "text-gray-500"
|
|
1942
|
+
) }, data.title), showSocial && renderSocialLinks())), showBio && data.bio && /* @__PURE__ */ React33__namespace.default.createElement("div", { className: chunk7Z5LLJ3A_js.cn(
|
|
1943
|
+
"mb-5 leading-relaxed text-sm",
|
|
1944
|
+
themeName === "dark" ? "text-gray-300" : "text-gray-600"
|
|
1945
|
+
) }, /* @__PURE__ */ React33__namespace.default.createElement("p", null, data.bio)), showContacts && renderContacts(), data.customContent && /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "mt-5" }, data.customContent))));
|
|
1946
|
+
};
|
|
1947
|
+
var ProfileModal_default = ProfileModal;
|
|
1948
|
+
var BadgeList = ({
|
|
1949
|
+
badges,
|
|
1950
|
+
className = ""
|
|
1951
|
+
}) => {
|
|
1952
|
+
if (!badges || badges.length === 0) return null;
|
|
1953
|
+
return /* @__PURE__ */ React33__namespace.default.createElement("div", { className: chunk7Z5LLJ3A_js.cn("flex flex-wrap gap-2 mt-4", className) }, badges.map((badge, index) => /* @__PURE__ */ React33__namespace.default.createElement(
|
|
1954
|
+
Badge,
|
|
1955
|
+
{
|
|
1956
|
+
key: index,
|
|
1957
|
+
variant: badge.type === "default" ? "default" : badge.type
|
|
1958
|
+
},
|
|
1959
|
+
badge.icon && /* @__PURE__ */ React33__namespace.default.createElement("span", { className: "mr-1" }, badge.icon),
|
|
1960
|
+
badge.label
|
|
1961
|
+
)));
|
|
1962
|
+
};
|
|
1963
|
+
|
|
1964
|
+
// src/features/profile/internal/Stat.tsx
|
|
1965
|
+
var Stat = ({
|
|
1966
|
+
label,
|
|
1967
|
+
value,
|
|
1968
|
+
icon,
|
|
1969
|
+
className = ""
|
|
1970
|
+
}) => {
|
|
1971
|
+
return /* @__PURE__ */ React.createElement("div", { className: chunk7Z5LLJ3A_js.cn("flex flex-col items-center flex-1 text-center", className) }, icon && /* @__PURE__ */ React.createElement("span", { className: "mb-2 text-2xl text-gray-400" }, icon), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("div", { className: "text-lg font-semibold text-gray-800" }, value), /* @__PURE__ */ React.createElement("div", { className: "text-xs text-gray-400 mt-1" }, label)));
|
|
1972
|
+
};
|
|
1973
|
+
|
|
1974
|
+
// src/features/profile/internal/StatList.tsx
|
|
1975
|
+
var StatList = ({
|
|
1976
|
+
stats,
|
|
1977
|
+
className = ""
|
|
1978
|
+
}) => {
|
|
1979
|
+
if (!stats || stats.length === 0) return null;
|
|
1980
|
+
return /* @__PURE__ */ React.createElement("div", { className: chunk7Z5LLJ3A_js.cn("flex justify-between mt-4 pt-4 border-t border-gray-100", className) }, stats.map((stat, index) => /* @__PURE__ */ React.createElement(Stat, { key: index, ...stat })));
|
|
1981
|
+
};
|
|
1982
|
+
|
|
1983
|
+
// src/features/profile/ProfileButton.tsx
|
|
1984
|
+
var exampleProfileData = {
|
|
1985
|
+
name: "\u5F20\u4E09",
|
|
1986
|
+
avatar: "https://randomuser.me/api/portraits/men/32.jpg",
|
|
1987
|
+
title: "\u9AD8\u7EA7\u524D\u7AEF\u5DE5\u7A0B\u5E08",
|
|
1988
|
+
bio: "\u4E13\u6CE8\u4E8EReact\u548CNext.js\u5F00\u53D1\u7684\u524D\u7AEF\u5DE5\u7A0B\u5E08\uFF0C\u67095\u5E74\u5DE5\u4F5C\u7ECF\u9A8C\u3002\u70ED\u7231\u5F00\u6E90\uFF0C\u559C\u6B22\u5206\u4EAB\u6280\u672F\u7ECF\u9A8C\u3002",
|
|
1989
|
+
contacts: {
|
|
1990
|
+
"\u90AE\u7BB1": "zhangsan@example.com",
|
|
1991
|
+
"\u7535\u8BDD": "138-8888-8888",
|
|
1992
|
+
"\u5730\u5740": "\u4E0A\u6D77\u5E02\u6D66\u4E1C\u65B0\u533A"
|
|
1993
|
+
},
|
|
1994
|
+
socialLinks: [
|
|
1995
|
+
{ type: "GitHub", url: "https://github.com/zhangsan", icon: "\u2605" },
|
|
1996
|
+
{ type: "Twitter", url: "https://twitter.com/zhangsan", icon: "\u2726" },
|
|
1997
|
+
{ type: "LinkedIn", url: "https://linkedin.com/in/zhangsan", icon: "\u272A" }
|
|
1998
|
+
],
|
|
1999
|
+
badges: [
|
|
2000
|
+
{ label: "React", type: "primary" },
|
|
2001
|
+
{ label: "Next.js", type: "success" },
|
|
2002
|
+
{ label: "TypeScript", type: "info" },
|
|
2003
|
+
{ label: "CSS", type: "default" }
|
|
2004
|
+
],
|
|
2005
|
+
stats: [
|
|
2006
|
+
{ label: "\u9879\u76EE", value: 42 },
|
|
2007
|
+
{ label: "\u7C89\u4E1D", value: 1024 },
|
|
2008
|
+
{ label: "\u8BC4\u5206", value: "4.9" }
|
|
2009
|
+
],
|
|
2010
|
+
customContent: /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "mt-5 border-t border-gray-100 pt-4" }, /* @__PURE__ */ React33__namespace.default.createElement("h3", { className: "text-sm font-semibold mb-2" }, "\u4E13\u4E1A\u6280\u80FD"), /* @__PURE__ */ React33__namespace.default.createElement("p", { className: "text-sm text-gray-600 leading-relaxed" }, "\u7CBE\u901AReact\u3001Vue\u3001Angular\u7B49\u524D\u7AEF\u6846\u67B6\uFF0C\u719F\u6089TypeScript\u3001JavaScript\u3001CSS3\u3001HTML5\u7B49\u524D\u7AEF\u6280\u672F\u3002 \u6709\u4E30\u5BCC\u7684\u5927\u578B\u9879\u76EE\u5F00\u53D1\u7ECF\u9A8C\uFF0C\u80FD\u72EC\u7ACB\u8D1F\u8D23\u524D\u7AEF\u67B6\u6784\u8BBE\u8BA1\u3002"))
|
|
2011
|
+
};
|
|
2012
|
+
var ProfileButton = ({
|
|
2013
|
+
data = exampleProfileData,
|
|
2014
|
+
buttonText = "\u67E5\u770B\u4E2A\u4EBA\u4FE1\u606F",
|
|
2015
|
+
variant = "default",
|
|
2016
|
+
size = "default",
|
|
2017
|
+
className = "",
|
|
2018
|
+
modalTheme = "light"
|
|
2019
|
+
}) => {
|
|
2020
|
+
const [isModalOpen, setIsModalOpen] = React33.useState(false);
|
|
2021
|
+
const openModal = () => setIsModalOpen(true);
|
|
2022
|
+
const closeModal = () => setIsModalOpen(false);
|
|
2023
|
+
const handleContactClick = (type, value) => {
|
|
2024
|
+
if (type === "\u90AE\u7BB1") {
|
|
2025
|
+
window.open(`mailto:${value}`);
|
|
2026
|
+
} else if (type === "\u7535\u8BDD") {
|
|
2027
|
+
window.open(`tel:${value}`);
|
|
2028
|
+
}
|
|
2029
|
+
};
|
|
2030
|
+
return /* @__PURE__ */ React33__namespace.default.createElement(React33__namespace.default.Fragment, null, /* @__PURE__ */ React33__namespace.default.createElement(
|
|
2031
|
+
Button,
|
|
2032
|
+
{
|
|
2033
|
+
variant,
|
|
2034
|
+
size,
|
|
2035
|
+
onClick: openModal,
|
|
2036
|
+
className
|
|
2037
|
+
},
|
|
2038
|
+
buttonText
|
|
2039
|
+
), /* @__PURE__ */ React33__namespace.default.createElement(
|
|
2040
|
+
ProfileModal_default,
|
|
2041
|
+
{
|
|
2042
|
+
isOpen: isModalOpen,
|
|
2043
|
+
onClose: closeModal,
|
|
2044
|
+
data,
|
|
2045
|
+
themeName: modalTheme,
|
|
2046
|
+
onContactClick: handleContactClick,
|
|
2047
|
+
onSocialLinkClick: (url) => window.open(url, "_blank")
|
|
2048
|
+
},
|
|
2049
|
+
data.customContent,
|
|
2050
|
+
data.badges && /* @__PURE__ */ React33__namespace.default.createElement(BadgeList, { badges: data.badges }),
|
|
2051
|
+
data.stats && /* @__PURE__ */ React33__namespace.default.createElement(StatList, { stats: data.stats })
|
|
2052
|
+
));
|
|
2053
|
+
};
|
|
2054
|
+
var AutoOpenModal = ({
|
|
2055
|
+
data,
|
|
2056
|
+
delay = 500,
|
|
2057
|
+
// 默认延迟500毫秒
|
|
2058
|
+
themeName = "light",
|
|
2059
|
+
onClose
|
|
2060
|
+
}) => {
|
|
2061
|
+
const [isModalOpen, setIsModalOpen] = React33.useState(false);
|
|
2062
|
+
React33.useEffect(() => {
|
|
2063
|
+
const timer = setTimeout(() => {
|
|
2064
|
+
setIsModalOpen(true);
|
|
2065
|
+
}, delay);
|
|
2066
|
+
return () => clearTimeout(timer);
|
|
2067
|
+
}, [delay]);
|
|
2068
|
+
const handleClose = () => {
|
|
2069
|
+
setIsModalOpen(false);
|
|
2070
|
+
if (onClose) {
|
|
2071
|
+
onClose();
|
|
2072
|
+
}
|
|
2073
|
+
};
|
|
2074
|
+
const handleContactClick = (type, value) => {
|
|
2075
|
+
if (type === "\u90AE\u7BB1") {
|
|
2076
|
+
window.open(`mailto:${value}`);
|
|
2077
|
+
} else if (type === "\u7535\u8BDD") {
|
|
2078
|
+
window.open(`tel:${value}`);
|
|
2079
|
+
}
|
|
2080
|
+
};
|
|
2081
|
+
return /* @__PURE__ */ React33__namespace.default.createElement(
|
|
2082
|
+
ProfileModal_default,
|
|
2083
|
+
{
|
|
2084
|
+
isOpen: isModalOpen,
|
|
2085
|
+
onClose: handleClose,
|
|
2086
|
+
data,
|
|
2087
|
+
themeName,
|
|
2088
|
+
onContactClick: handleContactClick,
|
|
2089
|
+
onSocialLinkClick: (url) => window.open(url, "_blank")
|
|
2090
|
+
},
|
|
2091
|
+
data.badges && /* @__PURE__ */ React33__namespace.default.createElement(BadgeList, { badges: data.badges }),
|
|
2092
|
+
data.stats && /* @__PURE__ */ React33__namespace.default.createElement(StatList, { stats: data.stats })
|
|
2093
|
+
);
|
|
2094
|
+
};
|
|
2095
|
+
var sizeMap = {
|
|
2096
|
+
small: "h-8 w-8",
|
|
2097
|
+
medium: "h-12 w-12",
|
|
2098
|
+
large: "h-16 w-16"
|
|
2099
|
+
};
|
|
2100
|
+
var moodColors = {
|
|
2101
|
+
online: "bg-green-500",
|
|
2102
|
+
offline: "bg-gray-500",
|
|
2103
|
+
away: "bg-yellow-500"
|
|
2104
|
+
};
|
|
2105
|
+
var EnhancedAvatar = ({
|
|
2106
|
+
src,
|
|
2107
|
+
name,
|
|
2108
|
+
size = "medium",
|
|
2109
|
+
mood = "online",
|
|
2110
|
+
statusText,
|
|
2111
|
+
onClick,
|
|
2112
|
+
className
|
|
2113
|
+
}) => {
|
|
2114
|
+
const sizeClass = typeof size === "string" ? sizeMap[size] : "";
|
|
2115
|
+
const customSizeStyle = typeof size === "number" ? { width: size, height: size } : {};
|
|
2116
|
+
return /* @__PURE__ */ React33__namespace.default.createElement("div", { className: chunk7Z5LLJ3A_js.cn("relative inline-block", className), onClick }, /* @__PURE__ */ React33__namespace.default.createElement(Avatar, { className: chunk7Z5LLJ3A_js.cn(sizeClass, onClick && "cursor-pointer hover:ring-2 hover:ring-blue-500 transition-all"), style: customSizeStyle }, src && /* @__PURE__ */ React33__namespace.default.createElement(AvatarImage, { src, alt: name || "Avatar", className: "object-cover" }), /* @__PURE__ */ React33__namespace.default.createElement(AvatarFallback, { className: "bg-primary/10 text-primary-foreground" }, name ? name.substring(0, 2).toUpperCase() : "??")), mood && /* @__PURE__ */ React33__namespace.default.createElement(
|
|
2117
|
+
"div",
|
|
2118
|
+
{
|
|
2119
|
+
className: chunk7Z5LLJ3A_js.cn(
|
|
2120
|
+
"absolute bottom-0 right-0 rounded-full border-2 border-white",
|
|
2121
|
+
moodColors[mood],
|
|
2122
|
+
typeof size === "number" ? size > 60 ? "h-4 w-4" : "h-3 w-3" : size === "large" ? "h-4 w-4" : "h-3 w-3"
|
|
2123
|
+
)
|
|
2124
|
+
}
|
|
2125
|
+
), statusText && /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "absolute -bottom-6 left-1/2 transform -translate-x-1/2 whitespace-nowrap" }, /* @__PURE__ */ React33__namespace.default.createElement("span", { className: "text-xs text-muted-foreground" }, statusText)));
|
|
2126
|
+
};
|
|
2127
|
+
var About = ({
|
|
2128
|
+
timelineConfig,
|
|
2129
|
+
collisionBallsConfig
|
|
2130
|
+
}) => {
|
|
2131
|
+
return /* @__PURE__ */ React33__namespace.default.createElement("section", { id: "about", className: "py-16 bg-white" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React33__namespace.default.createElement("h2", { className: "text-3xl font-bold text-center mb-12" }, "\u5173\u4E8E\u6211"), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-12" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "bg-white rounded-lg shadow-lg p-6" }, /* @__PURE__ */ React33__namespace.default.createElement("h3", { className: "text-2xl font-semibold mb-6" }, "\u4E2A\u4EBA\u7ECF\u5386"), /* @__PURE__ */ React33__namespace.default.createElement(Timeline, { items: timelineConfig.items })), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "bg-white rounded-lg shadow-lg p-6" }, /* @__PURE__ */ React33__namespace.default.createElement("h3", { className: "text-2xl font-semibold mb-6" }, "\u6280\u80FD\u5C55\u793A"), /* @__PURE__ */ React33__namespace.default.createElement("div", { style: { height: "400px", position: "relative" } }, /* @__PURE__ */ React33__namespace.default.createElement(CollisionBalls, { collisionBallsConfig }))))));
|
|
2132
|
+
};
|
|
2133
|
+
var About_default = About;
|
|
2134
|
+
var Contact = () => {
|
|
2135
|
+
const [formData, setFormData] = React33.useState({
|
|
2136
|
+
name: "",
|
|
2137
|
+
email: "",
|
|
2138
|
+
message: ""
|
|
2139
|
+
});
|
|
2140
|
+
const [isSubmitting, setIsSubmitting] = React33.useState(false);
|
|
2141
|
+
const [submitStatus, setSubmitStatus] = React33.useState("idle");
|
|
2142
|
+
const handleChange = (e) => {
|
|
2143
|
+
const { name, value } = e.target;
|
|
2144
|
+
setFormData((prev) => ({
|
|
2145
|
+
...prev,
|
|
2146
|
+
[name]: value
|
|
2147
|
+
}));
|
|
2148
|
+
};
|
|
2149
|
+
const handleSubmit = async (e) => {
|
|
2150
|
+
e.preventDefault();
|
|
2151
|
+
setIsSubmitting(true);
|
|
2152
|
+
setSubmitStatus("idle");
|
|
2153
|
+
try {
|
|
2154
|
+
await new Promise((resolve) => setTimeout(resolve, 1e3));
|
|
2155
|
+
setSubmitStatus("success");
|
|
2156
|
+
setFormData({ name: "", email: "", message: "" });
|
|
2157
|
+
} catch (error) {
|
|
2158
|
+
setSubmitStatus("error");
|
|
2159
|
+
} finally {
|
|
2160
|
+
setIsSubmitting(false);
|
|
2161
|
+
}
|
|
2162
|
+
};
|
|
2163
|
+
return /* @__PURE__ */ React33__namespace.default.createElement("section", { id: "contact", className: "py-16 bg-gray-50" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "max-w-4xl mx-auto px-4 sm:px-6 lg:px-8" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "text-center mb-12" }, /* @__PURE__ */ React33__namespace.default.createElement("h2", { className: "text-3xl font-bold text-gray-900 sm:text-4xl" }, "\u8054\u7CFB\u6211"), /* @__PURE__ */ React33__namespace.default.createElement("p", { className: "mt-4 text-lg text-gray-600" }, "\u6709\u4EFB\u4F55\u95EE\u9898\u6216\u5EFA\u8BAE\uFF1F\u8BF7\u968F\u65F6\u8054\u7CFB\u6211")), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "bg-white rounded-lg shadow-xl p-6 sm:p-8" }, /* @__PURE__ */ React33__namespace.default.createElement("form", { onSubmit: handleSubmit, className: "space-y-6" }, /* @__PURE__ */ React33__namespace.default.createElement("div", null, /* @__PURE__ */ React33__namespace.default.createElement("label", { htmlFor: "name", className: "block text-sm font-medium text-gray-700" }, "\u59D3\u540D"), /* @__PURE__ */ React33__namespace.default.createElement(
|
|
2164
|
+
"input",
|
|
2165
|
+
{
|
|
2166
|
+
type: "text",
|
|
2167
|
+
name: "name",
|
|
2168
|
+
id: "name",
|
|
2169
|
+
value: formData.name,
|
|
2170
|
+
onChange: handleChange,
|
|
2171
|
+
required: true,
|
|
2172
|
+
className: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm",
|
|
2173
|
+
placeholder: "\u8BF7\u8F93\u5165\u60A8\u7684\u59D3\u540D"
|
|
2174
|
+
}
|
|
2175
|
+
)), /* @__PURE__ */ React33__namespace.default.createElement("div", null, /* @__PURE__ */ React33__namespace.default.createElement("label", { htmlFor: "email", className: "block text-sm font-medium text-gray-700" }, "\u90AE\u7BB1"), /* @__PURE__ */ React33__namespace.default.createElement(
|
|
2176
|
+
"input",
|
|
2177
|
+
{
|
|
2178
|
+
type: "email",
|
|
2179
|
+
name: "email",
|
|
2180
|
+
id: "email",
|
|
2181
|
+
value: formData.email,
|
|
2182
|
+
onChange: handleChange,
|
|
2183
|
+
required: true,
|
|
2184
|
+
className: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm",
|
|
2185
|
+
placeholder: "\u8BF7\u8F93\u5165\u60A8\u7684\u90AE\u7BB1"
|
|
2186
|
+
}
|
|
2187
|
+
)), /* @__PURE__ */ React33__namespace.default.createElement("div", null, /* @__PURE__ */ React33__namespace.default.createElement("label", { htmlFor: "message", className: "block text-sm font-medium text-gray-700" }, "\u6D88\u606F"), /* @__PURE__ */ React33__namespace.default.createElement(
|
|
2188
|
+
"textarea",
|
|
2189
|
+
{
|
|
2190
|
+
name: "message",
|
|
2191
|
+
id: "message",
|
|
2192
|
+
rows: 4,
|
|
2193
|
+
value: formData.message,
|
|
2194
|
+
onChange: handleChange,
|
|
2195
|
+
required: true,
|
|
2196
|
+
className: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm",
|
|
2197
|
+
placeholder: "\u8BF7\u8F93\u5165\u60A8\u7684\u6D88\u606F"
|
|
2198
|
+
}
|
|
2199
|
+
)), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "flex items-center justify-end" }, /* @__PURE__ */ React33__namespace.default.createElement(
|
|
2200
|
+
"button",
|
|
2201
|
+
{
|
|
2202
|
+
type: "submit",
|
|
2203
|
+
disabled: isSubmitting,
|
|
2204
|
+
className: `inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white
|
|
2205
|
+
${isSubmitting ? "bg-blue-400 cursor-not-allowed" : "bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500"}`
|
|
2206
|
+
},
|
|
2207
|
+
isSubmitting ? "\u53D1\u9001\u4E2D..." : "\u53D1\u9001\u6D88\u606F"
|
|
2208
|
+
)), submitStatus === "success" && /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "rounded-md bg-green-50 p-4" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "flex" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "flex-shrink-0" }, /* @__PURE__ */ React33__namespace.default.createElement("svg", { className: "h-5 w-5 text-green-400", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ React33__namespace.default.createElement("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", clipRule: "evenodd" }))), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "ml-3" }, /* @__PURE__ */ React33__namespace.default.createElement("p", { className: "text-sm font-medium text-green-800" }, "\u6D88\u606F\u5DF2\u6210\u529F\u53D1\u9001\uFF01")))), submitStatus === "error" && /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "rounded-md bg-red-50 p-4" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "flex" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "flex-shrink-0" }, /* @__PURE__ */ React33__namespace.default.createElement("svg", { className: "h-5 w-5 text-red-400", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ React33__namespace.default.createElement("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z", clipRule: "evenodd" }))), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "ml-3" }, /* @__PURE__ */ React33__namespace.default.createElement("p", { className: "text-sm font-medium text-red-800" }, "\u53D1\u9001\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5")))))), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "mt-12 grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "bg-white rounded-lg shadow-lg p-6 text-center" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "text-blue-600 mb-4" }, /* @__PURE__ */ React33__namespace.default.createElement("svg", { className: "h-8 w-8 mx-auto", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React33__namespace.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" }))), /* @__PURE__ */ React33__namespace.default.createElement("h3", { className: "text-lg font-medium text-gray-900" }, "\u90AE\u7BB1"), /* @__PURE__ */ React33__namespace.default.createElement("p", { className: "mt-2 text-gray-600" }, "your.email@example.com")), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "bg-white rounded-lg shadow-lg p-6 text-center" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "text-blue-600 mb-4" }, /* @__PURE__ */ React33__namespace.default.createElement("svg", { className: "h-8 w-8 mx-auto", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React33__namespace.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z" }))), /* @__PURE__ */ React33__namespace.default.createElement("h3", { className: "text-lg font-medium text-gray-900" }, "\u7535\u8BDD"), /* @__PURE__ */ React33__namespace.default.createElement("p", { className: "mt-2 text-gray-600" }, "+86 123 4567 8900")), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "bg-white rounded-lg shadow-lg p-6 text-center" }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "text-blue-600 mb-4" }, /* @__PURE__ */ React33__namespace.default.createElement("svg", { className: "h-8 w-8 mx-auto", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React33__namespace.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z" }), /* @__PURE__ */ React33__namespace.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M15 11a3 3 0 11-6 0 3 3 0 016 0z" }))), /* @__PURE__ */ React33__namespace.default.createElement("h3", { className: "text-lg font-medium text-gray-900" }, "\u5730\u5740"), /* @__PURE__ */ React33__namespace.default.createElement("p", { className: "mt-2 text-gray-600" }, "\u4E2D\u56FD\uFF0C\u5317\u4EAC")))));
|
|
2209
|
+
};
|
|
2210
|
+
var Contact_default = Contact;
|
|
2211
|
+
var NavigationItemComponent = ({
|
|
2212
|
+
item,
|
|
2213
|
+
direction,
|
|
2214
|
+
isActive,
|
|
2215
|
+
onClick
|
|
2216
|
+
}) => {
|
|
2217
|
+
const handleClick = (e) => {
|
|
2218
|
+
e.preventDefault();
|
|
2219
|
+
onClick(item);
|
|
2220
|
+
};
|
|
2221
|
+
const getItemClasses = () => {
|
|
2222
|
+
const baseClasses = `
|
|
2223
|
+
group relative flex items-center gap-3
|
|
2224
|
+
transition-all duration-300 ease-in-out
|
|
2225
|
+
focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-opacity-50
|
|
2226
|
+
rounded-lg
|
|
2227
|
+
`;
|
|
2228
|
+
const directionClasses = direction === "vertical" ? "px-4 py-3 w-full justify-start" : "px-3 py-2 justify-center";
|
|
2229
|
+
const stateClasses = isActive ? "bg-blue-500 text-white shadow-lg" : item.isExternal ? "text-gray-700 hover:bg-purple-50 hover:text-purple-600 border border-purple-200" : "text-gray-700 hover:bg-blue-50 hover:text-blue-600";
|
|
2230
|
+
return `${baseClasses} ${directionClasses} ${stateClasses}`;
|
|
2231
|
+
};
|
|
2232
|
+
return /* @__PURE__ */ React33__namespace.default.createElement(
|
|
2233
|
+
"a",
|
|
2234
|
+
{
|
|
2235
|
+
href: item.href,
|
|
2236
|
+
onClick: handleClick,
|
|
2237
|
+
target: item.target,
|
|
2238
|
+
rel: item.isExternal ? "noopener noreferrer" : void 0,
|
|
2239
|
+
className: getItemClasses()
|
|
2240
|
+
},
|
|
2241
|
+
item.icon && /* @__PURE__ */ React33__namespace.default.createElement("span", { className: "flex-shrink-0" }, item.icon),
|
|
2242
|
+
/* @__PURE__ */ React33__namespace.default.createElement("span", { className: `font-medium ${direction === "vertical" ? "text-sm" : "text-xs"}` }, item.label),
|
|
2243
|
+
item.isExternal && /* @__PURE__ */ React33__namespace.default.createElement(
|
|
2244
|
+
"svg",
|
|
2245
|
+
{
|
|
2246
|
+
className: "w-3 h-3 opacity-60 group-hover:opacity-100 transition-opacity",
|
|
2247
|
+
fill: "none",
|
|
2248
|
+
stroke: "currentColor",
|
|
2249
|
+
viewBox: "0 0 24 24"
|
|
2250
|
+
},
|
|
2251
|
+
/* @__PURE__ */ React33__namespace.default.createElement(
|
|
2252
|
+
"path",
|
|
2253
|
+
{
|
|
2254
|
+
strokeLinecap: "round",
|
|
2255
|
+
strokeLinejoin: "round",
|
|
2256
|
+
strokeWidth: 2,
|
|
2257
|
+
d: "M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"
|
|
2258
|
+
}
|
|
2259
|
+
)
|
|
2260
|
+
),
|
|
2261
|
+
direction === "vertical" && isActive && /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "absolute left-1 top-1/2 transform -translate-y-1/2 w-1 h-6 bg-white rounded-full" })
|
|
2262
|
+
);
|
|
2263
|
+
};
|
|
2264
|
+
var NavigationItem_default = NavigationItemComponent;
|
|
2265
|
+
|
|
2266
|
+
// src/features/navigation/Navigation.tsx
|
|
2267
|
+
var Navigation = ({
|
|
2268
|
+
config,
|
|
2269
|
+
isOpen,
|
|
2270
|
+
activeItemId,
|
|
2271
|
+
onItemClick,
|
|
2272
|
+
className = ""
|
|
2273
|
+
}) => {
|
|
2274
|
+
const { direction, position, items, avatar, logo } = config;
|
|
2275
|
+
const getContainerClasses = () => {
|
|
2276
|
+
const baseClasses = `
|
|
2277
|
+
fixed z-[90]
|
|
2278
|
+
bg-white/95 backdrop-blur-lg
|
|
2279
|
+
border border-gray-200/50
|
|
2280
|
+
shadow-2xl
|
|
2281
|
+
transition-all duration-500 ease-in-out
|
|
2282
|
+
`;
|
|
2283
|
+
if (direction === "vertical") {
|
|
2284
|
+
const verticalClasses = "h-screen w-64 flex flex-col";
|
|
2285
|
+
const positionClasses = position === "left" ? `left-0 top-0 ${isOpen ? "translate-x-0" : "-translate-x-full"}` : `right-0 top-0 ${isOpen ? "translate-x-0" : "translate-x-full"}`;
|
|
2286
|
+
return `${baseClasses} ${verticalClasses} ${positionClasses}`;
|
|
2287
|
+
} else {
|
|
2288
|
+
const horizontalClasses = "w-full h-16 flex items-center";
|
|
2289
|
+
const positionClasses = position === "top" ? `top-0 left-0 right-0 ${isOpen ? "translate-y-0" : "-translate-y-full"}` : `bottom-0 left-0 right-0 ${isOpen ? "translate-y-0" : "translate-y-full"}`;
|
|
2290
|
+
return `${baseClasses} ${horizontalClasses} ${positionClasses}`;
|
|
2291
|
+
}
|
|
2292
|
+
};
|
|
2293
|
+
const getContentClasses = () => {
|
|
2294
|
+
if (direction === "vertical") {
|
|
2295
|
+
return "flex flex-col h-full p-4";
|
|
2296
|
+
} else {
|
|
2297
|
+
return "flex items-center justify-between w-full px-6";
|
|
2298
|
+
}
|
|
2299
|
+
};
|
|
2300
|
+
const getItemsListClasses = () => {
|
|
2301
|
+
if (direction === "vertical") {
|
|
2302
|
+
return "flex flex-col gap-2 flex-1 overflow-y-auto mt-4";
|
|
2303
|
+
} else {
|
|
2304
|
+
return "flex items-center gap-4";
|
|
2305
|
+
}
|
|
2306
|
+
};
|
|
2307
|
+
const handleItemClick = (item) => {
|
|
2308
|
+
if (item.isExternal) {
|
|
2309
|
+
window.open(item.href, item.target || "_blank");
|
|
2310
|
+
} else if (item.href.startsWith("#")) {
|
|
2311
|
+
const element = document.getElementById(item.id);
|
|
2312
|
+
if (element) {
|
|
2313
|
+
element.scrollIntoView({ behavior: "smooth" });
|
|
2314
|
+
}
|
|
2315
|
+
} else {
|
|
2316
|
+
window.location.href = item.href;
|
|
2317
|
+
}
|
|
2318
|
+
onItemClick?.(item);
|
|
2319
|
+
};
|
|
2320
|
+
if (!isOpen) return null;
|
|
2321
|
+
return /* @__PURE__ */ React33__namespace.default.createElement("nav", { className: `${getContainerClasses()} ${className}` }, /* @__PURE__ */ React33__namespace.default.createElement("div", { className: getContentClasses() }, logo && /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "flex items-center justify-center mb-4" }, /* @__PURE__ */ React33__namespace.default.createElement(
|
|
2322
|
+
"img",
|
|
2323
|
+
{
|
|
2324
|
+
src: logo.src,
|
|
2325
|
+
alt: logo.alt || "Logo",
|
|
2326
|
+
className: "h-8 w-auto"
|
|
2327
|
+
}
|
|
2328
|
+
)), direction === "vertical" && /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "h-12 flex-shrink-0" }), /* @__PURE__ */ React33__namespace.default.createElement("div", { className: getItemsListClasses() }, items.map((item) => /* @__PURE__ */ React33__namespace.default.createElement(
|
|
2329
|
+
NavigationItem_default,
|
|
2330
|
+
{
|
|
2331
|
+
key: item.id,
|
|
2332
|
+
item,
|
|
2333
|
+
direction,
|
|
2334
|
+
isActive: activeItemId === item.id,
|
|
2335
|
+
onClick: handleItemClick
|
|
2336
|
+
}
|
|
2337
|
+
))), avatar && direction === "vertical" && /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "flex items-center justify-center mt-auto pt-4" }, /* @__PURE__ */ React33__namespace.default.createElement(
|
|
2338
|
+
"img",
|
|
2339
|
+
{
|
|
2340
|
+
src: avatar.src,
|
|
2341
|
+
alt: avatar.alt || "Avatar",
|
|
2342
|
+
className: "w-10 h-10 rounded-full border-2 border-gray-200"
|
|
2343
|
+
}
|
|
2344
|
+
)), avatar && direction === "horizontal" && /* @__PURE__ */ React33__namespace.default.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React33__namespace.default.createElement(
|
|
2345
|
+
"img",
|
|
2346
|
+
{
|
|
2347
|
+
src: avatar.src,
|
|
2348
|
+
alt: avatar.alt || "Avatar",
|
|
2349
|
+
className: "w-8 h-8 rounded-full border-2 border-gray-200"
|
|
2350
|
+
}
|
|
670
2351
|
))));
|
|
671
2352
|
};
|
|
2353
|
+
var Navigation_default = Navigation;
|
|
2354
|
+
var NavigationToggle = ({
|
|
2355
|
+
isOpen,
|
|
2356
|
+
onClick,
|
|
2357
|
+
position
|
|
2358
|
+
}) => {
|
|
2359
|
+
const getPositionClasses = () => {
|
|
2360
|
+
switch (position) {
|
|
2361
|
+
case "top":
|
|
2362
|
+
return "top-4 left-4";
|
|
2363
|
+
case "bottom":
|
|
2364
|
+
return "bottom-4 left-4";
|
|
2365
|
+
case "left":
|
|
2366
|
+
return "top-4 left-4";
|
|
2367
|
+
case "right":
|
|
2368
|
+
return "top-4 right-4";
|
|
2369
|
+
default:
|
|
2370
|
+
return "top-4 left-4";
|
|
2371
|
+
}
|
|
2372
|
+
};
|
|
2373
|
+
return /* @__PURE__ */ React33__namespace.default.createElement(
|
|
2374
|
+
"button",
|
|
2375
|
+
{
|
|
2376
|
+
onClick,
|
|
2377
|
+
className: `
|
|
2378
|
+
fixed ${getPositionClasses()} z-[100]
|
|
2379
|
+
p-3 rounded-xl
|
|
2380
|
+
bg-white/90 backdrop-blur-md
|
|
2381
|
+
shadow-lg hover:shadow-xl
|
|
2382
|
+
border border-gray-200/50
|
|
2383
|
+
transition-all duration-300 ease-in-out
|
|
2384
|
+
hover:scale-105 active:scale-95
|
|
2385
|
+
focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-opacity-50
|
|
2386
|
+
`,
|
|
2387
|
+
"aria-label": isOpen ? "\u5173\u95ED\u5BFC\u822A\u680F" : "\u6253\u5F00\u5BFC\u822A\u680F"
|
|
2388
|
+
},
|
|
2389
|
+
/* @__PURE__ */ React33__namespace.default.createElement("div", { className: "w-5 h-5 flex flex-col justify-center items-center" }, /* @__PURE__ */ React33__namespace.default.createElement(
|
|
2390
|
+
"span",
|
|
2391
|
+
{
|
|
2392
|
+
className: `
|
|
2393
|
+
block w-5 h-0.5 bg-gray-600 rounded-full
|
|
2394
|
+
transform transition-all duration-300 ease-in-out
|
|
2395
|
+
${isOpen ? "rotate-45 translate-y-0.5" : ""}
|
|
2396
|
+
`
|
|
2397
|
+
}
|
|
2398
|
+
), /* @__PURE__ */ React33__namespace.default.createElement(
|
|
2399
|
+
"span",
|
|
2400
|
+
{
|
|
2401
|
+
className: `
|
|
2402
|
+
block w-5 h-0.5 bg-gray-600 rounded-full
|
|
2403
|
+
transform transition-all duration-300 ease-in-out mt-1
|
|
2404
|
+
${isOpen ? "opacity-0 scale-0" : "opacity-100 scale-100"}
|
|
2405
|
+
`
|
|
2406
|
+
}
|
|
2407
|
+
), /* @__PURE__ */ React33__namespace.default.createElement(
|
|
2408
|
+
"span",
|
|
2409
|
+
{
|
|
2410
|
+
className: `
|
|
2411
|
+
block w-5 h-0.5 bg-gray-600 rounded-full
|
|
2412
|
+
transform transition-all duration-300 ease-in-out mt-1
|
|
2413
|
+
${isOpen ? "-rotate-45 -translate-y-2.5" : ""}
|
|
2414
|
+
`
|
|
2415
|
+
}
|
|
2416
|
+
))
|
|
2417
|
+
);
|
|
2418
|
+
};
|
|
2419
|
+
var NavigationToggle_default = NavigationToggle;
|
|
2420
|
+
var FloatingMenu = ({
|
|
2421
|
+
trigger,
|
|
2422
|
+
menu,
|
|
2423
|
+
initialPosition = { x: 20, y: 20 },
|
|
2424
|
+
defaultOpen = false,
|
|
2425
|
+
className = "",
|
|
2426
|
+
menuClassName = "",
|
|
2427
|
+
triggerClassName = "",
|
|
2428
|
+
zIndex = 1e3
|
|
2429
|
+
}) => {
|
|
2430
|
+
const [position, setPosition] = React33.useState(initialPosition);
|
|
2431
|
+
const [isMenuOpen, setIsMenuOpen] = React33.useState(defaultOpen);
|
|
2432
|
+
const [menuDirection, setMenuDirection] = React33.useState("right");
|
|
2433
|
+
const [isDragging, setIsDragging] = React33.useState(false);
|
|
2434
|
+
const [dragOffset, setDragOffset] = React33.useState({ x: 0, y: 0 });
|
|
2435
|
+
const containerRef = React33.useRef(null);
|
|
2436
|
+
const [mounted, setMounted] = React33.useState(false);
|
|
2437
|
+
const [hasDragged, setHasDragged] = React33.useState(false);
|
|
2438
|
+
const dragTimerRef = React33.useRef(null);
|
|
2439
|
+
const mouseDownPosRef = React33.useRef(null);
|
|
2440
|
+
React33.useEffect(() => {
|
|
2441
|
+
setMounted(true);
|
|
2442
|
+
return () => setMounted(false);
|
|
2443
|
+
}, []);
|
|
2444
|
+
React33.useEffect(() => {
|
|
2445
|
+
if (!mounted || !containerRef.current) return;
|
|
2446
|
+
const updateMenuDirection = () => {
|
|
2447
|
+
const rect = containerRef.current?.getBoundingClientRect();
|
|
2448
|
+
if (!rect) return;
|
|
2449
|
+
const windowWidth = window.innerWidth;
|
|
2450
|
+
const middlePoint = windowWidth / 2;
|
|
2451
|
+
setMenuDirection(rect.left < middlePoint ? "right" : "left");
|
|
2452
|
+
};
|
|
2453
|
+
updateMenuDirection();
|
|
2454
|
+
window.addEventListener("resize", updateMenuDirection);
|
|
2455
|
+
window.addEventListener("scroll", updateMenuDirection);
|
|
2456
|
+
return () => {
|
|
2457
|
+
window.removeEventListener("resize", updateMenuDirection);
|
|
2458
|
+
window.removeEventListener("scroll", updateMenuDirection);
|
|
2459
|
+
};
|
|
2460
|
+
}, [mounted]);
|
|
2461
|
+
const handleMouseDown = (e) => {
|
|
2462
|
+
if (!containerRef.current) return;
|
|
2463
|
+
e.stopPropagation();
|
|
2464
|
+
mouseDownPosRef.current = { x: e.clientX, y: e.clientY };
|
|
2465
|
+
const rect = containerRef.current.getBoundingClientRect();
|
|
2466
|
+
setDragOffset({
|
|
2467
|
+
x: e.clientX - rect.left,
|
|
2468
|
+
y: e.clientY - rect.top
|
|
2469
|
+
});
|
|
2470
|
+
setHasDragged(false);
|
|
2471
|
+
setIsDragging(true);
|
|
2472
|
+
};
|
|
2473
|
+
React33.useEffect(() => {
|
|
2474
|
+
if (!isDragging) return;
|
|
2475
|
+
const handleMouseMove = (e) => {
|
|
2476
|
+
if (mouseDownPosRef.current) {
|
|
2477
|
+
const dx = Math.abs(e.clientX - mouseDownPosRef.current.x);
|
|
2478
|
+
const dy = Math.abs(e.clientY - mouseDownPosRef.current.y);
|
|
2479
|
+
if (dx > 3 || dy > 3) {
|
|
2480
|
+
setHasDragged(true);
|
|
2481
|
+
}
|
|
2482
|
+
}
|
|
2483
|
+
const newX = e.clientX - dragOffset.x;
|
|
2484
|
+
const newY = e.clientY - dragOffset.y;
|
|
2485
|
+
const windowWidth = window.innerWidth;
|
|
2486
|
+
const windowHeight = window.innerHeight;
|
|
2487
|
+
setPosition({
|
|
2488
|
+
x: Math.min(Math.max(newX, 0), windowWidth - 50),
|
|
2489
|
+
y: Math.min(Math.max(newY, 0), windowHeight - 50)
|
|
2490
|
+
});
|
|
2491
|
+
};
|
|
2492
|
+
const handleMouseUp = () => {
|
|
2493
|
+
setIsDragging(false);
|
|
2494
|
+
mouseDownPosRef.current = null;
|
|
2495
|
+
if (dragTimerRef.current) {
|
|
2496
|
+
window.clearTimeout(dragTimerRef.current);
|
|
2497
|
+
}
|
|
2498
|
+
dragTimerRef.current = window.setTimeout(() => {
|
|
2499
|
+
setHasDragged(false);
|
|
2500
|
+
}, 300);
|
|
2501
|
+
};
|
|
2502
|
+
document.addEventListener("mousemove", handleMouseMove);
|
|
2503
|
+
document.addEventListener("mouseup", handleMouseUp);
|
|
2504
|
+
return () => {
|
|
2505
|
+
document.removeEventListener("mousemove", handleMouseMove);
|
|
2506
|
+
document.removeEventListener("mouseup", handleMouseUp);
|
|
2507
|
+
};
|
|
2508
|
+
}, [isDragging, dragOffset]);
|
|
2509
|
+
React33.useEffect(() => {
|
|
2510
|
+
return () => {
|
|
2511
|
+
if (dragTimerRef.current) {
|
|
2512
|
+
window.clearTimeout(dragTimerRef.current);
|
|
2513
|
+
}
|
|
2514
|
+
};
|
|
2515
|
+
}, []);
|
|
2516
|
+
const toggleMenu = (e) => {
|
|
2517
|
+
e.stopPropagation();
|
|
2518
|
+
if (hasDragged) {
|
|
2519
|
+
return;
|
|
2520
|
+
}
|
|
2521
|
+
setIsMenuOpen(!isMenuOpen);
|
|
2522
|
+
};
|
|
2523
|
+
React33.useEffect(() => {
|
|
2524
|
+
if (!isMenuOpen) return;
|
|
2525
|
+
const handleClickOutside = (e) => {
|
|
2526
|
+
if (containerRef.current && !containerRef.current.contains(e.target)) {
|
|
2527
|
+
setIsMenuOpen(false);
|
|
2528
|
+
}
|
|
2529
|
+
};
|
|
2530
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
2531
|
+
return () => {
|
|
2532
|
+
document.removeEventListener("mousedown", handleClickOutside);
|
|
2533
|
+
};
|
|
2534
|
+
}, [isMenuOpen]);
|
|
2535
|
+
React33.useEffect(() => {
|
|
2536
|
+
if (!mounted) return;
|
|
2537
|
+
const checkBoundaries = () => {
|
|
2538
|
+
const windowWidth = window.innerWidth;
|
|
2539
|
+
const windowHeight = window.innerHeight;
|
|
2540
|
+
setPosition((prev) => {
|
|
2541
|
+
const newX = Math.min(Math.max(prev.x, 0), windowWidth - 50);
|
|
2542
|
+
const newY = Math.min(Math.max(prev.y, 0), windowHeight - 50);
|
|
2543
|
+
if (newX !== prev.x || newY !== prev.y) {
|
|
2544
|
+
return { x: newX, y: newY };
|
|
2545
|
+
}
|
|
2546
|
+
return prev;
|
|
2547
|
+
});
|
|
2548
|
+
};
|
|
2549
|
+
window.addEventListener("resize", checkBoundaries);
|
|
2550
|
+
return () => {
|
|
2551
|
+
window.removeEventListener("resize", checkBoundaries);
|
|
2552
|
+
};
|
|
2553
|
+
}, [mounted]);
|
|
2554
|
+
if (!mounted) return null;
|
|
2555
|
+
return reactDom.createPortal(
|
|
2556
|
+
/* @__PURE__ */ React33__namespace.default.createElement(
|
|
2557
|
+
"div",
|
|
2558
|
+
{
|
|
2559
|
+
ref: containerRef,
|
|
2560
|
+
className: `fixed select-none box-border ${className}`,
|
|
2561
|
+
style: {
|
|
2562
|
+
left: `${position.x}px`,
|
|
2563
|
+
top: `${position.y}px`,
|
|
2564
|
+
zIndex
|
|
2565
|
+
}
|
|
2566
|
+
},
|
|
2567
|
+
/* @__PURE__ */ React33__namespace.default.createElement(
|
|
2568
|
+
"div",
|
|
2569
|
+
{
|
|
2570
|
+
className: `
|
|
2571
|
+
flex items-center justify-center
|
|
2572
|
+
w-12 h-12 md:w-12 md:h-12
|
|
2573
|
+
bg-white rounded-full
|
|
2574
|
+
shadow-md hover:shadow-lg
|
|
2575
|
+
cursor-grab active:cursor-grabbing
|
|
2576
|
+
transition-all duration-200
|
|
2577
|
+
hover:scale-105 active:scale-95
|
|
2578
|
+
${triggerClassName}
|
|
2579
|
+
`,
|
|
2580
|
+
onMouseDown: handleMouseDown,
|
|
2581
|
+
onClick: toggleMenu
|
|
2582
|
+
},
|
|
2583
|
+
trigger
|
|
2584
|
+
),
|
|
2585
|
+
isMenuOpen && /* @__PURE__ */ React33__namespace.default.createElement(
|
|
2586
|
+
"div",
|
|
2587
|
+
{
|
|
2588
|
+
className: `
|
|
2589
|
+
absolute top-0
|
|
2590
|
+
bg-white rounded-lg shadow-xl
|
|
2591
|
+
p-3 min-w-[200px] md:min-w-[200px] max-w-[300px]
|
|
2592
|
+
z-[1000]
|
|
2593
|
+
transition-all duration-200
|
|
2594
|
+
${isMenuOpen ? "opacity-100 scale-100" : "opacity-0 scale-95"}
|
|
2595
|
+
${menuDirection === "left" ? "right-[calc(100%+10px)]" : "left-[calc(100%+10px)]"}
|
|
2596
|
+
${menuClassName}
|
|
2597
|
+
`,
|
|
2598
|
+
onClick: (e) => e.stopPropagation(),
|
|
2599
|
+
onMouseDown: (e) => e.stopPropagation(),
|
|
2600
|
+
onMouseUp: (e) => e.stopPropagation(),
|
|
2601
|
+
onTouchStart: (e) => e.stopPropagation(),
|
|
2602
|
+
onTouchMove: (e) => e.stopPropagation(),
|
|
2603
|
+
onTouchEnd: (e) => e.stopPropagation(),
|
|
2604
|
+
onPointerDown: (e) => e.stopPropagation(),
|
|
2605
|
+
onPointerUp: (e) => e.stopPropagation()
|
|
2606
|
+
},
|
|
2607
|
+
menu
|
|
2608
|
+
)
|
|
2609
|
+
),
|
|
2610
|
+
document.body
|
|
2611
|
+
);
|
|
2612
|
+
};
|
|
2613
|
+
var FloatingMenu_default = FloatingMenu;
|
|
672
2614
|
|
|
2615
|
+
Object.defineProperty(exports, "SearchBox", {
|
|
2616
|
+
enumerable: true,
|
|
2617
|
+
get: function () { return chunkIEA55H3G_js.SearchBox; }
|
|
2618
|
+
});
|
|
673
2619
|
Object.defineProperty(exports, "arrayUtils", {
|
|
674
2620
|
enumerable: true,
|
|
675
|
-
get: function () { return
|
|
2621
|
+
get: function () { return chunk7Z5LLJ3A_js.arrayUtils; }
|
|
2622
|
+
});
|
|
2623
|
+
Object.defineProperty(exports, "cn", {
|
|
2624
|
+
enumerable: true,
|
|
2625
|
+
get: function () { return chunk7Z5LLJ3A_js.cn; }
|
|
676
2626
|
});
|
|
677
2627
|
Object.defineProperty(exports, "debugUtils", {
|
|
678
2628
|
enumerable: true,
|
|
679
|
-
get: function () { return
|
|
2629
|
+
get: function () { return chunk7Z5LLJ3A_js.debugUtils; }
|
|
680
2630
|
});
|
|
681
2631
|
Object.defineProperty(exports, "errorUtils", {
|
|
682
2632
|
enumerable: true,
|
|
683
|
-
get: function () { return
|
|
2633
|
+
get: function () { return chunk7Z5LLJ3A_js.errorUtils; }
|
|
684
2634
|
});
|
|
685
2635
|
Object.defineProperty(exports, "fileUtils", {
|
|
686
2636
|
enumerable: true,
|
|
687
|
-
get: function () { return
|
|
2637
|
+
get: function () { return chunk7Z5LLJ3A_js.fileUtils; }
|
|
688
2638
|
});
|
|
689
2639
|
Object.defineProperty(exports, "formatTime", {
|
|
690
2640
|
enumerable: true,
|
|
691
|
-
get: function () { return
|
|
2641
|
+
get: function () { return chunk7Z5LLJ3A_js.formatTime; }
|
|
692
2642
|
});
|
|
693
2643
|
Object.defineProperty(exports, "japaneseUtils", {
|
|
694
2644
|
enumerable: true,
|
|
695
|
-
get: function () { return
|
|
2645
|
+
get: function () { return chunk7Z5LLJ3A_js.japaneseUtils; }
|
|
696
2646
|
});
|
|
697
2647
|
Object.defineProperty(exports, "stringUtils", {
|
|
698
2648
|
enumerable: true,
|
|
699
|
-
get: function () { return
|
|
2649
|
+
get: function () { return chunk7Z5LLJ3A_js.stringUtils; }
|
|
700
2650
|
});
|
|
701
2651
|
Object.defineProperty(exports, "validators", {
|
|
702
2652
|
enumerable: true,
|
|
703
|
-
get: function () { return
|
|
2653
|
+
get: function () { return chunk7Z5LLJ3A_js.validators; }
|
|
704
2654
|
});
|
|
705
2655
|
Object.defineProperty(exports, "useAsyncStorage", {
|
|
706
2656
|
enumerable: true,
|
|
@@ -742,10 +2692,111 @@ Object.defineProperty(exports, "logger", {
|
|
|
742
2692
|
enumerable: true,
|
|
743
2693
|
get: function () { return chunk6PRFP5EG_js.logger; }
|
|
744
2694
|
});
|
|
2695
|
+
exports.About = About_default;
|
|
2696
|
+
exports.AlertDialog = AlertDialog;
|
|
2697
|
+
exports.AlertDialogAction = AlertDialogAction;
|
|
2698
|
+
exports.AlertDialogCancel = AlertDialogCancel;
|
|
2699
|
+
exports.AlertDialogContent = AlertDialogContent;
|
|
2700
|
+
exports.AlertDialogDescription = AlertDialogDescription;
|
|
2701
|
+
exports.AlertDialogFooter = AlertDialogFooter;
|
|
2702
|
+
exports.AlertDialogHeader = AlertDialogHeader;
|
|
2703
|
+
exports.AlertDialogOverlay = AlertDialogOverlay;
|
|
2704
|
+
exports.AlertDialogPortal = AlertDialogPortal;
|
|
2705
|
+
exports.AlertDialogTitle = AlertDialogTitle;
|
|
2706
|
+
exports.AlertDialogTrigger = AlertDialogTrigger;
|
|
2707
|
+
exports.AutoOpenModal = AutoOpenModal;
|
|
2708
|
+
exports.Avatar = Avatar;
|
|
2709
|
+
exports.AvatarFallback = AvatarFallback;
|
|
2710
|
+
exports.AvatarImage = AvatarImage;
|
|
745
2711
|
exports.BackgroundRemover = BackgroundRemover;
|
|
2712
|
+
exports.Badge = Badge;
|
|
2713
|
+
exports.Button = Button;
|
|
2714
|
+
exports.Card = Card;
|
|
2715
|
+
exports.CardContent = CardContent;
|
|
2716
|
+
exports.CardDescription = CardDescription;
|
|
2717
|
+
exports.CardFooter = CardFooter;
|
|
2718
|
+
exports.CardHeader = CardHeader;
|
|
2719
|
+
exports.CardTitle = CardTitle;
|
|
2720
|
+
exports.CollisionBalls = CollisionBalls;
|
|
2721
|
+
exports.Contact = Contact_default;
|
|
2722
|
+
exports.Dialog = Dialog;
|
|
2723
|
+
exports.DialogClose = DialogClose;
|
|
2724
|
+
exports.DialogContent = DialogContent;
|
|
2725
|
+
exports.DialogDescription = DialogDescription;
|
|
2726
|
+
exports.DialogFooter = DialogFooter;
|
|
2727
|
+
exports.DialogHeader = DialogHeader;
|
|
2728
|
+
exports.DialogOverlay = DialogOverlay;
|
|
2729
|
+
exports.DialogPortal = DialogPortal;
|
|
2730
|
+
exports.DialogTitle = DialogTitle;
|
|
2731
|
+
exports.DialogTrigger = DialogTrigger;
|
|
2732
|
+
exports.DropdownMenu = DropdownMenu;
|
|
2733
|
+
exports.DropdownMenuCheckboxItem = DropdownMenuCheckboxItem;
|
|
2734
|
+
exports.DropdownMenuContent = DropdownMenuContent;
|
|
2735
|
+
exports.DropdownMenuGroup = DropdownMenuGroup;
|
|
2736
|
+
exports.DropdownMenuItem = DropdownMenuItem;
|
|
2737
|
+
exports.DropdownMenuLabel = DropdownMenuLabel;
|
|
2738
|
+
exports.DropdownMenuPortal = DropdownMenuPortal;
|
|
2739
|
+
exports.DropdownMenuRadioGroup = DropdownMenuRadioGroup;
|
|
2740
|
+
exports.DropdownMenuRadioItem = DropdownMenuRadioItem;
|
|
2741
|
+
exports.DropdownMenuSeparator = DropdownMenuSeparator;
|
|
2742
|
+
exports.DropdownMenuShortcut = DropdownMenuShortcut;
|
|
2743
|
+
exports.DropdownMenuSub = DropdownMenuSub;
|
|
2744
|
+
exports.DropdownMenuSubContent = DropdownMenuSubContent;
|
|
2745
|
+
exports.DropdownMenuSubTrigger = DropdownMenuSubTrigger;
|
|
2746
|
+
exports.DropdownMenuTrigger = DropdownMenuTrigger;
|
|
2747
|
+
exports.EnhancedAvatar = EnhancedAvatar;
|
|
2748
|
+
exports.FloatingMenu = FloatingMenu_default;
|
|
2749
|
+
exports.Grid = Grid;
|
|
2750
|
+
exports.Input = Input;
|
|
2751
|
+
exports.Label = Label;
|
|
2752
|
+
exports.Navigation = Navigation_default;
|
|
2753
|
+
exports.NavigationItem = NavigationItem_default;
|
|
2754
|
+
exports.NavigationToggle = NavigationToggle_default;
|
|
746
2755
|
exports.OCRScanner = OCRScanner;
|
|
2756
|
+
exports.Popover = Popover;
|
|
2757
|
+
exports.PopoverAnchor = PopoverAnchor;
|
|
2758
|
+
exports.PopoverContent = PopoverContent;
|
|
2759
|
+
exports.PopoverTrigger = PopoverTrigger;
|
|
2760
|
+
exports.ProfileButton = ProfileButton;
|
|
2761
|
+
exports.ProfileModal = ProfileModal;
|
|
2762
|
+
exports.Progress = Progress;
|
|
2763
|
+
exports.ScrollArea = ScrollArea;
|
|
2764
|
+
exports.ScrollBar = ScrollBar;
|
|
2765
|
+
exports.Select = Select;
|
|
2766
|
+
exports.SelectContent = SelectContent;
|
|
2767
|
+
exports.SelectGroup = SelectGroup;
|
|
2768
|
+
exports.SelectItem = SelectItem;
|
|
2769
|
+
exports.SelectLabel = SelectLabel;
|
|
2770
|
+
exports.SelectScrollDownButton = SelectScrollDownButton;
|
|
2771
|
+
exports.SelectScrollUpButton = SelectScrollUpButton;
|
|
2772
|
+
exports.SelectSeparator = SelectSeparator;
|
|
2773
|
+
exports.SelectTrigger = SelectTrigger;
|
|
2774
|
+
exports.SelectValue = SelectValue;
|
|
747
2775
|
exports.SentimentAnalyzer = SentimentAnalyzer;
|
|
2776
|
+
exports.Separator = Separator3;
|
|
2777
|
+
exports.Sheet = Sheet;
|
|
2778
|
+
exports.SheetClose = SheetClose;
|
|
2779
|
+
exports.SheetContent = SheetContent;
|
|
2780
|
+
exports.SheetDescription = SheetDescription;
|
|
2781
|
+
exports.SheetFooter = SheetFooter;
|
|
2782
|
+
exports.SheetHeader = SheetHeader;
|
|
2783
|
+
exports.SheetOverlay = SheetOverlay;
|
|
2784
|
+
exports.SheetPortal = SheetPortal;
|
|
2785
|
+
exports.SheetTitle = SheetTitle;
|
|
2786
|
+
exports.SheetTrigger = SheetTrigger;
|
|
748
2787
|
exports.SmartAssistant = SmartAssistant;
|
|
2788
|
+
exports.Tabs = Tabs;
|
|
2789
|
+
exports.TabsContent = TabsContent;
|
|
2790
|
+
exports.TabsList = TabsList;
|
|
2791
|
+
exports.TabsTrigger = TabsTrigger;
|
|
2792
|
+
exports.Textarea = Textarea;
|
|
2793
|
+
exports.Timeline = Timeline;
|
|
2794
|
+
exports.Tooltip = Tooltip;
|
|
2795
|
+
exports.TooltipContent = TooltipContent;
|
|
2796
|
+
exports.TooltipProvider = TooltipProvider;
|
|
2797
|
+
exports.TooltipTrigger = TooltipTrigger;
|
|
2798
|
+
exports.badgeVariants = badgeVariants;
|
|
2799
|
+
exports.buttonVariants = buttonVariants;
|
|
749
2800
|
exports.useBackgroundRemoval = useBackgroundRemoval;
|
|
750
2801
|
exports.useOCR = useOCR;
|
|
751
2802
|
exports.useSentimentAnalysis = useSentimentAnalysis;
|