sa2kit 1.6.44 → 1.6.45
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/AliyunOSSProvider-2FARPAQD.js +15 -0
- package/dist/{AliyunOSSProvider-HCNGDJL7.js.map → AliyunOSSProvider-2FARPAQD.js.map} +1 -1
- package/dist/AliyunOSSProvider-UMVGVBDJ.mjs +9 -0
- package/dist/{AliyunOSSProvider-4W47OFEK.mjs.map → AliyunOSSProvider-UMVGVBDJ.mjs.map} +1 -1
- package/dist/CollisionBalls-BpHufX3H.d.mts +41 -0
- package/dist/CollisionBalls-BpHufX3H.d.ts +41 -0
- package/dist/ConfigService-QR67WYNK.mjs +4 -0
- package/dist/{ConfigService-V6ZK273Z.mjs.map → ConfigService-QR67WYNK.mjs.map} +1 -1
- package/dist/{ConfigService-3DIC6C3Q.js → ConfigService-UYC6ZTCM.js} +3 -3
- package/dist/{ConfigService-3DIC6C3Q.js.map → ConfigService-UYC6ZTCM.js.map} +1 -1
- package/dist/GenericOrderManager-e4WizpNf.d.mts +28 -0
- package/dist/GenericOrderManager-e4WizpNf.d.ts +28 -0
- package/dist/LocalStorageProvider-JQF5WK5H.js +15 -0
- package/dist/{LocalStorageProvider-PP7MA5OT.js.map → LocalStorageProvider-JQF5WK5H.js.map} +1 -1
- package/dist/LocalStorageProvider-PYOHETJV.mjs +9 -0
- package/dist/{LocalStorageProvider-3RVPCQB3.mjs.map → LocalStorageProvider-PYOHETJV.mjs.map} +1 -1
- package/dist/PMXParser-RLBDO7YK.mjs +4 -0
- package/dist/{PMXParser-RNVQL76A.mjs.map → PMXParser-RLBDO7YK.mjs.map} +1 -1
- package/dist/{PMXParser-2VTA737I.js → PMXParser-XHNO2KNI.js} +3 -3
- package/dist/{PMXParser-2VTA737I.js.map → PMXParser-XHNO2KNI.js.map} +1 -1
- package/dist/UniversalFileService-RBV6EN5J.js +15 -0
- package/dist/UniversalFileService-RBV6EN5J.js.map +1 -0
- package/dist/UniversalFileService-TNYKO6JN.mjs +9 -0
- package/dist/UniversalFileService-TNYKO6JN.mjs.map +1 -0
- package/dist/analytics/index.js +1 -1
- package/dist/analytics/index.mjs +1 -1
- package/dist/analytics/server/index.js +1 -1
- package/dist/analytics/server/index.mjs +1 -1
- package/dist/api/index.js +1 -1
- package/dist/api/index.mjs +1 -1
- package/dist/audioDetection/index.js +1 -1
- package/dist/audioDetection/index.mjs +1 -1
- package/dist/auth/client/index.js +1 -1
- package/dist/auth/client/index.mjs +1 -1
- package/dist/auth/components/index.js +1 -1
- package/dist/auth/components/index.mjs +1 -1
- package/dist/auth/hooks/index.js +1 -1
- package/dist/auth/hooks/index.mjs +1 -1
- package/dist/auth/index.js +1 -1
- package/dist/auth/index.mjs +1 -1
- package/dist/auth/middleware/index.js +1 -1
- package/dist/auth/middleware/index.mjs +1 -1
- package/dist/auth/routes/index.js +1 -1
- package/dist/auth/routes/index.mjs +1 -1
- package/dist/auth/schema/index.js +1 -1
- package/dist/auth/schema/index.mjs +1 -1
- package/dist/auth/services/index.js +1 -1
- package/dist/auth/services/index.mjs +1 -1
- package/dist/calendar/index.js +12 -12
- package/dist/calendar/index.mjs +5 -5
- package/dist/calendar/routes/index.js +1 -1
- package/dist/calendar/routes/index.mjs +1 -1
- package/dist/calendar/server.js +1 -1
- package/dist/calendar/server.mjs +1 -1
- package/dist/chunk-2PS5PIXV.mjs +443 -0
- package/dist/chunk-2PS5PIXV.mjs.map +1 -0
- package/dist/chunk-35CXIK5Y.js +277 -0
- package/dist/chunk-35CXIK5Y.js.map +1 -0
- package/dist/{chunk-GMIUSZXC.mjs → chunk-3JW4X3AC.mjs} +3 -3
- package/dist/{chunk-GMIUSZXC.mjs.map → chunk-3JW4X3AC.mjs.map} +1 -1
- package/dist/chunk-3M6T5KVD.js +453 -0
- package/dist/chunk-3M6T5KVD.js.map +1 -0
- package/dist/chunk-3TNR6IMC.js +168 -0
- package/dist/chunk-3TNR6IMC.js.map +1 -0
- package/dist/chunk-4NFOSCM6.js +34 -0
- package/dist/chunk-4NFOSCM6.js.map +1 -0
- package/dist/{chunk-3NHAT7D4.mjs → chunk-4VJQZSPU.mjs} +4 -3
- package/dist/chunk-4VJQZSPU.mjs.map +1 -0
- package/dist/{chunk-SCDDMIF6.js → chunk-4XXIBWCO.js} +66 -66
- package/dist/{chunk-SCDDMIF6.js.map → chunk-4XXIBWCO.js.map} +1 -1
- package/dist/chunk-6AHYPPUP.js +344 -0
- package/dist/chunk-6AHYPPUP.js.map +1 -0
- package/dist/{chunk-EGJPS7OL.mjs → chunk-6BJ76BYC.mjs} +3 -3
- package/dist/{chunk-EGJPS7OL.mjs.map → chunk-6BJ76BYC.mjs.map} +1 -1
- package/dist/chunk-76V7EKBX.mjs +796 -0
- package/dist/chunk-76V7EKBX.mjs.map +1 -0
- package/dist/chunk-ACLOJXXE.js +195 -0
- package/dist/chunk-ACLOJXXE.js.map +1 -0
- package/dist/chunk-AEXPAH7Z.mjs +32 -0
- package/dist/chunk-AEXPAH7Z.mjs.map +1 -0
- package/dist/chunk-CFGX3EKK.js +560 -0
- package/dist/chunk-CFGX3EKK.js.map +1 -0
- package/dist/chunk-D2HXMGXS.js +46 -0
- package/dist/chunk-D2HXMGXS.js.map +1 -0
- package/dist/chunk-DM2GUVUH.js +1201 -0
- package/dist/chunk-DM2GUVUH.js.map +1 -0
- package/dist/{chunk-ZWQJSZEY.js → chunk-DVENFCQY.js} +5 -4
- package/dist/chunk-DVENFCQY.js.map +1 -0
- package/dist/chunk-EONPKLEJ.mjs +163 -0
- package/dist/chunk-EONPKLEJ.mjs.map +1 -0
- package/dist/{chunk-L47ZOYHL.js → chunk-EUIXQPPU.js} +4 -4
- package/dist/{chunk-L47ZOYHL.js.map → chunk-EUIXQPPU.js.map} +1 -1
- package/dist/chunk-K7WNCB4V.mjs +554 -0
- package/dist/chunk-K7WNCB4V.mjs.map +1 -0
- package/dist/chunk-L4ZYBFB2.mjs +44 -0
- package/dist/chunk-L4ZYBFB2.mjs.map +1 -0
- package/dist/chunk-M4HGHTIC.js +820 -0
- package/dist/chunk-M4HGHTIC.js.map +1 -0
- package/dist/{chunk-HHVDOIPV.js → chunk-MZKATHB7.js} +4 -4
- package/dist/{chunk-HHVDOIPV.js.map → chunk-MZKATHB7.js.map} +1 -1
- package/dist/{chunk-UKT3PLON.mjs → chunk-NXQVTAOP.mjs} +3 -3
- package/dist/{chunk-UKT3PLON.mjs.map → chunk-NXQVTAOP.mjs.map} +1 -1
- package/dist/chunk-OBIPI4GU.mjs +266 -0
- package/dist/chunk-OBIPI4GU.mjs.map +1 -0
- package/dist/chunk-PAX4S7QM.mjs +94 -0
- package/dist/chunk-PAX4S7QM.mjs.map +1 -0
- package/dist/chunk-PXWDQFWV.mjs +192 -0
- package/dist/chunk-PXWDQFWV.mjs.map +1 -0
- package/dist/chunk-QROLPPXP.mjs +5797 -0
- package/dist/chunk-QROLPPXP.mjs.map +1 -0
- package/dist/chunk-TGNUEULF.mjs +1158 -0
- package/dist/chunk-TGNUEULF.mjs.map +1 -0
- package/dist/chunk-VBQFVXOW.mjs +2772 -0
- package/dist/chunk-VBQFVXOW.mjs.map +1 -0
- package/dist/chunk-VLZ5N6XZ.js +5888 -0
- package/dist/chunk-VLZ5N6XZ.js.map +1 -0
- package/dist/chunk-VTGPHE4Z.mjs +322 -0
- package/dist/chunk-VTGPHE4Z.mjs.map +1 -0
- package/dist/chunk-WMJKH4XE.mjs +30 -0
- package/dist/{chunk-BJTO5JO5.mjs.map → chunk-WMJKH4XE.mjs.map} +1 -1
- package/dist/chunk-XYQMAF7H.js +96 -0
- package/dist/chunk-XYQMAF7H.js.map +1 -0
- package/dist/chunk-Z3G3IXEF.js +2814 -0
- package/dist/chunk-Z3G3IXEF.js.map +1 -0
- package/dist/chunk-Z6ZWNWWR.js +35 -0
- package/dist/{chunk-DGUM43GV.js.map → chunk-Z6ZWNWWR.js.map} +1 -1
- package/dist/components/index.d.mts +378 -0
- package/dist/components/index.d.ts +378 -0
- package/dist/components/index.js +414 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/index.mjs +9 -0
- package/dist/components/index.mjs.map +1 -0
- package/dist/config/index.js +1 -1
- package/dist/config/index.mjs +1 -1
- package/dist/config/server/index.js +1 -1
- package/dist/config/server/index.mjs +1 -1
- package/dist/fileService-O3W6YXCI.mjs +4 -0
- package/dist/fileService-O3W6YXCI.mjs.map +1 -0
- package/dist/fileService-YUDIYOAS.js +13 -0
- package/dist/fileService-YUDIYOAS.js.map +1 -0
- package/dist/i18n/index.js +7 -7
- package/dist/i18n/index.mjs +1 -1
- package/dist/imageCrop/index.js +1 -1
- package/dist/imageCrop/index.mjs +1 -1
- package/dist/index.d.mts +9 -580
- package/dist/index.d.ts +9 -580
- package/dist/index.js +297 -956
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +103 -789
- package/dist/index.mjs.map +1 -1
- package/dist/logger/index.js +8 -8
- package/dist/logger/index.mjs +5 -2
- package/dist/mikuFireworks3D/index.js +1 -1
- package/dist/mikuFireworks3D/index.mjs +1 -1
- package/dist/mikuFireworks3D/server/index.js +1 -1
- package/dist/mikuFireworks3D/server/index.mjs +1 -1
- package/dist/mikuFusionGame/index.js +5 -5
- package/dist/mikuFusionGame/index.mjs +4 -4
- package/dist/mmd/admin/index.js +1 -1
- package/dist/mmd/admin/index.mjs +1 -1
- package/dist/mmd/index.js +2 -2
- package/dist/mmd/index.mjs +2 -2
- package/dist/mmd/server/index.js +1 -1
- package/dist/mmd/server/index.mjs +1 -1
- package/dist/music/index.js +1 -1
- package/dist/music/index.mjs +1 -1
- package/dist/music/server/index.js +1 -1
- package/dist/music/server/index.mjs +1 -1
- package/dist/navigation/index.d.mts +93 -0
- package/dist/navigation/index.d.ts +93 -0
- package/dist/navigation/index.js +29 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/navigation/index.mjs +4 -0
- package/dist/navigation/index.mjs.map +1 -0
- package/dist/popupConfig-BznThU1O.d.mts +330 -0
- package/dist/popupConfig-BznThU1O.d.ts +330 -0
- package/dist/portfolio/index.d.mts +57 -0
- package/dist/portfolio/index.d.ts +57 -0
- package/dist/portfolio/index.js +35 -0
- package/dist/portfolio/index.js.map +1 -0
- package/dist/portfolio/index.mjs +10 -0
- package/dist/portfolio/index.mjs.map +1 -0
- package/dist/request/index.js +1 -1
- package/dist/request/index.mjs +1 -1
- package/dist/showmasterpiece/index.d.mts +2524 -0
- package/dist/showmasterpiece/index.d.ts +2524 -0
- package/dist/showmasterpiece/index.js +9681 -0
- package/dist/showmasterpiece/index.js.map +1 -0
- package/dist/showmasterpiece/index.mjs +9631 -0
- package/dist/showmasterpiece/index.mjs.map +1 -0
- package/dist/showmasterpiece/migration/index.d.mts +120 -0
- package/dist/showmasterpiece/migration/index.d.ts +120 -0
- package/dist/showmasterpiece/migration/index.js +595 -0
- package/dist/showmasterpiece/migration/index.js.map +1 -0
- package/dist/showmasterpiece/migration/index.mjs +589 -0
- package/dist/showmasterpiece/migration/index.mjs.map +1 -0
- package/dist/showmasterpiece/scripts/index.d.mts +28 -0
- package/dist/showmasterpiece/scripts/index.d.ts +28 -0
- package/dist/showmasterpiece/scripts/index.js +327 -0
- package/dist/showmasterpiece/scripts/index.js.map +1 -0
- package/dist/showmasterpiece/scripts/index.mjs +325 -0
- package/dist/showmasterpiece/scripts/index.mjs.map +1 -0
- package/dist/showmasterpiece/server/index.d.mts +2698 -0
- package/dist/showmasterpiece/server/index.d.ts +2698 -0
- package/dist/showmasterpiece/server/index.js +179 -0
- package/dist/showmasterpiece/server/index.js.map +1 -0
- package/dist/showmasterpiece/server/index.mjs +6 -0
- package/dist/showmasterpiece/server/index.mjs.map +1 -0
- package/dist/storage/index.js +8 -8
- package/dist/storage/index.mjs +2 -2
- package/dist/testYourself/admin/index.js +1 -1
- package/dist/testYourself/admin/index.mjs +1 -1
- package/dist/testYourself/index.js +2 -2
- package/dist/testYourself/index.mjs +2 -2
- package/dist/testYourself/server/index.js +1 -1
- package/dist/testYourself/server/index.mjs +1 -1
- package/dist/universalExport/index.js +154 -1195
- package/dist/universalExport/index.js.map +1 -1
- package/dist/universalExport/index.mjs +2 -1157
- package/dist/universalExport/index.mjs.map +1 -1
- package/dist/universalExport/server/index.js +5 -3
- package/dist/universalExport/server/index.js.map +1 -1
- package/dist/universalExport/server/index.mjs +4 -2
- package/dist/universalExport/server/index.mjs.map +1 -1
- package/dist/universalFile/index.js +10 -7
- package/dist/universalFile/index.js.map +1 -1
- package/dist/universalFile/index.mjs +6 -2
- package/dist/universalFile/index.mjs.map +1 -1
- package/dist/universalFile/server/index.d.mts +592 -265
- package/dist/universalFile/server/index.d.ts +592 -265
- package/dist/universalFile/server/index.js +298 -5637
- package/dist/universalFile/server/index.js.map +1 -1
- package/dist/universalFile/server/index.mjs +8 -5559
- package/dist/universalFile/server/index.mjs.map +1 -1
- package/dist/utils/index.js +12 -12
- package/dist/utils/index.mjs +3 -3
- package/package.json +36 -1
- package/dist/AliyunOSSProvider-4W47OFEK.mjs +0 -6
- package/dist/AliyunOSSProvider-HCNGDJL7.js +0 -15
- package/dist/ConfigService-V6ZK273Z.mjs +0 -4
- package/dist/LocalStorageProvider-3RVPCQB3.mjs +0 -6
- package/dist/LocalStorageProvider-PP7MA5OT.js +0 -15
- package/dist/PMXParser-RNVQL76A.mjs +0 -4
- package/dist/chunk-25OFOKNF.js +0 -171
- package/dist/chunk-25OFOKNF.js.map +0 -1
- package/dist/chunk-3DXPQ4YV.mjs +0 -165
- package/dist/chunk-3DXPQ4YV.mjs.map +0 -1
- package/dist/chunk-3NHAT7D4.mjs.map +0 -1
- package/dist/chunk-BJTO5JO5.mjs +0 -10
- package/dist/chunk-CIVO4R6N.mjs +0 -37
- package/dist/chunk-CIVO4R6N.mjs.map +0 -1
- package/dist/chunk-DGUM43GV.js +0 -12
- package/dist/chunk-HDMIOOZY.mjs +0 -546
- package/dist/chunk-HDMIOOZY.mjs.map +0 -1
- package/dist/chunk-HJ6MH7J7.js +0 -552
- package/dist/chunk-HJ6MH7J7.js.map +0 -1
- package/dist/chunk-KH6RQ4J5.js +0 -28
- package/dist/chunk-KH6RQ4J5.js.map +0 -1
- package/dist/chunk-Q5EDCKQA.js +0 -336
- package/dist/chunk-Q5EDCKQA.js.map +0 -1
- package/dist/chunk-YOTQG4NP.mjs +0 -314
- package/dist/chunk-YOTQG4NP.mjs.map +0 -1
- package/dist/chunk-ZGVB35L2.mjs +0 -25
- package/dist/chunk-ZGVB35L2.mjs.map +0 -1
- package/dist/chunk-ZRAW3HXA.js +0 -43
- package/dist/chunk-ZRAW3HXA.js.map +0 -1
- package/dist/chunk-ZWQJSZEY.js.map +0 -1
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { Timeline, CollisionBalls } from './chunk-3JW4X3AC.mjs';
|
|
2
|
+
import { cn } from './chunk-4VJQZSPU.mjs';
|
|
3
|
+
import React2, { useState, useEffect } from 'react';
|
|
4
|
+
import { clsx } from 'clsx';
|
|
5
|
+
import Link from 'next/link';
|
|
6
|
+
|
|
7
|
+
var About = ({
|
|
8
|
+
timelineConfig,
|
|
9
|
+
collisionBallsConfig
|
|
10
|
+
}) => {
|
|
11
|
+
return /* @__PURE__ */ React2.createElement("section", { id: "about", className: "py-16 bg-white" }, /* @__PURE__ */ React2.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React2.createElement("h2", { className: "text-3xl font-bold text-center mb-12" }, "\u5173\u4E8E\u6211"), /* @__PURE__ */ React2.createElement("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-12" }, /* @__PURE__ */ React2.createElement("div", { className: "bg-white rounded-lg shadow-lg p-6" }, /* @__PURE__ */ React2.createElement("h3", { className: "text-2xl font-semibold mb-6" }, "\u4E2A\u4EBA\u7ECF\u5386"), /* @__PURE__ */ React2.createElement(Timeline, { items: timelineConfig.items })), /* @__PURE__ */ React2.createElement("div", { className: "bg-white rounded-lg shadow-lg p-6" }, /* @__PURE__ */ React2.createElement("h3", { className: "text-2xl font-semibold mb-6" }, "\u6280\u80FD\u5C55\u793A"), /* @__PURE__ */ React2.createElement("div", { style: { height: "400px", position: "relative" } }, /* @__PURE__ */ React2.createElement(CollisionBalls, { collisionBallsConfig }))))));
|
|
12
|
+
};
|
|
13
|
+
var About_default = About;
|
|
14
|
+
var Contact = () => {
|
|
15
|
+
const [formData, setFormData] = useState({
|
|
16
|
+
name: "",
|
|
17
|
+
email: "",
|
|
18
|
+
message: ""
|
|
19
|
+
});
|
|
20
|
+
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
21
|
+
const [submitStatus, setSubmitStatus] = useState("idle");
|
|
22
|
+
const handleChange = (e) => {
|
|
23
|
+
const { name, value } = e.target;
|
|
24
|
+
setFormData((prev) => ({
|
|
25
|
+
...prev,
|
|
26
|
+
[name]: value
|
|
27
|
+
}));
|
|
28
|
+
};
|
|
29
|
+
const handleSubmit = async (e) => {
|
|
30
|
+
e.preventDefault();
|
|
31
|
+
setIsSubmitting(true);
|
|
32
|
+
setSubmitStatus("idle");
|
|
33
|
+
try {
|
|
34
|
+
await new Promise((resolve) => setTimeout(resolve, 1e3));
|
|
35
|
+
setSubmitStatus("success");
|
|
36
|
+
setFormData({ name: "", email: "", message: "" });
|
|
37
|
+
} catch (error) {
|
|
38
|
+
setSubmitStatus("error");
|
|
39
|
+
} finally {
|
|
40
|
+
setIsSubmitting(false);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
return /* @__PURE__ */ React2.createElement("section", { id: "contact", className: "py-16 bg-gray-50" }, /* @__PURE__ */ React2.createElement("div", { className: "max-w-4xl mx-auto px-4 sm:px-6 lg:px-8" }, /* @__PURE__ */ React2.createElement("div", { className: "text-center mb-12" }, /* @__PURE__ */ React2.createElement("h2", { className: "text-3xl font-bold text-gray-900 sm:text-4xl" }, "\u8054\u7CFB\u6211"), /* @__PURE__ */ React2.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__ */ React2.createElement("div", { className: "bg-white rounded-lg shadow-xl p-6 sm:p-8" }, /* @__PURE__ */ React2.createElement("form", { onSubmit: handleSubmit, className: "space-y-6" }, /* @__PURE__ */ React2.createElement("div", null, /* @__PURE__ */ React2.createElement("label", { htmlFor: "name", className: "block text-sm font-medium text-gray-700" }, "\u59D3\u540D"), /* @__PURE__ */ React2.createElement(
|
|
44
|
+
"input",
|
|
45
|
+
{
|
|
46
|
+
type: "text",
|
|
47
|
+
name: "name",
|
|
48
|
+
id: "name",
|
|
49
|
+
value: formData.name,
|
|
50
|
+
onChange: handleChange,
|
|
51
|
+
required: true,
|
|
52
|
+
className: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm",
|
|
53
|
+
placeholder: "\u8BF7\u8F93\u5165\u60A8\u7684\u59D3\u540D"
|
|
54
|
+
}
|
|
55
|
+
)), /* @__PURE__ */ React2.createElement("div", null, /* @__PURE__ */ React2.createElement("label", { htmlFor: "email", className: "block text-sm font-medium text-gray-700" }, "\u90AE\u7BB1"), /* @__PURE__ */ React2.createElement(
|
|
56
|
+
"input",
|
|
57
|
+
{
|
|
58
|
+
type: "email",
|
|
59
|
+
name: "email",
|
|
60
|
+
id: "email",
|
|
61
|
+
value: formData.email,
|
|
62
|
+
onChange: handleChange,
|
|
63
|
+
required: true,
|
|
64
|
+
className: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm",
|
|
65
|
+
placeholder: "\u8BF7\u8F93\u5165\u60A8\u7684\u90AE\u7BB1"
|
|
66
|
+
}
|
|
67
|
+
)), /* @__PURE__ */ React2.createElement("div", null, /* @__PURE__ */ React2.createElement("label", { htmlFor: "message", className: "block text-sm font-medium text-gray-700" }, "\u6D88\u606F"), /* @__PURE__ */ React2.createElement(
|
|
68
|
+
"textarea",
|
|
69
|
+
{
|
|
70
|
+
name: "message",
|
|
71
|
+
id: "message",
|
|
72
|
+
rows: 4,
|
|
73
|
+
value: formData.message,
|
|
74
|
+
onChange: handleChange,
|
|
75
|
+
required: true,
|
|
76
|
+
className: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm",
|
|
77
|
+
placeholder: "\u8BF7\u8F93\u5165\u60A8\u7684\u6D88\u606F"
|
|
78
|
+
}
|
|
79
|
+
)), /* @__PURE__ */ React2.createElement("div", { className: "flex items-center justify-end" }, /* @__PURE__ */ React2.createElement(
|
|
80
|
+
"button",
|
|
81
|
+
{
|
|
82
|
+
type: "submit",
|
|
83
|
+
disabled: isSubmitting,
|
|
84
|
+
className: clsx("inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white", 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")
|
|
85
|
+
},
|
|
86
|
+
isSubmitting ? "\u53D1\u9001\u4E2D..." : "\u53D1\u9001\u6D88\u606F"
|
|
87
|
+
)), submitStatus === "success" && /* @__PURE__ */ React2.createElement("div", { className: "rounded-md bg-green-50 p-4" }, /* @__PURE__ */ React2.createElement("div", { className: "flex" }, /* @__PURE__ */ React2.createElement("div", { className: "flex-shrink-0" }, /* @__PURE__ */ React2.createElement("svg", { className: "h-5 w-5 text-green-400", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ React2.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__ */ React2.createElement("div", { className: "ml-3" }, /* @__PURE__ */ React2.createElement("p", { className: "text-sm font-medium text-green-800" }, "\u6D88\u606F\u5DF2\u6210\u529F\u53D1\u9001\uFF01")))), submitStatus === "error" && /* @__PURE__ */ React2.createElement("div", { className: "rounded-md bg-red-50 p-4" }, /* @__PURE__ */ React2.createElement("div", { className: "flex" }, /* @__PURE__ */ React2.createElement("div", { className: "flex-shrink-0" }, /* @__PURE__ */ React2.createElement("svg", { className: "h-5 w-5 text-red-400", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ React2.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__ */ React2.createElement("div", { className: "ml-3" }, /* @__PURE__ */ React2.createElement("p", { className: "text-sm font-medium text-red-800" }, "\u53D1\u9001\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5")))))), /* @__PURE__ */ React2.createElement("div", { className: "mt-12 grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3" }, /* @__PURE__ */ React2.createElement("div", { className: "bg-white rounded-lg shadow-lg p-6 text-center" }, /* @__PURE__ */ React2.createElement("div", { className: "text-blue-600 mb-4" }, /* @__PURE__ */ React2.createElement("svg", { className: "h-8 w-8 mx-auto", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React2.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__ */ React2.createElement("h3", { className: "text-lg font-medium text-gray-900" }, "\u90AE\u7BB1"), /* @__PURE__ */ React2.createElement("p", { className: "mt-2 text-gray-600" }, "your.email@example.com")), /* @__PURE__ */ React2.createElement("div", { className: "bg-white rounded-lg shadow-lg p-6 text-center" }, /* @__PURE__ */ React2.createElement("div", { className: "text-blue-600 mb-4" }, /* @__PURE__ */ React2.createElement("svg", { className: "h-8 w-8 mx-auto", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React2.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__ */ React2.createElement("h3", { className: "text-lg font-medium text-gray-900" }, "\u7535\u8BDD"), /* @__PURE__ */ React2.createElement("p", { className: "mt-2 text-gray-600" }, "+86 123 4567 8900")), /* @__PURE__ */ React2.createElement("div", { className: "bg-white rounded-lg shadow-lg p-6 text-center" }, /* @__PURE__ */ React2.createElement("div", { className: "text-blue-600 mb-4" }, /* @__PURE__ */ React2.createElement("svg", { className: "h-8 w-8 mx-auto", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React2.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__ */ React2.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M15 11a3 3 0 11-6 0 3 3 0 016 0z" }))), /* @__PURE__ */ React2.createElement("h3", { className: "text-lg font-medium text-gray-900" }, "\u5730\u5740"), /* @__PURE__ */ React2.createElement("p", { className: "mt-2 text-gray-600" }, "\u4E2D\u56FD\uFF0C\u5317\u4EAC")))));
|
|
88
|
+
};
|
|
89
|
+
var Contact_default = Contact;
|
|
90
|
+
var Home = ({ homeConfig, className }) => {
|
|
91
|
+
const { title, subtitle, buttons, imageSrc } = homeConfig;
|
|
92
|
+
const [displayText, setDisplayText] = useState("");
|
|
93
|
+
const [currentIndex, setCurrentIndex] = useState(0);
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
if (currentIndex < title.length) {
|
|
96
|
+
const timer = setTimeout(() => {
|
|
97
|
+
setDisplayText((prev) => prev + title[currentIndex]);
|
|
98
|
+
setCurrentIndex((prev) => prev + 1);
|
|
99
|
+
}, 150);
|
|
100
|
+
return () => clearTimeout(timer);
|
|
101
|
+
}
|
|
102
|
+
return () => {
|
|
103
|
+
setDisplayText("");
|
|
104
|
+
setCurrentIndex(0);
|
|
105
|
+
};
|
|
106
|
+
}, [currentIndex, title]);
|
|
107
|
+
return /* @__PURE__ */ React2.createElement(
|
|
108
|
+
"section",
|
|
109
|
+
{
|
|
110
|
+
id: "home",
|
|
111
|
+
className: cn("min-h-screen flex items-center justify-center py-16 bg-gradient-to-b from-white to-gray-50", className)
|
|
112
|
+
},
|
|
113
|
+
/* @__PURE__ */ React2.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React2.createElement("div", { className: "flex flex-col md:flex-row items-center gap-12" }, /* @__PURE__ */ React2.createElement("div", { className: "flex-1 text-center md:text-left" }, /* @__PURE__ */ React2.createElement("h1", { className: "text-4xl md:text-6xl font-bold mb-6 text-gray-900" }, /* @__PURE__ */ React2.createElement("span", { className: "inline-block" }, displayText), /* @__PURE__ */ React2.createElement("span", { className: "animate-pulse ml-1 text-blue-500" }, "|")), /* @__PURE__ */ React2.createElement("p", { className: "text-xl md:text-2xl text-gray-600 mb-8" }, subtitle), /* @__PURE__ */ React2.createElement("div", { className: "flex flex-wrap gap-4 justify-center md:justify-start" }, buttons.map((button) => /* @__PURE__ */ React2.createElement(
|
|
114
|
+
"a",
|
|
115
|
+
{
|
|
116
|
+
key: button.link,
|
|
117
|
+
href: button.link,
|
|
118
|
+
className: "px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-all duration-300 shadow-md hover:shadow-lg font-medium"
|
|
119
|
+
},
|
|
120
|
+
button.text
|
|
121
|
+
)))), /* @__PURE__ */ React2.createElement("div", { className: "flex-1" }, /* @__PURE__ */ React2.createElement("div", { className: "relative group" }, /* @__PURE__ */ React2.createElement("div", { className: "absolute -inset-1 bg-gradient-to-r from-blue-600 to-purple-600 rounded-lg blur opacity-25 group-hover:opacity-50 transition duration-1000 group-hover:duration-200" }), /* @__PURE__ */ React2.createElement(
|
|
122
|
+
"img",
|
|
123
|
+
{
|
|
124
|
+
src: imageSrc,
|
|
125
|
+
alt: "Profile",
|
|
126
|
+
className: "relative w-full max-w-md mx-auto rounded-lg shadow-xl transform hover:scale-[1.02] transition-transform duration-300 bg-white"
|
|
127
|
+
}
|
|
128
|
+
)))))
|
|
129
|
+
);
|
|
130
|
+
};
|
|
131
|
+
var Home_default = Home;
|
|
132
|
+
var ExperimentCard = ({
|
|
133
|
+
href,
|
|
134
|
+
title,
|
|
135
|
+
description,
|
|
136
|
+
tags,
|
|
137
|
+
category,
|
|
138
|
+
isCompleted,
|
|
139
|
+
updatedAt,
|
|
140
|
+
createdAt,
|
|
141
|
+
className
|
|
142
|
+
}) => {
|
|
143
|
+
const formatDate = (dateString) => {
|
|
144
|
+
if (!dateString) return "";
|
|
145
|
+
try {
|
|
146
|
+
const date = new Date(dateString);
|
|
147
|
+
return date.toLocaleDateString("zh-CN", {
|
|
148
|
+
year: "numeric",
|
|
149
|
+
month: "2-digit",
|
|
150
|
+
day: "2-digit"
|
|
151
|
+
});
|
|
152
|
+
} catch (e) {
|
|
153
|
+
return dateString;
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
return /* @__PURE__ */ React2.createElement(Link, { href, className: cn("block group", className) }, /* @__PURE__ */ React2.createElement("div", { className: "w-full h-full bg-white rounded-2xl overflow-hidden shadow-md hover:shadow-2xl transition-all duration-300 transform group-hover:-translate-y-1 border border-gray-100 hover:border-gray-200" }, /* @__PURE__ */ React2.createElement("div", { className: "p-6" }, /* @__PURE__ */ React2.createElement("div", { className: "flex items-start justify-between mb-4" }, /* @__PURE__ */ React2.createElement("h3", { className: "text-xl font-semibold text-gray-900 flex-1 pr-4 leading-tight" }, title), /* @__PURE__ */ React2.createElement("div", { className: "flex flex-col gap-2 flex-shrink-0" }, /* @__PURE__ */ React2.createElement("span", { className: cn(
|
|
157
|
+
"px-3 py-1.5 text-xs font-medium rounded-full shadow-sm",
|
|
158
|
+
category === "utility" ? "bg-gradient-to-r from-green-50 to-green-100 text-green-700 border border-green-200" : "bg-gradient-to-r from-purple-50 to-purple-100 text-purple-700 border border-purple-200"
|
|
159
|
+
) }, category === "utility" ? "\u{1F527} \u5B9E\u7528\u5DE5\u5177" : "\u{1F3AE} \u4F11\u95F2\u5A31\u4E50"), /* @__PURE__ */ React2.createElement("span", { className: cn(
|
|
160
|
+
"px-3 py-1.5 text-xs font-medium rounded-full shadow-sm border",
|
|
161
|
+
isCompleted ? "bg-gradient-to-r from-emerald-50 to-emerald-100 text-emerald-700 border border-emerald-200" : "bg-gradient-to-r from-orange-50 to-orange-100 text-orange-700 border border-orange-200"
|
|
162
|
+
) }, isCompleted ? "\u2705 \u5DF2\u5B8C\u6210" : "\u{1F6A7} \u8FDB\u884C\u4E2D"))), /* @__PURE__ */ React2.createElement("p", { className: "text-gray-600 mb-4" }, description), updatedAt && /* @__PURE__ */ React2.createElement("div", { className: "flex items-center gap-1 mb-3 text-xs text-gray-500" }, /* @__PURE__ */ React2.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ React2.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" })), /* @__PURE__ */ React2.createElement("span", null, "\u66F4\u65B0\u4E8E: ", formatDate(updatedAt)), createdAt && createdAt !== updatedAt && /* @__PURE__ */ React2.createElement("span", { className: "ml-2 text-gray-400" }, "\u521B\u5EFA\u4E8E: ", formatDate(createdAt))), /* @__PURE__ */ React2.createElement("div", { className: "flex flex-wrap gap-2" }, tags.map((tag) => /* @__PURE__ */ React2.createElement(
|
|
163
|
+
"span",
|
|
164
|
+
{
|
|
165
|
+
key: tag,
|
|
166
|
+
className: "px-3 py-1.5 text-xs font-medium bg-gradient-to-r from-gray-50 to-gray-100 text-gray-700 rounded-full border border-gray-200 shadow-sm hover:shadow-md transition-shadow duration-200"
|
|
167
|
+
},
|
|
168
|
+
"#",
|
|
169
|
+
tag
|
|
170
|
+
))))));
|
|
171
|
+
};
|
|
172
|
+
var ProjectCarousel = ({ projects, className }) => {
|
|
173
|
+
const [currentIndex, setCurrentIndex] = useState(0);
|
|
174
|
+
const nextSlide = () => {
|
|
175
|
+
setCurrentIndex(
|
|
176
|
+
(prevIndex) => prevIndex === projects.length - 1 ? 0 : prevIndex + 1
|
|
177
|
+
);
|
|
178
|
+
};
|
|
179
|
+
const prevSlide = () => {
|
|
180
|
+
setCurrentIndex(
|
|
181
|
+
(prevIndex) => prevIndex === 0 ? projects.length - 1 : prevIndex - 1
|
|
182
|
+
);
|
|
183
|
+
};
|
|
184
|
+
return /* @__PURE__ */ React2.createElement("section", { id: "projects", className: cn("py-16 bg-gray-50", className) }, /* @__PURE__ */ React2.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React2.createElement("h2", { className: "text-3xl font-bold text-center mb-12 text-gray-900" }, "\u9879\u76EE\u5C55\u793A"), /* @__PURE__ */ React2.createElement("div", { className: "relative max-w-4xl mx-auto" }, /* @__PURE__ */ React2.createElement("div", { className: "relative h-[400px] overflow-hidden rounded-lg shadow-xl" }, projects.map((project, index) => /* @__PURE__ */ React2.createElement(
|
|
185
|
+
"div",
|
|
186
|
+
{
|
|
187
|
+
key: project.id,
|
|
188
|
+
className: cn(
|
|
189
|
+
"absolute w-full h-full transition-all duration-500 transform",
|
|
190
|
+
index === currentIndex ? "translate-x-0 opacity-100" : index < currentIndex ? "-translate-x-full opacity-0" : "translate-x-full opacity-0"
|
|
191
|
+
)
|
|
192
|
+
},
|
|
193
|
+
/* @__PURE__ */ React2.createElement(
|
|
194
|
+
ExperimentCard,
|
|
195
|
+
{
|
|
196
|
+
href: project.link || "#",
|
|
197
|
+
title: project.title,
|
|
198
|
+
description: project.description,
|
|
199
|
+
tags: project.tags,
|
|
200
|
+
category: "utility"
|
|
201
|
+
}
|
|
202
|
+
)
|
|
203
|
+
))), /* @__PURE__ */ React2.createElement(
|
|
204
|
+
"button",
|
|
205
|
+
{
|
|
206
|
+
onClick: prevSlide,
|
|
207
|
+
className: "absolute left-4 top-1/2 -translate-y-1/2 p-2 rounded-full bg-white/80 hover:bg-white shadow-lg focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all z-[10]"
|
|
208
|
+
},
|
|
209
|
+
/* @__PURE__ */ React2.createElement(
|
|
210
|
+
"svg",
|
|
211
|
+
{
|
|
212
|
+
className: "w-6 h-6 text-gray-600",
|
|
213
|
+
fill: "none",
|
|
214
|
+
stroke: "currentColor",
|
|
215
|
+
viewBox: "0 0 24 24"
|
|
216
|
+
},
|
|
217
|
+
/* @__PURE__ */ React2.createElement(
|
|
218
|
+
"path",
|
|
219
|
+
{
|
|
220
|
+
strokeLinecap: "round",
|
|
221
|
+
strokeLinejoin: "round",
|
|
222
|
+
strokeWidth: 2,
|
|
223
|
+
d: "M15 19l-7-7 7-7"
|
|
224
|
+
}
|
|
225
|
+
)
|
|
226
|
+
)
|
|
227
|
+
), /* @__PURE__ */ React2.createElement(
|
|
228
|
+
"button",
|
|
229
|
+
{
|
|
230
|
+
onClick: nextSlide,
|
|
231
|
+
className: "absolute right-4 top-1/2 -translate-y-1/2 p-2 rounded-full bg-white/80 hover:bg-white shadow-lg focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all z-[10]"
|
|
232
|
+
},
|
|
233
|
+
/* @__PURE__ */ React2.createElement(
|
|
234
|
+
"svg",
|
|
235
|
+
{
|
|
236
|
+
className: "w-6 h-6 text-gray-600",
|
|
237
|
+
fill: "none",
|
|
238
|
+
stroke: "currentColor",
|
|
239
|
+
viewBox: "0 0 24 24"
|
|
240
|
+
},
|
|
241
|
+
/* @__PURE__ */ React2.createElement(
|
|
242
|
+
"path",
|
|
243
|
+
{
|
|
244
|
+
strokeLinecap: "round",
|
|
245
|
+
strokeLinejoin: "round",
|
|
246
|
+
strokeWidth: 2,
|
|
247
|
+
d: "M9 5l7 7-7 7"
|
|
248
|
+
}
|
|
249
|
+
)
|
|
250
|
+
)
|
|
251
|
+
), /* @__PURE__ */ React2.createElement("div", { className: "absolute bottom-4 left-1/2 transform -translate-x-1/2 flex space-x-2 z-[10]" }, projects.map((_, index) => /* @__PURE__ */ React2.createElement(
|
|
252
|
+
"button",
|
|
253
|
+
{
|
|
254
|
+
key: index,
|
|
255
|
+
onClick: () => setCurrentIndex(index),
|
|
256
|
+
className: cn(
|
|
257
|
+
"w-2 h-2 rounded-full transition-all duration-300",
|
|
258
|
+
index === currentIndex ? "bg-blue-500 w-4" : "bg-gray-300"
|
|
259
|
+
)
|
|
260
|
+
}
|
|
261
|
+
))))));
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
export { About_default, Contact_default, ExperimentCard, Home_default, ProjectCarousel };
|
|
265
|
+
//# sourceMappingURL=chunk-OBIPI4GU.mjs.map
|
|
266
|
+
//# sourceMappingURL=chunk-OBIPI4GU.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/portfolio/About.tsx","../src/portfolio/Contact.tsx","../src/portfolio/Home.tsx","../src/portfolio/ExperimentCard.tsx","../src/portfolio/ProjectCarousel.tsx"],"names":["React","useState"],"mappings":";;;;;;AAYA,IAAM,QAA8B,CAAC;AAAA,EACnC,cAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,uBACEA,MAAA,CAAA,aAAA,CAAC,SAAA,EAAA,EAAQ,EAAA,EAAG,OAAA,EAAQ,SAAA,EAAU,gBAAA,EAAA,kBAC5BA,MAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAA,kBACbA,MAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,sCAAA,EAAA,EAAuC,oBAAG,CAAA,kBACxDA,MAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EAAA,kBACbA,MAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EAAA,kBACbA,MAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6BAAA,EAAA,EAA8B,0BAAI,CAAA,kBAChDA,MAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAO,cAAA,CAAe,KAAA,EAAO,CACzC,CAAA,kBACAA,MAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EAAA,kBACbA,MAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6BAAA,EAAA,EAA8B,0BAAI,CAAA,kBAChDA,MAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,UAAA,EAAW,EAAA,kBAClDA,MAAA,CAAA,aAAA,CAAC,cAAA,EAAA,EAAe,oBAAA,EAA4C,CAC9D,CACF,CACF,CACF,CACF,CAAA;AAEJ,CAAA;AAEA,IAAO,aAAA,GAAQ;AC1Bf,IAAM,UAAoB,MAAM;AAC9B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,CAAmB;AAAA,IACjD,IAAA,EAAM,EAAA;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACV,CAAA;AACD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAuC,MAAM,CAAA;AAErF,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAiE;AACrF,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,CAAA,CAAE,MAAA;AAC1B,IAAA,WAAA,CAAY,CAAA,IAAA,MAAS;AAAA,MACnB,GAAG,IAAA;AAAA,MACH,CAAC,IAAI,GAAG;AAAA,KACV,CAAE,CAAA;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,OAAO,CAAA,KAAuB;AACjD,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,eAAA,CAAgB,MAAM,CAAA;AAEtB,IAAA,IAAI;AAEF,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,GAAI,CAAC,CAAA;AACtD,MAAA,eAAA,CAAgB,SAAS,CAAA;AACzB,MAAA,WAAA,CAAY,EAAE,IAAA,EAAM,EAAA,EAAI,OAAO,EAAA,EAAI,OAAA,EAAS,IAAI,CAAA;AAAA,IAClD,SAAS,KAAA,EAAO;AACd,MAAA,eAAA,CAAgB,OAAO,CAAA;AAAA,IACzB,CAAA,SAAE;AACA,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACvB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEA,MAAAA,CAAA,aAAA,CAAC,SAAA,EAAA,EAAQ,EAAA,EAAG,SAAA,EAAU,SAAA,EAAU,kBAAA,EAAA,kBAC9BA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAA,kBACbA,OAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,8CAAA,EAAA,EAA+C,oBAE7D,CAAA,kBACAA,MAAAA,CAAA,cAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAAA,EAAA,EAA6B,4FAE1C,CACF,CAAA,kBAEAA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,UAAU,YAAA,EAAc,SAAA,EAAU,WAAA,EAAA,kBACtCA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,IAAA,kBACCA,OAAA,aAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAQ,MAAA,EAAO,SAAA,EAAU,yCAAA,EAAA,EAA0C,cAE1E,CAAA,kBACAA,MAAAA,CAAA,aAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,MAAA;AAAA,MACL,IAAA,EAAK,MAAA;AAAA,MACL,EAAA,EAAG,MAAA;AAAA,MACH,OAAO,QAAA,CAAS,IAAA;AAAA,MAChB,QAAA,EAAU,YAAA;AAAA,MACV,QAAA,EAAQ,IAAA;AAAA,MACR,SAAA,EAAU,6GAAA;AAAA,MACV,WAAA,EAAY;AAAA;AAAA,GAEhB,CAAA,kBAEAA,MAAAA,CAAA,aAAA,CAAC,6BACCA,MAAAA,CAAA,aAAA,CAAC,OAAA,EAAA,EAAM,SAAQ,OAAA,EAAQ,SAAA,EAAU,6CAA0C,cAE3E,CAAA,kBACAA,MAAAA,CAAA,aAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,OAAA;AAAA,MACL,IAAA,EAAK,OAAA;AAAA,MACL,EAAA,EAAG,OAAA;AAAA,MACH,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,QAAA,EAAU,YAAA;AAAA,MACV,QAAA,EAAQ,IAAA;AAAA,MACR,SAAA,EAAU,6GAAA;AAAA,MACV,WAAA,EAAY;AAAA;AAAA,GAEhB,CAAA,kBAEAA,MAAAA,CAAA,aAAA,CAAC,6BACCA,MAAAA,CAAA,aAAA,CAAC,OAAA,EAAA,EAAM,SAAQ,SAAA,EAAU,SAAA,EAAU,6CAA0C,cAE7E,CAAA,kBACAA,MAAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,SAAA;AAAA,MACL,EAAA,EAAG,SAAA;AAAA,MACH,IAAA,EAAM,CAAA;AAAA,MACN,OAAO,QAAA,CAAS,OAAA;AAAA,MAChB,QAAA,EAAU,YAAA;AAAA,MACV,QAAA,EAAQ,IAAA;AAAA,MACR,SAAA,EAAU,6GAAA;AAAA,MACV,WAAA,EAAY;AAAA;AAAA,GAEhB,mBAEAA,MAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,QAAA,EAAU,YAAA;AAAA,MACV,SAAA,EAAW,IAAA,CAAK,oHAAA,EAAsH,YAAA,GAChI,mCACA,uGAAuG;AAAA,KAAA;AAAA,IAE5G,eAAe,uBAAA,GAAW;AAAA,GAE/B,CAAA,EAEC,YAAA,KAAiB,SAAA,oBAChBA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDACbA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,eAAA,EAAA,kBACbA,MAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAyB,OAAA,EAAQ,aAAY,IAAA,EAAK,cAAA,EAAA,kBAC/DA,MAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,QAAA,EAAS,SAAA,EAAU,CAAA,EAAE,yIAAwI,QAAA,EAAS,SAAA,EAAU,CACxL,CACF,mBACAA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,OAAE,SAAA,EAAU,oCAAA,EAAA,EAAqC,kDAElD,CACF,CACF,CACF,CAAA,EAGD,YAAA,KAAiB,OAAA,oBAChBA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CACbA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAA,kBACbA,OAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,SAAQ,WAAA,EAAY,IAAA,EAAK,cAAA,EAAA,kBAC7DA,OAAA,aAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAS,SAAA,EAAU,GAAE,yNAAA,EAA0N,QAAA,EAAS,SAAA,EAAU,CAC1Q,CACF,CAAA,kBACAA,MAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,MAAA,EAAA,kBACbA,MAAAA,CAAA,cAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kCAAA,EAAA,EAAmC,8DAEhD,CACF,CACF,CACF,CAEJ,CACF,mBAGAA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4DAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,+CAAA,EAAA,kBACbA,MAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAA,kBACbA,OAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAkB,MAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,OAAA,EAAQ,+BACzEA,MAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,aAAY,GAAA,EAAI,CAAA,EAAE,sGAAA,EAAuG,CAC9K,CACF,CAAA,kBACAA,MAAAA,CAAA,aAAA,CAAC,QAAG,SAAA,EAAU,mCAAA,EAAA,EAAoC,cAAE,CAAA,kBACpDA,MAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wBAAqB,wBAAsB,CAC1D,CAAA,kBAEAA,OAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCACbA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iBAAA,EAAkB,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,gBAAe,OAAA,EAAQ,WAAA,EAAA,kBACzEA,MAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,WAAA,EAAY,GAAA,EAAI,CAAA,EAAE,uNAAA,EAAwN,CAC/R,CACF,CAAA,kBACAA,MAAAA,CAAA,cAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mCAAA,EAAA,EAAoC,cAAE,mBACpDA,MAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oBAAA,EAAA,EAAqB,mBAAiB,CACrD,mBAEAA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+CAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,oBAAA,EAAA,kBACbA,MAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAkB,IAAA,EAAK,QAAO,MAAA,EAAO,cAAA,EAAe,OAAA,EAAQ,WAAA,EAAA,kBACzEA,MAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,WAAA,EAAY,GAAA,EAAI,GAAE,oFAAA,EAAqF,CAAA,kBAC1JA,MAAAA,CAAA,cAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,WAAA,EAAY,GAAA,EAAI,CAAA,EAAE,kCAAA,EAAmC,CAC1G,CACF,CAAA,kBACAA,MAAAA,CAAA,cAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mCAAA,EAAA,EAAoC,cAAE,mBACpDA,MAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,WAAU,oBAAA,EAAA,EAAqB,gCAAK,CACzC,CACF,CACF,CACF,CAAA;AAEJ,CAAA;AAEA,IAAO,eAAA,GAAQ;AC7KR,IAAM,IAAA,GAA4B,CAAC,EAAE,UAAA,EAAY,WAAU,KAAM;AACtE,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,UAAS,GAAI,UAAA;AAC/C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIC,SAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,CAAC,CAAA;AAElD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,YAAA,GAAe,MAAM,MAAA,EAAQ;AAC/B,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,cAAA,CAAe,CAAC,IAAA,KAAS,IAAA,GAAO,KAAA,CAAM,YAAY,CAAC,CAAA;AACnD,QAAA,eAAA,CAAgB,CAAC,IAAA,KAAS,IAAA,GAAO,CAAC,CAAA;AAAA,MACpC,GAAG,GAAG,CAAA;AAEN,MAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,IACjC;AACA,IAAA,OAAO,MAAM;AACX,MAAA,cAAA,CAAe,EAAE,CAAA;AACjB,MAAA,eAAA,CAAgB,CAAC,CAAA;AAAA,IACnB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,KAAK,CAAC,CAAA;AAExB,EAAA,uBACED,MAAAA,CAAA,aAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAG,MAAA;AAAA,MACH,SAAA,EAAW,EAAA,CAAG,4FAAA,EAA8F,SAAS;AAAA,KAAA;AAAA,oBAErHA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mDAAA,EAAA,kBACZA,MAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAA,EAAgB,WAAY,CAAA,kBAC5CA,MAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAA,EAAmC,GAAC,CACtD,CAAA,kBACAA,MAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCAAA,EAAA,EAA0C,QAAS,CAAA,kBAChEA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EAAA,EACZ,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,MAAAA,CAAA,aAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,KAAK,MAAA,CAAO,IAAA;AAAA,QACZ,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,SAAA,EAAU;AAAA,OAAA;AAAA,MAET,MAAA,CAAO;AAAA,KAEX,CACH,CACF,CAAA,kBACAA,OAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAA,kBACbA,MAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,oKAAA,EAAqK,CAAA,kBACpLA,MAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,QAAA;AAAA,QACL,GAAA,EAAI,SAAA;AAAA,QACJ,SAAA,EAAU;AAAA;AAAA,KAEd,CACF,CACF,CACF;AAAA,GACF;AAEJ,CAAA;AAEA,IAAO,YAAA,GAAQ;AC/DR,IAAM,iBAAgD,CAAC;AAAA,EAC5D,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,KAAM;AAEJ,EAAA,MAAM,UAAA,GAAa,CAAC,UAAA,KAAwB;AAC1C,IAAA,IAAI,CAAC,YAAY,OAAO,EAAA;AAExB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,UAAU,CAAA;AAChC,MAAA,OAAO,IAAA,CAAK,mBAAmB,OAAA,EAAS;AAAA,QACtC,IAAA,EAAM,SAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,GAAA,EAAK;AAAA,OACN,CAAA;AAAA,IACH,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,UAAA;AAAA,IACT;AAAA,EACF,CAAA;AAEA,EAAA,uBACEA,OAAA,aAAA,CAAC,IAAA,EAAA,EAAK,MAAY,SAAA,EAAW,EAAA,CAAG,eAAe,SAAS,CAAA,EAAA,kBACtDA,MAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,6LAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EAAA,kBACbA,OAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uCAAA,EAAA,kBACbA,OAAA,aAAA,CAAC,IAAA,EAAA,EAAG,WAAU,+DAAA,EAAA,EACX,KACH,mBACAA,MAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDACbA,MAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA;AAAA,IACf,wDAAA;AAAA,IACA,QAAA,KAAa,YACT,oFAAA,GACA;AAAA,GACN,EAAA,EACG,QAAA,KAAa,SAAA,GAAY,oCAAA,GAAY,oCACxC,mBACAA,MAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA;AAAA,IACf,+DAAA;AAAA,IACA,cACI,4FAAA,GACA;AAAA,OAEH,WAAA,GAAc,2BAAA,GAAU,8BAC3B,CACF,CACF,mBACAA,MAAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,WAAU,oBAAA,EAAA,EAAsB,WAAY,GAG9C,SAAA,oBACCA,OAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EAAA,kBACbA,MAAAA,CAAA,aAAA,CAAC,SAAI,KAAA,EAAM,4BAAA,EAA6B,WAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAA,kBACjGA,MAAAA,CAAA,aAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,aAAa,CAAA,EAAG,CAAA,EAAE,+CAA8C,CACrH,CAAA,kBACAA,MAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAK,sBAAA,EAAM,WAAW,SAAS,CAAE,GACjC,SAAA,IAAa,SAAA,KAAc,6BAC1BA,MAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oBAAA,EAAA,EAAqB,sBAAA,EAAM,WAAW,SAAS,CAAE,CAErE,CAAA,kBAGFA,OAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sBAAA,EAAA,EACZ,IAAA,CAAK,IAAI,CAAC,GAAA,qBACTA,MAAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,GAAA;AAAA,MACL,SAAA,EAAU;AAAA,KAAA;AAAA,IACX,GAAA;AAAA,IACG;AAAA,GAEL,CACH,CACF,CACF,CACF,CAAA;AAEJ;AC5EO,IAAM,eAAA,GAAkD,CAAC,EAAE,QAAA,EAAU,WAAU,KAAM;AAC1F,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIC,SAAS,CAAC,CAAA;AAElD,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,eAAA;AAAA,MAAgB,CAAC,SAAA,KACf,SAAA,KAAc,SAAS,MAAA,GAAS,CAAA,GAAI,IAAI,SAAA,GAAY;AAAA,KACtD;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,eAAA;AAAA,MAAgB,CAAC,SAAA,KACf,SAAA,KAAc,IAAI,QAAA,CAAS,MAAA,GAAS,IAAI,SAAA,GAAY;AAAA,KACtD;AAAA,EACF,CAAA;AAEA,EAAA,uBACED,MAAAA,CAAA,aAAA,CAAC,aAAQ,EAAA,EAAG,UAAA,EAAW,WAAW,EAAA,CAAG,kBAAA,EAAoB,SAAS,CAAA,EAAA,kBAChEA,OAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wBAAA,EAAA,kBACbA,OAAA,aAAA,CAAC,IAAA,EAAA,EAAG,WAAU,oDAAA,EAAA,EAAqD,0BAAI,mBAEvEA,MAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAEbA,MAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DACZ,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,EAAS,KAAA,qBACtBA,MAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAK,OAAA,CAAQ,EAAA;AAAA,MACb,SAAA,EAAW,EAAA;AAAA,QACT,8DAAA;AAAA,QACA,KAAA,KAAU,YAAA,GACN,2BAAA,GACA,KAAA,GAAQ,eACR,6BAAA,GACA;AAAA;AACN,KAAA;AAAA,oBAEAA,MAAAA,CAAA,aAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,QAAQ,IAAA,IAAQ,GAAA;AAAA,QACtB,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,QAAA,EAAS;AAAA;AAAA;AACX,GAEH,CACH,CAAA,kBAGAA,MAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,SAAA;AAAA,MACT,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEVA,MAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,uBAAA;AAAA,QACV,IAAA,EAAK,MAAA;AAAA,QACL,MAAA,EAAO,cAAA;AAAA,QACP,OAAA,EAAQ;AAAA,OAAA;AAAA,sBAERA,MAAAA,CAAA,aAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UACf,WAAA,EAAa,CAAA;AAAA,UACb,CAAA,EAAE;AAAA;AAAA;AACJ;AACF,GACF,kBAEAA,MAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,SAAA;AAAA,MACT,SAAA,EAAU;AAAA,KAAA;AAAA,oBAEVA,MAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,uBAAA;AAAA,QACV,IAAA,EAAK,MAAA;AAAA,QACL,MAAA,EAAO,cAAA;AAAA,QACP,OAAA,EAAQ;AAAA,OAAA;AAAA,sBAERA,MAAAA,CAAA,aAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UACf,WAAA,EAAa,CAAA;AAAA,UACb,CAAA,EAAE;AAAA;AAAA;AACJ;AACF,GACF,kBAGAA,MAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6EAAA,EAAA,EACZ,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG,KAAA,qBAChBA,MAAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,KAAA;AAAA,MACL,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK,CAAA;AAAA,MACpC,SAAA,EAAW,EAAA;AAAA,QACT,kDAAA;AAAA,QACA,KAAA,KAAU,eAAe,iBAAA,GAAoB;AAAA;AAC/C;AAAA,GAEH,CACH,CACF,CACF,CACF,CAAA;AAEJ","file":"chunk-OBIPI4GU.mjs","sourcesContent":["'use client';\n\nimport React from \"react\";\n\nimport { CollisionBalls, Timeline } from \"@/components\";\nimport type { TimelineConfig, CollisionBallsConfig } from \"@/components\";\n\ninterface AboutProps {\n timelineConfig: TimelineConfig;\n collisionBallsConfig: CollisionBallsConfig;\n}\n\nconst About: React.FC<AboutProps> = ({\n timelineConfig,\n collisionBallsConfig,\n}) => {\n return (\n <section id=\"about\" className=\"py-16 bg-white\">\n <div className=\"container mx-auto px-4\">\n <h2 className=\"text-3xl font-bold text-center mb-12\">关于我</h2>\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-12\">\n <div className=\"bg-white rounded-lg shadow-lg p-6\">\n <h3 className=\"text-2xl font-semibold mb-6\">个人经历</h3>\n <Timeline items={timelineConfig.items} />\n </div>\n <div className=\"bg-white rounded-lg shadow-lg p-6\">\n <h3 className=\"text-2xl font-semibold mb-6\">技能展示</h3>\n <div style={{ height: '400px', position: 'relative' }}>\n <CollisionBalls collisionBallsConfig={collisionBallsConfig} />\n </div>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default About;\n","'use client';\n\nimport React, { useState } from 'react';\nimport { clsx } from 'clsx';\n\ninterface FormData {\n name: string;\n email: string;\n message: string;\n}\n\nconst Contact: React.FC = () => {\n const [formData, setFormData] = useState<FormData>({\n name: '',\n email: '',\n message: ''\n });\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitStatus, setSubmitStatus] = useState<'idle' | 'success' | 'error'>('idle');\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const { name, value } = e.target;\n setFormData(prev => ({\n ...prev,\n [name]: value\n }));\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setIsSubmitting(true);\n setSubmitStatus('idle');\n\n try {\n // 这里添加你的表单提交逻辑\n await new Promise(resolve => setTimeout(resolve, 1000)); // 模拟API调用\n setSubmitStatus('success');\n setFormData({ name: '', email: '', message: '' });\n } catch (error) {\n setSubmitStatus('error');\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <section id=\"contact\" className=\"py-16 bg-gray-50\">\n <div className=\"max-w-4xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"text-center mb-12\">\n <h2 className=\"text-3xl font-bold text-gray-900 sm:text-4xl\">\n 联系我\n </h2>\n <p className=\"mt-4 text-lg text-gray-600\">\n 有任何问题或建议?请随时联系我\n </p>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-xl p-6 sm:p-8\">\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n <div>\n <label htmlFor=\"name\" className=\"block text-sm font-medium text-gray-700\">\n 姓名\n </label>\n <input\n type=\"text\"\n name=\"name\"\n id=\"name\"\n value={formData.name}\n onChange={handleChange}\n required\n className=\"mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm\"\n placeholder=\"请输入您的姓名\"\n />\n </div>\n\n <div>\n <label htmlFor=\"email\" className=\"block text-sm font-medium text-gray-700\">\n 邮箱\n </label>\n <input\n type=\"email\"\n name=\"email\"\n id=\"email\"\n value={formData.email}\n onChange={handleChange}\n required\n className=\"mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm\"\n placeholder=\"请输入您的邮箱\"\n />\n </div>\n\n <div>\n <label htmlFor=\"message\" className=\"block text-sm font-medium text-gray-700\">\n 消息\n </label>\n <textarea\n name=\"message\"\n id=\"message\"\n rows={4}\n value={formData.message}\n onChange={handleChange}\n required\n className=\"mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm\"\n placeholder=\"请输入您的消息\"\n />\n </div>\n\n <div className=\"flex items-center justify-end\">\n <button\n type=\"submit\"\n disabled={isSubmitting}\n className={clsx('inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white', isSubmitting \n ? 'bg-blue-400 cursor-not-allowed' \n : 'bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500')}\n >\n {isSubmitting ? '发送中...' : '发送消息'}\n </button>\n </div>\n\n {submitStatus === 'success' && (\n <div className=\"rounded-md bg-green-50 p-4\">\n <div className=\"flex\">\n <div className=\"flex-shrink-0\">\n <svg className=\"h-5 w-5 text-green-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <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\" />\n </svg>\n </div>\n <div className=\"ml-3\">\n <p className=\"text-sm font-medium text-green-800\">\n 消息已成功发送!\n </p>\n </div>\n </div>\n </div>\n )}\n\n {submitStatus === 'error' && (\n <div className=\"rounded-md bg-red-50 p-4\">\n <div className=\"flex\">\n <div className=\"flex-shrink-0\">\n <svg className=\"h-5 w-5 text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <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\" />\n </svg>\n </div>\n <div className=\"ml-3\">\n <p className=\"text-sm font-medium text-red-800\">\n 发送失败,请稍后重试\n </p>\n </div>\n </div>\n </div>\n )}\n </form>\n </div>\n\n {/* 联系方式 */}\n <div className=\"mt-12 grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3\">\n <div className=\"bg-white rounded-lg shadow-lg p-6 text-center\">\n <div className=\"text-blue-600 mb-4\">\n <svg className=\"h-8 w-8 mx-auto\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\" />\n </svg>\n </div>\n <h3 className=\"text-lg font-medium text-gray-900\">邮箱</h3>\n <p className=\"mt-2 text-gray-600\">your.email@example.com</p>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-lg p-6 text-center\">\n <div className=\"text-blue-600 mb-4\">\n <svg className=\"h-8 w-8 mx-auto\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\" />\n </svg>\n </div>\n <h3 className=\"text-lg font-medium text-gray-900\">电话</h3>\n <p className=\"mt-2 text-gray-600\">+86 123 4567 8900</p>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-lg p-6 text-center\">\n <div className=\"text-blue-600 mb-4\">\n <svg className=\"h-8 w-8 mx-auto\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </div>\n <h3 className=\"text-lg font-medium text-gray-900\">地址</h3>\n <p className=\"mt-2 text-gray-600\">中国,北京</p>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default Contact; ","'use client';\n\nimport React, { useEffect, useState } from \"react\";\nimport { cn } from '@/utils';\n\nexport interface HomeConfig {\n title: string;\n subtitle: string;\n buttons: Array<{\n text: string;\n link: string;\n }>;\n imageSrc: string;\n}\n\ninterface HomeProps {\n homeConfig: HomeConfig;\n className?: string;\n}\n\nexport const Home: React.FC<HomeProps> = ({ homeConfig, className }) => {\n const { title, subtitle, buttons, imageSrc } = homeConfig;\n const [displayText, setDisplayText] = useState(\"\");\n const [currentIndex, setCurrentIndex] = useState(0);\n\n useEffect(() => {\n if (currentIndex < title.length) {\n const timer = setTimeout(() => {\n setDisplayText((prev) => prev + title[currentIndex]);\n setCurrentIndex((prev) => prev + 1);\n }, 150);\n\n return () => clearTimeout(timer);\n }\n return () => {\n setDisplayText(\"\");\n setCurrentIndex(0);\n };\n }, [currentIndex, title]);\n\n return (\n <section \n id=\"home\" \n className={cn(\"min-h-screen flex items-center justify-center py-16 bg-gradient-to-b from-white to-gray-50\", className)}\n >\n <div className=\"container mx-auto px-4\">\n <div className=\"flex flex-col md:flex-row items-center gap-12\">\n <div className=\"flex-1 text-center md:text-left\">\n <h1 className=\"text-4xl md:text-6xl font-bold mb-6 text-gray-900\">\n <span className=\"inline-block\">{displayText}</span>\n <span className=\"animate-pulse ml-1 text-blue-500\">|</span>\n </h1>\n <p className=\"text-xl md:text-2xl text-gray-600 mb-8\">{subtitle}</p>\n <div className=\"flex flex-wrap gap-4 justify-center md:justify-start\">\n {buttons.map((button) => (\n <a\n key={button.link}\n href={button.link}\n className=\"px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-all duration-300 shadow-md hover:shadow-lg font-medium\"\n >\n {button.text}\n </a>\n ))}\n </div>\n </div>\n <div className=\"flex-1\">\n <div className=\"relative group\">\n <div className=\"absolute -inset-1 bg-gradient-to-r from-blue-600 to-purple-600 rounded-lg blur opacity-25 group-hover:opacity-50 transition duration-1000 group-hover:duration-200\"></div>\n <img\n src={imageSrc}\n alt=\"Profile\"\n className=\"relative w-full max-w-md mx-auto rounded-lg shadow-xl transform hover:scale-[1.02] transition-transform duration-300 bg-white\"\n />\n </div>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default Home;\n\n","'use client';\n\nimport React from 'react';\nimport Link from 'next/link';\nimport { cn } from '@/utils';\n\nexport interface ExperimentCardProps {\n href: string;\n title: string;\n description: string;\n tags: string[];\n category: 'utility' | 'leisure';\n isCompleted?: boolean;\n updatedAt?: string;\n createdAt?: string;\n className?: string;\n}\n\nexport const ExperimentCard: React.FC<ExperimentCardProps> = ({ \n href, \n title, \n description, \n tags, \n category, \n isCompleted,\n updatedAt,\n createdAt,\n className\n}) => {\n // 格式化日期显示\n const formatDate = (dateString?: string) => {\n if (!dateString) return '';\n \n try {\n const date = new Date(dateString);\n return date.toLocaleDateString('zh-CN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n });\n } catch (e) {\n return dateString;\n }\n };\n \n return (\n <Link href={href} className={cn(\"block group\", className)}>\n <div className=\"w-full h-full bg-white rounded-2xl overflow-hidden shadow-md hover:shadow-2xl transition-all duration-300 transform group-hover:-translate-y-1 border border-gray-100 hover:border-gray-200\">\n <div className=\"p-6\">\n <div className=\"flex items-start justify-between mb-4\">\n <h3 className=\"text-xl font-semibold text-gray-900 flex-1 pr-4 leading-tight\">\n {title}\n </h3>\n <div className=\"flex flex-col gap-2 flex-shrink-0\">\n <span className={cn(\n \"px-3 py-1.5 text-xs font-medium rounded-full shadow-sm\",\n category === 'utility' \n ? 'bg-gradient-to-r from-green-50 to-green-100 text-green-700 border border-green-200' \n : 'bg-gradient-to-r from-purple-50 to-purple-100 text-purple-700 border border-purple-200'\n )}>\n {category === 'utility' ? '🔧 实用工具' : '🎮 休闲娱乐'}\n </span>\n <span className={cn(\n \"px-3 py-1.5 text-xs font-medium rounded-full shadow-sm border\",\n isCompleted \n ? 'bg-gradient-to-r from-emerald-50 to-emerald-100 text-emerald-700 border border-emerald-200' \n : 'bg-gradient-to-r from-orange-50 to-orange-100 text-orange-700 border border-orange-200'\n )}>\n {isCompleted ? '✅ 已完成' : '🚧 进行中'}\n </span>\n </div>\n </div>\n <p className=\"text-gray-600 mb-4\">{description}</p>\n \n {/* 显示更新时间 */}\n {updatedAt && (\n <div className=\"flex items-center gap-1 mb-3 text-xs text-gray-500\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span>更新于: {formatDate(updatedAt)}</span>\n {createdAt && createdAt !== updatedAt && (\n <span className=\"ml-2 text-gray-400\">创建于: {formatDate(createdAt)}</span>\n )}\n </div>\n )}\n \n <div className=\"flex flex-wrap gap-2\">\n {tags.map((tag) => (\n <span\n key={tag}\n className=\"px-3 py-1.5 text-xs font-medium bg-gradient-to-r from-gray-50 to-gray-100 text-gray-700 rounded-full border border-gray-200 shadow-sm hover:shadow-md transition-shadow duration-200\"\n >\n #{tag}\n </span>\n ))}\n </div>\n </div>\n </div>\n </Link>\n );\n};\n\nexport default ExperimentCard;\n\n","'use client';\n\nimport React, { useState } from 'react';\nimport { ExperimentCard } from './ExperimentCard';\nimport { cn } from '@/utils';\n\n// Project相关的类型定义\nexport interface Project {\n id: string;\n title: string;\n description: string;\n image: string;\n link?: string;\n tags: string[];\n}\n\nexport interface ProjectsConfig {\n projects: Project[];\n}\n\ninterface ProjectCarouselProps {\n projects: Project[];\n className?: string;\n}\n\nexport const ProjectCarousel: React.FC<ProjectCarouselProps> = ({ projects, className }) => {\n const [currentIndex, setCurrentIndex] = useState(0);\n\n const nextSlide = () => {\n setCurrentIndex((prevIndex) =>\n prevIndex === projects.length - 1 ? 0 : prevIndex + 1\n );\n };\n\n const prevSlide = () => {\n setCurrentIndex((prevIndex) =>\n prevIndex === 0 ? projects.length - 1 : prevIndex - 1\n );\n };\n\n return (\n <section id=\"projects\" className={cn(\"py-16 bg-gray-50\", className)}>\n <div className=\"container mx-auto px-4\">\n <h2 className=\"text-3xl font-bold text-center mb-12 text-gray-900\">项目展示</h2>\n \n <div className=\"relative max-w-4xl mx-auto\">\n {/* 项目卡片 */}\n <div className=\"relative h-[400px] overflow-hidden rounded-lg shadow-xl\">\n {projects.map((project, index) => (\n <div\n key={project.id}\n className={cn(\n \"absolute w-full h-full transition-all duration-500 transform\",\n index === currentIndex\n ? \"translate-x-0 opacity-100\"\n : index < currentIndex\n ? \"-translate-x-full opacity-0\"\n : \"translate-x-full opacity-0\"\n )}\n >\n <ExperimentCard\n href={project.link || '#'}\n title={project.title}\n description={project.description}\n tags={project.tags}\n category=\"utility\"\n />\n </div>\n ))}\n </div>\n\n {/* 导航按钮 */}\n <button\n onClick={prevSlide}\n className=\"absolute left-4 top-1/2 -translate-y-1/2 p-2 rounded-full bg-white/80 hover:bg-white shadow-lg focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all z-[10]\"\n >\n <svg\n className=\"w-6 h-6 text-gray-600\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n\n <button\n onClick={nextSlide}\n className=\"absolute right-4 top-1/2 -translate-y-1/2 p-2 rounded-full bg-white/80 hover:bg-white shadow-lg focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all z-[10]\"\n >\n <svg\n className=\"w-6 h-6 text-gray-600\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n\n {/* 指示器 */}\n <div className=\"absolute bottom-4 left-1/2 transform -translate-x-1/2 flex space-x-2 z-[10]\">\n {projects.map((_, index) => (\n <button\n key={index}\n onClick={() => setCurrentIndex(index)}\n className={cn(\n \"w-2 h-2 rounded-full transition-all duration-300\",\n index === currentIndex ? \"bg-blue-500 w-4\" : \"bg-gray-300\"\n )}\n />\n ))}\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default ProjectCarousel;\n\n"]}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// src/showmasterpiece/server/services/fileService.ts
|
|
2
|
+
function buildDefaultConfig() {
|
|
3
|
+
const localStorage = {
|
|
4
|
+
type: "local",
|
|
5
|
+
enabled: true,
|
|
6
|
+
rootPath: process.env.FILE_STORAGE_PATH || "uploads",
|
|
7
|
+
baseUrl: process.env.FILE_BASE_URL || "/uploads"
|
|
8
|
+
};
|
|
9
|
+
const ossConfig = {
|
|
10
|
+
type: "aliyun-oss",
|
|
11
|
+
enabled: false,
|
|
12
|
+
region: process.env.ALIYUN_OSS_REGION || "",
|
|
13
|
+
bucket: process.env.ALIYUN_OSS_BUCKET || "",
|
|
14
|
+
accessKeyId: process.env.ALIYUN_OSS_ACCESS_KEY_ID || "",
|
|
15
|
+
accessKeySecret: process.env.ALIYUN_OSS_ACCESS_KEY_SECRET || "",
|
|
16
|
+
customDomain: process.env.ALIYUN_OSS_CUSTOM_DOMAIN,
|
|
17
|
+
secure: process.env.ALIYUN_OSS_SECURE === "true",
|
|
18
|
+
internal: process.env.ALIYUN_OSS_INTERNAL === "true"
|
|
19
|
+
};
|
|
20
|
+
const hasOssConfig = !!ossConfig.region && !!ossConfig.bucket && !!ossConfig.accessKeyId && !!ossConfig.accessKeySecret;
|
|
21
|
+
const defaultStorage = hasOssConfig ? "aliyun-oss" : "local";
|
|
22
|
+
ossConfig.enabled = hasOssConfig;
|
|
23
|
+
return {
|
|
24
|
+
defaultStorage,
|
|
25
|
+
storageProviders: {
|
|
26
|
+
local: localStorage,
|
|
27
|
+
"aliyun-oss": ossConfig,
|
|
28
|
+
"aws-s3": { type: "aws-s3", enabled: false },
|
|
29
|
+
"qcloud-cos": { type: "qcloud-cos", enabled: false }
|
|
30
|
+
},
|
|
31
|
+
defaultCDN: "none",
|
|
32
|
+
cdnProviders: {
|
|
33
|
+
none: { type: "none", enabled: false },
|
|
34
|
+
"aliyun-cdn": {
|
|
35
|
+
type: "aliyun-cdn",
|
|
36
|
+
enabled: false,
|
|
37
|
+
domain: process.env.ALIYUN_CDN_DOMAIN,
|
|
38
|
+
accessKeyId: process.env.ALIYUN_CDN_ACCESS_KEY_ID,
|
|
39
|
+
accessKeySecret: process.env.ALIYUN_CDN_ACCESS_KEY_SECRET,
|
|
40
|
+
region: process.env.ALIYUN_CDN_REGION
|
|
41
|
+
},
|
|
42
|
+
"aws-cloudfront": { type: "aws-cloudfront", enabled: false },
|
|
43
|
+
"qcloud-cdn": { type: "qcloud-cdn", enabled: false }
|
|
44
|
+
},
|
|
45
|
+
maxFileSize: parseInt(process.env.MAX_FILE_SIZE || "104857600", 10),
|
|
46
|
+
allowedMimeTypes: [
|
|
47
|
+
"image/jpeg",
|
|
48
|
+
"image/png",
|
|
49
|
+
"image/gif",
|
|
50
|
+
"image/webp",
|
|
51
|
+
"image/svg+xml",
|
|
52
|
+
"audio/mpeg",
|
|
53
|
+
"audio/wav",
|
|
54
|
+
"audio/ogg",
|
|
55
|
+
"audio/mp4",
|
|
56
|
+
"audio/aac",
|
|
57
|
+
"video/mp4",
|
|
58
|
+
"video/avi",
|
|
59
|
+
"video/mov",
|
|
60
|
+
"video/webm",
|
|
61
|
+
"video/mkv",
|
|
62
|
+
"application/pdf",
|
|
63
|
+
"text/plain",
|
|
64
|
+
"application/json",
|
|
65
|
+
"application/javascript",
|
|
66
|
+
"text/css",
|
|
67
|
+
"text/html",
|
|
68
|
+
"text/markdown",
|
|
69
|
+
"application/zip",
|
|
70
|
+
"application/x-zip-compressed",
|
|
71
|
+
"application/x-rar-compressed",
|
|
72
|
+
"application/x-7z-compressed",
|
|
73
|
+
"application/octet-stream",
|
|
74
|
+
"model/gltf+json",
|
|
75
|
+
"model/gltf-binary"
|
|
76
|
+
],
|
|
77
|
+
cache: {
|
|
78
|
+
metadataTTL: parseInt(process.env.METADATA_CACHE_TTL || "3600", 10),
|
|
79
|
+
urlTTL: parseInt(process.env.URL_CACHE_TTL || "1800", 10)
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
async function getShowMasterpieceFileConfig() {
|
|
84
|
+
const config = buildDefaultConfig();
|
|
85
|
+
return {
|
|
86
|
+
getConfig() {
|
|
87
|
+
return config;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export { getShowMasterpieceFileConfig };
|
|
93
|
+
//# sourceMappingURL=chunk-PAX4S7QM.mjs.map
|
|
94
|
+
//# sourceMappingURL=chunk-PAX4S7QM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/showmasterpiece/server/services/fileService.ts"],"names":[],"mappings":"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","file":"chunk-PAX4S7QM.mjs","sourcesContent":["export interface ShowMasterpieceFileRuntimeConfig {\n defaultStorage: string;\n storageProviders: Record<string, any>;\n defaultCDN: string;\n cdnProviders: Record<string, any>;\n maxFileSize: number;\n allowedMimeTypes: string[];\n cache: {\n metadataTTL: number;\n urlTTL: number;\n };\n}\n\ninterface ConfigManager {\n getConfig(): ShowMasterpieceFileRuntimeConfig;\n}\n\nfunction buildDefaultConfig(): ShowMasterpieceFileRuntimeConfig {\n const localStorage = {\n type: 'local',\n enabled: true,\n rootPath: process.env.FILE_STORAGE_PATH || 'uploads',\n baseUrl: process.env.FILE_BASE_URL || '/uploads',\n };\n\n const ossConfig = {\n type: 'aliyun-oss',\n enabled: false,\n region: process.env.ALIYUN_OSS_REGION || '',\n bucket: process.env.ALIYUN_OSS_BUCKET || '',\n accessKeyId: process.env.ALIYUN_OSS_ACCESS_KEY_ID || '',\n accessKeySecret: process.env.ALIYUN_OSS_ACCESS_KEY_SECRET || '',\n customDomain: process.env.ALIYUN_OSS_CUSTOM_DOMAIN,\n secure: process.env.ALIYUN_OSS_SECURE === 'true',\n internal: process.env.ALIYUN_OSS_INTERNAL === 'true',\n };\n\n const hasOssConfig =\n !!ossConfig.region &&\n !!ossConfig.bucket &&\n !!ossConfig.accessKeyId &&\n !!ossConfig.accessKeySecret;\n\n const defaultStorage = hasOssConfig ? 'aliyun-oss' : 'local';\n ossConfig.enabled = hasOssConfig;\n\n return {\n defaultStorage,\n storageProviders: {\n local: localStorage,\n 'aliyun-oss': ossConfig,\n 'aws-s3': { type: 'aws-s3', enabled: false },\n 'qcloud-cos': { type: 'qcloud-cos', enabled: false },\n },\n defaultCDN: 'none',\n cdnProviders: {\n none: { type: 'none', enabled: false },\n 'aliyun-cdn': {\n type: 'aliyun-cdn',\n enabled: false,\n domain: process.env.ALIYUN_CDN_DOMAIN,\n accessKeyId: process.env.ALIYUN_CDN_ACCESS_KEY_ID,\n accessKeySecret: process.env.ALIYUN_CDN_ACCESS_KEY_SECRET,\n region: process.env.ALIYUN_CDN_REGION,\n },\n 'aws-cloudfront': { type: 'aws-cloudfront', enabled: false },\n 'qcloud-cdn': { type: 'qcloud-cdn', enabled: false },\n },\n maxFileSize: parseInt(process.env.MAX_FILE_SIZE || '104857600', 10),\n allowedMimeTypes: [\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n 'audio/mpeg',\n 'audio/wav',\n 'audio/ogg',\n 'audio/mp4',\n 'audio/aac',\n 'video/mp4',\n 'video/avi',\n 'video/mov',\n 'video/webm',\n 'video/mkv',\n 'application/pdf',\n 'text/plain',\n 'application/json',\n 'application/javascript',\n 'text/css',\n 'text/html',\n 'text/markdown',\n 'application/zip',\n 'application/x-zip-compressed',\n 'application/x-rar-compressed',\n 'application/x-7z-compressed',\n 'application/octet-stream',\n 'model/gltf+json',\n 'model/gltf-binary',\n ],\n cache: {\n metadataTTL: parseInt(process.env.METADATA_CACHE_TTL || '3600', 10),\n urlTTL: parseInt(process.env.URL_CACHE_TTL || '1800', 10),\n },\n };\n}\n\nexport async function getShowMasterpieceFileConfig(): Promise<ConfigManager> {\n const config = buildDefaultConfig();\n return {\n getConfig() {\n return config;\n },\n };\n}\n"]}
|