From 7e87781c85ba0209c73585616c86ef41615cd56b Mon Sep 17 00:00:00 2001 From: landaiqing <3517283258@qq.com> Date: Mon, 20 May 2024 14:34:52 +0800 Subject: [PATCH] feat: update --- .env.development | 4 +- .env.production | 4 +- .eslintrc.cjs | 2 +- .prettierrc.cjs | 12 +- package.json | 131 +-- pnpm-lock.yaml | 1190 ++++++++++++++++++++- src/api/captcha/api.ts | 22 +- src/api/captcha/canvas.ts | 104 +- src/api/captcha/index.ts | 60 +- src/api/oss/minio/index.ts | 32 +- src/assets/images/cube-leg.png | Bin 0 -> 18194 bytes src/assets/images/growth.png | Bin 0 -> 19139 bytes src/assets/images/icon.ico | Bin 0 -> 5862 bytes src/assets/images/icon.png | Bin 0 -> 24111 bytes src/assets/images/looking-ahead.png | Bin 0 -> 13455 bytes src/assets/images/pilot.png | Bin 0 -> 34680 bytes src/assets/images/reflecting.png | Bin 0 -> 19890 bytes src/assets/images/test/1011.jpg | Bin 6042 -> 0 bytes src/assets/images/test/332.jpg | Bin 18329 -> 0 bytes src/assets/images/test/430.jpg | Bin 8413 -> 0 bytes src/assets/images/test/47.jpg | Bin 4035 -> 0 bytes src/assets/images/test/535.jpg | Bin 6380 -> 0 bytes src/assets/styles/index.less | 1 - src/components/BlurCard/index.tsx | 95 +- src/components/ComponentLoading/index.tsx | 17 +- src/components/Footer/index.tsx | 34 +- src/components/HomeIndex/index.tsx | 1055 +++++++++--------- src/components/Loading/index.tsx | 121 ++- src/constants/index.ts | 1 - src/layout/default/index.tsx | 51 +- src/lib/utils.ts | 8 + src/main.tsx | 36 +- src/router/index.ts | 69 +- src/router/modules/home/index.ts | 16 +- src/store/index.ts | 8 +- src/store/modules/user.ts | 79 +- src/utils/axios/request.ts | 234 ++-- src/utils/axios/web.ts | 24 +- src/utils/cookie/cookie.ts | 146 +-- src/utils/encrypt/encrypt.ts | 282 ++--- src/utils/localStorage/config.ts | 176 +-- src/utils/localStorage/encry.ts | 64 +- src/utils/localStorage/interface.ts | 12 +- src/utils/localforage/index.ts | 120 ++- src/utils/store/useStore.tsx | 14 +- src/views/404/404.tsx | 333 +++--- src/views/Home/index.tsx | 39 +- src/views/Main/index.tsx | 17 +- src/views/User/Login/index.tsx | 730 ++++++------- src/views/User/Register/index.tsx | 426 ++++---- src/vite-env.d.ts | 59 +- tsconfig.json | 85 +- vite.config.ts | 350 +++--- 53 files changed, 3726 insertions(+), 2537 deletions(-) create mode 100644 src/assets/images/cube-leg.png create mode 100644 src/assets/images/growth.png create mode 100644 src/assets/images/icon.ico create mode 100644 src/assets/images/icon.png create mode 100644 src/assets/images/looking-ahead.png create mode 100644 src/assets/images/pilot.png create mode 100644 src/assets/images/reflecting.png create mode 100644 src/lib/utils.ts diff --git a/.env.development b/.env.development index 122e2b7..fe5c2e8 100644 --- a/.env.development +++ b/.env.development @@ -8,8 +8,8 @@ VITE_APP_BASE_API='/api' VITE_APP_TITLE=开发环境 # 网络请求公用地址 -#VITE_API_BASE_URL='http://127.0.0.1:3000' -VITE_API_BASE_URL='http://1.95.0.111:3000' +VITE_API_BASE_URL='http://127.0.0.1:3000' +#VITE_API_BASE_URL='http://1.95.0.111:4000' VITE_TITLE_NAME='五味子云存储' diff --git a/.env.production b/.env.production index fe08623..59dd031 100644 --- a/.env.production +++ b/.env.production @@ -7,7 +7,7 @@ VITE_APP_BASE_API='/api' VITE_APP_TITLE=生产环境 # 网络请求公用地址 -VITE_API_BASE_URL='http://1.95.0.111:4000' +VITE_API_BASE_URL='http://1.95.0.111:3000' VITE_TITLE_NAME='五味子云存储' @@ -15,4 +15,4 @@ VITE_TITLE_NAME='五味子云存储' VITE_APP_TOKEN_KEY='token' # the upload url -VITE_UPLOAD_URL='http://1.95.0.111:4000' +VITE_UPLOAD_URL='http://1.95.0.111:3000' diff --git a/.eslintrc.cjs b/.eslintrc.cjs index a115b57..a2fbd10 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -37,7 +37,7 @@ module.exports = { 'react/jsx-use-react': 0, // React V17开始JSX已经不再需要引入React 'react/react-in-jsx-scope': 0, // 同上 'import/first': 0, // 消除绝对路径必须要在相对路径前引入, - 'no-mixed-spaces-and-tabs': 2, // 禁止空格和 tab 的混合缩进 + // 'no-mixed-spaces-and-tabs': 2, // 禁止空格和 tab 的混合缩进 'no-debugger': 2, // 禁止有debugger 'space-infix-ops': 2, // 要求操作符周围有空格 'space-before-blocks': 2, // 要求语句块之前有空格 diff --git a/.prettierrc.cjs b/.prettierrc.cjs index df9c9d1..0c0d0c7 100644 --- a/.prettierrc.cjs +++ b/.prettierrc.cjs @@ -1,16 +1,16 @@ module.exports = { printWidth: 100, //单行长度 - tabWidth: 4, //缩进长度 - useTabs: false, //使用空格代替tab缩进 - semi: false, //句末使用分号 - singleQuote: true, //使用单引号 + // tabWidth: 4, //缩进长度 + // useTabs: true, //使用空格代替tab缩进 + semi: true, //句末使用分号 + // singleQuote: true, //使用单引号 quoteProps: 'as-needed', //仅在必需时为对象的key添加引号 - jsxSingleQuote: true, // jsx中使用单引号 + jsxSingleQuote: false, // jsx中使用单引号 bracketSpacing: true, //在对象前后添加空格-eg: { foo: bar } jsxBracketSameLine: true, //多属性html标签的‘>’折行放置 arrowParens: 'always', //单参数箭头函数参数周围使用圆括号-eg: (x) => x requirePragma: false, //无需顶部注释即可格式化 - insertPragma: false, //在已被preitter格式化的文件顶部加上标注 + insertPragma: true, //在已被preitter格式化的文件顶部加上标注 endOfLine: 'auto', //结束行形式 embeddedLanguageFormatting: 'auto', //对引用代码进行格式化 } diff --git a/package.json b/package.json index 35fb25a..d12dc9f 100644 --- a/package.json +++ b/package.json @@ -1,66 +1,69 @@ { - "name": "schisandra-cloud-album-front-react", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite --mode development --host", - "build": "tsc && vite build --mode production", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" - }, - "dependencies": { - "@ant-design/icons": "^5.3.7", - "@ant-design/pro-components": "^2.7.1", - "@ant-design/use-emotion-css": "^1.0.4", - "@babel/preset-env": "^7.24.5", - "@types/crypto-js": "^4.2.2", - "@vitejs/plugin-legacy": "^5.4.0", - "antd": "^5.17.0", - "autoprefixer": "^10.4.19", - "axios": "^1.6.8", - "core-js": "^3.37.0", - "crypto-js": "^4.2.0", - "gsap": "^3.12.5", - "jsencrypt": "^3.3.2", - "localforage": "^1.10.0", - "mobx": "^6.12.3", - "mobx-persist-store": "^1.1.5", - "mobx-react": "^9.1.1", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-rotate-captcha": "^1.0.26", - "react-router-dom": "^6.23.0", - "regenerator-runtime": "^0.14.1", - "vite-plugin-compression": "^0.5.1", - "vite-plugin-html": "^3.2.2", - "vite-plugin-svg-icons": "^2.0.1" - }, - "devDependencies": { - "@rollup/plugin-babel": "^6.0.4", - "@types/gsap": "^3.0.0", - "@types/node": "^20.12.11", - "@types/react": "^18.3.1", - "@types/react-dom": "^18.3.0", - "@typescript-eslint/eslint-plugin": "^7.8.0", - "@typescript-eslint/parser": "^7.8.0", - "@vitejs/plugin-react": "^4.2.1", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-react": "^7.34.1", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.6", - "less": "^4.2.0", - "postcss-less": "^6.0.0", - "postcss-preset-env": "^9.5.11", - "prettier": "^3.2.5", - "stylelint": "^16.5.0", - "stylelint-config-recess-order": "^5.0.1", - "stylelint-config-standard-less": "^3.0.1", - "stylelint-order": "^6.0.4", - "typescript": "^5.4.5", - "unplugin-imagemin": "^0.5.18", - "vite": "^5.2.11" - } + "name": "schisandra-cloud-album-front-react", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite --mode development --host", + "build": "tsc && vite build --mode production", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@ant-design/icons": "^5.3.7", + "@ant-design/pro-components": "^2.7.1", + "@ant-design/use-emotion-css": "^1.0.4", + "@babel/preset-env": "^7.24.5", + "@types/crypto-js": "^4.2.2", + "@vitejs/plugin-legacy": "^5.4.0", + "antd": "^5.17.0", + "autoprefixer": "^10.4.19", + "axios": "^1.6.8", + "core-js": "^3.37.0", + "crypto-js": "^4.2.0", + "gsap": "^3.12.5", + "jsencrypt": "^3.3.2", + "localforage": "^1.10.0", + "mobx": "^6.12.3", + "mobx-persist-store": "^1.1.5", + "mobx-react": "^9.1.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-rotate-captcha": "^1.0.26", + "react-router-dom": "^6.23.0", + "regenerator-runtime": "^0.14.1", + "tailwind-merge": "^2.3.0", + "tailwindcss": "^3.4.3", + "tailwindcss-animate": "^1.0.7", + "vite-plugin-compression": "^0.5.1", + "vite-plugin-html": "^3.2.2", + "vite-plugin-svg-icons": "^2.0.1" + }, + "devDependencies": { + "@rollup/plugin-babel": "^6.0.4", + "@types/gsap": "^3.0.0", + "@types/node": "^20.12.11", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", + "@typescript-eslint/eslint-plugin": "^7.8.0", + "@typescript-eslint/parser": "^7.8.0", + "@vitejs/plugin-react": "^4.2.1", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "less": "^4.2.0", + "postcss-less": "^6.0.0", + "postcss-preset-env": "^9.5.11", + "prettier": "^3.2.5", + "stylelint": "^16.5.0", + "stylelint-config-recess-order": "^5.0.1", + "stylelint-config-standard-less": "^3.0.1", + "stylelint-order": "^6.0.4", + "typescript": "^5.4.5", + "unplugin-imagemin": "^0.5.18", + "vite": "^5.2.11" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 22eb1d5..f09292b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,27 @@ dependencies: '@babel/preset-env': specifier: ^7.24.5 version: 7.24.5(@babel/core@7.24.5) + '@radix-ui/react-accordion': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-avatar': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-dialog': + specifier: ^1.0.5 + version: 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-dropdown-menu': + specifier: ^2.0.6 + version: 2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-icons': + specifier: ^1.3.0 + version: 1.3.0(react@18.3.1) + '@radix-ui/react-navigation-menu': + specifier: ^1.1.4 + version: 1.1.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': + specifier: ^1.0.2 + version: 1.0.2(@types/react@18.3.1)(react@18.3.1) '@types/crypto-js': specifier: ^4.2.2 version: 4.2.2 @@ -32,6 +53,12 @@ dependencies: axios: specifier: ^1.6.8 version: 1.6.8 + class-variance-authority: + specifier: ^0.7.0 + version: 0.7.0 + clsx: + specifier: ^2.1.1 + version: 2.1.1 core-js: specifier: ^3.37.0 version: 3.37.0 @@ -47,6 +74,9 @@ dependencies: localforage: specifier: ^1.10.0 version: 1.10.0 + lucide-react: + specifier: ^0.378.0 + version: 0.378.0(react@18.3.1) mobx: specifier: ^6.12.3 version: 6.12.3 @@ -71,6 +101,15 @@ dependencies: regenerator-runtime: specifier: ^0.14.1 version: 0.14.1 + tailwind-merge: + specifier: ^2.3.0 + version: 2.3.0 + tailwindcss: + specifier: ^3.4.3 + version: 3.4.3 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.3) vite-plugin-compression: specifier: ^0.5.1 version: 0.5.1(vite@5.2.11) @@ -160,6 +199,11 @@ devDependencies: packages: + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: false + /@ampproject/remapping@2.3.0: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -2478,6 +2522,34 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@floating-ui/core@1.6.2: + resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} + dependencies: + '@floating-ui/utils': 0.2.2 + dev: false + + /@floating-ui/dom@1.6.5: + resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} + dependencies: + '@floating-ui/core': 1.6.2 + '@floating-ui/utils': 0.2.2 + dev: false + + /@floating-ui/react-dom@2.0.9(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 1.6.5 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@floating-ui/utils@0.2.2: + resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} + dev: false + /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -2698,6 +2770,18 @@ packages: dev: true optional: true + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: false + /@jridgewell/gen-mapping@0.3.5: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -2798,11 +2882,677 @@ packages: resolution: {integrity: sha512-3BG5doAREcD50dbKyXgmjD4b1GzY8CUy3T41jMhHZXNDdaNwOd31IBq+D6dV00OSrDVhzrTVj0IxsUsnMyHvIQ==} dev: true + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: false + optional: true + /@pkgr/core@0.1.1: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} dev: true + /@radix-ui/primitive@1.0.1: + resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + dependencies: + '@babel/runtime': 7.24.5 + dev: false + + /@radix-ui/react-accordion@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-fDG7jcoNKVjSK6yfmuAs0EnPDro0WMXIhMtXdTBWqEioVW206ku+4Lw07e+13lUkFkpoEQ2PdeMIAGpdqEAmDg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-avatar@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@types/react': 18.3.1 + react: 18.3.1 + dev: false + + /@radix-ui/react-context@1.0.1(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@types/react': 18.3.1 + react: 18.3.1 + dev: false + + /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.3.1)(react@18.3.1) + dev: false + + /@radix-ui/react-direction@1.0.1(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@types/react': 18.3.1 + react: 18.3.1 + dev: false + + /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@types/react': 18.3.1 + react: 18.3.1 + dev: false + + /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-icons@1.3.0(react@18.3.1): + resolution: {integrity: sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==} + peerDependencies: + react: ^16.x || ^17.x || ^18.x + dependencies: + react: 18.3.1 + dev: false + + /@radix-ui/react-id@1.0.1(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + react: 18.3.1 + dev: false + + /@radix-ui/react-menu@2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.3.1)(react@18.3.1) + dev: false + + /@radix-ui/react-navigation-menu@1.1.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Cc+seCS3PmWmjI51ufGG7zp1cAAIRqHVw7C9LOA2TZ+R4hG6rDvHcTqIsEEFLmZO3zNVH72jOOE7kKNy8W+RtA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-popper@1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@floating-ui/react-dom': 2.0.9(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/rect': 1.0.1 + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-portal@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-slot@1.0.2(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@types/react': 18.3.1 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@types/react': 18.3.1 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-previous@1.0.1(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@types/react': 18.3.1 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-rect@1.0.1(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/rect': 1.0.1 + '@types/react': 18.3.1 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-size@1.0.1(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + react: 18.3.1 + dev: false + + /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/rect@1.0.1: + resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} + dependencies: + '@babel/runtime': 7.24.5 + dev: false + /@rc-component/async-validator@5.0.3: resolution: {integrity: sha512-eN5chKrc0ANerXjLJuoqh/YJpor0u4T1bgaph5BPh42cJ2afDihaHJ2Mh3Up3XIFk05EfKG4nIQxbqC6y2eM4Q==} engines: {node: '>=14.x'} @@ -3145,20 +3895,17 @@ packages: /@types/prop-types@15.7.12: resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - dev: true /@types/react-dom@18.3.0: resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} dependencies: '@types/react': 18.3.1 - dev: true /@types/react@18.3.1: resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 - dev: true /@types/semver@7.5.8: resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -3400,12 +4147,10 @@ packages: /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - dev: true /ansi-regex@6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} - dev: true /ansi-styles@2.2.1: resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} @@ -3424,6 +4169,11 @@ packages: dependencies: color-convert: 2.0.1 + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: false + /antd@5.17.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-jrzMIcaTJIy12/GJ2PfgchgZGuAlDodlaOKd05/TxEtFilRHnv8oaf0qfqNGG3slvvuy4J/57xn21jM4cLl7Hw==} peerDependencies: @@ -3486,18 +4236,32 @@ packages: - moment dev: false + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: true + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: false /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true + /aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + dependencies: + tslib: 2.6.2 + dev: false + /arr-diff@4.0.0: resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} engines: {node: '>=0.10.0'} @@ -3745,7 +4509,6 @@ packages: /binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - dev: true /bl@5.1.0: resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} @@ -3881,6 +4644,11 @@ packages: tslib: 2.6.2 dev: false + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: false + /caniuse-lite@1.0.30001617: resolution: {integrity: sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==} @@ -3928,7 +4696,6 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 - dev: true /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} @@ -3951,6 +4718,12 @@ packages: static-extend: 0.1.2 dev: false + /class-variance-authority@0.7.0: + resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} + dependencies: + clsx: 2.0.0 + dev: false + /classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} dev: false @@ -3988,6 +4761,16 @@ packages: engines: {node: '>=0.8'} dev: false + /clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + dev: false + + /clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + dev: false + /collection-visit@1.0.0: resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} engines: {node: '>=0.10.0'} @@ -4046,6 +4829,11 @@ packages: /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: false + /commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -4160,7 +4948,6 @@ packages: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true /crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} @@ -4258,7 +5045,6 @@ packages: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true - dev: true /csso@4.2.0: resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} @@ -4398,6 +5184,14 @@ packages: engines: {node: '>=8'} dev: true + /detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + dev: false + + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: false + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -4405,6 +5199,10 @@ packages: path-type: 4.0.0 dev: true + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: false + /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -4508,6 +5306,10 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: false + /ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} @@ -4521,7 +5323,10 @@ packages: /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: false /emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} @@ -5081,6 +5886,14 @@ packages: engines: {node: '>=0.10.0'} dev: false + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: false + /form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -5156,6 +5969,11 @@ packages: has-symbols: 1.0.3 hasown: 2.0.2 + /get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + dev: false + /get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} @@ -5199,7 +6017,18 @@ packages: engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 - dev: true + + /glob@10.3.15: + resolution: {integrity: sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==} + engines: {node: '>=16 || 14 >=14.18'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.4 + minipass: 7.1.1 + path-scurry: 1.11.1 + dev: false /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -5476,6 +6305,12 @@ packages: hasown: 2.0.2 side-channel: 1.0.6 + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: false + /is-accessor-descriptor@1.0.1: resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} engines: {node: '>= 0.10'} @@ -5514,7 +6349,6 @@ packages: engines: {node: '>=8'} dependencies: binary-extensions: 2.3.0 - dev: true /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} @@ -5596,7 +6430,6 @@ packages: /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - dev: true /is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} @@ -5745,7 +6578,6 @@ packages: /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true /isobject@2.1.0: resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} @@ -5769,6 +6601,15 @@ packages: set-function-name: 2.0.2 dev: true + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: false + /jake@10.9.1: resolution: {integrity: sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==} engines: {node: '>=10'} @@ -5783,7 +6624,6 @@ packages: /jiti@1.21.0: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true - dev: true /js-base64@2.6.4: resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} @@ -5936,6 +6776,16 @@ packages: immediate: 3.0.6 dev: false + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: false + + /lilconfig@3.1.1: + resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + engines: {node: '>=14'} + dev: false + /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -6008,11 +6858,24 @@ packages: tslib: 2.6.2 dev: false + /lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + engines: {node: 14 || >=16.14} + dev: false + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 + /lucide-react@0.378.0(react@18.3.1): + resolution: {integrity: sha512-u6EPU8juLUk9ytRcyapkWI18epAv3RU+6+TC23ivjR0e+glWKBobFeSgRwOIJihzktILQuy6E0E80P2jVTDR5g==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.3.1 + dev: false + /magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} dependencies: @@ -6148,7 +7011,6 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 - dev: true /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -6166,6 +7028,11 @@ packages: engines: {node: '>=8'} dev: true + /minipass@7.1.1: + resolution: {integrity: sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==} + engines: {node: '>=16 || 14 >=14.17'} + dev: false + /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -6259,6 +7126,14 @@ packages: /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: false + /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -6321,7 +7196,6 @@ packages: /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - dev: true /normalize-range@0.1.2: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} @@ -6364,6 +7238,11 @@ packages: kind-of: 3.2.2 dev: false + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: false + /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} @@ -6551,7 +7430,6 @@ packages: /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - dev: true /path-key@4.0.0: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} @@ -6561,6 +7439,14 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + dependencies: + lru-cache: 10.2.2 + minipass: 7.1.1 + dev: false + /path-to-regexp@2.4.0: resolution: {integrity: sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==} dev: false @@ -6593,12 +7479,22 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: false + /pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} requiresBuild: true optional: true + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: false + /pkg-types@1.1.1: resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} dependencies: @@ -6782,6 +7678,28 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-import@15.1.0(postcss@8.4.38): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + dev: false + + /postcss-js@4.0.1(postcss@8.4.38): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.38 + dev: false + /postcss-lab-function@6.0.16(postcss@8.4.38): resolution: {integrity: sha512-QWv0VxfjgIl8jBR/wuQcm/o31jn4P/LwzYuVKzNQoO5t7HPcU0d3RfWUiDrHN3frmSv+YYZppr3P81tKFTDyqg==} engines: {node: ^14 || ^16 || >=18} @@ -6805,6 +7723,23 @@ packages: postcss: 8.4.38 dev: true + /postcss-load-config@4.0.2(postcss@8.4.38): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.1.1 + postcss: 8.4.38 + yaml: 2.4.2 + dev: false + /postcss-logical@7.0.1(postcss@8.4.38): resolution: {integrity: sha512-8GwUQZE0ri0K0HJHkDv87XOLC8DE0msc+HoWLeKdtjDZEwpZ5xuK3QdV6FhmHSQW40LPkg43QzvATRAI3LsRkg==} engines: {node: ^14 || ^16 || >=18} @@ -6815,6 +7750,16 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-nested@6.0.1(postcss@8.4.38): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + dev: false + /postcss-nesting@12.1.2(postcss@8.4.38): resolution: {integrity: sha512-FUmTHGDNundodutB4PUBxt/EPuhgtpk8FJGRsBhOuy+6FnkR2A8RZWIsyyy6XmhvX2DZQQWIkvu+HB4IbJm+Ew==} engines: {node: ^14 || ^16 || >=18} @@ -6988,7 +7933,6 @@ packages: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - dev: true /postcss-sorting@8.0.2(postcss@8.4.38): resolution: {integrity: sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==} @@ -7695,6 +8639,41 @@ packages: engines: {node: '>=0.10.0'} dev: true + /react-remove-scroll-bar@2.3.6(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.1 + react: 18.3.1 + react-style-singleton: 2.2.1(@types/react@18.3.1)(react@18.3.1) + tslib: 2.6.2 + dev: false + + /react-remove-scroll@2.5.5(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.1 + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.1)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.1)(react@18.3.1) + tslib: 2.6.2 + use-callback-ref: 1.3.2(@types/react@18.3.1)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.1)(react@18.3.1) + dev: false + /react-rotate-captcha@1.0.26: resolution: {integrity: sha512-JeMn/yUv+HUxKOzC0oJekf3/vE/SUnyfwO6ViOervIH+zrKzt+UU6Ly9XMf0tZsbPBg2IkC4FKfJWMgSJldc0g==} dev: false @@ -7722,6 +8701,23 @@ packages: react: 18.3.1 dev: false + /react-style-singleton@2.2.1(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.1 + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.3.1 + tslib: 2.6.2 + dev: false + /react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -7738,6 +8734,12 @@ packages: react: 18.3.1 dev: false + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: false + /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -7751,7 +8753,6 @@ packages: engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 - dev: true /reflect.getprototypeof@1.0.6: resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} @@ -8075,12 +9076,10 @@ packages: engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 - dev: true /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - dev: true /side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} @@ -8098,7 +9097,6 @@ packages: /signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - dev: true /simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -8239,7 +9237,15 @@ packages: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: false /string.prototype.matchall@4.0.11: resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} @@ -8300,14 +9306,12 @@ packages: engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - dev: true /strip-ansi@7.1.0: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 - dev: true /strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} @@ -8463,6 +9467,20 @@ packages: resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} dev: false + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.3.15 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: false + /supports-color@2.0.0: resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} engines: {node: '>=0.8.0'} @@ -8584,6 +9602,51 @@ packages: strip-ansi: 6.0.1 dev: true + /tailwind-merge@2.3.0: + resolution: {integrity: sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA==} + dependencies: + '@babel/runtime': 7.24.5 + dev: false + + /tailwindcss-animate@1.0.7(tailwindcss@3.4.3): + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + tailwindcss: 3.4.3 + dev: false + + /tailwindcss@3.4.3: + resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.38 + postcss-import: 15.1.0(postcss@8.4.38) + postcss-js: 4.0.1(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38) + postcss-nested: 6.0.1(postcss@8.4.38) + postcss-selector-parser: 6.0.16 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + dev: false + /tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} @@ -8610,6 +9673,19 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: false + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: false + /throttle-debounce@5.0.0: resolution: {integrity: sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==} engines: {node: '>=12.22'} @@ -8676,6 +9752,10 @@ packages: typescript: 5.4.5 dev: true + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: false + /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -8908,6 +9988,37 @@ packages: deprecated: Please see https://github.com/lydell/urix#deprecated dev: false + /use-callback-ref@1.3.2(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.1 + react: 18.3.1 + tslib: 2.6.2 + dev: false + + /use-sidecar@1.1.2(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.1 + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.6.2 + dev: false + /use-sync-external-store@1.2.2(react@18.3.1): resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} peerDependencies: @@ -9107,13 +10218,30 @@ packages: hasBin: true dependencies: isexe: 2.0.0 - dev: true /word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} dev: true + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: false + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true @@ -9138,6 +10266,12 @@ packages: engines: {node: '>= 6'} dev: false + /yaml@2.4.2: + resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} + engines: {node: '>= 14'} + hasBin: true + dev: false + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} diff --git a/src/api/captcha/api.ts b/src/api/captcha/api.ts index 0dc5889..5fda7ed 100644 --- a/src/api/captcha/api.ts +++ b/src/api/captcha/api.ts @@ -1,16 +1,28 @@ -import web from '@/utils/axios/web.ts' +/** @format */ + +import web from "@/utils/axios/web.ts"; /** * 获取验证码 */ export const getCaptcha = () => { - return web.post('/ReactRotateCaptcha/get') -} + return web.request({ + url: "/ReactRotateCaptcha/get", + method: "get", + }); +}; /** * 验证验证码 * @param data * @constructor */ export const VerfiyCaptcha = (data: any) => { - return web.post('/ReactRotateCaptcha/verfiy', data) -} + return web.request({ + url: "/ReactRotateCaptcha/verfiy", + method: "post", + headers: { + "Content-Type": "application/json;charset=UTF-8", + }, + data: data, + }); +}; diff --git a/src/api/captcha/canvas.ts b/src/api/captcha/canvas.ts index ab7eac8..bb01c97 100644 --- a/src/api/captcha/canvas.ts +++ b/src/api/captcha/canvas.ts @@ -1,68 +1,68 @@ const calcSize = (img: HTMLImageElement, size: number) => { - const src_src = Math.max(Math.min(img.width, img.height, size), 160) - const dst_w = src_src - const dst_h = src_src + const src_src = Math.max(Math.min(img.width, img.height, size), 160); + const dst_w = src_src; + const dst_h = src_src; - const dst_scale = dst_h / dst_w // Target image ratio - const src_scale = img.height / img.width // Original image aspect ratio + const dst_scale = dst_h / dst_w; // Target image ratio + const src_scale = img.height / img.width; // Original image aspect ratio - const info = - src_scale >= dst_scale - ? [ - Math.round(img.height * (src_src / img.width)), - 0, - Math.round((img.height - img.width) / 2), - ] - : [ - Math.round(img.width * (src_src / img.height)), - Math.round((img.width - img.height) / 2), - 0, - ] + const info = + src_scale >= dst_scale + ? [ + Math.round(img.height * (src_src / img.width)), + 0, + Math.round((img.height - img.width) / 2), + ] + : [ + Math.round(img.width * (src_src / img.height)), + Math.round((img.width - img.height) / 2), + 0, + ]; - return [img.width, img.height, src_src, ...info] -} + return [img.width, img.height, src_src, ...info]; +}; const build = (img: HTMLImageElement, sizes: number[]): [number, string] => { - const [src_w, src_h, size, tar_size, x, y] = sizes - const canvas = document.createElement('canvas') - canvas.width = size - canvas.height = size + const [src_w, src_h, size, tar_size, x, y] = sizes; + const canvas = document.createElement("canvas"); + canvas.width = size; + canvas.height = size; - const max = 275 - 50 - const min = 0 + const max = 275 - 50; + const min = 0; - const ave = Math.round((360 / max) * 100) / 100 - const ctx = canvas.getContext('2d') + const ave = Math.round((360 / max) * 100) / 100; + const ctx = canvas.getContext("2d"); - const coordinate = size / 2 - const moveX = Math.floor(Math.random() * (max - min + 1)) + const coordinate = size / 2; + const moveX = Math.floor(Math.random() * (max - min + 1)); - ctx?.beginPath() - ctx?.translate(coordinate, coordinate) - ctx?.rotate((moveX * -1 * ave * Math.PI) / 180) - ctx?.translate(-coordinate, -coordinate) - ctx?.drawImage(img, x, y, src_w, src_h, 0, 0, tar_size, size) - ctx!.globalCompositeOperation = 'destination-in' - ctx?.arc(size / 2, size / 2, size / 2, 0, (360 * Math.PI) / 180, false) - ctx?.fill() - ctx?.restore() + ctx?.beginPath(); + ctx?.translate(coordinate, coordinate); + ctx?.rotate((moveX * -1 * ave * Math.PI) / 180); + ctx?.translate(-coordinate, -coordinate); + ctx?.drawImage(img, x, y, src_w, src_h, 0, 0, tar_size, size); + ctx!.globalCompositeOperation = "destination-in"; + ctx?.arc(size / 2, size / 2, size / 2, 0, (360 * Math.PI) / 180, false); + ctx?.fill(); + ctx?.restore(); - return [(360 / (max - min)) * moveX, canvas.toDataURL('image/png')] -} + return [(360 / (max - min)) * moveX, canvas.toDataURL("image/png")]; +}; export const handle = (url: string, size: number = 350) => - new Promise<[number, string]>((resovle) => { - const img = new Image() - img.onerror = function () { - console.log('image load error') - } + new Promise<[number, string]>((resovle) => { + const img = new Image(); + img.onerror = function () { + console.log("image load error"); + }; - img.onload = function () { - const sizes = calcSize(img, size) - const arc_img = build(img, sizes) + img.onload = function () { + const sizes = calcSize(img, size); + const arc_img = build(img, sizes); - resovle(arc_img) - } + resovle(arc_img); + }; - img.src = url - }) + img.src = url; + }); diff --git a/src/api/captcha/index.ts b/src/api/captcha/index.ts index ef443ba..56f059c 100644 --- a/src/api/captcha/index.ts +++ b/src/api/captcha/index.ts @@ -1,44 +1,46 @@ -import type { TicketInfoType, TokenInfoType } from 'react-rotate-captcha' -import { getCaptcha, VerfiyCaptcha } from '@/api/captcha/api.ts' +import type { TicketInfoType, TokenInfoType } from "react-rotate-captcha"; +import { getCaptcha, VerfiyCaptcha } from "@/api/captcha/api.ts"; + export type ActionType = { - code: 0 | 1 - msg: string -} -let image: string = '' + code: 0 | 1; + msg: string; +}; +let image: string = ""; + export async function get(): Promise { - const res: any = await getCaptcha() - image = res.data.str - return res + const res: any = await getCaptcha(); + image = res.data.str; + return res; } export function isSupportWebp() { - try { - return ( - document - .createElement('canvas') - .toDataURL('image/webp', 0.5) - .indexOf('data:image/webp') === 0 - ) - } catch (err) { - return false - } + try { + return ( + document + .createElement("canvas") + .toDataURL("image/webp", 0.5) + .indexOf("data:image/webp") === 0 + ); + } catch (err) { + return false; + } } export async function load() { - return image + return image; } export function sleep(time: number) { - return new Promise((resolve) => { - setTimeout(() => resolve(true), time) - }) + return new Promise((resolve) => { + setTimeout(() => resolve(true), time); + }); } export async function verify(token: string, deg: number): Promise { - const data: any = { - token: token, - deg: deg, - } - const res: any = await VerfiyCaptcha(data) - return res + const data: any = { + token: token, + deg: deg, + }; + const res: any = await VerfiyCaptcha(data); + return res; } diff --git a/src/api/oss/minio/index.ts b/src/api/oss/minio/index.ts index c0d9f2e..4607b5c 100644 --- a/src/api/oss/minio/index.ts +++ b/src/api/oss/minio/index.ts @@ -1,12 +1,30 @@ -import web from '@/utils/axios/web.ts' +import web from "@/utils/axios/web.ts"; /** * 初始化minio */ -export const initMinio = (data: string) => { - return web.post('/oss/minio/init', data) -} +export const initMinio = (data: any) => { + return web.request({ + url: "/oss/minio/init", + headers: { + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + }, + method: "post", + data: { + userId: data, + }, + }); +}; -export const getBaseInfo = (data: string) => { - return web.post('/oss/minio/getBaseInfo', data) -} +export const getBaseInfo = (data: any) => { + return web.request({ + url: "/oss/minio/getBaseInfo", + method: "post", + headers: { + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + }, + data: { + fileName: data, + }, + }); +}; diff --git a/src/assets/images/cube-leg.png b/src/assets/images/cube-leg.png new file mode 100644 index 0000000000000000000000000000000000000000..388ba8ce8595e8aa7c656d67abf950758f62e487 GIT binary patch literal 18194 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/growth.png b/src/assets/images/growth.png new file mode 100644 index 0000000000000000000000000000000000000000..2a04fca5c123371b347910de6a20dffce6e5cc1d GIT binary patch literal 19139 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 z0000000000000000000000000000000000000000000000I2Z~@Fy6VGM|(G00000 LNkvXXu0mjfE6`0) literal 0 HcmV?d00001 diff --git a/src/assets/images/icon.ico b/src/assets/images/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ac12869d6c348b9093da19a004318cca44b710d1 GIT binary patch literal 5862 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 LDNELhn*{zJK&R_3 literal 0 HcmV?d00001 diff --git a/src/assets/images/pilot.png b/src/assets/images/pilot.png new file mode 100644 index 0000000000000000000000000000000000000000..e190bb2c6a3e1c314ae25c87b6637fd0896ada72 GIT binary patch literal 34680 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/reflecting.png b/src/assets/images/reflecting.png new file mode 100644 index 0000000000000000000000000000000000000000..60101e84a446027400935ee17e887d1f7fe3b0b9 GIT binary patch literal 19890 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/test/1011.jpg b/src/assets/images/test/1011.jpg index 86ee471d2bb11d579d56b6aba156e04819689a5f..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 6042 zcmbtVXH-*Lw>>FTkq#G;PUuBxmyYy6=*6G}M5K2@ZxIBgiSz)1REZR+3V|y{Kn11O zP(nvQy3#}xdEwq4_xgxg^5D3sC4d8qk zT%@n1WoK$`qN{JHLn;6OIMvg^%O83j0KB{d{LJB+JhyIJ^H9tK>d1l zHB3znf&UuE1c0Oj0AmstTK{$1e=b~dbnio07x>;k_@Wmc2UkBY z(jHF|hIx4glJ4+#Ty#R?632lw`vReWABo`txRSWyq--GI4>*xlXHwpYG(1T=NO9r)#R>rbdg|{ibD>9S znFav>WGm0ap&hhOU}>Fo&x}63IIAX|KTP;Q*kCWMt$NG?Wyipu2R5iiUxXk&%Ipfq{vY z;}0fgb`}N(HeNP%PEKxaZl*u@V0>IK4lZu43lR{BN@p&ff!^q_;pu`kp`+E&Lr65GWZrB^Urvk;-cH00;sBUtFG&jO?Ng z0z;qx83Q>l1*4P(lbJmwGaveabXsve3oE~-xnJj3n2grFk?4|FT}veXRS*D%{BLyt zN(P3Ig8&LrQIY`wgFz55gaZ1vgBRiegaOLPOD4snVRj*0TtA{|pZ1kS=G*xUKm#GE zF+doA8$c*-X)7y4jpvpGecl5BV{Jwb>TA^{Sgt^yhfeTRuMFc5|5CxJrSP^<`bPoo zrt4^x$JXiQio+#-a8HILaHZUatK{!;d6zJ;?dVCKHT_lf{lPhr$H&2s<~n8{iQTKK zn-<%pg-7NKyFV-EAGEzGe04#!jCHF|awzLS-nBQg&sEI6Dsx?>HLgD?klVUZ9n1S2 z*`FyL>5Tma-6@!`7>!U&ach0+pUo?6xwiA5KRxM)B7(DWfBe>tN?D#06Y0f9ak zHfxZ`=|fA5%Y}CND+DMsr8C+fEGCx#rh_dz(@u16e}V7vC3{#hoeA*LQWmk1n+VIwid8ron!I%ni;U~q%l7a2+IF4%A{c6cUz zL!}tlOS$eYkITTfU z-2NGLAXLP;>GgruhG2M%eQPwqVdMe7{==K4?R`<%4T?mI{w9`RMJr*hE0XZT_m zwb0txj0Rss)@c1PskBGMJR4#jxp##M>eZrZRyeW^|jCWd$pdiL*@OuxTO0|=fGiDsrtcIz$%=r!jcN`z7Nri?>-%7q>&i|&&FlNpedsq0`UKG&LV>m`3o48-y zZ)@#-c`9J#B%8u{^LX0?|J0)T4{f0xc!-F~yYCs}7|Pk}) zpS;|;B0lo(KaUxB(`>hV-KLu*aY$`A3+eEd)x!uU8q9l(?F$*z*b$lc*Sz|NN2+|& z8jZTtXZ9@*?+^bu;1zIo8QoYi;%DyHW$h)T!$ws!7*;x1te3I|2G!fmM zuT?Ffho+`Rr2CrdF2+nHPTe20F%G^pHR;t_oBPd&inb*R@up$|tH{S4 z8J4AH8R2)$H+-IDPX+2(2PqJ90{B1cum#{&UA6V2wc|fVifXp%0A|giC$vGP-N1Y_ zU3vN9I)9sO2;2|-#DwgDpYv>~p22|Hw(nQXPPP+$AfMGlCa9*7&FrFK^duQMx-NAA~+1hyEHoOv7}@8#KxJvEl8fXCu3`#fmc9|`4THp4~r zIL(dy8ztPQKrwVEG1xA*o~c8;JpH2Q3+8Cu`(3Ge2mG>R!+XE+=;sTobs2n~-)%9e zRGRFo6kLvhLpZ+OHc#bVqKCiGlFD>Xabc+DKaRT&OwnMywByZTvL}JB6vwY?d~wrBY@9KTKP{Ow@L8|zI?ZcrS= zUheLZovRJQXiT*A{T|<@_%*tO!--mBv5PM5*MmRqfOtT$Dub#6qPIVDhTqG&K0G52 zk*$J*Eea7od@~uR6*A(~yranOI`+xe!IR#9rXe@n&NPY5FbJP`xQ(L= znb+;R@hI3Qph*hH0*$Iq*HypL`Ackc7{7orPLhB|tLn&~ZU1I=`>gY;BG0e0V^03^ zLz~^st=`q*Yeu2QLhmH@*Rd3eie16`-OI%x4_?YfU_^J)n!8rr+}7q2eA2NE^%-eP ztGp@+5Qxh3whNkA5>`^uawSy5MzRF>OSEeJz#i7ErDy~ zZ0ZzHJgmqoq?Ln~qP)#K``;%md6gl1IcbWit*#~F#3T4&E`8PB9sZR3$^qcUAyMq z2j|u#RN}}9tC7;+zW3?#3`(;FHb-ub+_iFd#B;MoLg3>1fRY7Pw!XJc&Gt9ew8@on zwUIC2FE=}l-YBLs_Z8{|)~iNJS83mjLIdBFCf`dNF5GKlLhNb{@m(38e9?3Ynmau0 zS%SeM z2BY>*2KJ+lp7^|x-Hh}!Ch)8vJb ztTJb%gEl3tdmk#;%5t1VUmfG72NP1W3zSzdMawK^c^eikV`AmnBZ$$0Cy8ky2se-d zN9pfC_~4=2aq6gWy&*o!CUD-F*%s{pavw5VT}{c(CpW-E%|99riA`I6mP4%Jl$t1X zvJqPN{^Q+3y=3JX-TSh`gH43P0^4VO^ZK|vGQFM(jxIcAW)(c<9k$}1)vu6LmOoi= z3qh}{U)%o}_Tw0pgsQGT>VA5qV@0y8l3AI6CA>NDxX;#`ykgVsXw-#$CQkF&rP;K? zUD8_7M?o-K_wA|w6nBF+kX!Qf zsJ3Fk`B^6lY5InifoP>@l{2veth<%e&obmgRNQqt^+01hqkfP)lAZg` z@i z%Z0s>Uv4N}xq;wx-{KaBvoiX*k>hp@X`OHiaQqy$zNM zm~6dW;N@=OpW4j2YoXXo;g@$KQfh+ajK_Q1=2j#=jZ!*-BVb&XE0co>?41v79Ms>| zO}&57#ntgsjC-0}!xH0`a~fm@1*3Q(wsLa^g1tCf+x=#Gndg!teyjN_cAYit1oMC${erx8iD;)l-!k*g6IOLCtuf z=qmql!d`PluQqX3bL@Bk?sH#ag1>|2+HpRSsM2xFf2DZn^*I1O+^rrSS_riE*3=rE zbr!Zi2Pm+VU5NNqMSODz>ld{RoQgYiD3D|yEk(KRomQT^{Y>%_m_KkoIL2NX>l19Rce9p+g7EUZ)RE% zhH)kn5@8c!9V&={Z!xUj{**cgj8=udl}yrJ5%h{H`;ioM#H_X)V9#wmOP{%@V7_?z zK<76{=W5$DJO6g;$Di>b3n514&@qB0(oV}?FX`=((8Sz=CrWTvB%L+IrkIV z=4!7(@W{tseu{(O?u}D!r9VFvY_l{xH8Xfpdk-HQs^(CmW{Lg4+Omo}Mws!&F>0pk zE~JF1_39)7Dpjm)m`dWa@UqeSVeXWbkI@+H{msf7s=|dmMCyj4A7-qdG*AV?W}Bs% zN$h`+`6Q38n>e3#$|zQs-$a{+{Q7W^nYh|UP;)q_tvE?bF?u{N@Xz+a+M95-1T1N2S4fc%iI0ruPZ&`4t zCg#;LOEx_c5`L{kKcm`em7?@*A7QT6KzmGRuUx6E#*=4fRoDH}iHaN#_nKq}%A4u?No;e^c@(S(A##x}4Y#sV;ER;^VR#RusMj|Q3_MIQwt5+)$Wsg3< zB1BbnkLZalV5PM}sow%06yHjQ!bhtqk|-;(pFJf~xmMv`#7-?-#hh)t+YNtypYN+_ z8kPf-wr(idbPMU)hxPTX=PX_Ap{5gs7pUVrtzJ5v&I_R&Uuco(@H({9Dj!!|E?VSr zMEqs@8O<6XgHD=_oi%u(5LGIoN~ua&j-R9VO1JS+<13EFm7R=?p99uDd)rf`e|gzQ zm#-W@d01uNnjVUt3XRxMwmHlz{}zgXF+PHfMeeaE*&5va@zq|A(5q_II#4hk7R&k~ z%{z}>H0P_szF1B)j+P3oF!Mw_Jag;4KYE;3Y zw6l&(Q^HI9Umhm*L|8Ppln1WvpDdb5!!qT*NY$MRW#Lnp)@5)Cw{LW)vEPc#sd})c zuKr8rmd?*8(Dy_t)MMYGK&myN$P#sM$>T?0*|xaYTfd(lp98OW_@BbrcpNA5c$z7) zj@Ev}VCX(<5OEkyX6BgQpl)4d_Uue+N1Vo_aWj;}k;Ho2q*^ILa9k~5yYD{QO8Wr_BWC6m`NQ*9f8bNczZ^pfu+Tv@Xm&q4*_k|ZvfNL#AJ z%b{9Pk-9oIeW(|(Ad7Esbt;o)y;8c4q6=mO%tCnyuK3^dU`f-C%r|&Aw}5E ztUaGS`o1QBsoq{YC~a74OGc-}KgL;((}$$U^n~^vxYPw{e2VpJG+a zZ^3$8GBzI+d7>%#ef?z8)G;pGgCABWO5C$16xVsPTF2UX169ObS3>I7mmjoFgL4s?5-~j>z4VvH% zm)|+}UFW=at-HQ|zMAQ&r+4kWYgbkG%+pmhj|-1$0D-asQ~^LjLIRYYUcloz_7zlC z)^0ETl!U6&uJRIC~RxXy-&UD_^mM;Hz{lA_5 z8LNN$1Q!AT{!?s-32R?3zkkb6{>e}QEC3%M2FL*#fB|3uH~=0%5D*2V0C_+e&;WD+ zBfuQ61{?razzgsPLV!0wG!O?Q1L;6EPymzyl|UWP0JH$@KsPV|i~^IuEU*Nu0b9U6 z@E5oMZl5kNbR=A)XGr8ov`CCdY)CvvLP!!w@<^&k+DJx7uaNAK+>m^cLXh4f#Ua6v zvXP3ADv>@RwIOvQ4I_O=`hoNdX&31P=>{2ujDt*!OpVNh{1RCRSsGadSr^$1*&f*w zIS4rtIT85-axroZG6K09c@%jTc@23V`5Xj*utB6CdJqRl2qX*A02zbqKwh9QP%J0| zR1B&EeFhDJra^0<1JE@J8p<;iIus5RQ4}QaBQz(pV6=F& zJhXbWuV~-VHqg$|(b37#+0ez&HP9{5ebA%Pv(RhMyU?f5x6rRJurX*ccrX+&j4|9W zA}}&AsxUe+rZ9FeZZQck88JmLH85>312K~@OEEuVPGD|f-eM7AF=L5i>0&uyy}|l` zRfpA&wTyL&jg9>RTNqml+Y$RU_6O{b*hARAu&;55a9D9t}DDl|Ji#wndCa%uEa=b|Q`=t|cBP{!2nc!bhS{5oTYQ`1l@QhQKmQTI|G z(2&wd(Kykh(R9-6(mtb=pmn58qwS*Iqa&e{rgNeDK-Wk2m!67ViQbpKh<=>@_673` zy%!NL>RTYGb9f($%@R%&+5RM!#cr+%qGC*$d|3+K^G@Jr*DDK7_KK5+4Kxp0+oEpZcZD|1J1 zf95{nVdb&r$>Evd#pPAt4d-p;J?3NMv*pX@Ti}1jug3q5zlZ-`Kv2L-piW>{5G?pg zFjsJ1h*(HdC|+nt7*$wCI9#}0_*z6j#7Cq-w(QJRNRL#?5e(7(!p%Av}ADmW@S zD%mRQs;sJBs-M-6)s)pz)t1#6)!o!vGyn~#Myke7O=e9`%`aMLTAErpTHD&(+9BG5 zI?r@0bgFbNbY*mtbeHs4^nCSt^zrpg^(*x+4de`925W{d4MPn_jVO#9jarS-jrEPo zjL%KvP0~%aO!-ZtP3O#*%>vAZ%_+=X%sVXbEi5e>U!lG-cvbc4&Qim&*z(*8YL#pC z*IL#((|X@V$|lWb*H+vXX1il2ZU?jbZ7*)0YQO6s>5$=Y;3(^u?Re~@8#;g z?)>Ot;8O33;rhz8&5g*-*{#o=#y!COy9b*`w8xsKh-bRzUoRD}GH)brGw)U(;-?>& zF<%znDBoXx5`H;;SN{6`jRAxKZUJL~tbs9sJ3$IT@L-f+>)@Uc`j9svze1%$i^7n? ztipQ28NwsOw_Yp0u6Tp>#`(>+2(AcN#MxVex1S@aBVR{uL@7p9N8?3%MbEzzeOK@v z<-Ozk@fhBiteA&bo7j;!uDFc2yLjvPkp%994+)Qnc8TLj0!jJFXvuELb19N36)-|r z5Nsn=EftYQmlm6LmTr+goWYk-kcpM)o4NKu^+RhGI4e2pF54k{Hb*9>K9?#tCigPW zCT}WVD!;CPx*)FLrqHo)p-8a^QOs1FQG!)MNl*N_Zm%Ej(RcKfA zRSH&CR#846#O%;>E8?DsjnxrKSt`LzX`h2KA1ejG3Q zE#5A@UPfJx{YmgMV})v^coni*zb3HO@k{R4*t*X8(uVcM{-*cl-B#o_?smow?M~%y zp5N`e3cHhgCVN}^9{aZk(T9YGxkoHVO@E~RjQutIyLIe!{CE<7N`6{?#&_0pu6e$4 z;d*g<8GA*3RdFqJJ$Peqvvcczhkp0r9&-QrLFHlj(e?51zqkqK6D^_p4=<6kwX^hf z@uB;Nu*kZ*xchq1>3CRL+tP8+{X=5@O(6cSeg221SY-h~OB4V+U;K~ksT$3HSM_h+ z_AmTj{PKT=f&3pk5GeqFc%Rs7>3?MI#Q-35{v=QKcC@Ga$5K{Xm+rs%fkWHY&eqG; z?Ww8yj<)`eZuU>@ce8Qyadda1b9DQMz5S<~{#VWa7f${Y=YKe}k8QvcuY8Kr-6PP; z(cZy_4(jG(>*Z$oPehh3{~8^ye`54@_wsS{b!DgH;o=eo0B<{9o_~degd_Jv^Hv`p zPniG!Jq-ZvlO7*$iyj~EpZWr{1OQ)sAC~~xf1U&Wj|mwW3F+yLg#170KM46BC;#Q( zf2sYC`u{P1{0b0a0Iz}9Afy)nG9eO(5b3e+iJAh)PfYH~`~P$@CKehx1_~-R2ta-+ z7a{_*8AQU8IR1gUD>A3(Igo27jh>k%-4?N?>Bz_^SMPfVpT@T@EwrOERW1OW@Zs zi^h_2&*01^D71g}incT8WBpf5wwm8fiE5V$0EhHuUnp5m@Ad~T&NFJxi(dMijGppv z4e*2zK3wf{>S)iYxRn_j8H%{;k`15B2B6#=QdMldN&65XexxxoSAxbe;Ht^qG zxN1J{UI>$)qw?ICq`hupGuHe**Z%YFb6YQ2?8YB<7Gpl_2$|blR@qzS*ZOy1ozkaw zftfS9(v~CWMy{AaBYqavjGGALZDLk-u-I+Pe0vjO6t}eCmI4#~>-o$nhnH4d!*5pY zbVqV9Nf=0N=t|>`IsEJ7!%7qKHnSiRf$ZE8~a*of2}51yoYsxOdvHLGfa(7U+a zU{$`QrNW=C+lZq~egvrJIlL^4#j}byDhDy7*#fb&?hu83k}XLa^Al)U^!;3*qx=~- z1!t>zkJL&}JKNyxBS7;-oh9ZGSR?6X!8ECbDrfi+6;k_vNkBVN1r)Rrp$0AF+tj@a zd3Bz-i;CsN#qXKa(jI}&itb*T8IzP6nKN)OIDA zr#7C}9)w%(&97H$>=D-@+Bh=>H{5Ct?X8=_vo`myP9(%}&29EYlXlkU^_ypn7=7WK zWX$aE@L30Ixi6Ue6Lintx+|K+xk|oZsFVSGaU$tzqF5Y=&;ob%ROOY$ZkX0;Ag5wmd-GZ<0-O07Td%{z@41Piz6nRx7_vAlx(&rO?c`pjW|=6dVx-GygG-3e4=-quONqB zn%(q(Fz&YuNBQLWEYP3*!@ZNStO+|JOM#DLt;%-(?Mg|98MmZMxy)l%w4$C5;sw6~ zQ8`K}D+o8$Vl13#oM-0pig@?z8R1cbX?^v99YSd=k#BGR!fSm{PvzNpXNH^|n7nCy z8Bzp3uO0ddFFp?)z!_OGv>{CF*sCScC3-QUQhh&1&Z;z^pahEFc?jGaJq#XLHkw2^ z?9boWFkZZ)ofHKH-3Q(M@?e(MAY5a~q}Bq%3X7VC~%6(g^>+Yyu{vFiDD&jNEF@t^VP%7B5cgP`EsgdC~?1v1?n2M z8t!%bbRR_Kg-|~vC7G2PfYgOXBk4IAp?Jw~Mr=*}A(oT39|bf9-3RN7v8g*ERKo^( zU>`{Z3Q3j?jv&CBt_Ac9jRG@l%?&zkVY+LfyR zu~KX#awM5vH2D_#+@YEDF9lH#AYvsq#cbWII~2csrpw0m$j7v`Ao3 zp=6imncFIZB)j@@(&6DFV0uQ;kXS6^(FaNyrVF^cOAOyhY_!$T4Ebqkq(NfRf@czF0 z^t`7Ls#qp^$}pDTmt3Sb@u_QJv@PQ9of+QyA@3z}GwJeN4g|MJN$mN?IQ;oW3=V7M z(p(WsD7Y?Q+WG3~4_?aAp4{}iuLa`#2)7(GwL4laq)`0+d_Aq*zx*w6HaiL{;L$;* zYArL#n97lsF;QGZ8&!p1Iw~3)YC=F;;FRM%otb&ApYxv6-K?H3Ss$7)G(DBEu#&(P z)YPT^ptYpbu8SL7R4tQANU)SNRow?Y0N_3K5IQZO_H>G)`sjqY4wE|B5*{XJl%`7g zlQMicK|UeRka%reCP*#q$D8u-Q!)V71Yy-Y2>n^xaW$!ha&V9Ygxu)RR=hOLZ5~~2 z%Y8*ySI@m7-m7PAq4;jDy_KsBT7?u_Q~XU;_-Ms==;K8x-0a)n`y|_nZ z*T@e`ah_X}uCIFQzc^BUf~E7N4P})2*K)Eje`3*z{UJdNrDT{wcw4;afSoeGu!zY& z0h=#;OPp5yHsJ zV4Eq1MrZA@>4k<6c&cY9h92 zPln&RA#aQ*#KNX9L9hIYlKO(0-0R4jd#NHQLq-zBv+5)Ek>G>AnFLGfT+yP-t{sW} zMSTyV*wT|P%Ikay83pzo6Voc8NX{Cbhl}Z3Zc#u446VIDWObtICp**gJkJOdhSx%X z_4E5jz`Q1>XxvH<1W*M`bcVMeB^z1vRr_~&FtwU?B zyQ5*`84^=L1}B*4*5U61^$yf%rx}$B&?%cBq>@ur3(ea1gYTSU-=AV%#PSu3zs~gQ zI!D@>OCRUiZE#`Xob1QVCv}II2|7nk*%^u-p`euoe`7w}d~dnFVJw2ne5|G64`0e7 ztj(%)E+Wz8t;D5-S*La{$|9G8L&tL02saWZA-1I%5C#L>gr(PD4`Cs(S0|Lf+duh1 zZuyCwRbo0b2zoVXS8Khf(_H0i&dm@@he}NsZOakw27RHnLqyya6MjQ8tFTTjtn=bE z)S|ZF5m+^J@*Y_@Tn!ZemiQHlZm#}@M$$qeStHYQ=*l~@QkWOi7{w|FnLJ_fs?t9| zI6e%!)<_|A^&q&Ha0>n0OJpkQe(dAjNKbY1A+L5FvJoBD5o9k4)|~X-keAEvtCdv8 zbnp*QgNvNC72kHi6;F<6iY}AnTvAn=FYLIq4YtPAG6>p)S>8qHen()EaT5_{?AfEOtStjWKCAl*gRcHD zUN{flpjI%HFmasPC@ppWqF$^wOPwE83JjVA9AS@}8A6Q#-E}B+;H&c@r&8!QqactV&RA zERw5=H#gsp=7wk`!Z#*&G$cnXF?`)6B5!R&H#yLyaHHOIFz-yHoZuHol+B3C#5iN{ z5PXEw0VUT09fXDH0kr7$;a#E&i@gq_vsjtBoQ017f=7s&fM8nBR<7G(fp*9medxv) zb`WIYq$92TK9Z(Kw$cH7%}V_hsWbuCCFIXTs8qv4-jDi$pN6rf7+EA3-iuHO&32M| z(j@J`S6WdCoMO+L%MXV-4qDni8VFtDbYx|czkFiugZswkN+)%U7p)szP7x+vHtL%w zcr&|G#ZvQY!ChTn7u$c|c((+-^Qug7w5wpn{)_pQK`j2bMRdU9KGUJAt!(S**z%crD$ zp_~v_W}E#JN{J4}>$s%-rQhK&W2;Z)o6HF(J|DZMq&3-$BaqZ##Z#t|SR&Acmy1w=JG zD6qVTAtEbDN!puhoGLDDs6=V{%E^mXpPQQCuS@A#UrV8y`-Q;70%^(?5}$v*6*>84 zooUNi);-edxtx7a@t3GPHy*J;@8nRK#!f=u+i^7??XZhjf{(o`&(&aV@CTK=aZ6jj zXu5mzB0rf`*(`{C_8Siom0pNl7H1ozltalD^%bNija1FLnpRnRdX}-yxx8=a(_!35 z#;|F;;0kc~w=_{{Z==X3UE)(+ReAO`YL=sApvt%hT(ja8oDy1~Y#(Jl6M zS+L>xg73z;Z%SVNUG#cqa)xzY=ZP%yvaBPfmi8C)SJJFk63t{Z7M7V}mVu;mb2#CD z?}Se!ON^MHITBlQx=U`Op_jd!m6;g@2u%pYct#sPxr{KXF9b50dKxPc6QsROQ|L+2 zFvmIn!g%{CQ@wTOwmO^HR7cE9IA}_Iz)TfXw5EP?js;1jpObUMxLO~&2bRmn6Vh^J!EWF3%ocOaX(zvrqOh?DQZEI0UUoi zYSb`Q7CIzUZK?gpg4n|HSo_=*HaJ+nvHwleH|ud&w`_HtNcmpD?sq71_G$WO@n^VH z3iY~i;-nAox?vcFTOx2>FcpR1N{mAC#b!^9t>Ihg-`p8sq00F7Jp*fSAQU0(gV?W> zK2Tm#VpG;yAzO=%-<3rgYNUZ(39@u>NIC}(>YnrtQy+~)ri;@wUn(OZoucug_Jgk3 zY_3<~M6G=d+lOk5(Ht<@ws?xby{xMTX|$iMUfHTcL^k@uNciydUQg6=(p9S^V^ifX z7zXuHZtsNX^C7<{$`6o7Y`(P3EIVtly6o06wwR=Zm7k#R!zNlA#sbPl50?~%m978C zw%#1?Nff_RT|8_iK7nM{)p$r)jV}4wO}yr9oXCy0UX-ssWV%*FC4Ps-u?2lD26TGh zlke<>Tkli5sAQ;k$N8y8xOOBsDu3itf+OS(sA3{ot@~=Ja#tFP1=wv@(M{bWuReT`_op`D)H7DSo)J)zb~J zu9^P3UfnN}I?CA*2=S}l42vFSo;vI@4yR~QEwd$Jy8f@8}p+WSE$9AG&4e<1G zbW?eGgll*v(H58vEx*bUa(z818GDAsr)1#Pqj#&UaOZ9jGxu)LbO&SHzT@H+Mil(U z-C7PvE-XZMx*(7OeLZeaxOc?SS5a$N4Sp3IUb5^%tg{GQVXmC1> z-W={EdEj5}x4p~gv$d2A7|Br%)@zOs^^r+G-E_aaOS!vQv%e<6Iu=YjjMV*Xqln>f zktrG*k*4i`g*U1AXYxc?DNkn}yw8hIdIa1Pl4Lk;(6!Cnn@Ak4 ziZkS2g+%ox_pUw{egry`#i3{%Im1cn;q>O=KY^9nS2a2E+ASzL-Q|!m#BATV_6^;?)5^g&v_gg zj83ZtmdrDEV(q_PEN3 zXTW*f6mbKbAR7KTy)qajLNmPW5m-9i)#JXa%!3>I`TG^f zdGGFLoi%q)mYvpX&1Ko9KZs+kJVYmvJ*#OL%k#r{NL7j2U?0Y;FNyt2_Kbs_c_@*n zjUX$wnBX$taEQLltlyQ-7V;j!W7VyLOU;1^Bbxp#lm5%i@6!3zgQES$%=+$#gNB}5 z5UVk~qPfJ&RL-AFO-;3RTqSWtyX$m?Ao(Gs>y)$u)a*VRdu|W!G~RQanh>Y*eUH+h z)0$}g{C0>IN6Nz}#0FXUP>Aju?q0*Ng`yr6w_ZDsz|c13#_Cs;I)(M;Xak`=$6!Q|Jp+OZ5|KRb8l7j4@y6TY7JjY;#EBC%#(Hm0H_q9oQ>y<2avLoEt zjaITLE5=jc!R&Wfnpc5M-XiL2oyt3SuKhyu2_FK51?dL5`hM;9eeBh{^zouw7;A=z zAL#J)CHbxwf@0ze6KWZz(n;T)T@1RH&FGR+sL0I)JkUFX)zS&yZ`>+WJ>i6m;!`azm8O(F$2STwS*2X!c!q5J{a(by9ZnwrK;>T0a4+EiH*O6>9Szqi^59dpDRzV#7k zG{~$fh#4? z2$RIxZVFOsZK4}%WtdC(D=B~Qq!%Ka?NBV=n#shDD%X&AF^P9JQRC5@9~7(BG@C0d zQKC~w|6#{hkA?SRv4p+OH!6CVXm^nJI4iR zb1TYg)bv3Xt3#y}WS4Eq6p~B&_9PEiJihg;Ky2!zBYZ@mLOTnsE<$a{(8`?6F2pws z!sfx&<%E6zrorcJ*UCuy)p?RcW!2|h$%?oSW6E)ki6=Fpoa+6?@n&(X`QY11k0XbJ z_1}>~{iE7xz3;`76q8qP^fQS-{ey;qK3VYAZ=~6%@~lYxY;w2`EZ0*~^H1~D*86e} z9X#`2_^UOIt5m+5{(=(kfWWx>Z-;C=h7=_JirehZ<$anmWveCQmn2j==tNU`&f5F7 zmtH5I2M;~}16pquq>$qj&%~DFPZLRieivca5U4Or>S4vVOH)NXAdcgsj&Nx$=5!Y< z*kG;vE9DRBk}Fyf$}?my^D3S!y+8C>M5%O%eUZpY%+k^}xX3=f$6c2+jUg-5jf=bL zQ5wnX&sLCVeqo|F!K7&ulLiwG<*pXaby^%+NB-nI%A*|LNn0Sg@Q&nn_CEsLCb}=VzSUV-A&gLRNXZN1K-6$^Gp8-< zMp>u&LaVEJ)CDo)KX!$~o@xT?ltd%7o-PlxCStS2W!F4IpL7NXu-+uc<&CAh%}wh3 zF(kHehNzc=?vjX;u+GSO%v|zwP-(UJ-d3K)psl_53A3SBpIhYZd0OLu9(ROEjxTJ} z#>~_)Jl~<2?v67f73dmHPrSv2qz$@cJzGi9gJ@&P%(Wy#(Ziz9XOyd?)^bRxjPDWN zrW_cq18<$MROTv8Vu5S%ZgafE?$zHx0zaX?WK(8cFRhQQPrx<3+;S=v{>+JN+lGBb zdC`NlY1YbJw!aTP@i%Y!9-(cB-Sn6mc+!4^o=a}~Zi;D%kTNDTYiTeG_0MtI*L?e& zW<;g|*@DCGn;2WKk8~_KE9ocLRwl|Nl?!J`=Dx6vI_KvT$CGB;a98%#U?Z>b?x0f| z2z8I+1>Ier7jc}0HEL&99dm4{5qtM6jr}}}=H{!RL?=?Bjy~)R3FTu}`a7*MS%&Lt zRjOFwO!6t6Np@ewg)wOlX8p25otng-(X0|kcX1$+IwRnyKdxGi;<@EBNwbvg*EIwfjAeS0%LHx&6ct2VlRz0NqxV3YX#3#%zUmo$JkPcq2ogDC7^SnpN7DkPk36UO7bZ<>)7k9i}&Xq4e-W(-!4k^ zHlU~Bpka|y5bB=NU+3qd>P{PE@0}?y(H>2{#PQ+#awwB-v?c~|k{mVpX2>Hjx)9As z#yhZ-DgqyiHnl4|l3nRMFs?bhLiC{$S+UPPDw{Td>#{6mz>!u;O8>TGTal{7ON>rheO z;Ki$hw7+h`DJ9xbKSt6_TlMHNaKDPsO5J!rz_aUiy^TntS4dIrak|x-K#xfTS1Pe*_QL)qh2fyzS}DW7NP>_kl34YD%7t< zBynK+RaQ2o`C96nUmfV7EGL2F1{xnY^+xlQtaJtVd7KwU?QCAMukeBS9s*rCu%lvX z+6W^*e(*HT-f)9NTh}&|5g3QT?~N?Z_P;*@T=pTp$$IPL?XA8aXvtU17?GSOPJ_`P zMV!S9I|#EhEV!vrlo0W>oGmu!$>9N+ zw@RSBVv2QpqWvH&hIgxlnNhBUj3R9E=*9pS_FXF?^>`%wG|trKLy0 z3j34S$g5;S>&2HSAZigs``v2;Jnb(sqw1V6@y3{|7)D( z3_EB2ocFPQ>;2Bz+D${+7N&*=0=>17D3$Ag0$Y%K+$xSGpmhnpW+LlF zRl6-X!B|m5!&5`_>kP88;DpMiA`Y00M!k4fCBFrg)+riRjVNp3Fz;@zR-DRa)t%n< z&dlH!_P1IbJeDQRUmzrI0%nn)Emzozn1sda-)CR^WWfSxZueFA zpPkfA3KpjRR`{W4%j2`;<|jZ*vOGl;+VDD!u%tM-_7OOdKCLCIsek`Yz}QwSMqnU& znnAGAX}9fy<(+Sea;t7-<;U9iE0-S}_+>KGGWeZokPdn!5F)W{H?V9Lv7Z+C5Ye%D z5%r*c@fzRq&-~ltThaMyby)1ra-aK54cQkgO*+!*U#W11DbQS~Xmhtt6f?l5`3(>C zb3U3*Yp!T5NsaXb6)LdW5|^)UhKqf>gL|Yl-jp)BNKxLlY`l9s&CP;Dn-v zOQ*CYWt_WeW$hse_4WjOiN^bH)@-nSH?)!TEiA|(lG4$tm#(zv9me(b>YuPU-k+kM zmqrt_rw_&IBR1Z!v4DSHg8jloCKu=eR|l(>=y&6lwR7}Xp_mZmNmKX6)Uu^18tIY*9lFky!zIdJNk2mrT8R?yKwc;8@Di~(E!Ca zSBfkw`8U<9e?b zRs$1R-C7Q2*~oUjdx_i2VAFa|Eqf`aXTCwEy;1k9O+lDMIms5rSkbROTcZ#Bep8&bg_J zO9U{%t)7aRTWo0i6!t5va|%9q8%-7HDhMfUj}q$Eal&%Nc7cFPFM)a#T8YN_;`~fa zINiMOX~+1M;VGkl$-(-Yu>OyDAh9Tu?O`Op4cykepDKGksTTE@yJqrpU9Y0;*e6u5 z@|NhpdGRt}+v6`*BshYI^`GB6ZJkqX_(=pknLA)b!bg^z<4&tV`m)a?yeZ6#Ge&#c zTrM{DF$`JpUMOMe!^9nvDwuIj^6*s~z3<*)7HA~NZMxv0mi7m`QJli`Ru(q&iPk?h zvr@BPWW&acA}im)rTxe~iL%*qQ@)4JX^fdcS2LfR#V@I!af3T&#feG#4AW=Q z^;~OR_2zXHAy#}o9G0zl2}N#%%X3tRW4ZKSe{xNkcwyg}ginq8np&+T6yrf{6oSG7#fYJ!4bOU`6iIgv@7 zxuoM?4;jFmcqlay>LU#<;t0kR9o)ob*Uvv{#qI06R_f|q6Ej53ha;N4z^{Dud0$l8 zX-WlB`knNl8u*WZ@G`EJ#5OI;z1G)09E=Y0UmfY#hTZbg>&aD?*d4ZR`z*zgd;X}A z*@oIi->xbb_^G%ch~XD0p)ngn>a6#DS9MVC{2I%-FXpzambdA=B5g!OKOTYVTRU)i zh4UgV3w0hUPx%x+XZ>K1M~*0gafzist0aS7T{&|C-u6JjvrKPK5}c*(!0#5Jrsup{ zUlgd0?4*@p&5_7(n>*eTNSg(LlvNV;8(PShv3-_9Zg02Grl3?tlNP53{^VbczvMhu z#I}T>!>rC=%>u`P125&h?VJJ&`oWFMsl8*xz*%BJj43Q*Xd%~-VRfp=7bQmADD7yj zif+W+*EU`1@z+L86(zBC>*-8NZkIvd!QCoS)u^iPa}040z*;|9tcg&E7RSrDgdDwS zq<5Xu>9`Yq{wTT8n+=2ZwdJ|&6n(3+IDgKg8+)w=eq+~XzuA{g_?04fNz1djp@~*~ zV>)RjC!xO8o_x5iSU@pp`;$jb_1&x?(=%^Rq5)g>Evd?PW?0x*9_D89E}b)WFvG-? z`}8hqe8n^Pa?~_a@M!(|LLDEA_140;9#Q&+b)FT1l+denyagJn0t!)kAoLVflymiCfB{NxQ3t{werJRzI~k#DAgrhy0*>x1AWeY zs=ZHKmTc%qpt@gg)15PtX9yiler_9b*5ZCB62-wg9@(q=UV(QUGP1v@KP+na8XraJ z;S;szF}h)fsVu3<-E@D5|JUVePx+KJa(`NpSkn`iKaFvj78`+X{3)VDJA&}i_}1dQ zc}uWDOQ4H}YGiwQI5pAMGUYstXSSz+{A-)~=KS0ZwB3hjvKMXAw(t51V_qxOX9}$U z+-eL@D^Dyo|It^M-$n=?tx7d-SkvJl5D`{Mzw*u#5&cq9mWof%wT{sWKj$O~q#tgh zu2XUKgLnm3?Stt#R^@Z=Pp23q3@#!1KVdx~Y;$yLG=XCxF5{l;j{sIf7!&lpZIkdU z=%95pY+N?+X}tqoHbLZ#iAaWThs{iFCT5(2lJW?$3S;^7o)a$Vjk`Lde0D>h6GO== zd)!jivB=N_xnhcK%IsF?(JlEeBY|8W&i%^$I$x4zGW~?2&TewoHzolQwgIzmIGUp0 zH4sN>Dy5fKQK9 zG4#?I)?XM)=$(CM;Le~~`?*UYpZ-}i`&|1FdH0mMoHV0%-vkWvrDcPO2BQNn#C6ex z(PCYqJxh$ama~gRyR!(lM_q4YJ#Om%YDu$Bk&E@ zk$B9=uY-&m%|8fYk0>+D)Km-)^|qjO?IUF^iv065gBza_SwlurY+gDQ+OQeB+|Z)| zqUN9k%erslFI`@Jx6;@4yb|D?GqK<`fgE^oD%}v@Kv+15nv1Pc4?D{z6&p!{WBz0= z>R?i2@y}TfcWJt12^G8fGA$8y3)THelYAhJ_8#yWNwFhMdg1J(k^IbI}2B2@fFcVLc{Y-)-yazPWZl zA@ldm!?%u}q|F@CCt$?xImu_Ed|1|Igr}B)*Bkq2CY~yJV%R7}q*vZBxeUFojsEgP z^s9L6yb~o~My~Jv`y~9fu5HQsA69s=l|Byq(T;_&_6p-2H_NCyjx!jMkR+cABYp+z zLgaNvs5?ePU8;>w09J~_BhiOP;OZRxM%b!&rFMU|DkG7;m%=OAd(&d?A zQ0V4?Vg-)C)DMFF7n{$Q%hopen_(+iB$=e?Rk-nbYN#8y7fV`-t>qZn#09=VSm%xt zJuC|^Nfc07;-?=0n0ALyN4fI+%^makNB)wVbE2AA{~SG6HN@vYM`y_MlDg1w47#0U zX;k$pDMfZ`T6km?AcDk_ph|AM)qIJA}8ubQ{B}kwc`u*Sl@@co^&ej^Q0!? z;b+ZB{W=mTjE`wdH$BLW9!)lifi0K}8s%%v?U-N4voUdzu@`1(8#&j14dAccw~# z<;XdnSS%jI=|QU&TDgC{CqUlye72g7m5nCm;p>7$bJoWUlarM{(u7Uff9#EUf%3-! z6F)TJ55r_~Lv4FDVvSq&NkduEovmjjX=R7B=-+p(yMRA$A{GJqvAO0<;*2RQ86x8G zJL-twHNA0W)taX4_8&{ql$vf>f+aTKk8KUl?J^CupIh$is6ejlTGjcU>B;0|n z30AmN zx1{Z@7-Q393HF%f$#8kzFU{SOZu@)_$D&JPT&lD8#=JtFnD|@T0HN19g~_lZFwq&x zDY8Fa$&x@_f%#!0v9&Og5nOX?8~nl)d*q5nYZ~oYukss;oQwm)WJ|Ax93hp=q(vPY zvx~rSUT=;{*UG!S&=-Z3P3(Nx0b{~OvaI|c(h5aI1Y2vritwn*d^lw0e7-p{ri>X& z`^jFgK0h2jR6uxEL9tEkeMA$**ivHHx?rUu{hakPDESxx@lX|8!$VEnVtJmBbhDR}jHa26wgwF0W6D<>s{-3NcWnM)c z%9>A={xHM!5D=-%H*$Nz=i?+lMjBo9cMGPC_hwzSoLVoc+3_tj4>fo{bpKJI!^IgA zlxJaRuZhYdAx~yVcY8mf+Zg1xHjcgN=3t$oVzJilR2FSVe{Uy0hG)NNG?^Xq-qOg1 z+_$R9ZCx+aIiBCo?8D6~14Itwu!HcOeon}j(ZB-n6Lqsu@`LY^tYh`2&5fRAohzMK z&wkLLsySmBaqU_fe4^p=yGx$2f%J3qb2!=lsT8Dsb+2+ZsuCRWM#D4OKH?>*woZ(Z zj*)oNhokQ%o<~{&FxlOzu}s27t`6ZmUg23q(+}S=wb#FH8tQAk*=$3j&e*uP8qi1@ zPcaBhGB+5mZ>s+I{+HZ)*e@uiu_<+F>2E|6gi`>{SITmImKdAPp+~~2!6E+>4ihAy z7o9A==v5$>I)Wsl`H!MnCEF9!nVrAMrZ`$aa$VBe?LjjPc7vBd$k`cCy*yfpB(4=# zg?8g0QZm8%ktheu&a^jS(wd;AYT53;k~RV7bHmb}4!({`D)P!0tW#69uSIX6D6~&o z`rKtN_Ys~G-3}B>wh$%F18GbErn4MEeQ=O^^;+!aS54%b2RPn&DVyRjg?P4>c<+wX z!^G)cA9^Bpe0bLB6f}89G=^Dno_1A2gd>m0x3Z^0^q9ntnrAfm6IG&}Y=-0r7o?tP z*6OZ6Cpol{Sbtm`tx7w*a%P6{<`~W3WA9<1_-5<&Ky0Hzzy{Np16MVC`4{%E++H;a zy(Z1@rw@V&##2lK*u2zo%-E`ZI^TO^al5GCYzz}sUb2Z5FeS+>3}wuDC*RWKVu6xo z7yO-Wnof2OJaAJ}a4fx9Eb9WL!S(9`8cbU7vrqMZe!KE#C&KDF8yM}f*QGPP-Ef<; zl0&89zeHZ@_IOo3*XCJf&X3KGuaZY)v8twc@zEcnVaTRCttoA~*u0{B`B%Q38x#4~U@8Qc8HkfCr!K98@fH zY@YUFOo(}4sE(uX*DQF|^$%y#cgpC-Wmp8Myfe2E zBYKNJ^0lo1|9B$>-{PG1($Zz2eEir6t@7)ssp%Z=!P?7YuTr6SRg2~R;D$=Jr~Rv_ zj&~9I$sw0S>UVjdyC8ylna#I^TO%O|)dA0ZDVbM&flb4g-0?jOC)nDY4m%CHvvUG} zIu6r{EVuPnKYm>LtrJ#XV>TbC(CqI!&UQF!#7SIMz)A0-8nOQg-p{J61hA zOzRBelx!`uLBOU^;%d6&b~mFqQu>H=aW>|e@XVuYwrcjDU)Y^_qMjw~KW&vQuV|@C zz;gBG*WlwP}vT*#9 zL0Tyz;s+ZEsmGASuLP$iVp>ZT&B*RU>Wazwh(XnvW0zz zD8#6zmt3WE8M{M&I=FqN81!i3B2L%+=&Gr-u*RwyuP9oQZbrK|qBN1;Nm^m)+{Y%0 zK)YBW^JH*jmB~d`CleC0FQ9hOfQO(T1XcHwi6C_OriRKIKI+aiA6AK*o9W)}Vp(nh zL>a`yexe#Ff0cd|Xp&KF=!--bheFF4u z=uL;p(AARNbB0~fH$f4<&b^~$^8|ZODTh3wY>iNJCZENaSOwq&dLEv(M;A@aRN@U( z(Yhj2`QER{I8T1Bkh z5|){m3eF9|x&rO%OY$xHU2Z7KKCK-jk+im35SX^b8%d&Wo11)?#x)qycrhzVJm-bG z;Z`hCmv4giK_yMr{Y58FFDtKQ{}0>y366eG`Xx8%4VSm6E^K{%8}zxEn44$^f4WMT zcsjaTocOZTxuzMG95XYiOCf2B+8Is6nQU_%VmC=X(6 zDks@RZ*fy-W>&gA0j6tcJge9>k}bu)?ZdSR9!|TP$@)Hdy60p? zo&tft53jD538@}1{eJ>;1dRL1nRNq5&CYSgxw`4?Z0ugQnUq=KvnEjXvmQjJmbJNs z$ct2ERXEDsjaw2+bxKkb6{Wd&eK5L^t>L~Woc3u6$?R9#-C>ob$;w@&>b~sCe+{98 zJ5>w*vf2dO*-Id*r47T36((xb4#oU@QZOk4*g<)*miihW~$LwB&flFe(VhCE38B}%4tv_ z1KjWdV(8R6Rl0{=SmKJ7H`!&RiYeiU;o+*<$rVI#xI2YiOGspiaJva`Kvi_}>{=DI zueD)oZ()1!zl1F$EcXrn0H^)|{`^S@UbWt%_>=i)Y?W(i@%X5N{{X=!etj6OL;8N; za~`&Vh-IS&n~hs#*aT~9mX~XZXW14RmRwQOyIUcqVZ8?W%9U8@oX4<~wJJl>8IBl3 zqtLp|aC@8+D#$SmhP|k_c*T>o_AN5%Utv!rExMQDN+1W~I~mpuA~rE z)kz~OmFKFl$mvQHR#c=Up&%6_@&po8tqtq6>to3u_>1;!{U8RD-k_79Nk}JZ(O2m2 zU(byae0rG9Sy5UNl$4Tpr3G!?(g&UIyGlDL9|vE(dg;c9x{(pb=>xm^GbHF?gf2Z{S06FSkjdB)Ih*M;BRMt;NXCjW%HW5_B zDGZ+0q(xM=8kZfw%+p=H)R!AtiWHwINghI9 zZIN8<^1$<&Mc*8TL4Y$82T>=0$?|}~jtJoNYQ=q?#b5E1)N$9#Q5=-!IahdOojXhu zAeiLZ-)8B8jB+w~C+j8WQJ8l@UQ72 zirEW`k>fL{WzCe-nB`~_F|<6&(Cl^W0Kv=c-sC7Yb@!|@`&qj@Gqcy3GqcX+^yMNzhg3tT0U!_vP$x9ta+xR> zp{)E!7p0?y&{QQj0DvgT$;#P-rvf0=`ec+CH9ce{m84Gg;YL zSQBs|0SmhmCP=`;f9;n4;?=+S$-nsLU+j)XDHGO4MZjE7{>8$7vE{$`?^?L5?A)CR zF-`;wb$0S1%;6vTyAmoJ7Xy8QX8Y&y08juNfB{^9CEx|v15SV^AVSbCgqr=&dE)=% zX#=i=94kWa2KWK)gp4PE9U)hkVD$n#02_j~CD?5U&4~~}kiWJ6s{!CYHTAH)^OujX zWGW;8kgi-_9tr{g*=qo}h`hY~oqu_GQ2+qM(*V$k{ZGCtmQc=Jf<5U!HfRgbokx=6sU)?O+E&dsYn9vj1+5*4<9ssBx001MQ)|96IU;n@LCUF1d2MVSD z0384Tnu7q4o&f+i3FFb4UCsf@04XsE2?;SNp(7IDvg^@ z{_$_eOk9r4 z`9n8v!(%g{2l=OXK1~+uhh~vmCPo^Coex)v_jvJgd;sFVzRkG1HStBOu3~C+oG23k z|LMFEJbY1GsG}h)6k8^4Yj)i1UgCL&JD6tHS9Cp&Z-b0%OFJs!HYn}evtJdU!5Lz7 zUdQI`F4M*30cS1AHfU;pFBh0`XW;;GI(+qe35_tA*Hl}aMy(-DrnyhB8o?S5$jstq~nz*d4<^2w36B43SMcFvI``1i{&Y}E)ta# zzXHK9PZY%ACaVesSgX(s6{Vc7#*IHc2lICxq|tosm+h>zphv$-5R0>cgB~*|6u`xwIq=&fIa^uX zy|TIFgIL2+g4ZRUnYaww*i*uK1xYwOUjSy#!vvE&;mkuEF)wlhA)1yKg@5ZQ5J6G zxfA7dEz=o^y56?4%I`09W2Y#3(>kj9#i-y>J$KIw)OhJYG?f%cLy5Z%$7_r_W%GW( zvUSyMH1hyqDuL_Ov~lcpbf%mr7yRgZz@9#F)nD3D@uO^5KgQ+CXL32I^~^Xb>(zkm zI+v)4(mhG$K%HlgyjVYa?ulASbK%{%LdhY+&v)|upJ>_Zt--XA=J~~%P5CRq?7U;u zaO^YOVgl&hF>prxXr`h5wd*8vSu^IN&Cjt%DPv-*q!J8ODD1AWP^Z#6)++51h+CXR zA9n{(Jf*4LK)G)&ix@$&M+@yEDl;ZL_^ca~!{D5|qlkB>dh2s6cD;d7$uD{I2dnz8 z7_P)nAmQU#LTB+)S08?jz$ZBv&SVbC*f}Hr=q>q^AC%X zU9-AsgLK_OgN#x|k_vH%tF)`5;{kDFI78}!{PXgi@tj$M8Q%VSU53mts3smwfQ z^SqW^yWaPjw@;tVbg0SQu;8=TF0XbTbElPN%9IP;67#rC&6XjmVUk=LV!yXj)@l-> zfI}r-OpJGFM2oi6B_$=f-yiZIRKvesERNjxD{HPU{l;lPD zJN52G%Lio$Ml5;;&v42UV!d4Fw z$rCq{gna5}H8I3lXFd;GiSy}k+6XQ)QlY%lr`59N9L8NQZl+lg?J4w42&vvDbM_ch zezq?|-%ZZ%z35-1J;4(fansZty)8Dp*WHR}eKknrY3)+VkTQ zczNI397b(8ExyQIWSacY?k7J;j)tk6PR>4Q){TOHC>?&pVxCy_gHn-vBx!VvF7?ME zEnWEqW89|mctB~iukq=`m4(b0>CP5+Dv$3-k=}ISK7>Rw($x z?E5}MDvsC5ui-8<;xK-v1^lg3W}WM7@uUvS?_DqWD`|{F`~3YrOK_Ymxzk7wNcBrhn2P5FW55YTyUfn9X!Yc z`GRb*teYM7_(!d0;o{r&VoUYhRJV&3yhOg6JkY+c*S(*4AamNoQeAm;;83!6tUbk( zc~;1~akQ3ep{j)R#Ph8ZKa&%Z=a3Kznt0t>E+~lK(gh1S)D(dEkR=t2+Y zNIc?YLgVr+E=)Lf6nbSmj>8*+J?79QFlkTyEpFs3>iN%&<6WrELw# zvn(-*6B}-i%zdV;)y%6|wFzZq37K|oNFm##R}(}nm7&q1#V+v3 zXX-bG7L4jIDrhO{fTTN}N8@Ny7o{>D^j5pJhlubkt0C$(jyoZr-#!GZm*Y-7ma4F6 zRM{Wq;LY8LEBX$VZgyOyB@+E$B*gN~3l0>;?6sfT^Ji8HP2M{}2-F7A-O7i-KmIGyy{GU^&^MJ-$8P0ksM zc4;^`i;^6a|8}Fn#5!&3cty)w={3 zW#(5(XYslL_+X3Aw2i?}H`t&<498*4M`}H^reNv;iKE?yFV|Y=wvfz8dr@J93}Ld^ zV#vUE%1DI|S{k#t3E5smujV`)MD_7-z0`fwg5?3D-e=2~fEReP$9%(e^kQdulC~PLd!s z%6~yO?YqF`VIuIsQlhQJ$GGLphG@A`{|^n)f>iFx9ZGj)jd#SBD2mk+INxBX@8{}-d8_MU5e7ds&2TiLu z3BtYXJ&n$00S)%!YY%j)+q~qA4~aiBQun;!ZViX=_vCrH=grz2bn?@EEQMn26$8BV zKCq+pF41i7Uf~^O2_xB+0A4h?_lh2WzAOu-UVn^I)}$YMJ72+7{H#n$VbfT?rt&^(LkZV4gBh7a#^+o2JiA&;Mf%E(>pDJeB9ax111Bd-XrziW zg~J6Vvfh~y1;=hk508|NUmw|?RIcV8=T?6c#H#JMPx?~;9^G&1lnJ$(gV)a#gJ9jy zwT_SYz14rtYS=M$1br509lIuQgj2=MEzd_@(I5}((bG-Z-hKQlkzX4I>V>Yz-R~jR z*dLcYF7OazQGF-^gEXoXr_!M+2D?AlIeGL_@FL0NSATE4U$E$HH&4!BdKH@L+7-zx zZUa_BV8(xG``-JkFiW>}l76+3xdYW!u2$5Ns=Idgw< z`J@i(hxOPDSV}9n}j5!0^EasIO&uV$;bw_$ch0}!p zJjv31=qWuoTfg0`+F%|jO6BisOxEQo+>$p`G=6wQrgK|6PMu{qq`UvLs=4oxrRt!z zyDga^U8t>W@!EKiZ2$9Eb%i`7O3Je`l@l9VEt)7BoPkm97(T}AsKE^fe;|~wj8+mU z;e*6k)0dXAD{Z1gex(whR4RF1nb-}~G-sOqkjrwJeh?h{Tr^~uVZF>jlqR)>YM z{OmQB%yfe(_QZA+@shDUG5fed+sa^A!##=Ei!|qx?RHqWf-RMx$6(1wA1cd@R|Iqk zFd&ACB$nC*Ys$n#9N2Bb@}2t(-3xfUWR!((zyC3P322Yw=ZR#-1RSNz=d-ebGw3bo zMzP~ifAJlcDU|)4OMuv+M1ww>*u!bbxj9j}E;*j;E=7sAk><{6#d^AdL-o(tfw&sv z9Le*L4L47Cuz{Vs2+E|n<3#sGOUo1iolifEY;;}a+ObpXAMTpF=%Z(kzS+)?2=v*k zC1G#MQZ}8fySzQxmndP{o@wOwx@mfy)z2gZ1!JG@Pst6uU7gc7_Nc5MW_`5N=(27e zRDl^RsjzbexHTx8_W$Tzcxh;1izkf?Z)h!V(?}XBIh)cLL@KxrnY@U+%g4fc2}nK4 z|HL4t+%r1iOv%G9*;m&cn_P51sVFC=Ep(WY%Sut4oSE!kSEBE^f=UrxXhmn@m~x4g#Ir@n!S| zO=0P03JQGg^SZhh5`Wtp9tgCu@Dn?Gyzv+O|st>rYx^xy7)0a|D zpTry9yU9X=B>bn@7le3(75_3g8qso@FCY89UD9|HHIwFS_(z})&w4Jo(%95ZyH;xK z#vi@$=@dO^qI~o_jJTT5 z>$3h3eOr~lEf;7wS6XxSs*oRXBS$kt&!z^i_$1jt3lGLyG_wz`-A^jym&^K~Jme9&+kbKWJ_u2$=NW!{H@d@TL~`64S@qrFbg zW!^=1S<|K$-G~a;@_Ki1MiOqRu;3-NDL{g$SF!tp%3K9C5;wEx3e;Q>4SIFeN^ZV5 zYSLTj);6;_F<7oMQ^50|KO0d#&8mwUd8t>@8OeP@caUN7l~*nW9IBtZrKpEvheUW} zvW+~kIFJjHN?%;HCy^fA`z?;L9`*O|nBp6??R6+zg{mksYsA=#Glk2O_h4@U0oW|M zV-~Gy7bCnGDzi+*VWhZKr%(+hw#@tKI(^$}66FEK5F6thoQ5Y$JKEkD?LQuMOTGxw zw4`>2h+fdEQx0hKd3?4a`|$X{sefIkgtn{ve&(RdexR1~jR6Z^^|O#}&tbN`DGP6k(lmL5%MY|TY1x4LdkAQLIRZD51Ll#^f9aSyilH1{gL zX*+6o>JXpiK3X~=cqI>=wox3 zNtPIq!N*%&GSYmJ7;?l71zpU^gaJxYFN4;=x^x=Pek{R_m?tM(5HA6iRKa^~t&N3R z5?`*8UY<>&Fp*V{Y2G0svGuG`?G^h0(UGhsOO4Sco=A}&9O539Hjm7(iaoD((vkj~prrSx^GaLhx&rfJpoGGZViVZB=h~Bv&6KMSY*`g;hDv?>-k?|K^z28i z$LxhQGncWH`Zq0gS*~*K&K^Q(4O|pj((OmL^~x@w#r2vvv6YYd0w(+G2cWbIzu_(( zHe{Fct#Ls{o|}P`P6eQ_;)=MY8Z3h!*LlyDr-stC={kQs1Alf)WJXCzIRDcQ1;q`? zrZ};XcsBT1>x|{EtMg`l;{vXY=1=fn(D+tkoZ3&pCSM#E=L%V3uU%2Nz-HrMqqxl` zyJD=VO?@6eGq1GbSQe=PBUsz(1(T2qEc87m0;A&lcvp|_k3U4baCCl?q|QVah2Jc- zmR;^#f6Vr$d4fZjusu{NT`Li+0ego)s$t^T0^PJDT>Z_8J+Uh2 z>kv7lkfo9yw76l@9?5kgXTaIWUe|f0Olu>pegBSqQat6l&QAx{Ij+^>i$?aKZLm~! z>sj#!FL)`D|2W+;8Kqg21w#4~n72?Yp13+>{8T6JcZHSr5B<;eJdG5;UsRK37}zsy zIr)RZ2#jJ!pgQP1jh|e!e4uCL7STp`hs}&oo^<`Jn~_wxMWu*T|7MAF_q}WApY=MmS9FB~xWYB>NBa zazTnm$~{23CrA?OG^OpTRQ03Lul$D0@ozuDZu5Aa8Ly~M=o|ivZ|K7D(qgCHmw*_V zA-eQP&Zn%#x~6{%>;Lpf`Ua+YMVc;=oGE)#{uyS2tRc5m-hLg^_&<8-|*f1 zEo7T*k-jHrJzIhoS<=kW@CB*&GyFQbvA?y_+b5?3n)pV-%G4*|-kJ?uAcb=Qq}ay0Y=R%S_1E{5HR{<&@`*npcVW;VdAMpcAF2<=eO&H@Y?X z9iN>rJ6$QNv6af%m0+6Dk7TE0=BL!vg*3p|ioue5n>L#_M(yqx4i2-qRsBTF;%MCb zx~r&nXz4#3GJdZi)Aohf+$@*fc93wW3y%q`T_*0-=~tsY8fM&1x&)LQIa$qPSyvpp zQC2GOy;Yee5{X1JF!c@Tvy@ziatR@ibs@0`N z<~MC%CG0Z`QE!)H^qUd;3`sefTp>HX!(Lilmq0D$?~37kxF+kX5+Of76ou}=;>E9t z6+6-ErcH)Zq%=z_M{1JjcRDElc+F%F&A>bSeVzhX`sHFN=|3$@O}ms)NDp}mwc|pj@@dU2VN9JmoWX!8H^#t}t`MVm_zR`We{bJ`PhCM%{HAn4r znjxpu5ll?E%Bt()xs2xuW>2ODhZ-sw1Gut@|ETMF2|6d=L~W0-*%t076m?>@tTv$$ zUvzS8$;!f**5~78H|x(-eM-E+Gvcb+&i6jb=)g=J9hkiyXN6q?C2+za{H$sVTbk*^ zGofpuu{nDXa+S=DYtij?(A!ySwR88xF0T@w{j-Ab<9I%kMwG#?wLzxLNwmbHfi z_3nX`w6DO+8qdWxT|0E}yOwI07Ea2k7-b}x7}bkJQ5g4J0`zAaYN`%+xk~`;AaBfD z=Fe^}AWd4|<%X;0TkuDQaGFc(M%S!)iLS>J9a!hDLmP&LLr40 z0<%KjsG2d>BqIWqsIufN56bRQtn@PscD=t@W(E_cQy(GzHDm*4k9z&bvVWhTcXYxz005(b(h3efe*O@?2w`-Pzt0iA4`CJu zS35@t7eQFU585DvdynGwfAHK9cKL(%jlpy;;kO-~gu%(n+!XT2-wzI8fDX_Ae83(A05{+X{J~ksdqJB0dmidH4-LE_ zjsrCNfDqsZF>8}2-`9FF?y^s2X!cPF0g#lpD1HdB!0H>k# zm~6=7KoihVQBhMNXsD^FX=!Qb7+4q?=;;|aPMl<7;pXJ!;pRjl`Gh1z_yi;bkx0?= zViM9aa&mIKA{SH?P|A|Ba;T#wFj`t#26_f|Mn-lNKawByUmLj7 z1x!$OCo%ctF~9(aL0g0~12yn~*QAFrJ)_VYTYqLv@FStPVQAfP`E(0j#3k8hDv+Y7 zsN(hCYhNA))7;c85SR6qNfQvoX0Nam+i=cQS_Sm(r=8T4lVQpYoF@&gx!rjvi|fia ziVce7X(}D7=cc>8^NSo?wYre8sRU0y)CHfftm2Rl}B+f3a_9o8q@g_=R zt~WCJ+meb5!zY{;gB?st5OMu;|I5hIff_Z|g4Z=SXvgEUFO!CR8}XM)cvA&E6jz6B zZ9T87#a!-=Bwi@s3j3P1K56}>C718-rdV3l4328rBonDoPh}vwK-m42YIw$iutCvXnuZc1_r!K#Z=;0w2jS-cY zIj1v)%(I@23%|JkM7l;rPeePcFQaxl!0F(A3(t8t8F&~Bmn36{QH9hEKPp~NFPRMO z&n8YN&|5#wk2Q9>p5`2H4r`(gH?Wo=vaoGZo6;7xQTaGtfGcO2>=C})2m~~PCy1SN z+Y9D9Tq|RhUlx_H#IIM&w$#Vh!-lwwZV5D}TbCHSbGF^d`I;lobtz;DW-c&q->z=Q z6BgP>ZTLOnSCv5v$K@CMNh~_02j|l?9BUfJeJ=1trnot!Fi)o?ioH*x8S}8r*xd8A z>3sgPQr_uL7K~x~=jt%<2(Ln+94DjGyIXReZ&9=I z=EB0R_wL<$tizdQk12eYb>J__B#?O^XY~OQ^sO(H?waQ1$P)}V@b^lW1=`J4&(_c4 zGj5stFrJq%d7m)Fc~-FqF~aInp)!;-Ly@(>-mWp&h`$=l&CTwFIyN?+m7-OGdIqaT z%bHssSelN?T%x=~WL2^p`P|1g{b;ksR>O1a6KjQgH8W?~HdS?Qj76PAPw;@oqBX{h z&{uV0dG712R-}FGmNtpbB8sPeI5E8+ceP`W@NG~0cBkon(i(B1`Yc6PKu#Wh=*6^F z^u=vChs`TpR1GekekVl3HFGgHw@M>9I!cUNTGFzUH?y2GJq+^;8ZM81-?OWEc}3vj zlfo#md7GckrCy46)=W6hvKjlUEhD&_U$pC24`Y5vPjG4b?%UkJe^eW-<6XQ~Ts%H8 zu8h-Wm!4y`I@eTC8!N5-aca&}d*M*l`p$f_oCJSuwMQJ+N|Z_u#-o-q<7sgZVb&+00%WLgau;UlxU2djQ z`FR@QV4F5+rCB8;&p}}2i|L`2Yu{HcR_Kp+TJqpSc;~Bfo~9xj)Gv*t4>B}-=#Myq z*f8yJ6Sb{SC-Rw5`k{N>g(uOvL43{*9ikh&)iw`mKY1(DpPoUTIbB)Nl1Y6p zMW;Wzw$7FR${~Vs=kW87;l-lqEBgapxwO$X;{2ye0?FX90j6hdJfTulaI8GVb!n%e z_M*NcVeaLx?%H4P^$pQ8osrjL5Y{?FyUbGEr8-rv9(xJ3-IOA0#yi|vY(@_pgC))- zHJ^E#x#}b`6qSv8+EPaB9%co3CO+O|z+MVci9lYtz|m+zCNal46m^~cbGL@=79-gC{35Yd~g zwNl>6Ht%HPvVyOBU=hbBadFB#BC*;1eapO=u8^>WB+Q0KE%bJnth;r=si#FYwr_jK zCv-iUqBp-ywEi^1o-feKTEQJ?kobNSvb(xkbGqTbuff^)jf6wM?7yL zW^vj+?-_CFy3{10sDB=HIW|xves|})eEzIyTUU%%^~=x?s(AysFYlofJPehC%SgkT zZcpSgjNkcg^Qmp>{Sq(=w-nJieBCD7nObPiHq6wStQOj(D!MFf7(#ixo?qR${ajGHgU^_#StYt%Xok~6kU&!R7G zwTO3QFlw)hTHd^D;?nR2mo!J`h7rv;58cSIZ4OC}SNBd@X48k)h8|?}pF6dTx|h35 zEqE|Q+1Vu&9wZmnH%qH*U_Og&Et|tlG`=Jh>Ul}_R6D2p@20Ry2_W~Jo;Qv3R}7QP z>Jnyq*FKYhO#0T!%6)2TJon;yA=ZANtqCS#`m8SXFydF*4S!O6S**iT-_&T;SwdG; z1uWpnO z%uKOyL85}4cy}EOp<6aVqZ#f+t6^^~IZS&nD|92D+2obl&DVWRs=hLDEXaFvugK8S zwFk4TtFOD=Qdp~P5y|QYDRlVaPZDcFCV~&FsIm1Osx>$53YQftVwAW-gasQqz^+PZ z4sp7u%(vSjUOAg;Y?RGSSkMA zQOihA!7lSb`xs8=RGsDh8PugHAC!-4`hMWVR$x8x&IJ+4!q@fNRk{OpXIcx0eA|4p zq~UOUM3E~|R8r!prgC|V67DlykK*fMDG}&T=nnnaj^Vhd*&vYreWx<n~&a)pF33CB}L z$6?lgcm6C?tI>Rb7U6R=S?d0)>O`iZVpnQ|dLgf5(@CQ|7Fax9cF~J)&+O6Ds!tKG z3}5mim2M8ftt(Q$v{N8o#_8s|U6$d+tStJ4b;H#JNvi5}^EZMK68VZtExQs2S z3O+Ac5TX^kj$88G67bPE9GsC!wNmQbZkw9eOMV=o_n9 z6)@e+IE_Wo&l$Xudfxdfl?)~~tRChH3gV}J@*vF!!czCns&c!%*)ARSgX#NAb#AYU zJDH^O4f}p;nWVibO;j=^5&8ub>>oGfC{|qlj@Edae_g)#BCbA!O5w-j!PQ2!b&g_d z}qeY8nt77!0BVfxryR3}AXDdJu?_m63^=g@u&`%)rLZ#=`#Z&GMfK z#ebVXD!PA*Ec77yf4~1nF5d%K=>VaCP#}d6fRdF0$Vze92jB$&D5!w{uKoYeQc=^; z0e~P1%70^R761j1k_t%u4=VcqG!&FTDr!~$4VxgXtR@}1kh$X(Ic!)WhcLXL4#cU| z{ar*}yYQ;0&LgkLBw}yh*gq3)3IOH5i2s!Vq^6{zp``%)8_Kf&OZXQ-38n=8zZ?Ej zQ?UwCvkA$XJF;ui$Z25{3+lSZz6;B9h8jnwnpRNr#SQ>yoxc9fo8|F$3haK<6KoBg9aK>8w$N&o&d5$ZI*o7zw!4HFeSSG zR`c+|vR%kUxhSgkNZGmOi>--u!SFDL>$p(Qla>{?9jtyKJSW;*1fY&J@}F2}E9Z@X zeVlsRzL2av{Ejt^54&B?2{KElR9K7qprQd1c^0r{ToTk_c{0PE;o|wE* z63xct+(;jUMD5%{w5;;vyTzrYVW zpo!nLkxfv%1T;?HH;Pe#E3v|gVCa|ku z?*NJszcvp^v&NIAE8A+}FQhzQ$Y7t|GIpVs&DvNEK*z4iy`>92MKLBnk_vri$K1bl z3$xn%#Apwy2IH z@vW#PDYu%ZTk4<=`t$CEbYG*gXIpFMz}LW{4{QXAbt1~IE}LyQ3B=X9sMpg+mK0{e zTrvLE(jS~?q1L3p^@R{D)W8~2bTSiLc36+GroT2`K}XMR{c82F>v!W{>!#~LTM0V` z_3c`V?wyivFzAOtQOAZ4XB(_S-X%Mp5Ne9A_kB*D>tP#rX5;pazZ*Esdxna%{`$jm^Cb4L?S^I1`&C|! zKey4n&lm2X6!)#i@dY%C_tzCWrww;xhf5)PZaC#{uRZLDsZ7ye@PxbMO8UI&D-IJe zZ0T*6`HJY9BOx#0rl-aVUorTw?MQrx33UVl`NZ73V_b0~;BN%O!?-F;cy_!TJn{C5 zoz`?Sw`~hPwsK9Ye<{4XZvF!Ey{9Z8Z7qEA zJEzczaT+wl<0;@)`x7y+MXLB*Qb(b@B-YRdbPrv3J$~_p5zmUR_osoEq^izw{X@Cj zD8fjte8ZMb;S9%K&7{kKty{L-SFPhS^q1rQhN6b+>8vfX=EZ6Kq3~+caLW@Tp!RIua-0#xgEl~T9@!8n8In9~N73AKy0q28N{%s&%eKm8Zk5fLc z-UBOAyzRcXOlnWy`ok;yC0w6sBkK*VoZ9Ba=gn(S(l0wk;O3@H?Y~+sU~gaiKu0<($7q#LtNYc&;uw z^n%Bq)!vQKuxhIO!(=j^unm?l5cViq%yxK0*|tFYNAdk#Vg-ZSVE5}DUs>fS#w0ia zGQR6Ns-MVHtul+GdQztmO@1gN{U!O%{FD|VZ9Hm9_VjVF>JuLmUesM`^a5*N#XK9G zz`gV%)zSDw0mewSMy`#S)pa`9TFk&5H^8RlUaFbJsg0k*hgg|*dfx; zW6p;uRQmBl$5-D%Xf0=gM39crDlUCXB3tpepZg2Us`j+PikyX!Rn6k7 zWO|ESmdXf{W$m|2x%OQG!Z-ak$~Mti6g8`i3#vG0#hq!z+<0dmXB>+UEeVWlTgeYem=-hSPK3|Fc+)ijWgV!)I5}2k3kwHY|MUYH+OQZSY}|Z7o+oRa&Rt> zj!fTh>->psy)i4$@572H)C;`>oB+FeBqxnc^lei|!(RtE_BY}A{qm|A0_aeo)?Pm7 z+4DzT;|(2L<+`{by?j#{q*u4sOR~-ohXg9@`a4$l{LrSxeOWqgSGyWXkZj`PKzwms zo0;zK?}^9T0VtlN!nNBI-eX)BnLR%+>EX3 zly_IVN-e!ruvjd7^%q6nM|X3VFd2>7opEsYB|wJzLSzV$3$hrkIk7FaRpv7^I^Bh) z^^sz)tXr+h_!NhE-ISTM0Zy5}1ycU){V^dH;c1q-!#Gn?nX|XF9rVvZazXgC(09V$ zPW4S&t*r-mFK{&?@dwW3#8@6`CL*CrjWUqa_7iabdt-XTK&>XCi6VqJO7x&9hr7*r zw-JOq5j@i3em*qJxRLLlq7Qjrp7x~({vEjJDeNMWq~Gxqg?5Gqn&+=ro3cNBI<_Q` z=itpC=Yh^=?aA<3BhKS>;y0x=N9mqqN}9u?By9|oiTuP~;XfU{?d5sG`n;PmkJi)Ioni9k+LN7%2m4oxVRZI|9AV^ZIF&&NxE ztTROK87b8;j4owQnu0EijW%%Qssv}P&@{h#>m&Z|;Wuigx_W5!9BM}tU&h^O6wyE; ztL=II>q3@qRrG#>8Z3xJOf;3li`8pU7Fos|wPojN3+Tzh>$SqNz>eY92f+mirh8E?Zrr&NAd1B7Zw}9#){DxU6Gh)jPbu%Ul9?wrhzk>+yKQ;+~cGLh`^po?pBA zRT0S*0j>&DUoEM&ee*p_Pb&K?IS^hZM(zS`r&W6T^wnH*-_W zPfifFMyd6s_iB{uiXOAqdt`x_6>WWNlPcNtB|Wd%*q25LwdV77)AXhZYE|#il|b_~ z%*-dTI^>w!7@n2S!HKFjsr9ka#rMXGDo*&?f7hCllAu2YBrW5*q^Lco9iQFHSHs7I zd5tfujHKKUes|I|hxx=O$?iycgm6lZ7hpY;^ad_gc2Um(T8p9zE^ygT zYQ7<)vlf@*k5$frIb2tc{gPPKDH^|;eV+xkDA((+zB-sEZqE(qswjA07?sQ)Ad1!~ zhr|tz8b1wY)d_%MNmrDp>>N|2o^!jkcD^g;h2=x1899Ido@we-Ym#SdO_v?7kE49< zLTE3^pRl>vZk7WR@Pz4GvOlDS>q#X$dM2$n8zb_=%9eUL^y{@5#+AqVvs7W^;iP)$ zUy>ZG=gM!943?&Nq?GQIT-1P6}@d*@Pg*lLezEKJD znS1cV)No91*2e2Nt8!j5OT;U%Q$Oqjy@bu;<5IIWUED!Pol9<-ZMsbaZ*Z#NjmHn_ zhKhJ>MykK?FSbd$l$9ge>r9Hr*Hc8rwPxd4tnf{Fbkq4oM|{?56}A1&M8s-al<<(7 z@_h0K{EvQUwrpu`+ccgg+>A|Sex2bhk?F9drrDs6=L#4}0LNHD;#15SRsvhKFvB_p<+LR4nZ? zddX)<>!H7S?pP!Xw=2`~nLS|fwnqYsok*kWkbwniZ*(XRiJGI>grPPnOu`JhvhX}z zI9Dvw9Xk9R@|EymKQ*YPI-gc>Gfd&bPZcz&+|l*LbpmPh_-wVKV)xvwP7z{XE7k#c zMw^$rJR@a1*7#NPt&U|4eiE5(%sfdp7!9jRuq<18Pw%xQ>#U3@m2-hvJx++a?g--h z+#5-=EyR}+m^89EkqdYC%%t>5bB<~k$@h*pT;99gx=NQ54S80}i zUN7h4p0fK^^$V#iIGTheAtHehpb76tgtSFBeyDr@s3vng=|{e(?XsYWT0NrFa?4Oj zjOD!8`h&M}!6RCnhR?v?Z0(Xz```LqH>0+;J?|q7+?H4ue!Tq^*WdoLPeL+1yFp#A z@Y`#MfzKK~KS0FO0IJms%$%s2*oLRvEBx#bgx?K3z)g@u-THrV#ZZVPKhBQKX;NxzU4O2-8YlLKQEk9z zSb75DRgkAz1j8M-d-Q|}B=o7AJEUhi<9rxvuet;R$1|`B> zThd|fL6nA@ao*@02XPm)3pSq_^^-jq9C}Bl>6eVT!&gr5JuMdGFQIv}`0r zD&*y>0TZq7{SbhmZIQObaI@MWkn2|q^-AuWx~E}XSqWBuo%QwRTq z9GG5Z3>hVyc(ztq0DL)XES$S?r-X!WwTe!Leh$kiGAU_b^8#hExs~S}MPpD?z7r2q zDh6ii%<8Vb&yKeEq37}0`xjzxE|Zh}w7m1%%9GfeOE)!I>oJvmN&@t(!C+JHF(5U-I_V$y*)!twM9+K^mDBdNy%yD^ekm zRV3kCt#So7EQm3mr9&)Nlc6FH0dvJX$?Ep`{Yvf0$s!5ynV1pZ)u zBJn+WG|0(G0YMW{eD*JxtpQ4GwHV+y&2SYmCo0vJdo~Lh>sl3lZZBK)Iz{_xWJ7%U zq39u?-f#7#zpKjQS7(Y%=aKU&mw*Ooq+gYty%Mj*#OV6-hY2ec#!01=3kTCF5>)f= z7cK!AtfL}#(~h31m@X3T3!9H?sKy$R38HO_=r`h_HE8S;@cox0l?kU!=SNsWmp#uP z20RZQ^hWBg1agRR~K?a%t2CuoA;K6Va|bPry)CRXgq_A#`Yg-{h#M2P!9_}^Qx zy%3HOPWm-rl%7y_1}z~rTjJ+4df2=P)P-gW>>u^WQARhW6v`SM>rJfB9DckWN(O59 ISzgZl4_`^j00000 diff --git a/src/assets/styles/index.less b/src/assets/styles/index.less index 7528d48..95d00cd 100644 --- a/src/assets/styles/index.less +++ b/src/assets/styles/index.less @@ -28,4 +28,3 @@ &::-webkit-resizer { visibility: hidden; } - diff --git a/src/components/BlurCard/index.tsx b/src/components/BlurCard/index.tsx index 2b35e40..ca8fb17 100644 --- a/src/components/BlurCard/index.tsx +++ b/src/components/BlurCard/index.tsx @@ -1,47 +1,50 @@ -import React, { useEffect } from 'react' -import styles from './index.module.less' -import { gsap } from 'gsap' -const BlurCard: React.FC = () => { - useEffect(() => { - const UPDATE = ({ x, y }: { x: any; y: any }) => { - gsap.set(document.documentElement, { - '--x': gsap.utils.mapRange(0, window.innerWidth, -1, 1, x), - '--y': gsap.utils.mapRange(0, window.innerHeight, -1, 1, y), - }) - } +/** @format */ - window.addEventListener('pointermove', UPDATE) - }, []) - return ( - <> -
- -

