From 9e6649afa0dba094cebb198634eb0748d736efd3 Mon Sep 17 00:00:00 2001 From: abearxiong Date: Tue, 20 May 2025 16:46:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=BD=E7=A6=BB=E7=99=BB=E9=99=86=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .devcontainer/devcontainer.json | 12 + .gitignore | 2 + README.md | 4 + config/esbuild.config.mjs | 11 + index.html | 33 + package.json | 54 + pnpm-lock.yaml | 2522 ++++++++++++++++++++++ public/MP_verify_NGWvli5lGpEkByyt.txt | 1 + public/config.js | 52 + src/app.ts | 0 src/assets/index.css | 16 + src/assets/logo-baner-h.png | Bin 0 -> 12614 bytes src/main.tsx | 5 + src/modules/basename.ts | 2 + src/modules/beian/beian.css | 11 + src/modules/beian/beian.tsx | 15 + src/modules/message.ts | 3 + src/modules/query.ts | 25 + src/user/Info.tsx | 102 + src/user/index.css | 13 + src/user/index.tsx | 6 + src/user/layout/UserLayout.tsx | 81 + src/user/login/Login.tsx | 331 +++ src/user/login/index.tsx | 49 + src/user/login/modules/WeChatMpLogin.tsx | 80 + src/user/module/load-js.ts | 21 + src/user/store/index.ts | 209 ++ src/vite-env.d.ts | 7 + src/wx/load-js.ts | 21 + src/wx/tencent-captcha.ts | 70 + src/wx/ws-login.ts | 44 + tsconfig.json | 41 + vite.config.mjs | 50 + 33 files changed, 3893 insertions(+) create mode 100644 .devcontainer/devcontainer.json create mode 100644 .gitignore create mode 100644 README.md create mode 100644 config/esbuild.config.mjs create mode 100644 index.html create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 public/MP_verify_NGWvli5lGpEkByyt.txt create mode 100644 public/config.js create mode 100644 src/app.ts create mode 100644 src/assets/index.css create mode 100644 src/assets/logo-baner-h.png create mode 100644 src/main.tsx create mode 100644 src/modules/basename.ts create mode 100644 src/modules/beian/beian.css create mode 100644 src/modules/beian/beian.tsx create mode 100644 src/modules/message.ts create mode 100644 src/modules/query.ts create mode 100644 src/user/Info.tsx create mode 100644 src/user/index.css create mode 100644 src/user/index.tsx create mode 100644 src/user/layout/UserLayout.tsx create mode 100644 src/user/login/Login.tsx create mode 100644 src/user/login/index.tsx create mode 100644 src/user/login/modules/WeChatMpLogin.tsx create mode 100644 src/user/module/load-js.ts create mode 100644 src/user/store/index.ts create mode 100644 src/vite-env.d.ts create mode 100644 src/wx/load-js.ts create mode 100644 src/wx/tencent-captcha.ts create mode 100644 src/wx/ws-login.ts create mode 100644 tsconfig.json create mode 100644 vite.config.mjs diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..ebaf25d --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,12 @@ +{ + "name": "kevisual dev", + "image": "docker.cnb.cool/kevisual/dev-env:latest", + "customizations": { + "vscode": { + "extensions": [ + "dbaeumer.vscode-eslint" + ] + } + }, + "postCreateCommand": "" +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..76add87 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +dist \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..ba084a6 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# app-template + + +`/system/lib/app.js` 包函的模块是 `QueryRouterServer` 和 `Page` 和 `useConfigKey` \ No newline at end of file diff --git a/config/esbuild.config.mjs b/config/esbuild.config.mjs new file mode 100644 index 0000000..4f758c6 --- /dev/null +++ b/config/esbuild.config.mjs @@ -0,0 +1,11 @@ +import { build } from 'esbuild'; + +build({ + entryPoints: ['src/index.ts'], + bundle: true, + outfile: 'dist/index.js', + platform: 'browser', + target: 'esnext', + sourcemap: false, + format: 'esm', +}).catch(() => process.exit(1)); diff --git a/index.html b/index.html new file mode 100644 index 0000000..7986b3e --- /dev/null +++ b/index.html @@ -0,0 +1,33 @@ + + + + +AI Apps + + + + + +
+ + + + \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..9b325dd --- /dev/null +++ b/package.json @@ -0,0 +1,54 @@ +{ + "name": "@kevisual/kevisual-login", + "version": "0.0.4", + "description": "", + "main": "index.js", + "basename": "/user/login", + "scripts": { + "dev": "vite", + "dev:web": "cross-env WEB_DEV=true vite --mode web", + "build": "vite build", + "esbuild": "node esbuild.config.mjs", + "preview": "vite preview", + "pub": "envision deploy ./dist -k login -v 0.0.4 -u -o user" + }, + "keywords": [], + "author": "abearxiong ", + "license": "MIT", + "type": "module", + "dependencies": { + "@floating-ui/dom": "^1.7.0", + "@kevisual/query": "0.0.18", + "@kevisual/query-login": "^0.0.6", + "@kevisual/system-lib": "^0.0.22", + "@kevisual/system-ui": "^0.0.3", + "clsx": "^2.1.1", + "dayjs": "^1.11.13", + "lodash-es": "^4.17.21", + "qrcode": "^1.5.4", + "react-dom": "^19.1.0", + "zustand": "^5.0.4" + }, + "devDependencies": { + "@kevisual/router": "0.0.20", + "@kevisual/store": "0.0.4", + "@kevisual/types": "^0.0.10", + "@tailwindcss/vite": "^4.1.7", + "@types/qrcode": "^1.5.5", + "@types/react": "^19.1.4", + "@types/react-dom": "^19.1.5", + "@vitejs/plugin-basic-ssl": "^2.0.0", + "@vitejs/plugin-react": "^4.4.1", + "cross-env": "^7.0.3", + "esbuild": "^0.25.4", + "react": "^19.1.0", + "tailwindcss": "^4.1.7", + "vite": "^6.3.5" + }, + "pnpm": { + "onlyBuiltDependencies": [ + "@tailwindcss/oxide", + "esbuild" + ] + } +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..b89e237 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2522 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@floating-ui/dom': + specifier: ^1.7.0 + version: 1.7.0 + '@kevisual/query': + specifier: 0.0.18 + version: 0.0.18(ws@8.18.0) + '@kevisual/query-login': + specifier: ^0.0.6 + version: 0.0.6(@kevisual/query@0.0.18(ws@8.18.0))(rollup@4.41.0)(typescript@5.8.3) + '@kevisual/system-lib': + specifier: ^0.0.22 + version: 0.0.22 + '@kevisual/system-ui': + specifier: ^0.0.3 + version: 0.0.3 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 + qrcode: + specifier: ^1.5.4 + version: 1.5.4 + react-dom: + specifier: ^19.1.0 + version: 19.1.0(react@19.1.0) + zustand: + specifier: ^5.0.4 + version: 5.0.4(@types/react@19.1.4)(react@19.1.0) + devDependencies: + '@kevisual/router': + specifier: 0.0.20 + version: 0.0.20 + '@kevisual/store': + specifier: 0.0.4 + version: 0.0.4 + '@kevisual/types': + specifier: ^0.0.10 + version: 0.0.10 + '@tailwindcss/vite': + specifier: ^4.1.7 + version: 4.1.7(vite@6.3.5(@types/node@22.10.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.37.0)) + '@types/qrcode': + specifier: ^1.5.5 + version: 1.5.5 + '@types/react': + specifier: ^19.1.4 + version: 19.1.4 + '@types/react-dom': + specifier: ^19.1.5 + version: 19.1.5(@types/react@19.1.4) + '@vitejs/plugin-basic-ssl': + specifier: ^2.0.0 + version: 2.0.0(vite@6.3.5(@types/node@22.10.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.37.0)) + '@vitejs/plugin-react': + specifier: ^4.4.1 + version: 4.4.1(vite@6.3.5(@types/node@22.10.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.37.0)) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + esbuild: + specifier: ^0.25.4 + version: 0.25.4 + react: + specifier: ^19.1.0 + version: 19.1.0 + tailwindcss: + specifier: ^4.1.7 + version: 4.1.7 + vite: + specifier: ^6.3.5 + version: 6.3.5(@types/node@22.10.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.37.0) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.27.2': + resolution: {integrity: sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.27.1': + resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.27.1': + resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.27.1': + resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.27.1': + resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.3': + resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.27.2': + resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.27.1': + resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.3': + resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.27.1': + resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} + engines: {node: '>=6.9.0'} + + '@esbuild/aix-ppc64@0.25.4': + resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.4': + resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.4': + resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.4': + resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.4': + resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.4': + resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.4': + resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.4': + resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.4': + resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.4': + resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.4': + resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.4': + resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.4': + resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.4': + resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.4': + resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.4': + resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.4': + resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.4': + resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.4': + resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.4': + resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.4': + resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.25.4': + resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.4': + resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.4': + resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.4': + resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@floating-ui/core@1.7.0': + resolution: {integrity: sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==} + + '@floating-ui/dom@1.7.0': + resolution: {integrity: sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==} + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@kevisual/cache@0.0.2': + resolution: {integrity: sha512-2Cl5KF2Gi27uLfhO6CdTMFnRzx9vYnqevAo7d9ab3rOaqTgF8tLeAXglXyRbaWW3WUbHU2XaOb4r98uUsqIQQw==} + + '@kevisual/query-login@0.0.6': + resolution: {integrity: sha512-ZdX+sxeQaM3PV9fZXofMlxFz1RmpYIkoi47exzUgw6DADjEryBAQKRXe2/oL20NsBTV8owqaagRqffAVjq5c5g==} + peerDependencies: + '@kevisual/query': ^0.0.17 + + '@kevisual/query@0.0.18': + resolution: {integrity: sha512-I2vHTu0I6AyD9PJyr+vxyp9jIJ6rd2EZqLVHTv/+zrVKVc2SS76Tg7aGNkmAFqqLSCB8kLLsmMGtSJU1Qb8VVg==} + + '@kevisual/router@0.0.20': + resolution: {integrity: sha512-uSwDYWh+kvAu6i0m0SJVgcLR/CYz7WvIWGz0nSF8Vg6smJuAgI+laHR4ESO8Fbz+Xn8bPHuSwmM//HHLMLx2FA==} + + '@kevisual/store@0.0.4': + resolution: {integrity: sha512-iOgUg7VfyV8au27wSt0DdFqptcykb0mOAayCWChjgfKRKaLh4B021VBn5bdfyrfN1ektJo0ibsapd/QAN6GBtg==} + + '@kevisual/system-lib@0.0.22': + resolution: {integrity: sha512-kdzYlWLH+TGnNe4BfzB4Lk7jRdQE/KMQnMguWvPXdOb/aRiwJFVjlfYoNtA6BXgNC9MOpJ59CzFRc+EsMx1HRw==} + + '@kevisual/system-ui@0.0.3': + resolution: {integrity: sha512-zRtUnL6wNe6R1W7X6eirDADZWeTmxZCNpLwxCLu30yeNuIhpFJdxHyOg0nX9aOZn6F0Kb6lB3Li2fZpKwdpk0w==} + + '@kevisual/types@0.0.10': + resolution: {integrity: sha512-Q73uzzjk9UidumnmCvOpgzqDDvQxsblz22bIFuoiioUFJWwaparx8bpd8ArRyFojicYL1YJoFDzDZ9j9NN8grA==} + + '@rollup/plugin-commonjs@28.0.3': + resolution: {integrity: sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@16.0.1': + resolution: {integrity: sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-typescript@12.1.2': + resolution: {integrity: sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.14.0||^3.0.0||^4.0.0 + tslib: '*' + typescript: '>=3.7.0' + peerDependenciesMeta: + rollup: + optional: true + tslib: + optional: true + + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.41.0': + resolution: {integrity: sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.41.0': + resolution: {integrity: sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.41.0': + resolution: {integrity: sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.41.0': + resolution: {integrity: sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.41.0': + resolution: {integrity: sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.41.0': + resolution: {integrity: sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.41.0': + resolution: {integrity: sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.41.0': + resolution: {integrity: sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.41.0': + resolution: {integrity: sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.41.0': + resolution: {integrity: sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.41.0': + resolution: {integrity: sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.41.0': + resolution: {integrity: sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.41.0': + resolution: {integrity: sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.41.0': + resolution: {integrity: sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.41.0': + resolution: {integrity: sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.41.0': + resolution: {integrity: sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.41.0': + resolution: {integrity: sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.41.0': + resolution: {integrity: sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.41.0': + resolution: {integrity: sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.41.0': + resolution: {integrity: sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA==} + cpu: [x64] + os: [win32] + + '@tailwindcss/node@4.1.7': + resolution: {integrity: sha512-9rsOpdY9idRI2NH6CL4wORFY0+Q6fnx9XP9Ju+iq/0wJwGD5IByIgFmwVbyy4ymuyprj8Qh4ErxMKTUL4uNh3g==} + + '@tailwindcss/oxide-android-arm64@4.1.7': + resolution: {integrity: sha512-IWA410JZ8fF7kACus6BrUwY2Z1t1hm0+ZWNEzykKmMNM09wQooOcN/VXr0p/WJdtHZ90PvJf2AIBS/Ceqx1emg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.7': + resolution: {integrity: sha512-81jUw9To7fimGGkuJ2W5h3/oGonTOZKZ8C2ghm/TTxbwvfSiFSDPd6/A/KE2N7Jp4mv3Ps9OFqg2fEKgZFfsvg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.7': + resolution: {integrity: sha512-q77rWjEyGHV4PdDBtrzO0tgBBPlQWKY7wZK0cUok/HaGgbNKecegNxCGikuPJn5wFAlIywC3v+WMBt0PEBtwGw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.7': + resolution: {integrity: sha512-RfmdbbK6G6ptgF4qqbzoxmH+PKfP4KSVs7SRlTwcbRgBwezJkAO3Qta/7gDy10Q2DcUVkKxFLXUQO6J3CRvBGw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.7': + resolution: {integrity: sha512-OZqsGvpwOa13lVd1z6JVwQXadEobmesxQ4AxhrwRiPuE04quvZHWn/LnihMg7/XkN+dTioXp/VMu/p6A5eZP3g==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.7': + resolution: {integrity: sha512-voMvBTnJSfKecJxGkoeAyW/2XRToLZ227LxswLAwKY7YslG/Xkw9/tJNH+3IVh5bdYzYE7DfiaPbRkSHFxY1xA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.7': + resolution: {integrity: sha512-PjGuNNmJeKHnP58M7XyjJyla8LPo+RmwHQpBI+W/OxqrwojyuCQ+GUtygu7jUqTEexejZHr/z3nBc/gTiXBj4A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.7': + resolution: {integrity: sha512-HMs+Va+ZR3gC3mLZE00gXxtBo3JoSQxtu9lobbZd+DmfkIxR54NO7Z+UQNPsa0P/ITn1TevtFxXTpsRU7qEvWg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.7': + resolution: {integrity: sha512-MHZ6jyNlutdHH8rd+YTdr3QbXrHXqwIhHw9e7yXEBcQdluGwhpQY2Eku8UZK6ReLaWtQ4gijIv5QoM5eE+qlsA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.7': + resolution: {integrity: sha512-ANaSKt74ZRzE2TvJmUcbFQ8zS201cIPxUDm5qez5rLEwWkie2SkGtA4P+GPTj+u8N6JbPrC8MtY8RmJA35Oo+A==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.7': + resolution: {integrity: sha512-HUiSiXQ9gLJBAPCMVRk2RT1ZrBjto7WvqsPBwUrNK2BcdSxMnk19h4pjZjI7zgPhDxlAbJSumTC4ljeA9y0tEw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.7': + resolution: {integrity: sha512-rYHGmvoHiLJ8hWucSfSOEmdCBIGZIq7SpkPRSqLsH2Ab2YUNgKeAPT1Fi2cx3+hnYOrAb0jp9cRyode3bBW4mQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.7': + resolution: {integrity: sha512-5SF95Ctm9DFiUyjUPnDGkoKItPX/k+xifcQhcqX5RA85m50jw1pT/KzjdvlqxRja45Y52nR4MR9fD1JYd7f8NQ==} + engines: {node: '>= 10'} + + '@tailwindcss/vite@4.1.7': + resolution: {integrity: sha512-tYa2fO3zDe41I7WqijyVbRd8oWT0aEID1Eokz5hMT6wShLIHj3yvwj9XbfuloHP9glZ6H+aG2AN/+ZrxJ1Y5RQ==} + peerDependencies: + vite: ^5.2.0 || ^6 + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + + '@types/node-fetch@2.6.12': + resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} + + '@types/node-forge@1.3.11': + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + + '@types/node@18.19.101': + resolution: {integrity: sha512-Ykg7fcE3+cOQlLUv2Ds3zil6DVjriGQaSN/kEpl5HQ3DIGM6W0F2n9+GkWV4bRt7KjLymgzNdTnSKCbFUUJ7Kw==} + + '@types/node@22.10.3': + resolution: {integrity: sha512-DifAyw4BkrufCILvD3ucnuN8eydUfc/C1GlyrnI+LK6543w5/L3VeVgf05o3B4fqSXP1dKYLOZsKfutpxPzZrw==} + + '@types/qrcode@1.5.5': + resolution: {integrity: sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==} + + '@types/react-dom@19.1.5': + resolution: {integrity: sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg==} + peerDependencies: + '@types/react': ^19.0.0 + + '@types/react@19.1.4': + resolution: {integrity: sha512-EB1yiiYdvySuIITtD5lhW4yPyJ31RkJkkDw794LaQYrxCSaQV/47y5o1FMC4zF9ZyjUjzJMZwbovEnT5yHTW6g==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@vitejs/plugin-basic-ssl@2.0.0': + resolution: {integrity: sha512-gc9Tjg8bUxBVSTzeWT3Njc0Cl3PakHFKdNfABnZWiUgbxqmHDEn7uECv3fHVylxoYgNzAcmU7ZrILz+BwSo3sA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + peerDependencies: + vite: ^6.0.0 + + '@vitejs/plugin-react@4.4.1': + resolution: {integrity: sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + browserslist@4.24.3: + resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001690: + resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} + + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + + dotenv@16.5.0: + resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.76: + resolution: {integrity: sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.25.4: + resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + fdir@6.4.4: + resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + form-data-encoder@1.7.2: + resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + + form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} + + formdata-node@4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} + engines: {node: '>= 12.20'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + idb-keyval@6.2.2: + resolution: {integrity: sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==} + + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + openai@4.100.0: + resolution: {integrity: sha512-9soq/wukv3utxcuD7TWFqKdKp0INWdeyhUCvxwrne5KwnxaCp4eHL4GdT/tMFhYolxgNhxFzg5GFwM331Z5CZg==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.23.8 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + peerDependencies: + react: ^19.1.0 + + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + rollup-plugin-dts@6.2.1: + resolution: {integrity: sha512-sR3CxYUl7i2CHa0O7bA45mCrgADyAQ0tVtGSqi3yvH28M+eg1+g5d7kQ9hLvEz5dorK3XVsH5L2jwHLQf72DzA==} + engines: {node: '>=16'} + peerDependencies: + rollup: ^3.29.4 || ^4 + typescript: ^4.5 || ^5.0 + + rollup@4.41.0: + resolution: {integrity: sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + + selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + style-to-object@1.0.8: + resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tailwindcss@4.1.7: + resolution: {integrity: sha512-kr1o/ErIdNhTz8uzAYL7TpaUuzKIE6QPQ4qmSdxnoX/lo+5wmUHQA6h3L5yIqEImSRnAAURDirLu/BgiXGPAhg==} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + + terser@5.37.0: + resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==} + engines: {node: '>=10'} + hasBin: true + + tinyglobby@0.2.13: + resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + engines: {node: '>=12.0.0'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + vite@6.3.5: + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + web-streams-polyfill@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + zustand@5.0.4: + resolution: {integrity: sha512-39VFTN5InDtMd28ZhjLyuTnlytDr9HfwO512Ai4I8ZABCoyAj4F1+sr7sD1jP/+p7k77Iko0Pb5NhgBFDCX0kQ==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.27.2': {} + + '@babel/core@7.27.1': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) + '@babel/helpers': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.27.1': + dependencies: + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.27.2 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.24.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.25.9': {} + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.27.1': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 + + '@babel/parser@7.26.3': + dependencies: + '@babel/types': 7.26.3 + + '@babel/parser@7.27.2': + dependencies: + '@babel/types': 7.27.1 + + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 + + '@babel/traverse@7.27.1': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.3': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@babel/types@7.27.1': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@esbuild/aix-ppc64@0.25.4': + optional: true + + '@esbuild/android-arm64@0.25.4': + optional: true + + '@esbuild/android-arm@0.25.4': + optional: true + + '@esbuild/android-x64@0.25.4': + optional: true + + '@esbuild/darwin-arm64@0.25.4': + optional: true + + '@esbuild/darwin-x64@0.25.4': + optional: true + + '@esbuild/freebsd-arm64@0.25.4': + optional: true + + '@esbuild/freebsd-x64@0.25.4': + optional: true + + '@esbuild/linux-arm64@0.25.4': + optional: true + + '@esbuild/linux-arm@0.25.4': + optional: true + + '@esbuild/linux-ia32@0.25.4': + optional: true + + '@esbuild/linux-loong64@0.25.4': + optional: true + + '@esbuild/linux-mips64el@0.25.4': + optional: true + + '@esbuild/linux-ppc64@0.25.4': + optional: true + + '@esbuild/linux-riscv64@0.25.4': + optional: true + + '@esbuild/linux-s390x@0.25.4': + optional: true + + '@esbuild/linux-x64@0.25.4': + optional: true + + '@esbuild/netbsd-arm64@0.25.4': + optional: true + + '@esbuild/netbsd-x64@0.25.4': + optional: true + + '@esbuild/openbsd-arm64@0.25.4': + optional: true + + '@esbuild/openbsd-x64@0.25.4': + optional: true + + '@esbuild/sunos-x64@0.25.4': + optional: true + + '@esbuild/win32-arm64@0.25.4': + optional: true + + '@esbuild/win32-ia32@0.25.4': + optional: true + + '@esbuild/win32-x64@0.25.4': + optional: true + + '@floating-ui/core@1.7.0': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.7.0': + dependencies: + '@floating-ui/core': 1.7.0 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/utils@0.2.9': {} + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + optional: true + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@kevisual/cache@0.0.2(rollup@4.41.0)(typescript@5.8.3)': + dependencies: + '@rollup/plugin-commonjs': 28.0.3(rollup@4.41.0) + '@rollup/plugin-node-resolve': 16.0.1(rollup@4.41.0) + '@rollup/plugin-typescript': 12.1.2(rollup@4.41.0)(typescript@5.8.3) + idb-keyval: 6.2.2 + rollup-plugin-dts: 6.2.1(rollup@4.41.0)(typescript@5.8.3) + transitivePeerDependencies: + - rollup + - tslib + - typescript + + '@kevisual/query-login@0.0.6(@kevisual/query@0.0.18(ws@8.18.0))(rollup@4.41.0)(typescript@5.8.3)': + dependencies: + '@kevisual/cache': 0.0.2(rollup@4.41.0)(typescript@5.8.3) + '@kevisual/query': 0.0.18(ws@8.18.0) + dotenv: 16.5.0 + transitivePeerDependencies: + - rollup + - tslib + - typescript + + '@kevisual/query@0.0.18(ws@8.18.0)': + dependencies: + openai: 4.100.0(ws@8.18.0) + transitivePeerDependencies: + - encoding + - ws + - zod + + '@kevisual/router@0.0.20': + dependencies: + path-to-regexp: 8.2.0 + selfsigned: 2.4.1 + + '@kevisual/store@0.0.4': + dependencies: + eventemitter3: 5.0.1 + path-to-regexp: 8.2.0 + + '@kevisual/system-lib@0.0.22': {} + + '@kevisual/system-ui@0.0.3': + dependencies: + dayjs: 1.11.13 + lodash-es: 4.17.21 + style-to-object: 1.0.8 + + '@kevisual/types@0.0.10': {} + + '@rollup/plugin-commonjs@28.0.3(rollup@4.41.0)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.41.0) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.4.4(picomatch@4.0.2) + is-reference: 1.2.1 + magic-string: 0.30.17 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.41.0 + + '@rollup/plugin-node-resolve@16.0.1(rollup@4.41.0)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.41.0) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.10 + optionalDependencies: + rollup: 4.41.0 + + '@rollup/plugin-typescript@12.1.2(rollup@4.41.0)(typescript@5.8.3)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.41.0) + resolve: 1.22.10 + typescript: 5.8.3 + optionalDependencies: + rollup: 4.41.0 + + '@rollup/pluginutils@5.1.4(rollup@4.41.0)': + dependencies: + '@types/estree': 1.0.7 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.41.0 + + '@rollup/rollup-android-arm-eabi@4.41.0': + optional: true + + '@rollup/rollup-android-arm64@4.41.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.41.0': + optional: true + + '@rollup/rollup-darwin-x64@4.41.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.41.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.41.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.41.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.41.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.41.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.41.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.41.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.41.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.41.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.41.0': + optional: true + + '@tailwindcss/node@4.1.7': + dependencies: + '@ampproject/remapping': 2.3.0 + enhanced-resolve: 5.18.1 + jiti: 2.4.2 + lightningcss: 1.30.1 + magic-string: 0.30.17 + source-map-js: 1.2.1 + tailwindcss: 4.1.7 + + '@tailwindcss/oxide-android-arm64@4.1.7': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.7': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.7': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.7': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.7': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.7': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.7': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.7': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.7': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.7': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.7': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.7': + optional: true + + '@tailwindcss/oxide@4.1.7': + dependencies: + detect-libc: 2.0.4 + tar: 7.4.3 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.7 + '@tailwindcss/oxide-darwin-arm64': 4.1.7 + '@tailwindcss/oxide-darwin-x64': 4.1.7 + '@tailwindcss/oxide-freebsd-x64': 4.1.7 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.7 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.7 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.7 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.7 + '@tailwindcss/oxide-linux-x64-musl': 4.1.7 + '@tailwindcss/oxide-wasm32-wasi': 4.1.7 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.7 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.7 + + '@tailwindcss/vite@4.1.7(vite@6.3.5(@types/node@22.10.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.37.0))': + dependencies: + '@tailwindcss/node': 4.1.7 + '@tailwindcss/oxide': 4.1.7 + tailwindcss: 4.1.7 + vite: 6.3.5(@types/node@22.10.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.37.0) + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.26.3 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.26.3 + + '@types/estree@1.0.7': {} + + '@types/node-fetch@2.6.12': + dependencies: + '@types/node': 22.10.3 + form-data: 4.0.2 + + '@types/node-forge@1.3.11': + dependencies: + '@types/node': 22.10.3 + + '@types/node@18.19.101': + dependencies: + undici-types: 5.26.5 + + '@types/node@22.10.3': + dependencies: + undici-types: 6.20.0 + + '@types/qrcode@1.5.5': + dependencies: + '@types/node': 22.10.3 + + '@types/react-dom@19.1.5(@types/react@19.1.4)': + dependencies: + '@types/react': 19.1.4 + + '@types/react@19.1.4': + dependencies: + csstype: 3.1.3 + + '@types/resolve@1.20.2': {} + + '@vitejs/plugin-basic-ssl@2.0.0(vite@6.3.5(@types/node@22.10.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.37.0))': + dependencies: + vite: 6.3.5(@types/node@22.10.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.37.0) + + '@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@22.10.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.37.0))': + dependencies: + '@babel/core': 7.27.1 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.27.1) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.27.1) + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 6.3.5(@types/node@22.10.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.37.0) + transitivePeerDependencies: + - supports-color + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + acorn@8.14.0: + optional: true + + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + asynckit@0.4.0: {} + + browserslist@4.24.3: + dependencies: + caniuse-lite: 1.0.30001690 + electron-to-chromium: 1.5.76 + node-releases: 2.0.19 + update-browserslist-db: 1.1.1(browserslist@4.24.3) + + buffer-from@1.1.2: + optional: true + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + camelcase@5.3.1: {} + + caniuse-lite@1.0.30001690: {} + + chownr@3.0.0: {} + + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + clsx@2.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@2.20.3: + optional: true + + commondir@1.0.1: {} + + convert-source-map@2.0.0: {} + + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.6 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.1.3: {} + + dayjs@1.11.13: {} + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decamelize@1.2.0: {} + + deepmerge@4.3.1: {} + + delayed-stream@1.0.0: {} + + detect-libc@2.0.4: {} + + dijkstrajs@1.0.3: {} + + dotenv@16.5.0: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.76: {} + + emoji-regex@8.0.0: {} + + enhanced-resolve@5.18.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.25.4: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.4 + '@esbuild/android-arm': 0.25.4 + '@esbuild/android-arm64': 0.25.4 + '@esbuild/android-x64': 0.25.4 + '@esbuild/darwin-arm64': 0.25.4 + '@esbuild/darwin-x64': 0.25.4 + '@esbuild/freebsd-arm64': 0.25.4 + '@esbuild/freebsd-x64': 0.25.4 + '@esbuild/linux-arm': 0.25.4 + '@esbuild/linux-arm64': 0.25.4 + '@esbuild/linux-ia32': 0.25.4 + '@esbuild/linux-loong64': 0.25.4 + '@esbuild/linux-mips64el': 0.25.4 + '@esbuild/linux-ppc64': 0.25.4 + '@esbuild/linux-riscv64': 0.25.4 + '@esbuild/linux-s390x': 0.25.4 + '@esbuild/linux-x64': 0.25.4 + '@esbuild/netbsd-arm64': 0.25.4 + '@esbuild/netbsd-x64': 0.25.4 + '@esbuild/openbsd-arm64': 0.25.4 + '@esbuild/openbsd-x64': 0.25.4 + '@esbuild/sunos-x64': 0.25.4 + '@esbuild/win32-arm64': 0.25.4 + '@esbuild/win32-ia32': 0.25.4 + '@esbuild/win32-x64': 0.25.4 + + escalade@3.2.0: {} + + estree-walker@2.0.2: {} + + event-target-shim@5.0.1: {} + + eventemitter3@5.0.1: {} + + fdir@6.4.4(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + form-data-encoder@1.7.2: {} + + form-data@4.0.2: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + + formdata-node@4.4.1: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + globals@11.12.0: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + + idb-keyval@6.2.2: {} + + inline-style-parser@0.2.4: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-fullwidth-code-point@3.0.0: {} + + is-module@1.0.0: {} + + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.7 + + isexe@2.0.0: {} + + jiti@2.4.2: {} + + js-tokens@4.0.0: {} + + jsesc@3.1.0: {} + + json5@2.2.3: {} + + lightningcss-darwin-arm64@1.30.1: + optional: true + + lightningcss-darwin-x64@1.30.1: + optional: true + + lightningcss-freebsd-x64@1.30.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true + + lightningcss-linux-x64-gnu@1.30.1: + optional: true + + lightningcss-linux-x64-musl@1.30.1: + optional: true + + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.0.4 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash-es@4.17.21: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + math-intrinsics@1.1.0: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minipass@7.1.2: {} + + minizlib@3.0.2: + dependencies: + minipass: 7.1.2 + + mkdirp@3.0.1: {} + + ms@2.1.3: {} + + nanoid@3.3.8: {} + + node-domexception@1.0.0: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-forge@1.3.1: {} + + node-releases@2.0.19: {} + + openai@4.100.0(ws@8.18.0): + dependencies: + '@types/node': 18.19.101 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + optionalDependencies: + ws: 8.18.0 + transitivePeerDependencies: + - encoding + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-try@2.2.0: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-to-regexp@8.2.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.2: {} + + pngjs@5.0.0: {} + + postcss@8.5.3: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + qrcode@1.5.4: + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + + react-dom@19.1.0(react@19.1.0): + dependencies: + react: 19.1.0 + scheduler: 0.26.0 + + react-refresh@0.17.0: {} + + react@19.1.0: {} + + require-directory@2.1.1: {} + + require-main-filename@2.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rollup-plugin-dts@6.2.1(rollup@4.41.0)(typescript@5.8.3): + dependencies: + magic-string: 0.30.17 + rollup: 4.41.0 + typescript: 5.8.3 + optionalDependencies: + '@babel/code-frame': 7.27.1 + + rollup@4.41.0: + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.41.0 + '@rollup/rollup-android-arm64': 4.41.0 + '@rollup/rollup-darwin-arm64': 4.41.0 + '@rollup/rollup-darwin-x64': 4.41.0 + '@rollup/rollup-freebsd-arm64': 4.41.0 + '@rollup/rollup-freebsd-x64': 4.41.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.41.0 + '@rollup/rollup-linux-arm-musleabihf': 4.41.0 + '@rollup/rollup-linux-arm64-gnu': 4.41.0 + '@rollup/rollup-linux-arm64-musl': 4.41.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.41.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.41.0 + '@rollup/rollup-linux-riscv64-gnu': 4.41.0 + '@rollup/rollup-linux-riscv64-musl': 4.41.0 + '@rollup/rollup-linux-s390x-gnu': 4.41.0 + '@rollup/rollup-linux-x64-gnu': 4.41.0 + '@rollup/rollup-linux-x64-musl': 4.41.0 + '@rollup/rollup-win32-arm64-msvc': 4.41.0 + '@rollup/rollup-win32-ia32-msvc': 4.41.0 + '@rollup/rollup-win32-x64-msvc': 4.41.0 + fsevents: 2.3.3 + + scheduler@0.26.0: {} + + selfsigned@2.4.1: + dependencies: + '@types/node-forge': 1.3.11 + node-forge: 1.3.1 + + semver@6.3.1: {} + + set-blocking@2.0.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + optional: true + + source-map@0.6.1: + optional: true + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + style-to-object@1.0.8: + dependencies: + inline-style-parser: 0.2.4 + + supports-preserve-symlinks-flag@1.0.0: {} + + tailwindcss@4.1.7: {} + + tapable@2.2.1: {} + + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.2 + mkdirp: 3.0.1 + yallist: 5.0.0 + + terser@5.37.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.0 + commander: 2.20.3 + source-map-support: 0.5.21 + optional: true + + tinyglobby@0.2.13: + dependencies: + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + + tr46@0.0.3: {} + + typescript@5.8.3: {} + + undici-types@5.26.5: {} + + undici-types@6.20.0: {} + + update-browserslist-db@1.1.1(browserslist@4.24.3): + dependencies: + browserslist: 4.24.3 + escalade: 3.2.0 + picocolors: 1.1.1 + + vite@6.3.5(@types/node@22.10.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.37.0): + dependencies: + esbuild: 0.25.4 + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.3 + rollup: 4.41.0 + tinyglobby: 0.2.13 + optionalDependencies: + '@types/node': 22.10.3 + fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.30.1 + terser: 5.37.0 + + web-streams-polyfill@4.0.0-beta.3: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-module@2.0.1: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + ws@8.18.0: + optional: true + + y18n@4.0.3: {} + + yallist@3.1.1: {} + + yallist@5.0.0: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + + zustand@5.0.4(@types/react@19.1.4)(react@19.1.0): + optionalDependencies: + '@types/react': 19.1.4 + react: 19.1.0 diff --git a/public/MP_verify_NGWvli5lGpEkByyt.txt b/public/MP_verify_NGWvli5lGpEkByyt.txt new file mode 100644 index 0000000..486acfa --- /dev/null +++ b/public/MP_verify_NGWvli5lGpEkByyt.txt @@ -0,0 +1 @@ +NGWvli5lGpEkByyt \ No newline at end of file diff --git a/public/config.js b/public/config.js new file mode 100644 index 0000000..32735ca --- /dev/null +++ b/public/config.js @@ -0,0 +1,52 @@ +export const silkyConfig = { + captchaAppId: '196626989', + wxLogin: { + appid: 'wxea912643e8747b44', + redirect_uri: 'https://kevisual.silkyai.cn/api/wx/login', + }, + wxmpLogin: { + loginUrl: `https://kevisual.xiongxiao.me/root/mini-web/login.html`, + }, + loginWay: ['account', 'wechat', 'phone', 'wechat-mp'], + loginSuccess: '/root/center/', + loginSuccessIsNew: '/root/center/', + beian: '浙ICP备2024137660号-1', +}; + +const currentUrl = new URL(window.location.href); +const redirect = currentUrl.origin + currentUrl.pathname; +export const kevisualConfig = { + loginWay: ['account', 'wechat'], + loginSuccess: '/root/center/', + loginSuccessIsNew: '/root/center/', + wxLogin: { + appid: 'wx9378885c8390e09b', + redirect_uri: redirect, + }, + beian: '浙ICP备2025158778号', + logo: 'https://kevisual.xiongxiao.me/root/center/panda.png', + logoStyle: { + borderRadius: '50%', + marginTop: '10px', + margin: '30px auto', + }, +}; + +const kevisualXiongxiaoConfig = { + ...kevisualConfig, + loginWay: ['account', 'wechat-mp'], + wxLogin: { + appid: 'wxff97d569b1db16b6', + redirect_uri: redirect, + }, + wxmpLogin: { + loginUrl: `${currentUrl.origin}/root/mini-web/login.html`, + }, + logo: 'https://kevisual.xiongxiao.me/root/center/panda.png', + beian: '蜀ICP备16031039号-2', +}; + +const url = new URL(window.location.href); +const isKevisual = url.hostname === 'kevisual.cn'; +const isKevisualXiongxiao = url.hostname === 'kevisual.xiongxiao.me'; +export const config = isKevisual ? kevisualConfig : isKevisualXiongxiao ? kevisualXiongxiaoConfig : silkyConfig; diff --git a/src/app.ts b/src/app.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/index.css b/src/assets/index.css new file mode 100644 index 0000000..7df6baa --- /dev/null +++ b/src/assets/index.css @@ -0,0 +1,16 @@ +@import "tailwindcss"; + +@layer components { + .test-loading { + @apply w-20 h-20 bg-gray-300 rounded-full animate-spin; + } +} + +#ai-bot-root { + width: 100%; + height: 100%; + position: fixed; + top: 0; + left: -100px; + z-index: 9999; +} diff --git a/src/assets/logo-baner-h.png b/src/assets/logo-baner-h.png new file mode 100644 index 0000000000000000000000000000000000000000..018736c5bb1775b92dd5f082f83408792ab69f67 GIT binary patch literal 12614 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 literal 0 HcmV?d00001 diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..cf3cbe2 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,5 @@ +import { createRoot } from 'react-dom/client'; +import { App } from './user/index.tsx'; + +// @ts-ignore +createRoot(document.getElementById('root')!).render(); \ No newline at end of file diff --git a/src/modules/basename.ts b/src/modules/basename.ts new file mode 100644 index 0000000..c4f3d9e --- /dev/null +++ b/src/modules/basename.ts @@ -0,0 +1,2 @@ +// @ts-ignore +export const basename = DEV_SERVER ? '/' : BASE_NAME; \ No newline at end of file diff --git a/src/modules/beian/beian.css b/src/modules/beian/beian.css new file mode 100644 index 0000000..083c558 --- /dev/null +++ b/src/modules/beian/beian.css @@ -0,0 +1,11 @@ +.beian2 { + position: fixed; + z-index: 99; +} + +@media (max-width: 640px) { + .beiann2 { + position: static !important; /* 或者 relative,根据需求修改 */ + } +} + diff --git a/src/modules/beian/beian.tsx b/src/modules/beian/beian.tsx new file mode 100644 index 0000000..3f94ae2 --- /dev/null +++ b/src/modules/beian/beian.tsx @@ -0,0 +1,15 @@ +import clsx from 'clsx'; +import './beian.css'; +type Props = { + className?: string; + text?: string; +}; +export const Beian = (props: Props) => { + return ( + + ); +}; diff --git a/src/modules/message.ts b/src/modules/message.ts new file mode 100644 index 0000000..f3cb669 --- /dev/null +++ b/src/modules/message.ts @@ -0,0 +1,3 @@ +import { message } from '@kevisual/system-ui/dist/message'; + +export { message }; diff --git a/src/modules/query.ts b/src/modules/query.ts new file mode 100644 index 0000000..0657858 --- /dev/null +++ b/src/modules/query.ts @@ -0,0 +1,25 @@ +import { QueryClient } from '@kevisual/query'; +import { QueryLoginBrowser } from '@kevisual/query-login'; + +export const query = new QueryClient(); + +export const queryLogin = new QueryLoginBrowser({ + query: query as any, +}); + +query.after(async (res, ctx) => { + if (res.code === 401) { + if (query.stop) { + return { + code: 500, + success: false, + message: '登录已过期.', + }; + } + query.stop = true; + const result = await queryLogin.afterCheck401ToRefreshToken(res, ctx); + query.stop = false; + return result; + } + return res; +}); diff --git a/src/user/Info.tsx b/src/user/Info.tsx new file mode 100644 index 0000000..f7939f1 --- /dev/null +++ b/src/user/Info.tsx @@ -0,0 +1,102 @@ +import React, { useEffect, useLayoutEffect, useState } from 'react'; +import { Layout, MainLayout } from './layout/UserLayout'; +import { useUserStore } from './store'; +import { message } from '@/modules/message'; +export const Info = () => { + return ( + + + + + + ); +}; +export const ProfileForm: React.FC = () => { + const [nickname, setNickname] = useState(''); + const [name, setName] = useState(''); + const [avatar, setAvatar] = useState(null); + const userStore = useUserStore(); + const handleAvatarChange = (e: React.ChangeEvent) => { + if (e.target.files && e.target.files[0]) { + const file = e.target.files[0]; + // 如果文件大于 2MB,提示用户 + if (file.size > 2 * 1024 * 1024) { + message.error('文件大小不能超过 2MB'); + return; + } + + const reader = new FileReader(); + reader.onload = () => { + setAvatar(reader.result as string); + }; + reader.readAsDataURL(file); + } + }; + + const handleSubmit = () => { + // alert(`昵称: ${nickname}, 姓名: ${name}`) + userStore.updateUser({ + nickname, + data: { + personalname: name, + }, + avatar, + }); + }; + useLayoutEffect(() => { + userStore.getUpdateUser(); + }, []); + useEffect(() => { + if (userStore.data) { + setNickname(userStore.data.nickname); + setName(userStore.data?.data?.personalname); + setAvatar(userStore.data.avatar); + } + }, [userStore.data]); + + return ( +
+

完善个人信息

+

请设置您的基本信息

+ + {/* Avatar Section */} +
+ +
+ + {/* Form Fields */} +
+ + setNickname(e.target.value)} + className='w-full border-[#FBBF24] rounded-lg p-2 border focus:outline-none focus:ring-2 focus:ring-[#F39800]' + /> +
+ +
+ + setName(e.target.value)} + className='w-full border-[#FBBF24] rounded-lg p-2 border focus:outline-none focus:ring-2 focus:ring-[#F39800]' + /> +
+ + {/* Submit Button */} + +
+ ); +}; diff --git a/src/user/index.css b/src/user/index.css new file mode 100644 index 0000000..fc889d4 --- /dev/null +++ b/src/user/index.css @@ -0,0 +1,13 @@ +@media (min-width: 1000px) and (max-width: 1440px) { + .login-main { + /* background-color: red !important; */ + scale: 0.8; + } +} + +@media (min-width: 1500px) and (max-width: 2000px) { + .login-main { + /* background-color: red !important; */ + scale: 1.2; + } +} diff --git a/src/user/index.tsx b/src/user/index.tsx new file mode 100644 index 0000000..9dc7c90 --- /dev/null +++ b/src/user/index.tsx @@ -0,0 +1,6 @@ +import './index.css'; +import { Login } from './login'; + +export const App = () => { + return ; +}; diff --git a/src/user/layout/UserLayout.tsx b/src/user/layout/UserLayout.tsx new file mode 100644 index 0000000..2a7b62b --- /dev/null +++ b/src/user/layout/UserLayout.tsx @@ -0,0 +1,81 @@ +import clsx from 'clsx'; +import LogoBannerH from '@/assets/logo-baner-h.png'; + +import { Beian } from '@/modules/beian/beian'; +import { useUserStore } from '../store'; +import { useShallow } from 'zustand/shallow'; +import { useEffect } from 'react'; +type Props = { + children?: React.ReactNode; + className?: string; +}; +export const Layout = (props: Props) => { + return ( +
+
{props.children}
+
+ ); +}; + +export const MainLayout = (props: Props) => { + const config = useUserStore((state) => state.config); + return ( +
+ {props.children} +

+ 登录即表示同意 服务条款隐私政策 +

+ +
+ ); +}; + +export const LoginWrapper = (props: Props) => { + const config = useUserStore((state) => state.config); + const loginWay = config?.loginWay || ['account']; + const store = useUserStore( + useShallow((state) => { + return { + loginByWechat: state.loginByWechat, + }; + }), + ); + const checkWechat = () => { + const url = new URL(window.location.href); + const code = url.searchParams.get('code'); + const state = url.searchParams.get('state'); + if (code && state) { + store.loginByWechat(code); + } + }; + useEffect(() => { + checkWechat(); + }, []); + return ( + + +
+ +
+
欢迎回来
+ {loginWay.length > 1 &&
请选择登陆方式
} +
{props.children}
+
+
+ ); +}; diff --git a/src/user/login/Login.tsx b/src/user/login/Login.tsx new file mode 100644 index 0000000..2476adf --- /dev/null +++ b/src/user/login/Login.tsx @@ -0,0 +1,331 @@ +import React, { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'; +import { useUserStore } from '../store'; +import { setWxerwma, wxId } from '@/wx/ws-login.ts'; +import { checkCaptcha } from '@/wx/tencent-captcha.ts'; +import { dynimicLoadTcapTcha } from '@/wx/load-js.ts'; +import { message } from '@/modules/message'; +import { useShallow } from 'zustand/react/shallow'; +import { WeChatMpLogin } from './modules/WeChatMpLogin'; +const WeChatLogin: React.FC = () => { + const userStore = useUserStore( + useShallow((state) => { + return { config: state.config! }; + }), + ); + useEffect(() => { + setWxerwma({ + ...userStore.config.wxLogin, + }); + }, []); + + return
; +}; + +type VerificationCodeInputProps = { + onGetCode: () => void; + verificationCode: string; + setVerificationCode: (value: string) => void; +}; +const VerificationCodeInput = forwardRef(({ onGetCode, verificationCode, setVerificationCode }: VerificationCodeInputProps, ref) => { + // const [verificationCode, setVerificationCode] = useState('') + const [isCounting, setIsCounting] = useState(false); + const [countdown, setCountdown] = useState(60); + useImperativeHandle(ref, () => ({ + isCounting, + setIsCounting, + setCountdown, + })); + const handleGetCode = () => { + if (!isCounting) { + // setIsCounting(true) + // setCountdown(60) + onGetCode(); // 调用父组件传入的获取验证码逻辑 + } + }; + + useEffect(() => { + let timer; + if (isCounting) { + timer = setInterval(() => { + setCountdown((prev) => { + if (prev <= 1) { + setIsCounting(false); + clearInterval(timer); + return 60; + } + return prev - 1; + }); + }, 1000); + } + return () => clearInterval(timer); + }, [isCounting]); + + return ( +
+ +
+ setVerificationCode(e.target.value)} + /> + +
+
+ ); +}); + +function PhoneNumberValidation({ phoneNumber, setPhoneNumber }) { + // const [phoneNumber, setPhoneNumber] = useState('') + const [errorMessage, setErrorMessage] = useState(''); + + const validatePhoneNumber = (number) => { + // 假设手机号的格式为中国的11位数字 + const phoneRegex = /^1[3-9]\d{9}$/; + if (!phoneRegex.test(number)) { + setErrorMessage('请输入有效的手机号'); + } else { + setErrorMessage(''); + } + }; + + const handleChange = (e) => { + const value = e.target.value; + setPhoneNumber(value); + validatePhoneNumber(value); + }; + + return ( +
+ + + {errorMessage &&

{errorMessage}

} + {!errorMessage &&

请输入11位手机号

} +
+ ); +} + +function AccountLogin({ accountName, setAccountName, password, setPassword }) { + const [errorMessage, setErrorMessage] = useState(''); + + const validateAccountName = (name) => { + if (name.length < 3) { + setErrorMessage('账户名至少需要3个字符'); + } else { + setErrorMessage(''); + } + }; + + const handleAccountChange = (e) => { + const value = e.target.value; + setAccountName(value); + validateAccountName(value); + }; + + const handlePasswordChange = (e) => { + setPassword(e.target.value); + }; + + return ( +
+ + + {errorMessage &&

{errorMessage}

} + {!errorMessage &&

账户名至少需要3个字符

} + + + +
+ ); +} + +const LoginForm: React.FC = () => { + const [phoneNumber, setPhoneNumber] = useState(''); + const [verificationCode, setVerificationCode] = useState(''); + const [accountName, setAccountName] = useState(''); + const [password, setPassword] = useState(''); + const [activeTab, setActiveTab] = useState<'phone' | 'wechat' | 'wechat-mp' | 'account'>('phone'); + const userStore = useUserStore( + useShallow((state) => { + return { + config: state.config! || {}, + getCode: state.getCode, + login: state.login, + loginByAccount: state.loginByAccount, + }; + }), + ); + const ref = useRef(null); + const handleGetCode = async () => { + const loaded = await dynimicLoadTcapTcha(); + if (!loaded) { + message.error('验证码加载失败'); + return; + } + const captcha = await checkCaptcha(userStore.config.captchaAppId); + if (captcha.ret !== 0) { + message.error('验证码发送失败'); + return; + } + ref.current.setIsCounting(true); + ref.current.setCountdown(60); + userStore.getCode(phoneNumber, captcha); + }; + useEffect(() => { + dynimicLoadTcapTcha(); + if (userStore.config.loginWay?.length > 0) { + setActiveTab(userStore.config.loginWay[0]); + } + }, [userStore.config.loginWay]); + const handleLogin = () => { + // alert(`登录中:手机号: ${phoneNumber}, 验证码: ${verificationCode}`) + userStore.login(phoneNumber, verificationCode); + }; + const inLoginWay = (way: string) => { + const loginWay = userStore.config?.loginWay || []; + return loginWay.includes(way); + }; + const handleAccountLogin = () => { + if (!accountName || !password) { + message.error('请输入账户名和密码'); + return; + } + userStore.loginByAccount(accountName, password); + }; + useListenEnter({ active: activeTab === 'phone', handleLogin }); + useListenEnter({ active: activeTab === 'account', handleLogin: handleAccountLogin }); + const tab = useMemo(() => { + const phoneCom = ( + + ); + const wechatCom = ( + + ); + const wechatMpCom = ( + + ); + const accountCom = ( + + ); + const coms: React.ReactNode[] = []; + for (const way of userStore.config.loginWay) { + if (way === 'phone') { + coms.push(phoneCom); + } else if (way === 'wechat') { + coms.push(wechatCom); + } else if (way === 'account') { + coms.push(accountCom); + } else if (way === 'wechat-mp') { + coms.push(wechatMpCom); + } + } + return coms; + }, [userStore.config.loginWay, activeTab]); + return ( +
+ {/* Tabs */} +
{tab}
+ +
+ {/* Phone Login Form */} + {activeTab === 'phone' && inLoginWay('phone') && ( +
+ + + +
+ )} + + {/* WeChat Login Placeholder */} + {activeTab === 'wechat' && inLoginWay('wechat') && ( +
+ +
+ )} + {activeTab === 'wechat-mp' && inLoginWay('wechat-mp') && ( +
+ +
+ )} + {activeTab === 'account' && inLoginWay('account') && ( +
+ + +
+ )} +
+
+ ); +}; + +export default LoginForm; + +export const useListenEnter = (opts?: { active: boolean; handleLogin: () => void }) => { + useEffect(() => { + if (!opts?.active) { + return; + } + const handleEnter = (e: KeyboardEvent) => { + if (e.key === 'Enter') { + opts?.handleLogin?.(); + } + }; + window.addEventListener('keydown', handleEnter); + return () => { + window.removeEventListener('keydown', handleEnter); + }; + }, [opts?.active, opts?.handleLogin]); +}; diff --git a/src/user/login/index.tsx b/src/user/login/index.tsx new file mode 100644 index 0000000..ecab485 --- /dev/null +++ b/src/user/login/index.tsx @@ -0,0 +1,49 @@ +import { useEffect, useLayoutEffect, useState } from 'react'; +import { Layout, LoginWrapper, MainLayout } from '../layout/UserLayout'; +import LoginForm from './Login'; +import { useUserStore } from '../store'; +import { useShallow } from 'zustand/react/shallow'; +import { Suspense } from 'react'; + +export const Login = () => { + const userStore = useUserStore( + useShallow((state) => { + return { + config: state.config, + setConfig: state.setConfig, + loadedConfig: state.loadedConfig, + setLoadedConfig: state.setLoadedConfig, + queryCheck: state.queryCheck, + }; + }), + ); + useLayoutEffect(() => { + fetchConfig(); + userStore.queryCheck(); + }, []); + const fetchConfig = async () => { + try { + const res = await fetch('./config.js'); + const configScript = await res.text(); + const blob = new Blob([configScript], { type: 'application/javascript' }); + const moduleUrl = URL.createObjectURL(blob); + const module = await import(/* @vite-ignore */ moduleUrl); + URL.revokeObjectURL(moduleUrl); // Clean up the object URL + userStore.setConfig(module.config); + } catch (error) { + console.error('Failed to load config:', error); + } + }; + + return ( + }> + {userStore.loadedConfig ? ( + + + + ) : ( +
Loading...
+ )} +
+ ); +}; diff --git a/src/user/login/modules/WeChatMpLogin.tsx b/src/user/login/modules/WeChatMpLogin.tsx new file mode 100644 index 0000000..96adb14 --- /dev/null +++ b/src/user/login/modules/WeChatMpLogin.tsx @@ -0,0 +1,80 @@ +import { useUserStore, Config } from '@/user/store'; +import { useShallow } from 'zustand/shallow'; +import QRCode, { QRCodeToDataURLOptions } from 'qrcode'; +import { message } from '@/modules/message'; +import { useEffect, useRef, useState } from 'react'; +import { query, queryLogin } from '@/modules/query'; +const useCreateLoginQRCode = (config: Config) => { + const url = new URL(window.location.href); + const redirect = url.searchParams.get('redirect'); + const loginSuccessUrl = config.loginSuccess; + const redirectURL = redirect ? decodeURIComponent(redirect) : loginSuccessUrl; + var opts: QRCodeToDataURLOptions = { + errorCorrectionLevel: 'H', + type: 'image/jpeg', + margin: 1, + width: 300, + }; + const [state, setState] = useState(''); + let timer = useRef(null); + const loginUrl = config?.wxmpLogin?.loginUrl || ''; + if (!loginUrl) { + message.error('没有配置微信登陆配置'); + return; + } + const createQrcode = async (state: string) => { + const text = `${loginUrl}?state=${state}`; + var img = document.getElementById('qrcode')! as HTMLCanvasElement; + // img.src = url; + const res = await QRCode.toDataURL(img, text, opts); + }; + const checkLogin = async (state: string) => { + const res = await fetch(`/api/router?path=wx&key=checkLogin&state=${state}`).then((res) => res.json()); + if (res.code === 200) { + console.log(res); + const token = res.data; + if (token) { + localStorage.setItem('token', token.accessToken); + await queryLogin.setLoginToken(token); + } + setTimeout(() => { + window.location.href = redirectURL; + }, 1000); + } else { + timer.current = setTimeout(() => { + checkLogin(state); + }, 2000); + } + }; + useEffect(() => { + // 随机生成一个state + const state = Math.random().toString(36).substring(2, 15); + createQrcode(state); + checkLogin(state); + const timer2 = setInterval(() => { + const state = Math.random().toString(36).substring(2, 15); + clearTimeout(timer.current); // 清除定时器 + createQrcode(state); // 90秒后更新二维码 + checkLogin(state); + }, 90000); + return () => { + clearInterval(timer.current); + clearInterval(timer2); + }; + }, []); + return { createQrcode }; +}; +export const WeChatMpLogin = () => { + const userStore = useUserStore( + useShallow((state) => { + return { config: state.config! }; + }), + ); + useCreateLoginQRCode(userStore.config); + + return ( +
+ +
+ ); +}; diff --git a/src/user/module/load-js.ts b/src/user/module/load-js.ts new file mode 100644 index 0000000..a02c12c --- /dev/null +++ b/src/user/module/load-js.ts @@ -0,0 +1,21 @@ +// + +export const dynimicLoadTcapTcha = async (): Promise => { + return new Promise((resolve, reject) => { + const script = document.createElement('script') + script.type = 'text/javascript' + script.id = 'tencent-captcha' + if (document.getElementById('tencent-captcha')) { + resolve(true) + return + } + script.src = 'https://turing.captcha.qcloud.com/TCaptcha.js' + script.onload = () => { + resolve(true) + } + script.onerror = (error) => { + reject(error) + } + document.body.appendChild(script) + }) +} diff --git a/src/user/store/index.ts b/src/user/store/index.ts new file mode 100644 index 0000000..e8b21ec --- /dev/null +++ b/src/user/store/index.ts @@ -0,0 +1,209 @@ +import { query, queryLogin } from '@/modules/query'; +import { TencentCaptcha } from '@/wx/tencent-captcha.ts'; +import { message } from '@/modules/message'; +import { create } from 'zustand'; + +export type Config = { + loginWay: any[]; + wxLogin: { + appid: string; + redirect_uri: string; + }; + wxmpLogin: { + loginUrl?: string; // 微信公众号的网页授权登陆 + appid?: string; // 微信公众号的appid + redirect_uri?: string; // 微信公众号的网页授权登陆 + }; + captchaAppId: string; + loginSuccess: string; + loginSuccessIsNew: string; + logo: string; + logoStyle: { + borderRadius: string; + width?: string; + height?: string; + }; + beian: string; +}; +export const redirectToSuccess = async (config: Config) => { + const href = location.href; + const url = new URL(href); + const redirect = url.searchParams.get('redirect'); + if (redirect) { + const href = decodeURIComponent(redirect); + window.open(href, '_self'); + } + await new Promise((resolve) => { + setTimeout(() => { + resolve(true); + }, 1000); + }); + if (config?.loginSuccess) { + location.href = config?.loginSuccess; + } else { + location.href = '/'; + } +}; +type UserStore = { + isAuthenticated: boolean; + qrCodeUrl: string; + checkAuthStatus: () => void; + getCode: (phone: string, captcha: TencentCaptcha) => void; + /** + * 手机号登录 + * @param phone 手机号 + * @param code 验证码 + */ + login: (phone: string, code: string) => void; + updateUser: (data: any, opts?: { needRedirect?: boolean }) => void; + getUpdateUser: () => void; + data: any; + setData: (data: any) => void; + config: Config | null; + setConfig: (config: any) => void; + loadedConfig: boolean; + setLoadedConfig: (loadedConfig: boolean) => void; + /** + * 账号密码登录 + * @param username 账号 + * @param password 密码 + */ + loginByAccount: (username: string, password: string) => void; + /** + * 检查是否需要跳转, 插件登陆 + */ + queryCheck: () => void; + loginByWechat: (code: string) => void; +}; +export const useUserStore = create((set, get) => ({ + isAuthenticated: false, + qrCodeUrl: '', + checkAuthStatus: () => { + // + }, + getCode: async (phone, captcha) => { + const res = await query.post({ + path: 'sms', + key: 'send', + data: { + phone, + captcha, + }, + }); + if (res.code === 200) { + // do something + message.success('验证码发送成功'); + } else { + message.error(res.message || '验证码发送失败'); + } + }, + login: async (phone, code) => { + const config = get().config!; + const res = await query.post({ + path: 'sms', + key: 'login', + data: { + phone, + code, + }, + }); + if (res.code === 200) { + message.success('登录成功'); + set({ isAuthenticated: true }); + redirectToSuccess(config); + } else { + message.error(res.message || '登录失败'); + } + }, + updateUser: async (data, opts) => { + const config = get().config!; + const res = await query.post({ + path: 'user', + key: 'updateInfo', + data, + }); + if (res.code === 200) { + message.success('更新成功'); + if (opts?.needRedirect) { + setTimeout(() => { + location.href = config?.loginSuccess; + }, 1000); + } + } else { + message.error(res.message || '更新失败'); + } + }, + getUpdateUser: async () => { + const res = await query.post({ + path: 'user', + key: 'getUpdateInfo', + }); + if (res.code === 200) { + set({ data: res.data }); + } else { + message.error(res.message || '获取用户信息失败'); + } + }, + data: {}, + setData: (data) => set({ data }), + loadedConfig: false, + setLoadedConfig: (loadedConfig) => set({ loadedConfig }), + config: null, + setConfig: (config) => set({ config, loadedConfig: true }), + loginByAccount: async (username, password) => { + const config = get().config!; + const isEmail = username.includes('@'); + const data: any = { password }; + if (isEmail) { + data.email = username; + } else { + data.username = username; + } + const res = await queryLogin.login(data); + if (res.code === 200) { + message.success('登录成功'); + set({ isAuthenticated: true }); + redirectToSuccess(config); + } else { + message.error(res.message || '登录失败'); + } + }, + queryCheck: async () => { + // const + const userCheck = 'user-check'; + const url = new URL(location.href); + const redirect = url.searchParams.get('redirect'); + const redirectUrl = redirect ? decodeURIComponent(redirect) : ''; + const checkKey = url.searchParams.get(userCheck); + if (redirect && checkKey) { + // 通过refresh_token 刷新token + const me = await queryLogin.getMe(); + if (me.code === 200) { + message.success('登录插件中...'); + const token = await queryLogin.cacheStore.getAccessToken(); + const newRedirectUrl = new URL(redirectUrl); + newRedirectUrl.searchParams.set('token', token + ''); + setTimeout(() => { + window.open(newRedirectUrl.toString(), '_blank'); + }, 2000); + return; + } + // 刷新token失败,登陆页自己跳转 + } + console.log('checkKey', checkKey, redirectUrl); + }, + loginByWechat: async (code) => { + const config = get().config!; + if (!code) { + message.error('code is required'); + return; + } + const res = await queryLogin.loginByWechat({ code }); + if (res.code === 200) { + message.success('登录成功'); + redirectToSuccess(config); + } else { + message.error(res.message || '登录失败'); + } + }, +})); diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..d4db9f1 --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1,7 @@ +/// +type SimpleObject = { + [key: string | number]: any; +}; + +declare let DEV_SERVER: boolean; +declare let BASE_NAME: string; \ No newline at end of file diff --git a/src/wx/load-js.ts b/src/wx/load-js.ts new file mode 100644 index 0000000..a02c12c --- /dev/null +++ b/src/wx/load-js.ts @@ -0,0 +1,21 @@ +// + +export const dynimicLoadTcapTcha = async (): Promise => { + return new Promise((resolve, reject) => { + const script = document.createElement('script') + script.type = 'text/javascript' + script.id = 'tencent-captcha' + if (document.getElementById('tencent-captcha')) { + resolve(true) + return + } + script.src = 'https://turing.captcha.qcloud.com/TCaptcha.js' + script.onload = () => { + resolve(true) + } + script.onerror = (error) => { + reject(error) + } + document.body.appendChild(script) + }) +} diff --git a/src/wx/tencent-captcha.ts b/src/wx/tencent-captcha.ts new file mode 100644 index 0000000..eaed8ce --- /dev/null +++ b/src/wx/tencent-captcha.ts @@ -0,0 +1,70 @@ +// 定义回调函数 +export function callback(res) { + // 第一个参数传入回调结果,结果如下: + // ret Int 验证结果,0:验证成功。2:用户主动关闭验证码。 + // ticket String 验证成功的票据,当且仅当 ret = 0 时 ticket 有值。 + // CaptchaAppId String 验证码应用ID。 + // bizState Any 自定义透传参数。 + // randstr String 本次验证的随机串,后续票据校验时需传递该参数。 + console.log('callback:', res); + // res(用户主动关闭验证码)= {ret: 2, ticket: null} + // res(验证成功) = {ret: 0, ticket: "String", randstr: "String"} + // res(请求验证码发生错误,验证码自动返回terror_前缀的容灾票据) = {ret: 0, ticket: "String", randstr: "String", errorCode: Number, errorMessage: "String"} + // 此处代码仅为验证结果的展示示例,真实业务接入,建议基于ticket和errorCode情况做不同的业务处理 + if (res.ret === 0) { + // 复制结果至剪切板 + var str = '【randstr】->【' + res.randstr + '】 【ticket】->【' + res.ticket + '】'; + var ipt = document.createElement('input'); + ipt.value = str; + document.body.appendChild(ipt); + ipt.select(); + document.body.removeChild(ipt); + alert('1. 返回结果(randstr、ticket)已复制到剪切板,ctrl+v 查看。 2. 打开浏览器控制台,查看完整返回结果。'); + } +} +export type TencentCaptcha = { + actionDuration?: number; + appid?: string; + bizState?: any; + randstr?: string; + ret: number; + sid?: string; + ticket?: string; + errorCode?: number; + errorMessage?: string; + verifyDuration?: number; +}; +// 定义验证码触发事件 +export const checkCaptcha = (captchaAppId: string): Promise => { + return new Promise((resolve, reject) => { + const callback = (res: TencentCaptcha) => { + console.log('callback:', res); + if (res.ret === 0) { + resolve(res); + } else { + reject(res); + } + }; + const appid = captchaAppId; + try { + // 生成一个验证码对象 + // CaptchaAppId:登录验证码控制台,从【验证管理】页面进行查看。如果未创建过验证,请先新建验证。注意:不可使用客户端类型为小程序的CaptchaAppId,会导致数据统计错误。 + //callback:定义的回调函数 + // @ts-ignore + var captcha = new TencentCaptcha(appid, callback, {}); + // 调用方法,显示验证码 + captcha.show(); + } catch (error) { + // 加载异常,调用验证码js加载错误处理函数 + var ticket = 'terror_1001_' + appid + '_' + Math.floor(new Date().getTime() / 1000); + // 生成容灾票据或自行做其它处理 + callback({ + ret: 0, + randstr: '@' + Math.random().toString(36).substring(2), + ticket: ticket, + errorCode: 1001, + errorMessage: 'jsload_error', + }); + } + }); +}; diff --git a/src/wx/ws-login.ts b/src/wx/ws-login.ts new file mode 100644 index 0000000..0f30531 --- /dev/null +++ b/src/wx/ws-login.ts @@ -0,0 +1,44 @@ +type WxLoginConfig = { + redirect_uri?: string; + appid?: string; + scope?: string; + state?: string; + style?: string; +}; +export const createLogin = async (config?: WxLoginConfig) => { + let redirect_uri = config?.redirect_uri; + const { appid } = config || {}; + if (!redirect_uri) { + redirect_uri = new URL(window.location.href).origin + '/api/s1/wx/login'; + } + if (!appid) { + console.error('appid is not cant be empty'); + return; + } + // @ts-ignore + const obj = new WxLogin({ + self_redirect: false, + id: 'weixinLogin', // 需要显示的容器id + appid: appid, // 微信开放平台appid wx******* + scope: 'snsapi_login', // 网页默认即可 snsapi_userinfo + redirect_uri: encodeURIComponent(redirect_uri), // 授权成功后回调的url + state: Math.ceil(Math.random() * 1000), // 可设置为简单的随机数加session用来校验 + stylelite: true, // 是否使用简洁模式 + }); + return obj; +}; +export const wxId = 'weixinLogin'; +export function setWxerwma(config?: WxLoginConfig) { + const s = document.createElement('script'); + s.type = 'text/javascript'; + s.src = '//res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js'; + s.id = 'weixinLogin-js'; + if (document.getElementById('weixinLogin-js')) { + createLogin(config); + return; + } + const wxElement = document.body.appendChild(s); + wxElement.onload = function () { + createLogin(config); + }; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..e770c3a --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,41 @@ +{ + "compilerOptions": { + "jsx": "react-jsx", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": [ + "ES2020", + "DOM", + "DOM.Iterable" + ], + "module": "ESNext", + "skipLibCheck": true, + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "baseUrl": "./", + "typeRoots": [ + "node_modules/@types", + "node_modules/@kevisual/types", + ], + "paths": { + "@/*": [ + "src/*" + ] + }, + /* Linting */ + "strict": true, + "noImplicitAny": false, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noFallthroughCasesInSwitch": true + }, + "include": [ + "src", + "typings.d.ts", + "snippets" + ] +} \ No newline at end of file diff --git a/vite.config.mjs b/vite.config.mjs new file mode 100644 index 0000000..23919c0 --- /dev/null +++ b/vite.config.mjs @@ -0,0 +1,50 @@ +import { defineConfig } from 'vite'; +import basicSsl from '@vitejs/plugin-basic-ssl'; +// import react from '@vitejs/plugin-react'; +import dayjs from 'dayjs'; +import path from 'path'; +import tailwindcss from '@tailwindcss/vite'; +import pkgs from './package.json' with { type: 'json' }; + +const isDev = process.env.NODE_ENV === 'development'; +const isWebDev = process.env.WEB_DEV === 'true'; +const BUILD_TIME = dayjs().format('YYYY-MM-DD HH:mm:ss'); +const basename = pkgs.basename; +let plugins = [tailwindcss()]; + +if (!isWebDev) { + // 在bolt的web开发环境下不需要ssl + plugins.push(basicSsl()); +} + +export default defineConfig({ + plugins: plugins, + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, + base: isDev ? '/' : basename, + define: { + DEV_SERVER: JSON.stringify(isDev), + BUILD_TIME: JSON.stringify(BUILD_TIME), + BASE_NAME: JSON.stringify(basename), + }, + optimizeDeps: { + // exclude: ['react'], // 排除 react 和 react-dom 以避免打包 + }, + // esbuild: { + // jsxFactory: 'h', + // jsxFragment: 'Fragment', + // }, + server: { + port: 6025, + host: '0.0.0.0', + proxy: { + '/api': { + target: 'https://kevisual.xiongxiao.me', + changeOrigin: true, + }, + }, + }, +});