Osaka

- -
- -
- --> -
-
-

- - - - - GuGong GuGong -

-

GuGong, China

-
-
- - ) -} -export default BlurCard +import React, { useEffect } from "react"; +import styles from "./index.module.less"; +import { gsap } from "gsap"; + +const BlurCard: React.FC = () => { + useEffect(() => { + const UPDATE = ({ x, y }: { x: any; y: any }) => { + gsap.set(document.documentElement, { + "--x": gsap.utils.mapRange(0, window.innerWidth, -1, 1, x), + "--y": gsap.utils.mapRange(0, window.innerHeight, -1, 1, y), + }); + }; + + window.addEventListener("pointermove", UPDATE); + }, []); + return ( + <> +
+ +

Osaka

+ +
+ +
+ --> +
+
+

+ + + + + GuGong GuGong +

+

GuGong, China

+
+
+ + ); +}; +export default BlurCard; diff --git a/src/components/ComponentLoading/index.tsx b/src/components/ComponentLoading/index.tsx index 4948c8d..5309902 100644 --- a/src/components/ComponentLoading/index.tsx +++ b/src/components/ComponentLoading/index.tsx @@ -1,8 +1,11 @@ -import Loading from '@/components/Loading' -import { Suspense } from 'react' +/** @format */ + +import Loading from "@/components/Loading"; +import { Suspense } from "react"; + const ComponentLoading = (Component: any, props: any) => ( - }> - - -) -export default ComponentLoading + }> + + +); +export default ComponentLoading; diff --git a/src/components/Footer/index.tsx b/src/components/Footer/index.tsx index 8a23603..4608c4d 100644 --- a/src/components/Footer/index.tsx +++ b/src/components/Footer/index.tsx @@ -1,17 +1,19 @@ -import React from 'react' -const FooterComponent: React.FC = () => { - return ( -
- schisandra ©{new Date().getFullYear()} Created by schisandra -
- ) -} +/** @format */ -export default FooterComponent +import React from "react"; +const FooterComponent: React.FC = () => { + return ( +
+ schisandra ©{new Date().getFullYear()} Created by schisandra +
+ ); +}; + +export default FooterComponent; diff --git a/src/components/HomeIndex/index.tsx b/src/components/HomeIndex/index.tsx index 3358b40..9498727 100644 --- a/src/components/HomeIndex/index.tsx +++ b/src/components/HomeIndex/index.tsx @@ -1,550 +1,553 @@ -import React, { useEffect } from 'react' -import { gsap } from 'gsap' -import { ScrollTrigger } from 'gsap/ScrollTrigger' -import './index.less' -import SvgIcon from '@/components/SvgIcon/SvgIcon.tsx' +/** @format */ + +import React, { useEffect } from "react"; +import { gsap } from "gsap"; +import { ScrollTrigger } from "gsap/ScrollTrigger"; +import "./index.less"; +import SvgIcon from "@/components/SvgIcon/SvgIcon.tsx"; + const HomeIndex: React.FC = () => { - const animationFunction = () => { - if (!CSS.supports('animation-timeline: scroll()')) { - // const SPAN = 'max(45vw, 260px)'; - const CONFIG = [ - { - x: () => { - return Math.max(260, window.innerWidth * 0.45) * -1 - }, - y: -10, - r: -8, - h: 160, - w: (el: any) => { - return Math.max(320, el.parentNode.offsetWidth * 0.55) - }, - }, + const animationFunction = () => { + if (!CSS.supports("animation-timeline: scroll()")) { + // const SPAN = 'max(45vw, 260px)'; + const CONFIG = [ + { + x: () => { + return Math.max(260, window.innerWidth * 0.45) * -1; + }, + y: -10, + r: -8, + h: 160, + w: (el: any) => { + return Math.max(320, el.parentNode.offsetWidth * 0.55); + }, + }, - { - x: () => { - return Math.max(260, window.innerWidth * 0.45) - }, - y: -50, - r: 15, - h: 360, - w: (el: any) => { - return Math.max(220, el.parentNode.offsetWidth * 0.3) - }, - }, + { + x: () => { + return Math.max(260, window.innerWidth * 0.45); + }, + y: -50, + r: 15, + h: 360, + w: (el: any) => { + return Math.max(220, el.parentNode.offsetWidth * 0.3); + }, + }, - { - x: () => { - return Math.max(260, window.innerWidth * 0.45) * -1 - }, - y: -30, - r: 6, - h: 300, - w: (el: any) => { - return Math.max(330, el.parentNode.offsetWidth * 0.55) - }, - }, + { + x: () => { + return Math.max(260, window.innerWidth * 0.45) * -1; + }, + y: -30, + r: 6, + h: 300, + w: (el: any) => { + return Math.max(330, el.parentNode.offsetWidth * 0.55); + }, + }, - { - x: () => { - return Math.max(260, window.innerWidth * 0.45) - }, - y: -30, - r: -5, - h: 400, - w: (el: any) => { - return Math.max(305, el.parentNode.offsetWidth * 0.45) - }, - }, + { + x: () => { + return Math.max(260, window.innerWidth * 0.45); + }, + y: -30, + r: -5, + h: 400, + w: (el: any) => { + return Math.max(305, el.parentNode.offsetWidth * 0.45); + }, + }, - { - x: () => { - return Math.max(260, window.innerWidth * 0.45) * -1 - }, - y: -45, - r: -20, - h: 525, - w: (el: any) => { - return Math.max(160, el.parentNode.offsetWidth * 0.3) - }, - }, + { + x: () => { + return Math.max(260, window.innerWidth * 0.45) * -1; + }, + y: -45, + r: -20, + h: 525, + w: (el: any) => { + return Math.max(160, el.parentNode.offsetWidth * 0.3); + }, + }, - { - x: () => { - return Math.max(260, window.innerWidth * 0.45) - }, - y: 10, - r: 10, - h: 160, - w: (el: any) => { - return Math.max(320, el.parentNode.offsetWidth * 0.55) - }, - }, - ] + { + x: () => { + return Math.max(260, window.innerWidth * 0.45); + }, + y: 10, + r: 10, + h: 160, + w: (el: any) => { + return Math.max(320, el.parentNode.offsetWidth * 0.55); + }, + }, + ]; - gsap.registerPlugin(ScrollTrigger) - console.info('gsap: ScrollTrigger registered') + gsap.registerPlugin(ScrollTrigger); + console.info("gsap: ScrollTrigger registered"); - gsap.set('.hero', { position: 'absolute' }) + gsap.set(".hero", { position: "absolute" }); - const cards = document.querySelectorAll('.card') + const cards = document.querySelectorAll(".card"); - for (const [index, card] of [...cards].entries()) { - if (CONFIG[index]) { - gsap.from(card, { - x: CONFIG[index].x, - yPercent: CONFIG[index].y, - height: `${CONFIG[index].h}%`, - rotate: CONFIG[index].r, - width: CONFIG[index].w, - scrollTrigger: { - trigger: '.scroller', - start: 'top bottom', - end: 'top 50%', - scrub: true, - }, - }) - } - } + for (const [index, card] of [...cards].entries()) { + if (CONFIG[index]) { + gsap.from(card, { + x: CONFIG[index].x, + yPercent: CONFIG[index].y, + height: `${CONFIG[index].h}%`, + rotate: CONFIG[index].r, + width: CONFIG[index].w, + scrollTrigger: { + trigger: ".scroller", + start: "top bottom", + end: "top 50%", + scrub: true, + }, + }); + } + } - gsap.from( - [ - '.card__content', - '.card--two .card__column:last-of-type', - '.card--three .card__column:last-of-type', - '.card--five .card__column:last-of-type', - ], + gsap.from( + [ + ".card__content", + ".card--two .card__column:last-of-type", + ".card--three .card__column:last-of-type", + ".card--five .card__column:last-of-type", + ], - { - y: '-100cqh', - scrollTrigger: { - trigger: '.scroller', - start: 'top 80%', - end: 'top top', - scrub: true, - }, - }, - ) + { + y: "-100cqh", + scrollTrigger: { + trigger: ".scroller", + start: "top 80%", + end: "top top", + scrub: true, + }, + }, + ); - gsap.from(['.card__avatar img', '.password svg'], { - opacity: 0, - scrollTrigger: { - trigger: '.scroller', - start: 'top 50%', - end: 'top top', - scrub: true, - }, - }) + gsap.from([".card__avatar img", ".password svg"], { + opacity: 0, + scrollTrigger: { + trigger: ".scroller", + start: "top 50%", + end: "top top", + scrub: true, + }, + }); - gsap.from(['.card--five .card__dummy', '.card--six .card__dummy'], { - width: (el: any) => el.parentNode.offsetWidth * 0.26, - scrollTrigger: { - trigger: '.scroller', - start: 'top 80%', - end: 'top top', - scrub: true, - }, - }) + gsap.from([".card--five .card__dummy", ".card--six .card__dummy"], { + width: (el: any) => el.parentNode.offsetWidth * 0.26, + scrollTrigger: { + trigger: ".scroller", + start: "top 80%", + end: "top top", + scrub: true, + }, + }); - gsap.from(['.card--one .card__avatar', '.card--four .card__avatar'], { - scale: 2, - scrollTrigger: { - trigger: '.scroller', - start: 'top bottom', - end: 'top top', - scrub: true, - }, - }) + gsap.from([".card--one .card__avatar", ".card--four .card__avatar"], { + scale: 2, + scrollTrigger: { + trigger: ".scroller", + start: "top bottom", + end: "top top", + scrub: true, + }, + }); - gsap.from('.card--two .card__avatar', { - width: (el: any) => Math.max(330, el.parentNode.offsetWidth * 0.55) - 32, - borderRadius: '12px', - height: 'calc(300cqh - 2rem)', - scrollTrigger: { - trigger: '.scroller', - start: 'top bottom', - end: 'top 20%', - scrub: true, - }, - }) + gsap.from(".card--two .card__avatar", { + width: (el: any) => Math.max(330, el.parentNode.offsetWidth * 0.55) - 32, + borderRadius: "12px", + height: "calc(300cqh - 2rem)", + scrollTrigger: { + trigger: ".scroller", + start: "top bottom", + end: "top 20%", + scrub: true, + }, + }); - gsap.from('.card--six .card__column:last-of-type .card__company', { - width: 120, - x: '-1rem', - scrollTrigger: { - trigger: '.scroller', - start: 'top bottom', - end: 'top 20%', - scrub: true, - }, - }) + gsap.from(".card--six .card__column:last-of-type .card__company", { + width: 120, + x: "-1rem", + scrollTrigger: { + trigger: ".scroller", + start: "top bottom", + end: "top 20%", + scrub: true, + }, + }); - gsap.from('.cta', { - scale: 1, - scrollTrigger: { - trigger: '.scroller', - start: 'top bottom', - end: 'top 20%', - scrub: true, - }, - }) - } - } - useEffect(() => { - document.body.classList.add('body') - window.addEventListener('resize', animationFunction) - return () => { - document.body.classList.remove('body') - window.removeEventListener('resize', animationFunction) - } - }, []) - return ( - <> -
-
-
-
-

- 五 味 子 云 存 储 -
- schisandra -

-

Start your journey and join thousands of others.

- - Start now - -
-
-
-
-
-
-
-
-
- -
-
+ gsap.from(".cta", { + scale: 1, + scrollTrigger: { + trigger: ".scroller", + start: "top bottom", + end: "top 20%", + scrub: true, + }, + }); + } + }; + useEffect(() => { + document.body.classList.add("body"); + window.addEventListener("resize", animationFunction); + return () => { + document.body.classList.remove("body"); + window.removeEventListener("resize", animationFunction); + }; + }, []); + return ( + <> + +
+
+
+

+ 五 味 子 云 存 储 +
+ schisandra +

+

Start your journey and join thousands of others.

+ + Start now + +
+
+
+
+
+
+
+
+
+ +
+
-
-
-
-
- - Headspace - - -
-
-
-
-
-
-
-
-
-
-
-
- - Amazon Alexa - - -
-
-
-
-
-
-
-
- - Google Chrome - - - -
-
-
-
-
-
-
-
-
+
+
+
+
+ + Headspace + + +
+
+
+
+
+
+
+
+
+
+
+
+ + Amazon Alexa + + +
+
+
+
+
+
+
+
+ + Google Chrome + + + +
+
+
+
+
+
+
+
+
-
-
-
-
- - YouTube - - -
-
-
-
-
-
- - Slack - - -
-
-
-
-
-
-
-
- -
-
+
+
+
+
+ + YouTube + + +
+
+
+
+
+
+ + Slack + + +
+
+
+
+
+
+
+
+ +
+
-
-
-
-
- - Messenger - - -
-
-
-
-
-
- - Notion - - -
-
-
-
-
-
-
-
- - Twilio - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+ + Messenger + + +
+
+
+
+
+
+ + Notion + + +
+
+
+
+
+
+
+
+ + Twilio + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
- - PayPal - - -
-
-
-
-
-
- - 1Password - - -
-
-
-
-
-
-
-
- - Spotify - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+ + PayPal + + +
+
+
+
+
+
+ + 1Password + + +
+
+
+
+
+
+
+
+ + Spotify + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
- - Calendly - - -
-
-
-
-
-
- - Bluesky - - -
-
-
-
-
-
-
-
- -
-
+
+
+
+
+ + Calendly + + +
+
+
+
+
+
+ + Bluesky + + +
+
+
+
+
+
+
+
+ +
+
-
-
-
-
- - Instagram - - -
-
-
-
-
-
-
-
-
-
-
-
- - X - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
- -
-
-
- {/*
*/} - {/*

Pretty rad.

*/} - {/*
*/} -
-
ʕ•ᴥ•ʔ schisandra © 2024
- - ) -} -export default HomeIndex +
+
+
+
+ + Instagram + + +
+
+
+
+
+
+
+
+
+
+
+
+ + X + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+ {/*
*/} + {/*

Pretty rad.

*/} + {/*
*/} +
+
ʕ•ᴥ•ʔ schisandra © 2024
+ + ); +}; +export default HomeIndex; diff --git a/src/components/Loading/index.tsx b/src/components/Loading/index.tsx index 36fc07b..b657916 100644 --- a/src/components/Loading/index.tsx +++ b/src/components/Loading/index.tsx @@ -1,60 +1,63 @@ -import React, { useEffect } from 'react' -import './index.less' +/** @format */ + +import React, { useEffect } from "react"; +import "./index.less"; + const Loading: React.FC = () => { - useEffect(() => { - document.body.classList.add('loading-body') - return () => { - document.body.classList.remove('loading-body') - } - }, []) - return ( - <> - - - - - - - - - - - - - - - - - - - - - {/**/} - {/* */} - {/* */} - {/**/} - - ) -} -export default React.memo(Loading) + useEffect(() => { + document.body.classList.add("loading-body"); + return () => { + document.body.classList.remove("loading-body"); + }; + }, []); + return ( + <> + + + + + + + + + + + + + + + + + + + + + {/**/} + {/* */} + {/* */} + {/**/} + + ); +}; +export default React.memo(Loading); diff --git a/src/constants/index.ts b/src/constants/index.ts index dc1f11d..e69de29 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -1 +0,0 @@ -export const DEFAULT_NAME = 'admin' diff --git a/src/layout/default/index.tsx b/src/layout/default/index.tsx index 992dc23..857aa26 100644 --- a/src/layout/default/index.tsx +++ b/src/layout/default/index.tsx @@ -1,25 +1,28 @@ -import React, { useEffect } from 'react' -import LeftArea from '@/layout/default/left-area' -import MainArea from '@/layout/default/main-area' -import RightArea from '@/layout/default/right-area' -import './index.less' -import Footer from '@/components/Footer' +/** @format */ + +import React, { useEffect } from "react"; +import LeftArea from "@/layout/default/left-area"; +import MainArea from "@/layout/default/main-area"; +import RightArea from "@/layout/default/right-area"; +import "./index.less"; +import Footer from "@/components/Footer"; + const DefaultLayOut: React.FC = () => { - useEffect(() => { - document.body.classList.add('main-body') - return () => { - document.body.classList.remove('main-body') - } - }, []) - return ( - <> -
- - - -
-
- - ) -} -export default DefaultLayOut + useEffect(() => { + document.body.classList.add("main-body"); + return () => { + document.body.classList.remove("main-body"); + }; + }, []); + return ( + <> +
+ + + +
+
+ + ); +}; +export default DefaultLayOut; diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..92b3ebd --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,8 @@ +/** @format */ + +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/src/main.tsx b/src/main.tsx index 0a00b72..06327d4 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,16 +1,20 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import { RouterProvider, createBrowserRouter } from 'react-router-dom' -import './assets/styles/index.less' -import routeConfig from './router' -import 'virtual:svg-icons-register' -import { Provider as MobxProvider } from 'mobx-react' -import { RootStore } from '@/store' -const router = createBrowserRouter(routeConfig) -ReactDOM.createRoot(document.getElementById('root')!).render( - - - - , - , -) +/** @format */ + +import React from "react"; +import ReactDOM from "react-dom/client"; +import { RouterProvider, createBrowserRouter } from "react-router-dom"; +import "./assets/styles/index.less"; +import routeConfig from "./router"; +import "virtual:svg-icons-register"; +import { Provider as MobxProvider } from "mobx-react"; +import { RootStore } from "@/store"; + +const router = createBrowserRouter(routeConfig); +ReactDOM.createRoot(document.getElementById("root")!).render( + + + + + , + , +); diff --git a/src/router/index.ts b/src/router/index.ts index ee29ef5..cf0b46e 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,37 +1,40 @@ -import type { RouteObject } from 'react-router-dom' +/** @format */ -import NoFound from '@/views/404/404' -import Login from './modules/login/index.ts' -import Register from './modules/register/index.ts' -import home from './modules/home/index.ts' -import Main from './modules/main/index.ts' +import type { RouteObject } from "react-router-dom"; + +import NoFound from "@/views/404/404"; +import Login from "./modules/login/index.ts"; +import Register from "./modules/register/index.ts"; +import home from "./modules/home/index.ts"; +import Main from "./modules/main/index.ts"; + +import ComponentLoading from "@/components/ComponentLoading"; -import ComponentLoading from '@/components/ComponentLoading' const routes: RouteObject[] = [ - { - path: '/', - Component: (props) => ComponentLoading(home, props), - }, - { - path: '*', - Component: NoFound, - }, - { - path: '/register', - Component: (props) => ComponentLoading(Register, props), - }, - // { - // path: '/home', - // Component: home, - // }, - { - path: '/login', - Component: (props) => ComponentLoading(Login, props), - }, - { - path: '/main', - Component: (props) => ComponentLoading(Main, props), - }, -] + { + path: "/", + Component: (props) => ComponentLoading(home, props), + }, + { + path: "*", + Component: NoFound, + }, + { + path: "/register", + Component: (props) => ComponentLoading(Register, props), + }, + // { + // path: '/home', + // Component: home, + // }, + { + path: "/login", + Component: (props) => ComponentLoading(Login, props), + }, + { + path: "/main", + Component: (props) => ComponentLoading(Main, props), + }, +]; -export default routes +export default routes; diff --git a/src/router/modules/home/index.ts b/src/router/modules/home/index.ts index a204780..a2b0894 100644 --- a/src/router/modules/home/index.ts +++ b/src/router/modules/home/index.ts @@ -1,9 +1,11 @@ -import { lazy } from 'react' +/** @format */ + +import { lazy } from "react"; const home = lazy( - () => - new Promise((resolve: any) => { - setTimeout(() => resolve(import('@/views/Home/')), 1000) - }), -) -export default home + () => + new Promise((resolve: any) => { + setTimeout(() => resolve(import("@/views/Home/")), 1000); + }), +); +export default home; diff --git a/src/store/index.ts b/src/store/index.ts index 39a7e7c..66d4340 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -1,6 +1,8 @@ -import { useUserStore } from './modules/user.ts' +/** @format */ + +import { useUserStore } from "./modules/user.ts"; /** 将每个Store实例化 */ export const RootStore = { - user: new useUserStore(), -} + user: new useUserStore(), +}; diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index 9a69a9e..4059444 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -1,38 +1,45 @@ -import { action, makeAutoObservable } from 'mobx' -import { makePersistable, isHydrated } from 'mobx-persist-store' -import { handleLocalforage } from '@/utils/localforage' +/** @format */ + +import { action, makeAutoObservable } from "mobx"; +import { makePersistable, isHydrated } from "mobx-persist-store"; +import { handleLocalforage } from "@/utils/localforage"; + export class useUserStore { - token: any = '' - constructor() { - makeAutoObservable( - this, - { - setToken: action, - }, - { autoBind: true }, - ) - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - makePersistable(this, { - // 在构造函数内使用 makePersistable - name: 'token', // 保存的name,用于在storage中的名称标识,只要不和storage中其他名称重复就可以 - properties: ['token'], // 要保存的字段,这些字段会被保存在name对应的storage中,注意:不写在这里面的字段将不会被保存,刷新页面也将丢失:get字段例外。get数据会在数据返回后再自动计算 - storage: handleLocalforage, // 保存的位置:看自己的业务情况选择,可以是localStorage,sessionstorage - // 。。还有一些其他配置参数,例如数据过期时间等等,可以康康文档,像storage这种字段可以配置在全局配置里,详见文档 - }).then( - action(() => { - // persist 完成的回调,在这里可以执行一些拿到数据后需要执行的操作,如果在页面上要判断是否完成persist,使用 isHydrated - // console.log(persistStore) - }), - ) - } - get getToken() { - return this.token ? this.token : null - } - get isHydrated() { - return isHydrated(this) - } - setToken(token: string) { - this.token = token - } + token: any = ""; + + constructor() { + makeAutoObservable( + this, + { + setToken: action, + }, + { autoBind: true }, + ); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + makePersistable(this, { + // 在构造函数内使用 makePersistable + name: "token", // 保存的name,用于在storage中的名称标识,只要不和storage中其他名称重复就可以 + properties: ["token"], // 要保存的字段,这些字段会被保存在name对应的storage中,注意:不写在这里面的字段将不会被保存,刷新页面也将丢失:get字段例外。get数据会在数据返回后再自动计算 + storage: handleLocalforage, // 保存的位置:看自己的业务情况选择,可以是localStorage,sessionstorage + // 。。还有一些其他配置参数,例如数据过期时间等等,可以康康文档,像storage这种字段可以配置在全局配置里,详见文档 + }).then( + action(() => { + // persist 完成的回调,在这里可以执行一些拿到数据后需要执行的操作,如果在页面上要判断是否完成persist,使用 isHydrated + // console.log(persistStore) + }), + ); + } + + get getToken() { + return this.token ? this.token : null; + } + + get isHydrated() { + return isHydrated(this); + } + + setToken(token: string) { + this.token = token; + } } diff --git a/src/utils/axios/request.ts b/src/utils/axios/request.ts index 544a6fc..033429e 100644 --- a/src/utils/axios/request.ts +++ b/src/utils/axios/request.ts @@ -1,145 +1,101 @@ -import axios, { AxiosInstance, AxiosRequestConfig } from 'axios' -import { message } from 'antd' +/** @format */ + +import axios, { AxiosInstance, AxiosRequestConfig } from "axios"; +import { message } from "antd"; + class Request { - private instance: AxiosInstance | undefined + private instance: AxiosInstance | undefined; - constructor(config: AxiosRequestConfig) { - this.instance = axios.create(config) - // 全局请求拦截 - this.instance.interceptors.request.use( - (config) => { - return config - }, - (error) => { - return Promise.reject(error) - }, - ) + constructor(config: AxiosRequestConfig) { + this.instance = axios.create(config); + // 全局请求拦截 + this.instance.interceptors.request.use( + (config) => { + return config; + }, + (error) => { + return Promise.reject(error); + }, + ); - // 全局响应拦截 - this.instance.interceptors.response.use( - (res) => { - // if (res.data.code && res.data.code !== 200) { - // message.error(res.data.message).then() - // return Promise.reject(res.data) - // } - return res.data - }, - (error) => { - const { response } = error - if (response) { - this.handleCode(response.status) - } - if (!window.navigator.onLine) { - message.error('网络连接失败') - // return router.push({ - // path: '/404', - // }) - return Promise.reject(error) - } - }, - ) - } - handleCode(code: number): void { - switch (code) { - case 400: - message.error('请求错误(400)') - break - case 401: - message.error('未授权,请重新登录(401)') - break - case 403: - message.error('拒绝访问(403)') - break - case 404: - message.error('请求出错(404)') - break - case 408: - message.error('请求超时(408)') - break - case 500: - message.error('服务器错误(500)') - break - case 501: - message.error('服务未实现(501)') - break - case 502: - message.error('网络错误(502)') - break - case 503: - message.error('服务不可用(503)') - break - case 504: - message.error('网络超时(504)') - break - case 505: - message.error('HTTP版本不受支持(505)') - break - default: - message.error(`连接出错(${code})!`) - break - } - } - request(config: AxiosRequestConfig): Promise { - return new Promise((resolve, reject) => { - this.instance - ?.request(config) - .then((res) => { - resolve(res) - }) - .catch((err) => { - reject(err) - }) - }) - } + // 全局响应拦截 + this.instance.interceptors.response.use( + (res) => { + // if (res.data.code && res.data.code !== 200) { + // message.error(res.data.message).then() + // return Promise.reject(res.data) + // } + return res.data; + }, + (error) => { + const { response } = error; + if (response) { + this.handleCode(response.status); + } + if (!window.navigator.onLine) { + message.error("网络连接失败"); + // return router.push({ + // path: '/404', + // }) + return Promise.reject(error); + } + }, + ); + } - get(url: string) { - return new Promise((resolve, reject) => { - this.instance - ?.get(url) - .then((res) => { - resolve(res) - }) - .catch((err) => { - reject(err) - }) - }) - } + handleCode(code: number): void { + switch (code) { + case 400: + message.error("请求错误(400)").then(); + break; + case 401: + message.error("未授权,请重新登录(401)").then(); + break; + case 403: + message.error("拒绝访问(403)").then(); + break; + case 404: + message.error("请求出错(404)").then(); + break; + case 408: + message.error("请求超时(408)").then(); + break; + case 500: + message.error("服务器错误(500)").then(); + break; + case 501: + message.error("服务未实现(501)").then(); + break; + case 502: + message.error("网络错误(502)").then(); + break; + case 503: + message.error("服务不可用(503)").then(); + break; + case 504: + message.error("网络超时(504)").then(); + break; + case 505: + message.error("HTTP版本不受支持(505)").then(); + break; + default: + message.error(`连接出错(${code})!`).then(); + break; + } + } - post(url: string, data = {}) { - return new Promise((resolve, reject) => { - this.instance - ?.post(url, data) - .then((res) => { - resolve(res) - }) - .catch((err) => { - reject(err) - }) - }) - } - put(url: string, data = {}) { - return new Promise((resolve, reject) => { - this.instance - ?.put(url, data) - .then((res) => { - resolve(res) - }) - .catch((err) => { - reject(err) - }) - }) - } - delete(url: string) { - return new Promise((resolve, reject) => { - this.instance - ?.delete(url) - .then((res) => { - resolve(res) - }) - .catch((err) => { - reject(err) - }) - }) - } + request(config: AxiosRequestConfig): Promise { + return new Promise((resolve, reject) => { + this.instance + ?.request(config) + .then((res) => { + resolve(res); + }) + .catch((err) => { + reject(err); + }); + }); + } } -export default Request + +export default Request; diff --git a/src/utils/axios/web.ts b/src/utils/axios/web.ts index 36b3a66..69e56a4 100644 --- a/src/utils/axios/web.ts +++ b/src/utils/axios/web.ts @@ -1,14 +1,16 @@ -import Request from './request' -import { handleLocalforage } from '@/utils/localforage' +/** @format */ -const token = String(handleLocalforage.getItem('token')) +import Request from "./request"; +import { handleLocalforage } from "@/utils/localforage"; + +const token = String(handleLocalforage.getItem("token")); const web: Request = new Request({ - baseURL: import.meta.env.VITE_APP_BASE_API, - headers: { - // 'Content-Type': 'application/json;charset=utf-8', - // Accept: 'application/json', - Authorization: token, - }, -}) + baseURL: import.meta.env.VITE_APP_BASE_API, + headers: { + // 'Content-Type': 'application/json;charset=utf-8', + // Accept: 'application/json', + Authorization: token, + }, +}); -export default web +export default web; diff --git a/src/utils/cookie/cookie.ts b/src/utils/cookie/cookie.ts index 0743307..5b96979 100644 --- a/src/utils/cookie/cookie.ts +++ b/src/utils/cookie/cookie.ts @@ -1,85 +1,91 @@ -/** 配置 */ +/** + * 配置 + * + * @format + */ + interface Options { - /** key前缀 */ - prefix?: string + /** key前缀 */ + prefix?: string; } + /** 默认配置 */ const defaultOptions: Options = { - prefix: '', -} + prefix: "", +}; class CookieStorage { - private prefix: string + private prefix: string; - constructor(options: Options = defaultOptions) { - const { prefix } = options - this.prefix = prefix ?? '' - } + constructor(options: Options = defaultOptions) { + const { prefix } = options; + this.prefix = prefix ?? ""; + } - /** - * @description: 设置cookie - * @param {string} key 键 - * @param {any} value 值 - * @param {number} expires 过期时间s毫秒,不传默认2年有效 - * @Date: 2023-05-17 18:10:34 - * @Author: mulingyuer - */ - public setItem(key: string, value: string | number, expires?: number): void { - const timestamp = Date.now() - if (typeof expires === 'number') { - expires = timestamp + expires - } else { - expires = timestamp + 2 * 365 * 24 * 60 * 60 * 1000 - } - document.cookie = `${this.prefix}${key}=${value};expires=${new Date(expires).toUTCString()}` - } + /** + * @description: 设置cookie + * @param {string} key 键 + * @param {any} value 值 + * @param {number} expires 过期时间s毫秒,不传默认2年有效 + * @Date: 2023-05-17 18:10:34 + * @Author: mulingyuer + */ + public setItem(key: string, value: string | number, expires?: number): void { + const timestamp = Date.now(); + if (typeof expires === "number") { + expires = timestamp + expires; + } else { + expires = timestamp + 2 * 365 * 24 * 60 * 60 * 1000; + } + document.cookie = `${this.prefix}${key}=${value};expires=${new Date(expires).toUTCString()}`; + } - /** - * @description: 获取cookie - * @param {string} key 键 - * @Date: 2023-05-17 18:31:50 - * @Author: mulingyuer - */ - public getItem(key: string): string | undefined { - const cookies = document.cookie.split('; ') - let val: string | undefined = undefined - cookies.find((item) => { - const [k, v] = item.split('=') - if (k === `${this.prefix}${key}`) { - val = v - return true - } - return false - }) + /** + * @description: 获取cookie + * @param {string} key 键 + * @Date: 2023-05-17 18:31:50 + * @Author: mulingyuer + */ + public getItem(key: string): string | undefined { + const cookies = document.cookie.split("; "); + let val: string | undefined = undefined; + cookies.find((item) => { + const [k, v] = item.split("="); + if (k === `${this.prefix}${key}`) { + val = v; + return true; + } + return false; + }); - return val - } + return val; + } - /** - * @description: 删除指定key的cookie - * @param {string} key 键 - * @Date: 2023-05-17 18:32:56 - * @Author: mulingyuer - */ - public removeItem(key: string): void { - this.setItem(key, '', -1) - } + /** + * @description: 删除指定key的cookie + * @param {string} key 键 + * @Date: 2023-05-17 18:32:56 + * @Author: mulingyuer + */ + public removeItem(key: string): void { + this.setItem(key, "", -1); + } - /** - * @description: 清空所有cookie - * @Date: 2023-05-17 23:13:04 - * @Author: mulingyuer - */ - public clear(): void { - const cookies = document.cookie.split('; ') - cookies.forEach((item) => { - const [k] = item.split('=') - this.removeItem(k) - }) - } + /** + * @description: 清空所有cookie + * @Date: 2023-05-17 23:13:04 + * @Author: mulingyuer + */ + public clear(): void { + const cookies = document.cookie.split("; "); + cookies.forEach((item) => { + const [k] = item.split("="); + this.removeItem(k); + }); + } } -const cookieStorage = new CookieStorage() +const cookieStorage = new CookieStorage(); -export default cookieStorage -export { CookieStorage } +export default cookieStorage; +export { CookieStorage }; diff --git a/src/utils/encrypt/encrypt.ts b/src/utils/encrypt/encrypt.ts index 4a79914..ca0da23 100644 --- a/src/utils/encrypt/encrypt.ts +++ b/src/utils/encrypt/encrypt.ts @@ -1,169 +1,173 @@ -import JSEncrypt from 'jsencrypt' -import CryptoJS from 'crypto-js' +/** @format */ + +import JSEncrypt from "jsencrypt"; +import CryptoJS from "crypto-js"; // 加密 export function rsaEncrypt(Str: string, afterPublicKey: string) { - const encryptor = new JSEncrypt() - encryptor.setPublicKey(afterPublicKey) // 设置公钥 - return encryptor.encrypt(Str) // 对数据进行加密 + const encryptor = new JSEncrypt(); + encryptor.setPublicKey(afterPublicKey); // 设置公钥 + return encryptor.encrypt(Str); // 对数据进行加密 } // 解密 export function rsaDecrypt(Str: string, frontPrivateKey: string) { - const encryptor = new JSEncrypt() - encryptor.setPrivateKey(frontPrivateKey) // 设置私钥 - return encryptor.decrypt(Str) // 对数据进行解密 + const encryptor = new JSEncrypt(); + encryptor.setPrivateKey(frontPrivateKey); // 设置私钥 + return encryptor.decrypt(Str); // 对数据进行解密 } export function aesEncrypt(aeskey: string, Str: string) { - // 设置一个默认值,如果第二个参数为空采用默认值,不为空则采用新设置的密钥 - const key = CryptoJS.enc.Utf8.parse(aeskey) - const srcs = CryptoJS.enc.Utf8.parse(Str) - const encrypted = CryptoJS.AES.encrypt(srcs, key, { - // 切记 需要和后端算法模式一致 - mode: CryptoJS.mode.ECB, - padding: CryptoJS.pad.Pkcs7, - }) + // 设置一个默认值,如果第二个参数为空采用默认值,不为空则采用新设置的密钥 + const key = CryptoJS.enc.Utf8.parse(aeskey); + const srcs = CryptoJS.enc.Utf8.parse(Str); + const encrypted = CryptoJS.AES.encrypt(srcs, key, { + // 切记 需要和后端算法模式一致 + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7, + }); - return encrypted.toString() + return encrypted.toString(); } export function aesDecrypt(aeskey: string, Str: string) { - const key = CryptoJS.enc.Utf8.parse(aeskey) - const decrypt = CryptoJS.AES.decrypt(Str, key, { - // 切记 需要和后端算法模式一致 - mode: CryptoJS.mode.ECB, - padding: CryptoJS.pad.Pkcs7, - }) - return CryptoJS.enc.Utf8.stringify(decrypt).toString() + const key = CryptoJS.enc.Utf8.parse(aeskey); + const decrypt = CryptoJS.AES.decrypt(Str, key, { + // 切记 需要和后端算法模式一致 + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7, + }); + return CryptoJS.enc.Utf8.stringify(decrypt).toString(); } + /** * 获取16位随机码AES * @returns {string} */ export function get16RandomNum() { - const chars = [ - '0', - '1', - '2', - '3', - '4', - '5', - '6', - '7', - '8', - '9', - 'A', - 'B', - 'C', - 'D', - 'E', - 'F', - 'G', - 'H', - 'I', - 'J', - 'K', - 'L', - 'M', - 'N', - 'O', - 'P', - 'Q', - 'R', - 'S', - 'T', - 'U', - 'V', - 'W', - 'X', - 'Y', - 'Z', - 'a', - 'b', - 'c', - 'd', - 'e', - 'f', - 'g', - 'h', - 'i', - 'j', - 'k', - 'l', - 'm', - 'n', - 'o', - 'p', - 'q', - 'r', - 's', - 't', - 'u', - 'v', - 'w', - 'x', - 'y', - 'z', - ] - let nums = '' - //这个地方切记要选择16位,因为美国对密钥长度有限制,选择32位的话加解密会报错,需要根据jdk版本去修改相关jar包,有点恼火,选择16位就不用处理。 - for (let i = 0; i < 16; i++) { - const id = parseInt(String(Math.random() * 61)) - nums += chars[id] - } - return nums + const chars = [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + ]; + let nums = ""; + //这个地方切记要选择16位,因为美国对密钥长度有限制,选择32位的话加解密会报错,需要根据jdk版本去修改相关jar包,有点恼火,选择16位就不用处理。 + for (let i = 0; i < 16; i++) { + const id = parseInt(String(Math.random() * 61)); + nums += chars[id]; + } + return nums; } + //获取rsa密钥对 export function getRsaKeys() { - return new Promise((resolve, reject) => { - window.crypto.subtle - .generateKey( - { - name: 'RSA-OAEP', - modulusLength: 2048, //can be 1024, 2048, or 4096 - publicExponent: new Uint8Array([0x01, 0x00, 0x01]), - hash: { name: 'SHA-512' }, //can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512" - }, - true, //whether the key is extractable (i.e. can be used in exportKey) - ['encrypt', 'decrypt'], //must be ["encrypt", "decrypt"] or ["wrapKey", "unwrapKey"] - ) - .then(function (key) { - window.crypto.subtle - .exportKey('pkcs8', key.privateKey) - .then(function (keydata1) { - window.crypto.subtle - .exportKey('spki', key.publicKey) - .then(function (keydata2) { - const privateKey = RSA2text(keydata1, 1) + return new Promise((resolve, reject) => { + window.crypto.subtle + .generateKey( + { + name: "RSA-OAEP", + modulusLength: 2048, //can be 1024, 2048, or 4096 + publicExponent: new Uint8Array([0x01, 0x00, 0x01]), + hash: { name: "SHA-512" }, //can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512" + }, + true, //whether the key is extractable (i.e. can be used in exportKey) + ["encrypt", "decrypt"], //must be ["encrypt", "decrypt"] or ["wrapKey", "unwrapKey"] + ) + .then(function (key) { + window.crypto.subtle + .exportKey("pkcs8", key.privateKey) + .then(function (keydata1) { + window.crypto.subtle + .exportKey("spki", key.publicKey) + .then(function (keydata2) { + const privateKey = RSA2text(keydata1, 1); - const publicKey = RSA2text(keydata2) + const publicKey = RSA2text(keydata2); - resolve({ privateKey, publicKey }) - }) - .catch(function (err) { - reject(err) - }) - }) - .catch(function (err) { - reject(err) - }) - }) - .catch(function (err) { - reject(err) - }) - }) + resolve({ privateKey, publicKey }); + }) + .catch(function (err) { + reject(err); + }); + }) + .catch(function (err) { + reject(err); + }); + }) + .catch(function (err) { + reject(err); + }); + }); } function RSA2text(buffer: any, _isPrivate: number = 0) { - let binary = '' - const bytes = new Uint8Array(buffer) - const len = bytes.byteLength - for (let i = 0; i < len; i++) { - binary += String.fromCharCode(bytes[i]) - } - const base64 = window.btoa(binary) - const text = base64.replace(/[^\x00-\xff]/g, '$&\x01').replace(/.{64}\x01?/g, '$&\n') + let binary = ""; + const bytes = new Uint8Array(buffer); + const len = bytes.byteLength; + for (let i = 0; i < len; i++) { + binary += String.fromCharCode(bytes[i]); + } + const base64 = window.btoa(binary); + const text = base64.replace(/[^\x00-\xff]/g, "$&\x01").replace(/.{64}\x01?/g, "$&\n"); - return text + return text; } diff --git a/src/utils/localStorage/config.ts b/src/utils/localStorage/config.ts index de6829d..825b8aa 100644 --- a/src/utils/localStorage/config.ts +++ b/src/utils/localStorage/config.ts @@ -1,102 +1,104 @@ -import { encrypt, decrypt } from './encry' -import { globalConfig } from './interface' +/** @format */ + +import { encrypt, decrypt } from "./encry"; +import { globalConfig } from "./interface"; const config: globalConfig = { - type: 'localStorage', //存储类型,localStorage | sessionStorage - prefix: 'schisandra_', //版本号 - expire: 24 * 60, //过期时间,默认为一天,单位为分钟 - isEncrypt: true, //支持加密、解密数据处理 -} + type: "localStorage", //存储类型,localStorage | sessionStorage + prefix: "schisandra_", //版本号 + expire: 24 * 60, //过期时间,默认为一天,单位为分钟 + isEncrypt: true, //支持加密、解密数据处理 +}; const setStorage = (key: string, value: any, expire: number = 24 * 60): boolean => { - //设定值 - if (value === '' || value === null || value === undefined) { - //空值重置 - value = null - } - if (isNaN(expire) || expire < 0) { - //过期时间值合理性判断 - throw new Error('Expire must be a number') - } - const data = { - value, //存储值 - time: Date.now(), //存储日期 - expire: Date.now() + 1000 * 60 * expire, //过期时间 - } - //是否需要加密,判断装载加密数据或原数据 - window[config.type].setItem( - autoAddPreFix(key), - config.isEncrypt ? encrypt(JSON.stringify(data)) : JSON.stringify(data), - ) - return true -} + //设定值 + if (value === "" || value === null || value === undefined) { + //空值重置 + value = null; + } + if (isNaN(expire) || expire < 0) { + //过期时间值合理性判断 + throw new Error("Expire must be a number"); + } + const data = { + value, //存储值 + time: Date.now(), //存储日期 + expire: Date.now() + 1000 * 60 * expire, //过期时间 + }; + //是否需要加密,判断装载加密数据或原数据 + window[config.type].setItem( + autoAddPreFix(key), + config.isEncrypt ? encrypt(JSON.stringify(data)) : JSON.stringify(data), + ); + return true; +}; const getStorageFromKey = (key: string) => { - //获取指定值 - if (config.prefix) { - key = autoAddPreFix(key) - } - if (!window[config.type].getItem(key)) { - //不存在判断 - return null - } + //获取指定值 + if (config.prefix) { + key = autoAddPreFix(key); + } + if (!window[config.type].getItem(key)) { + //不存在判断 + return null; + } - const storageVal = config.isEncrypt - ? JSON.parse(decrypt(window[config.type].getItem(key) as string)) - : JSON.parse(window[config.type].getItem(key) as string) - const now = Date.now() - if (now >= storageVal.expire) { - //过期销毁 - removeStorageFromKey(key) - return null - //不过期回值 - } else { - return storageVal.value - } -} + const storageVal = config.isEncrypt + ? JSON.parse(decrypt(window[config.type].getItem(key) as string)) + : JSON.parse(window[config.type].getItem(key) as string); + const now = Date.now(); + if (now >= storageVal.expire) { + //过期销毁 + removeStorageFromKey(key); + return null; + //不过期回值 + } else { + return storageVal.value; + } +}; const getAllStorage = () => { - //获取所有值 - const storageList: any = {} - const keys = Object.keys(window[config.type]) - keys.forEach((key) => { - const value = getStorageFromKey(autoRemovePreFix(key)) - if (value !== null) { - //如果值没有过期,加入到列表中 - storageList[autoRemovePreFix(key)] = value - } - }) - return storageList -} + //获取所有值 + const storageList: any = {}; + const keys = Object.keys(window[config.type]); + keys.forEach((key) => { + const value = getStorageFromKey(autoRemovePreFix(key)); + if (value !== null) { + //如果值没有过期,加入到列表中 + storageList[autoRemovePreFix(key)] = value; + } + }); + return storageList; +}; const getStorageLength = () => { - //获取值列表长度 - return window[config.type].length -} + //获取值列表长度 + return window[config.type].length; +}; const removeStorageFromKey = (key: string) => { - //删除值 - if (config.prefix) { - key = autoAddPreFix(key) - } - window[config.type].removeItem(key) -} + //删除值 + if (config.prefix) { + key = autoAddPreFix(key); + } + window[config.type].removeItem(key); +}; const clearStorage = () => { - window[config.type].clear() -} + window[config.type].clear(); +}; const autoAddPreFix = (key: string) => { - //添加前缀,保持唯一性 - const prefix = config.prefix || '' - return `${prefix}_${key}` -} + //添加前缀,保持唯一性 + const prefix = config.prefix || ""; + return `${prefix}_${key}`; +}; const autoRemovePreFix = (key: string) => { - //删除前缀,进行增删改查 - const lineIndex = config.prefix.length + 1 - return key.substr(lineIndex) -} + //删除前缀,进行增删改查 + const lineIndex = config.prefix.length + 1; + return key.substr(lineIndex); +}; export { - setStorage, - getStorageFromKey, - getAllStorage, - getStorageLength, - removeStorageFromKey, - clearStorage, -} + setStorage, + getStorageFromKey, + getAllStorage, + getStorageLength, + removeStorageFromKey, + clearStorage, +}; diff --git a/src/utils/localStorage/encry.ts b/src/utils/localStorage/encry.ts index 5a52f5a..1d03db4 100644 --- a/src/utils/localStorage/encry.ts +++ b/src/utils/localStorage/encry.ts @@ -1,37 +1,39 @@ -import CryptoJS from 'crypto-js' +/** @format */ -const SECRET_KEY = CryptoJS.enc.Utf8.parse('3333e6e143439161') //十六位十六进制数作为密钥 -const SECRET_IV = CryptoJS.enc.Utf8.parse('e3bbe7e3ba84431a') //十六位十六进制数作为密钥偏移量 +import CryptoJS from "crypto-js"; + +const SECRET_KEY = CryptoJS.enc.Utf8.parse("3333e6e143439161"); //十六位十六进制数作为密钥 +const SECRET_IV = CryptoJS.enc.Utf8.parse("e3bbe7e3ba84431a"); //十六位十六进制数作为密钥偏移量 const encrypt = (data: object | string): string => { - //加密 - if (typeof data === 'object') { - try { - data = JSON.stringify(data) - } catch (e) { - throw new Error('encrypt error' + e) - } - } - const dataHex = CryptoJS.enc.Utf8.parse(data) - const encrypted = CryptoJS.AES.encrypt(dataHex, SECRET_KEY, { - iv: SECRET_IV, - mode: CryptoJS.mode.CBC, - padding: CryptoJS.pad.Pkcs7, - }) - return encrypted.ciphertext.toString() -} + //加密 + if (typeof data === "object") { + try { + data = JSON.stringify(data); + } catch (e) { + throw new Error("encrypt error" + e); + } + } + const dataHex = CryptoJS.enc.Utf8.parse(data); + const encrypted = CryptoJS.AES.encrypt(dataHex, SECRET_KEY, { + iv: SECRET_IV, + mode: CryptoJS.mode.CBC, + padding: CryptoJS.pad.Pkcs7, + }); + return encrypted.ciphertext.toString(); +}; const decrypt = (data: string) => { - //解密 - const encryptedHexStr = CryptoJS.enc.Hex.parse(data) - const str = CryptoJS.enc.Base64.stringify(encryptedHexStr) - const decrypt = CryptoJS.AES.decrypt(str, SECRET_KEY, { - iv: SECRET_IV, - mode: CryptoJS.mode.CBC, - padding: CryptoJS.pad.Pkcs7, - }) - const decryptedStr = decrypt.toString(CryptoJS.enc.Utf8) - return decryptedStr.toString() -} + //解密 + const encryptedHexStr = CryptoJS.enc.Hex.parse(data); + const str = CryptoJS.enc.Base64.stringify(encryptedHexStr); + const decrypt = CryptoJS.AES.decrypt(str, SECRET_KEY, { + iv: SECRET_IV, + mode: CryptoJS.mode.CBC, + padding: CryptoJS.pad.Pkcs7, + }); + const decryptedStr = decrypt.toString(CryptoJS.enc.Utf8); + return decryptedStr.toString(); +}; -export { encrypt, decrypt } +export { encrypt, decrypt }; diff --git a/src/utils/localStorage/interface.ts b/src/utils/localStorage/interface.ts index ac933cc..9aef243 100644 --- a/src/utils/localStorage/interface.ts +++ b/src/utils/localStorage/interface.ts @@ -1,8 +1,10 @@ +/** @format */ + interface globalConfig { - type: 'localStorage' | 'sessionStorage' - prefix: string - expire: number - isEncrypt: boolean + type: "localStorage" | "sessionStorage"; + prefix: string; + expire: number; + isEncrypt: boolean; } -export type { globalConfig } +export type { globalConfig }; diff --git a/src/utils/localforage/index.ts b/src/utils/localforage/index.ts index 488ef6f..b023ea0 100644 --- a/src/utils/localforage/index.ts +++ b/src/utils/localforage/index.ts @@ -1,74 +1,76 @@ -import localforage from 'localforage' -import CryptoJS from 'crypto-js' +/** @format */ -const SECRET_KEY = CryptoJS.enc.Utf8.parse('3333e6e143439161') //十六位十六进制数作为密钥 -const SECRET_IV = CryptoJS.enc.Utf8.parse('e3bbe7e3ba84431a') //十六位十六进制数作为密钥偏移量 +import localforage from "localforage"; +import CryptoJS from "crypto-js"; + +const SECRET_KEY = CryptoJS.enc.Utf8.parse("3333e6e143439161"); //十六位十六进制数作为密钥 +const SECRET_IV = CryptoJS.enc.Utf8.parse("e3bbe7e3ba84431a"); //十六位十六进制数作为密钥偏移量 /** * 加密 * @param data * @param output */ export const encrypt = (data: string, output?: any) => { - const dataHex = CryptoJS.enc.Utf8.parse(data) - const encrypted = CryptoJS.AES.encrypt(dataHex, SECRET_KEY, { - iv: SECRET_IV, - mode: CryptoJS.mode.CBC, - padding: CryptoJS.pad.Pkcs7, - }) - return encrypted.ciphertext.toString(output) -} + const dataHex = CryptoJS.enc.Utf8.parse(data); + const encrypted = CryptoJS.AES.encrypt(dataHex, SECRET_KEY, { + iv: SECRET_IV, + mode: CryptoJS.mode.CBC, + padding: CryptoJS.pad.Pkcs7, + }); + return encrypted.ciphertext.toString(output); +}; /** * 解密 * @param data */ export const decrypt = (data: string | null) => { - if (data === null) { - return - } - const encryptedHex = CryptoJS.enc.Hex.parse(data) - const encryptedHexStr = CryptoJS.enc.Base64.stringify(encryptedHex) - const decrypted = CryptoJS.AES.decrypt(encryptedHexStr, SECRET_KEY, { - iv: SECRET_IV, - mode: CryptoJS.mode.CBC, - padding: CryptoJS.pad.Pkcs7, - }) - const decryptedStr = decrypted.toString(CryptoJS.enc.Utf8) - return decryptedStr.toString() -} + if (data === null) { + return; + } + const encryptedHex = CryptoJS.enc.Hex.parse(data); + const encryptedHexStr = CryptoJS.enc.Base64.stringify(encryptedHex); + const decrypted = CryptoJS.AES.decrypt(encryptedHexStr, SECRET_KEY, { + iv: SECRET_IV, + mode: CryptoJS.mode.CBC, + padding: CryptoJS.pad.Pkcs7, + }); + const decryptedStr = decrypted.toString(CryptoJS.enc.Utf8); + return decryptedStr.toString(); +}; export const handleLocalforage = { - config: async (options?: LocalForageOptions) => localforage.config(options || {}), - setItem: async (key: string, value: string): Promise => { - await localforage.setItem(key, encrypt(value)) - }, - getItem: async function getItem(key: string): Promise { - try { - const value: any = decrypt(await localforage.getItem(key)) as any - // 如果值是 undefined,返回 null - if (value === undefined) { - return null - } - // 如果值是 T 类型,直接返回 - if (typeof value === 'object' && value !== null) { - return value as T - } - // 如果值是 string 类型,直接返回 - return value as string - } catch (error) { - console.error('Error retrieving data from localforage:', error) - return null - } - }, - removeItem: async (key: string): Promise => { - await localforage.removeItem(key) - }, - clear: async () => { - return await localforage.clear() - }, - createInstance: async (name: string) => { - return localforage.createInstance({ - name, - }) - }, -} + config: async (options?: LocalForageOptions) => localforage.config(options || {}), + setItem: async (key: string, value: string): Promise => { + await localforage.setItem(key, encrypt(value)); + }, + getItem: async function getItem(key: string): Promise { + try { + const value: any = decrypt(await localforage.getItem(key)) as any; + // 如果值是 undefined,返回 null + if (value === undefined) { + return null; + } + // 如果值是 T 类型,直接返回 + if (typeof value === "object" && value !== null) { + return value as T; + } + // 如果值是 string 类型,直接返回 + return value as string; + } catch (error) { + console.error("Error retrieving data from localforage:", error); + return null; + } + }, + removeItem: async (key: string): Promise => { + await localforage.removeItem(key); + }, + clear: async () => { + return await localforage.clear(); + }, + createInstance: async (name: string) => { + return localforage.createInstance({ + name, + }); + }, +}; diff --git a/src/utils/store/useStore.tsx b/src/utils/store/useStore.tsx index 23859f6..609f1fe 100644 --- a/src/utils/store/useStore.tsx +++ b/src/utils/store/useStore.tsx @@ -1,11 +1,13 @@ -import { MobXProviderContext } from 'mobx-react' -import { useContext } from 'react' -import { RootStore } from '@/store' +/** @format */ + +import { MobXProviderContext } from "mobx-react"; +import { useContext } from "react"; +import { RootStore } from "@/store"; // 根据RootStore来实现参数的自动获取和返回值的自动推导 function useStore(name: V): T[V] { - const store = useContext(MobXProviderContext) as T - return store[name] + const store = useContext(MobXProviderContext) as T; + return store[name]; } -export default useStore +export default useStore; diff --git a/src/views/404/404.tsx b/src/views/404/404.tsx index 0ec179d..256834e 100644 --- a/src/views/404/404.tsx +++ b/src/views/404/404.tsx @@ -1,168 +1,171 @@ -import { useNavigate } from 'react-router-dom' -import './index.less' -import {useEffect} from "react"; +/** @format */ + +import { useNavigate } from "react-router-dom"; +// import "./index.less"; +import { useEffect } from "react"; + export default () => { - const navigate = useNavigate() - const goBack = () => { - navigate(-1) - } + const navigate = useNavigate(); + const goBack = () => { + navigate(-1); + }; useEffect(() => { - document.body.classList.add('not-fount-body') - return ()=>{ - document.body.classList.remove('not-fount-body') - } + document.body.classList.add("not-fount-body"); + return () => { + document.body.classList.remove("not-fount-body"); + }; }, []); - return ( - <> - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
4
-
-
-
-
-
-
-
-
-
-
4
-
-
Oops. Looks like you took a wrong turn.
- -
-
- - - ) -} + return ( + <> + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4
+
+
+
+
+
+
+
+
+
+
4
+
+
Oops. Looks like you took a wrong turn.
+ +
+
+ + + ); +}; diff --git a/src/views/Home/index.tsx b/src/views/Home/index.tsx index 29323d0..a86ca17 100644 --- a/src/views/Home/index.tsx +++ b/src/views/Home/index.tsx @@ -1,30 +1,13 @@ -import HomeIndex from '@/components/HomeIndex' -import { useEffect } from 'react' -import { getBaseInfo, initMinio } from '@/api/oss/minio' -import { Button } from 'antd' +/** @format */ +import { useEffect } from "react"; + +import HomeIndex from "@/components/HomeIndex"; export default () => { - const minioInit = () => { - initMinio('1').then(() => { - getBaseInfo('wallhaven-1pd98v.jpg').then((res) => { - console.log(res) - }) - }) - } - const init = () => { - initMinio('2').then(() => { - getBaseInfo('background.png').then((res) => { - console.log(res) - }) - }) - } - - useEffect(() => {}, []) - return ( -
- - - -
- ) -} + useEffect(() => {}, []); + return ( +
+ +
+ ); +}; diff --git a/src/views/Main/index.tsx b/src/views/Main/index.tsx index 5ee261d..454a203 100644 --- a/src/views/Main/index.tsx +++ b/src/views/Main/index.tsx @@ -1,8 +1,11 @@ -import DefaultLayOut from '@/layout/default' +/** @format */ + +import DefaultLayOut from "@/layout/default"; + export default () => { - return ( - <> - - - ) -} + return ( + <> + + + ); +}; diff --git a/src/views/User/Login/index.tsx b/src/views/User/Login/index.tsx index 58272f0..645df0d 100644 --- a/src/views/User/Login/index.tsx +++ b/src/views/User/Login/index.tsx @@ -1,376 +1,378 @@ +/** @format */ + import { - GithubOutlined, - GitlabOutlined, - LockOutlined, - MobileOutlined, - QqOutlined, - UserOutlined, - WechatOutlined, -} from '@ant-design/icons' -import { ProFormCaptcha, ProFormCheckbox, ProFormText } from '@ant-design/pro-components' -import { Divider, Space, Tabs, message, Image, Alert, Form, Button } from 'antd' -import { CSSProperties, useRef } from 'react' -import { useState } from 'react' -import logo from '@/assets/icons/schisandra.svg' -import qrCode from '@/assets/images/login_qrcode-landaiqing.jpg' -import styles from './index.module.less' -import { observer } from 'mobx-react' -import FooterComponent from '@/components/Footer' -import RotateCaptcha, { CaptchaInstance } from 'react-rotate-captcha' -import { get, load, verify } from '@/api/captcha/index.ts' + GithubOutlined, + GitlabOutlined, + LockOutlined, + MobileOutlined, + QqOutlined, + UserOutlined, + WechatOutlined, +} from "@ant-design/icons"; +import { ProFormCaptcha, ProFormCheckbox, ProFormText } from "@ant-design/pro-components"; +import { Divider, Space, Tabs, message, Image, Alert, Form, Button } from "antd"; +import { CSSProperties, useRef } from "react"; +import { useState } from "react"; +import logo from "@/assets/icons/schisandra.svg"; +import qrCode from "@/assets/images/login_qrcode-landaiqing.jpg"; +import styles from "./index.module.less"; +import { observer } from "mobx-react"; +import FooterComponent from "@/components/Footer"; +import RotateCaptcha, { CaptchaInstance } from "react-rotate-captcha"; +import { get, load, verify } from "@/api/captcha/index.ts"; // import useStore from '@/utils/store/useStore.tsx' -type LoginType = 'account' | 'phone' +type LoginType = "account" | "phone"; const iconStyles: CSSProperties = { - color: 'rgba(0, 0, 0, 0.2)', - fontSize: '18px', - verticalAlign: 'middle', - cursor: 'pointer', -} + color: "rgba(0, 0, 0, 0.2)", + fontSize: "18px", + verticalAlign: "middle", + cursor: "pointer", +}; export default observer(() => { - const [form] = Form.useForm() - const captcha = useRef(null) - const items = [ - { - label: ( - - - 账户登录 - - ), - key: 'account', - }, - { - label: ( - - - 短信登录 - - ), - key: 'phone', - }, - ] - const [loginType, setLoginType] = useState('account') + const [form] = Form.useForm(); + const captcha = useRef(null); + const items = [ + { + label: ( + + + 账户登录 + + ), + key: "account", + }, + { + label: ( + + + 短信登录 + + ), + key: "phone", + }, + ]; + const [loginType, setLoginType] = useState("account"); - const onSubmit = async (formData: object) => { - console.log(formData) - } - return ( - -
-
- - - - - 微信扫码登录 - - 微信扫码关注公众号)} - description={ -
- - 微信扫码 - - 关注公众号 - - -
- 登录更快更安全 -
- } - // type="success" - showIcon={true} - className={styles.alert} - icon={} - /> -
-
-
- - - logo - 五味子云存储 - -
随时随地分享你的美好瞬间
-
+ const onSubmit = async (formData: object) => { + console.log(formData); + }; + return ( + +
+
+ + + + + 微信扫码登录 + + 微信扫码关注公众号)} + description={ +
+ + 微信扫码 + + 关注公众号 + + +
+ 登录更快更安全 +
+ } + // type="success" + showIcon={true} + className={styles.alert} + icon={} + /> +
+
+ + + + logo + 五味子云存储 + +
随时随地分享你的美好瞬间
+
- - setLoginType(activeKey as LoginType) - }> + + setLoginType(activeKey as LoginType) + }> - {loginType === 'account' && ( - <> - , - }} - placeholder={'请输入账号/邮箱/电话号码'} - rules={[ - { - required: true, - message: '请输入用户名!', - }, - ]} - /> - , - }} - placeholder={'请输入密码'} - rules={[ - { - required: true, - message: '请输入密码!', - }, - { - pattern: - /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z\\W]{6,18}$/, - message: - '密码长度需在6~18位字符,且必须包含字母和数字!', - }, - ]} - /> - {/*,*/} - {/* autoComplete: 'off',*/} - {/* }}*/} - {/* placeholder='请输入图形验证码'*/} - {/* rules={[*/} - {/* {*/} - {/* required: true,*/} - {/* message: '请输入图形验证码!',*/} - {/* },*/} - {/* {*/} - {/* pattern: /^[a-zA-Z0-9]{5}$/,*/} - {/* message: '图形验证码格式不正确',*/} - {/* },*/} - {/* ]}*/} - {/*/>*/} - - )} - {loginType === 'phone' && ( - <> - , - autoComplete: 'off', - }} - name='mobile' - placeholder={'请输入手机号'} - rules={[ - { - required: true, - message: '请输入手机号!', - }, - { - pattern: /^1\d{10}$/, - message: '手机号格式错误!', - }, - ]} - /> - {/*,*/} - {/* autoComplete: 'off',*/} - {/* }}*/} - {/* placeholder='请输入图形验证码'*/} - {/* rules={[*/} - {/* {*/} - {/* required: true,*/} - {/* message: '请输入图形验证码!',*/} - {/* },*/} - {/* {*/} - {/* pattern: /^[a-zA-Z0-9]{5}$/,*/} - {/* message: '图形验证码格式不正确',*/} - {/* },*/} - {/* ]}*/} - {/*/>*/} - , - }} - captchaProps={{ - size: 'large', - }} - placeholder={'请输入验证码'} - captchaTextRender={(timing, count) => { - if (timing) { - return `${count} ${'获取验证码'}` - } - return '获取验证码' - }} - name='captcha' - rules={[ - { - required: true, - message: '请输入验证码!', - }, - ]} - onGetCaptcha={async () => { - captcha.current!.open() - message.success('获取验证码成功!验证码为:1234') - }} - /> - - )} -
- - 自动登录 - - 忘记密码 -
+ {loginType === "account" && ( + <> + , + }} + placeholder={"请输入账号/邮箱/电话号码"} + rules={[ + { + required: true, + message: "请输入用户名!", + }, + ]} + /> + , + }} + placeholder={"请输入密码"} + rules={[ + { + required: true, + message: "请输入密码!", + }, + { + pattern: + /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z\\W]{6,18}$/, + message: + "密码长度需在6~18位字符,且必须包含字母和数字!", + }, + ]} + /> + {/*,*/} + {/* autoComplete: 'off',*/} + {/* }}*/} + {/* placeholder='请输入图形验证码'*/} + {/* rules={[*/} + {/* {*/} + {/* required: true,*/} + {/* message: '请输入图形验证码!',*/} + {/* },*/} + {/* {*/} + {/* pattern: /^[a-zA-Z0-9]{5}$/,*/} + {/* message: '图形验证码格式不正确',*/} + {/* },*/} + {/* ]}*/} + {/*/>*/} + + )} + {loginType === "phone" && ( + <> + , + autoComplete: "off", + }} + name="mobile" + placeholder={"请输入手机号"} + rules={[ + { + required: true, + message: "请输入手机号!", + }, + { + pattern: /^1\d{10}$/, + message: "手机号格式错误!", + }, + ]} + /> + {/*,*/} + {/* autoComplete: 'off',*/} + {/* }}*/} + {/* placeholder='请输入图形验证码'*/} + {/* rules={[*/} + {/* {*/} + {/* required: true,*/} + {/* message: '请输入图形验证码!',*/} + {/* },*/} + {/* {*/} + {/* pattern: /^[a-zA-Z0-9]{5}$/,*/} + {/* message: '图形验证码格式不正确',*/} + {/* },*/} + {/* ]}*/} + {/*/>*/} + , + }} + captchaProps={{ + size: "large", + }} + placeholder={"请输入验证码"} + captchaTextRender={(timing, count) => { + if (timing) { + return `${count} ${"获取验证码"}`; + } + return "获取验证码"; + }} + name="captcha" + rules={[ + { + required: true, + message: "请输入验证码!", + }, + ]} + onGetCaptcha={async () => { + captcha.current!.open(); + message.success("获取验证码成功!验证码为:1234"); + }} + /> + + )} +
+ + 自动登录 + + 忘记密码 +
- + await form + .validateFields(validateFields) + .then(async (values) => { + if (loginType === "account") { + captcha.current!.open(); + } + await onSubmit(values as API.PhoneRegisterRequest); + }) + .catch((errorInfo) => { + console.error(errorInfo); + }); + }}> + 登录 + -
- - - 其他登录方式 - - - -
- -
-
- -
-
- -
-
- -
-
-
- - - 注册 - -
-
-
- -
-
- ) -}) +
+ + + 其他登录方式 + + + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+ + + 注册 + +
+
+
+ +
+
+ ); +}); diff --git a/src/views/User/Register/index.tsx b/src/views/User/Register/index.tsx index 2b40685..8e4a5b2 100644 --- a/src/views/User/Register/index.tsx +++ b/src/views/User/Register/index.tsx @@ -1,221 +1,223 @@ -import { LockOutlined, MobileOutlined, WechatOutlined } from '@ant-design/icons' -import { ProFormCaptcha, ProFormText } from '@ant-design/pro-components' -import { Space, Tabs, message, Image, Alert, Form, Button } from 'antd' -import { useState } from 'react' -import logo from '@/assets/icons/schisandra.svg' +/** @format */ + +import { LockOutlined, MobileOutlined, WechatOutlined } from "@ant-design/icons"; +import { ProFormCaptcha, ProFormText } from "@ant-design/pro-components"; +import { Space, Tabs, message, Image, Alert, Form, Button } from "antd"; +import { useState } from "react"; +import logo from "@/assets/icons/schisandra.svg"; // import background from '@/assets/images/background.png' -import qrCode from '@/assets/images/login_qrcode-landaiqing.jpg' -import styles from './index.module.less' -import { observer } from 'mobx-react' -import FooterComponent from '@/components/Footer' +import qrCode from "@/assets/images/login_qrcode-landaiqing.jpg"; +import styles from "./index.module.less"; +import { observer } from "mobx-react"; +import FooterComponent from "@/components/Footer"; // import useStore from '@/utils/store/useStore.tsx' -type LoginType = 'phone' +type LoginType = "phone"; export default observer(() => { - const [form] = Form.useForm() - const items = [ - { - key: 'phone', - label: ( - - - 手机号注册 - - ), - }, - ] - const [loginType, setLoginType] = useState('phone') + const [form] = Form.useForm(); + const items = [ + { + key: "phone", + label: ( + + + 手机号注册 + + ), + }, + ]; + const [loginType, setLoginType] = useState("phone"); - const onSubmit = async (formData: object) => { - console.log(formData) - } - return ( -
-
- - - - - 微信扫码登录 - - 微信扫码关注公众号)} - description={ -
- - 微信扫码 - 关注公众号 - -
- 登录更快更安全 -
- } - // type="success" - showIcon={true} - className={styles.alert} - icon={} - /> -
-
-
- - - logo - 五味子云存储 - -
随时随地分享你的美好瞬间
-
+ const onSubmit = async (formData: object) => { + console.log(formData); + }; + return ( +
+
+ + + + + 微信扫码登录 + + 微信扫码关注公众号)} + description={ +
+ + 微信扫码 + 关注公众号 + +
+ 登录更快更安全 +
+ } + // type="success" + showIcon={true} + className={styles.alert} + icon={} + /> +
+
+ + + + logo + 五味子云存储 + +
随时随地分享你的美好瞬间
+
- - setLoginType(activeKey as LoginType) - }> + + setLoginType(activeKey as LoginType) + }> - <> - , - autoComplete: 'off', - }} - name='phone' - placeholder='请输入手机号!' - rules={[ - { - required: true, - message: '请输入手机号!', - }, - { - pattern: /^1\d{10}$/, - message: '手机号格式错误!', - }, - ]} - /> + <> + , + autoComplete: "off", + }} + name="phone" + placeholder="请输入手机号!" + rules={[ + { + required: true, + message: "请输入手机号!", + }, + { + pattern: /^1\d{10}$/, + message: "手机号格式错误!", + }, + ]} + /> - , - }} - placeholder='请输入密码' - rules={[ - { - required: true, - message: '请输入密码!', - }, - { - pattern: - /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z\\W]{6,18}$/, - message: - '密码长度需在6~18位字符,且必须包含字母和数字!', - }, - ]} - /> + , + }} + placeholder="请输入密码" + rules={[ + { + required: true, + message: "请输入密码!", + }, + { + pattern: + /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z\\W]{6,18}$/, + message: + "密码长度需在6~18位字符,且必须包含字母和数字!", + }, + ]} + /> - , - }} - placeholder='请再次确认密码' - rules={[ - { - required: true, - message: '请再次确认密码!', - }, - ({ getFieldValue }) => ({ - validator(_, value) { - if (!value || getFieldValue('password') === value) { - return Promise.resolve() - } - return Promise.reject( - new Error('两次输入的密码不一致!'), - ) - }, - }), - ]} - /> - , - }} - captchaProps={{ - size: 'large', - }} - placeholder={'请输入验证码'} - captchaTextRender={(timing, count) => { - if (timing) { - return `${count} ${'获取验证码'}` - } - return '获取验证码' - }} - name='captcha' - rules={[ - { - required: true, - message: '请输入验证码!', - }, - ]} - onGetCaptcha={async () => { - message.success('获取验证码成功!验证码为:1234') - }} - /> - - - - - 登录 - -
-
-
- -
- ) -}) + , + }} + placeholder="请再次确认密码" + rules={[ + { + required: true, + message: "请再次确认密码!", + }, + ({ getFieldValue }) => ({ + validator(_, value) { + if (!value || getFieldValue("password") === value) { + return Promise.resolve(); + } + return Promise.reject( + new Error("两次输入的密码不一致!"), + ); + }, + }), + ]} + /> + , + }} + captchaProps={{ + size: "large", + }} + placeholder={"请输入验证码"} + captchaTextRender={(timing, count) => { + if (timing) { + return `${count} ${"获取验证码"}`; + } + return "获取验证码"; + }} + name="captcha" + rules={[ + { + required: true, + message: "请输入验证码!", + }, + ]} + onGetCaptcha={async () => { + message.success("获取验证码成功!验证码为:1234"); + }} + /> + + + + + 登录 + +
+
+
+ +
+ ); +}); diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 013c2d7..6ba2310 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -1,34 +1,41 @@ +/** @format */ + /// declare interface ImportMetaEnv { - readonly VITE_APP_BASE_API: string - readonly VITE_APP_TITLE: string - readonly VITE_API_BASE_URL: string - readonly VITE_NODE_ENV: string - readonly VITE_TITLE_NAME: string - readonly VITE_APP_TOKEN_KEY?: string - readonly VITE_UPLOAD_URL?: string + readonly VITE_APP_BASE_API: string; + readonly VITE_APP_TITLE: string; + readonly VITE_API_BASE_URL: string; + readonly VITE_NODE_ENV: string; + readonly VITE_TITLE_NAME: string; + readonly VITE_APP_TOKEN_KEY?: string; + readonly VITE_UPLOAD_URL?: string; } interface ImportMeta { - readonly env: ImportMetaEnv + readonly env: ImportMetaEnv; } -declare module '*.svg' { - const content: any - export default content -} -declare module '.*' { - const value: any - export default value -} -declare module '*.tsx' -declare module '*.svg' -declare module '*.png' -declare module '*.jpg' -declare module '*.jpeg' -declare module '*.gif' -declare module '*.bmp' -declare module '*.tiff' -declare module 'gsap' -declare module 'gsap/ScrollTrigger' +declare module "*.svg" { + const content: any; + export default content; +} +declare module "*.js" { + const content: any; + export default content; +} +declare module ".*" { + const value: any; + export default value; +} +declare module "*.tsx"; +declare module "*.svg"; +declare module "*.png"; +declare module "*.jpg"; +declare module "*.jpeg"; +declare module "*.gif"; +declare module "*.bmp"; +declare module "*.tiff"; + +declare module "gsap"; +declare module "gsap/ScrollTrigger"; diff --git a/tsconfig.json b/tsconfig.json index c6d1f95..1039b56 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,45 +1,44 @@ { - "compilerOptions": { - "esModuleInterop": true, - "target": "ES2020", - "useDefineForClassFields": true, - "lib": [ - "ES2020", - "DOM", - "DOM.Iterable" - ], - "module": "ESNext", - "skipLibCheck": true, - /* Bundler mode */ - "moduleResolution": "node", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "baseUrl": "./", - "paths": { - "@/*": [ - "./src/*" - ] - } - }, - "include": [ - "src/**/*.ts", - "src/**/*.d.ts", - "src/**/*.tsx", - "types/*.d.ts", - "vite.config.ts", - - ], - "references": [ - { - "path": "./tsconfig.node.json" - } - ] + "compilerOptions": { + "esModuleInterop": true, + "target": "ES2020", + "useDefineForClassFields": true, + "lib": [ + "ES2020", + "DOM", + "DOM.Iterable" + ], + "module": "ESNext", + "skipLibCheck": true, + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "baseUrl": "./", + "paths": { + "@/*": [ + "./src/*" + ], + } + }, + "include": [ + "src/**/*.ts", + "src/**/*.d.ts", + "src/**/*.tsx", + "types/*.d.ts", + "vite.config.ts", + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] } diff --git a/vite.config.ts b/vite.config.ts index b2706df..1b8dfa5 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,179 +1,181 @@ -import { defineConfig, loadEnv } from 'vite' -import react from '@vitejs/plugin-react' -import { resolve } from 'path' +/** @format */ + +import { defineConfig, loadEnv } from "vite"; +import react from "@vitejs/plugin-react"; +import { resolve } from "path"; // icons plugin -import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' -import * as path from 'path' -import imagemin from 'unplugin-imagemin/vite' -import viteCompression from 'vite-plugin-compression' -import { createHtmlPlugin } from 'vite-plugin-html' -import legacy from '@vitejs/plugin-legacy' -import postcssPresetEnv from 'postcss-preset-env' -import autoprefixer from 'autoprefixer' +import { createSvgIconsPlugin } from "vite-plugin-svg-icons"; +import * as path from "path"; +import imagemin from "unplugin-imagemin/vite"; +import viteCompression from "vite-plugin-compression"; +import { createHtmlPlugin } from "vite-plugin-html"; +import legacy from "@vitejs/plugin-legacy"; +import postcssPresetEnv from "postcss-preset-env"; +import autoprefixer from "autoprefixer"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error //配置参数 export default defineConfig(({ mode }) => { - const env = loadEnv(mode, process.cwd()) - return { - base: '/', - plugins: [ - react(), - legacy({ - targets: [ - 'ie >= 11', - 'chrome 52', - 'Chrome > 70', - 'Safari 12.1', - 'last 2 versions and since 2018 and > 0.5%', - 'iOS >= 9', - 'Android >= 4.4', - 'last 2 versions', - ], - additionalLegacyPolyfills: ['regenerator-runtime/runtime'], - renderLegacyChunks: true, - polyfills: [ - 'es.promise.all-settled', - 'es.symbol', - 'es.array.filter', - 'es.promise', - 'es.promise.finally', - 'es/map', - 'es/set', - 'es.array.for-each', - 'es.object.define-properties', - 'es.object.define-property', - 'es.object.get-own-property-descriptor', - 'es.object.get-own-property-descriptors', - 'es.object.keys', - 'es.object.to-string', - 'web.dom-collections.for-each', - 'esnext.global-this', - 'esnext.string.match-all', - ], - modernPolyfills: ['es.promise.all-settled', 'es.object.entries'], - }), - // 修改 icons 相关配置 - createSvgIconsPlugin({ - // 指定需要缓存的图标文件夹 - iconDirs: [path.resolve(__dirname, './src/assets/icons')], - // 指定symbolId格式 - symbolId: 'icon-[dir]-[name]', - }), - imagemin({ - // Default mode sharp. support squoosh and sharp - mode: 'sharp', - beforeBundle: true, - // Default configuration options for compressing different pictures - compress: { - jpg: { - quality: 10, - }, - jpeg: { - quality: 10, - }, - png: { - quality: 10, - }, - webp: { - quality: 10, - }, - }, - conversion: [ - { from: 'jpeg', to: 'webp' }, - { from: 'png', to: 'webp' }, - { from: 'JPG', to: 'jpeg' }, - ], - }), - viteCompression({ - verbose: true, // 是否在控制台中输出压缩结果 - disable: false, - threshold: 10240, // 如果体积大于阈值,将被压缩,单位为b,体积过小时请不要压缩,以免适得其反 - algorithm: 'gzip', // 压缩算法,可选['gzip',' brotliccompress ','deflate ','deflateRaw'] - ext: '.gz', - deleteOriginFile: true, // 源文件压缩后是否删除 - }), - createHtmlPlugin({ - minify: true, - /** - * 在这里写entry后,你将不需要在`index.html`内添加 script 标签,原有标签需要删除 - * @default src/main.ts - */ - entry: 'src/main.tsx', - /** - * 如果你想将 `index.html`存放在指定文件夹,可以修改它,否则不需要配置 - * @default index.html - */ - template: 'index.html', - /** - * 需要注入 index.html ejs 模版的数据 - */ - inject: { - data: { - title: env.VITE_TITLE_NAME, - }, - }, - }), - ], - resolve: { - alias: { - '@': resolve(__dirname, 'src'), - }, - extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json'], // 默认值,这些文件引入时不需要写后缀 - }, - css: { - modules: { - // 一般我们可以通过 generateScopedName 属性来对生成的类名进行自定义 - // 其中,name 表示当前文件名,local 表示类名 - generateScopedName: '[name]__[local]___[hash:base64:5]', - }, - postcss: { - plugins: [ - postcssPresetEnv(), - autoprefixer({ - // 自动添加前缀 - overrideBrowserslist: [ - 'Android 4.1', - 'iOS 7.1', - 'Chrome > 31', - 'ff > 31', - 'ie >= 8', - ], - }), - ], - }, - preprocessorOptions: { - less: { - javascriptEnabled: true, - }, - }, - }, - esbuild: { - // drop: ['console', 'debugger'], - }, - build: { - outDir: 'dist', // 指定输出路径 - assetsDir: 'assets', // 指定生成静态文件目录 - assetsInlineLimit: '4096', // 小于此阈值的导入或引用资源将内联为 base64 编码 - cssCodeSplit: true, // 启用 CSS 代码拆分 - sourcemap: false, // 构建后是否生成 source map 文件 - minify: 'esbuild', // 指定使用哪种混淆器 - write: true, // 启用将构建后的文件写入磁盘 - emptyOutDir: true, // 构建时清空该目录 - brotliSize: true, // 启用 brotli 压缩大小报告 - chunkSizeWarningLimit: 2000, // chunk 大小警告的限制 - watch: null, // 设置为 {} 则会启用 rollup 的监听器 - }, - server: { - proxy: { - [env.VITE_APP_BASE_API]: { - //后端接口的baseurl - target: env.VITE_API_BASE_URL, - //是否允许跨域 - changeOrigin: true, - rewrite: (path) => path.replace(RegExp(`^${env.VITE_APP_BASE_API}`), ''), - }, - }, - }, - } -}) + const env = loadEnv(mode, process.cwd()); + return { + base: "/", + plugins: [ + react(), + legacy({ + targets: [ + "ie >= 11", + "chrome 52", + "Chrome > 70", + "Safari 12.1", + "last 2 versions and since 2018 and > 0.5%", + "iOS >= 9", + "Android >= 4.4", + "last 2 versions", + ], + additionalLegacyPolyfills: ["regenerator-runtime/runtime"], + renderLegacyChunks: true, + polyfills: [ + "es.promise.all-settled", + "es.symbol", + "es.array.filter", + "es.promise", + "es.promise.finally", + "es/map", + "es/set", + "es.array.for-each", + "es.object.define-properties", + "es.object.define-property", + "es.object.get-own-property-descriptor", + "es.object.get-own-property-descriptors", + "es.object.keys", + "es.object.to-string", + "web.dom-collections.for-each", + "esnext.global-this", + "esnext.string.match-all", + ], + modernPolyfills: ["es.promise.all-settled", "es.object.entries"], + }), + // 修改 icons 相关配置 + createSvgIconsPlugin({ + // 指定需要缓存的图标文件夹 + iconDirs: [path.resolve(__dirname, "./src/assets/icons")], + // 指定symbolId格式 + symbolId: "icon-[dir]-[name]", + }), + imagemin({ + // Default mode sharp. support squoosh and sharp + mode: "sharp", + beforeBundle: true, + // Default configuration options for compressing different pictures + compress: { + jpg: { + quality: 10, + }, + jpeg: { + quality: 10, + }, + png: { + quality: 10, + }, + webp: { + quality: 10, + }, + }, + conversion: [ + { from: "jpeg", to: "webp" }, + { from: "png", to: "webp" }, + { from: "JPG", to: "jpeg" }, + ], + }), + viteCompression({ + verbose: true, // 是否在控制台中输出压缩结果 + disable: false, + threshold: 10240, // 如果体积大于阈值,将被压缩,单位为b,体积过小时请不要压缩,以免适得其反 + algorithm: "gzip", // 压缩算法,可选['gzip',' brotliccompress ','deflate ','deflateRaw'] + ext: ".gz", + deleteOriginFile: true, // 源文件压缩后是否删除 + }), + createHtmlPlugin({ + minify: true, + /** + * 在这里写entry后,你将不需要在`index.html`内添加 script 标签,原有标签需要删除 + * @default src/main.ts + */ + entry: "src/main.tsx", + /** + * 如果你想将 `index.html`存放在指定文件夹,可以修改它,否则不需要配置 + * @default index.html + */ + template: "index.html", + /** + * 需要注入 index.html ejs 模版的数据 + */ + inject: { + data: { + title: env.VITE_TITLE_NAME, + }, + }, + }), + ], + resolve: { + alias: { + "@": resolve(__dirname, "src"), + }, + extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json"], // 默认值,这些文件引入时不需要写后缀 + }, + css: { + modules: { + // 一般我们可以通过 generateScopedName 属性来对生成的类名进行自定义 + // 其中,name 表示当前文件名,local 表示类名 + generateScopedName: "[name]__[local]___[hash:base64:5]", + }, + postcss: { + plugins: [ + postcssPresetEnv(), + autoprefixer({ + // 自动添加前缀 + overrideBrowserslist: [ + "Android 4.1", + "iOS 7.1", + "Chrome > 31", + "ff > 31", + "ie >= 8", + ], + }), + ], + }, + preprocessorOptions: { + less: { + javascriptEnabled: true, + }, + }, + }, + esbuild: { + // drop: ['console', 'debugger'], + }, + build: { + outDir: "dist", // 指定输出路径 + assetsDir: "assets", // 指定生成静态文件目录 + assetsInlineLimit: "4096", // 小于此阈值的导入或引用资源将内联为 base64 编码 + cssCodeSplit: true, // 启用 CSS 代码拆分 + sourcemap: false, // 构建后是否生成 source map 文件 + minify: "esbuild", // 指定使用哪种混淆器 + write: true, // 启用将构建后的文件写入磁盘 + emptyOutDir: true, // 构建时清空该目录 + brotliSize: true, // 启用 brotli 压缩大小报告 + chunkSizeWarningLimit: 2000, // chunk 大小警告的限制 + watch: null, // 设置为 {} 则会启用 rollup 的监听器 + }, + server: { + proxy: { + [env.VITE_APP_BASE_API]: { + //后端接口的baseurl + target: env.VITE_API_BASE_URL, + //是否允许跨域 + changeOrigin: true, + rewrite: (path) => path.replace(RegExp(`^${env.VITE_APP_BASE_API}`), ""), + }, + }, + }, + }; +});