commit b0935a05fd9b312793970368e6d407a3bc74ddb2 Author: Cxx0822 <1556464090@qq.com> Date: Sun Sep 21 22:48:33 2025 +0800 feat:初始化工程 diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..3324da4 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,5 @@ +module.exports = { + extends: [ + './node_modules/vue3-eslint' + ] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..33895ab --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# Vue 3 + TypeScript + Vite + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..d83dfc4 --- /dev/null +++ b/package.json @@ -0,0 +1,44 @@ +{ + "name": "blog-admin-ui", + "private": true, + "version": "0.0.1", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@fortawesome/fontawesome-free": "^6.7.2", + "@popperjs/core": "^2.11.8", + "@vueuse/core": "^13.1.0", + "animate.css": "^4.1.1", + "dayjs": "^1.11.13", + "element-plus": "^2.9.7", + "file-icons-vue": "^1.3.4", + "font-awesome": "^4.7.0", + "md-editor-v3": "^4.21.3", + "pinia": "^2.3.1", + "ua-parser-js": "^2.0.3", + "vue": "3.5.12", + "vue3-common": "git+https://gitee.com/Cxx0822/vue3-common", + "vue3-emoji-picker": "^1.1.8", + "vue3-eslint": "git+https://gitee.com/Cxx0822/vue3-eslint" + }, + "devDependencies": { + "@types/node": "^18.19.86", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", + "@vitejs/plugin-vue": "5.2.1", + "eslint": "^7.32.0", + "eslint-config-standard": "^16.0.3", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^5.2.0", + "eslint-plugin-vue": "^8.7.1", + "sass": "^1.86.3", + "typescript": "^5.8.3", + "vite": "~5.2.0", + "vite-plugin-svg-icons": "^2.0.1", + "vue-tsc": "^1.8.27" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..fe0067b --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,6111 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@fortawesome/fontawesome-free': + specifier: ^6.7.2 + version: 6.7.2 + '@popperjs/core': + specifier: ^2.11.8 + version: 2.11.8 + '@vueuse/core': + specifier: ^13.1.0 + version: 13.9.0(vue@3.5.12(typescript@5.9.2)) + animate.css: + specifier: ^4.1.1 + version: 4.1.1 + dayjs: + specifier: ^1.11.13 + version: 1.11.18 + element-plus: + specifier: ^2.9.7 + version: 2.9.11(vue@3.5.12(typescript@5.9.2)) + file-icons-vue: + specifier: ^1.3.4 + version: 1.3.4 + font-awesome: + specifier: ^4.7.0 + version: 4.7.0 + md-editor-v3: + specifier: ^4.21.3 + version: 4.21.3(vue@3.5.12(typescript@5.9.2)) + pinia: + specifier: ^2.3.1 + version: 2.3.1(typescript@5.9.2)(vue@3.5.12(typescript@5.9.2)) + ua-parser-js: + specifier: ^2.0.3 + version: 2.0.5 + vue: + specifier: 3.5.12 + version: 3.5.12(typescript@5.9.2) + vue3-common: + specifier: git+https://gitee.com/Cxx0822/vue3-common + version: git+https://gitee.com/Cxx0822/vue3-common#0d4a3beb7b1bfb068fe6672c25839997cd8d2129(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0)(typescript@5.9.2))(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint-config-standard@16.0.3(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0))(eslint-plugin-node@11.1.0(eslint@7.32.0))(eslint-plugin-promise@5.2.0(eslint@7.32.0))(eslint@7.32.0))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0))(eslint-plugin-node@11.1.0(eslint@7.32.0))(eslint-plugin-promise@5.2.0(eslint@7.32.0))(eslint-plugin-vue@8.7.1(eslint@7.32.0))(eslint@7.32.0)(pinia@2.3.1(typescript@5.9.2)(vue@3.5.12(typescript@5.9.2)))(vue-router@4.5.1(vue@3.5.12(typescript@5.9.2)))(vue@3.5.12(typescript@5.9.2)) + vue3-emoji-picker: + specifier: ^1.1.8 + version: 1.1.8(typescript@5.9.2) + vue3-eslint: + specifier: git+https://gitee.com/Cxx0822/vue3-eslint + version: git+https://gitee.com/Cxx0822/vue3-eslint#849a4e0e783d3ecc57035fb2f92950998b6b2e41(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0)(typescript@5.9.2))(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint-config-standard@16.0.3(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0))(eslint-plugin-node@11.1.0(eslint@7.32.0))(eslint-plugin-promise@5.2.0(eslint@7.32.0))(eslint@7.32.0))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0))(eslint-plugin-node@11.1.0(eslint@7.32.0))(eslint-plugin-promise@5.2.0(eslint@7.32.0))(eslint-plugin-vue@8.7.1(eslint@7.32.0))(eslint@7.32.0) + devDependencies: + '@types/node': + specifier: ^18.19.86 + version: 18.19.127 + '@typescript-eslint/eslint-plugin': + specifier: ^5.62.0 + version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0)(typescript@5.9.2) + '@typescript-eslint/parser': + specifier: ^5.62.0 + version: 5.62.0(eslint@7.32.0)(typescript@5.9.2) + '@vitejs/plugin-vue': + specifier: 5.2.1 + version: 5.2.1(vite@5.2.0(@types/node@18.19.127)(sass@1.93.0))(vue@3.5.12(typescript@5.9.2)) + eslint: + specifier: ^7.32.0 + version: 7.32.0 + eslint-config-standard: + specifier: ^16.0.3 + version: 16.0.3(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0))(eslint-plugin-node@11.1.0(eslint@7.32.0))(eslint-plugin-promise@5.2.0(eslint@7.32.0))(eslint@7.32.0) + eslint-plugin-import: + specifier: ^2.31.0 + version: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0) + eslint-plugin-node: + specifier: ^11.1.0 + version: 11.1.0(eslint@7.32.0) + eslint-plugin-promise: + specifier: ^5.2.0 + version: 5.2.0(eslint@7.32.0) + eslint-plugin-vue: + specifier: ^8.7.1 + version: 8.7.1(eslint@7.32.0) + sass: + specifier: ^1.86.3 + version: 1.93.0 + typescript: + specifier: ^5.8.3 + version: 5.9.2 + vite: + specifier: ~5.2.0 + version: 5.2.0(@types/node@18.19.127)(sass@1.93.0) + vite-plugin-svg-icons: + specifier: ^2.0.1 + version: 2.0.1(vite@5.2.0(@types/node@18.19.127)(sass@1.93.0)) + vue-tsc: + specifier: ^1.8.27 + version: 1.8.27(typescript@5.9.2) + +packages: + + '@babel/code-frame@7.12.11': + resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + 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/highlight@7.25.9': + resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + + '@codemirror/autocomplete@6.18.7': + resolution: {integrity: sha512-8EzdeIoWPJDsMBwz3zdzwXnUpCzMiCyz5/A3FIPpriaclFCGDkAzK13sMcnsu5rowqiyeQN2Vs2TsOcoDPZirQ==} + + '@codemirror/commands@6.8.1': + resolution: {integrity: sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==} + + '@codemirror/lang-angular@0.1.4': + resolution: {integrity: sha512-oap+gsltb/fzdlTQWD6BFF4bSLKcDnlxDsLdePiJpCVNKWXSTAbiiQeYI3UmES+BLAdkmIC1WjyztC1pi/bX4g==} + + '@codemirror/lang-cpp@6.0.3': + resolution: {integrity: sha512-URM26M3vunFFn9/sm6rzqrBzDgfWuDixp85uTY49wKudToc2jTHUrKIGGKs+QWND+YLofNNZpxcNGRynFJfvgA==} + + '@codemirror/lang-css@6.3.1': + resolution: {integrity: sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==} + + '@codemirror/lang-go@6.0.1': + resolution: {integrity: sha512-7fNvbyNylvqCphW9HD6WFnRpcDjr+KXX/FgqXy5H5ZS0eC5edDljukm/yNgYkwTsgp2busdod50AOTIy6Jikfg==} + + '@codemirror/lang-html@6.4.10': + resolution: {integrity: sha512-h/SceTVsN5r+WE+TVP2g3KDvNoSzbSrtZXCKo4vkKdbfT5t4otuVgngGdFukOO/rwRD2++pCxoh6xD4TEVMkQA==} + + '@codemirror/lang-java@6.0.2': + resolution: {integrity: sha512-m5Nt1mQ/cznJY7tMfQTJchmrjdjQ71IDs+55d1GAa8DGaB8JXWsVCkVT284C3RTASaY43YknrK2X3hPO/J3MOQ==} + + '@codemirror/lang-javascript@6.2.4': + resolution: {integrity: sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA==} + + '@codemirror/lang-json@6.0.2': + resolution: {integrity: sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==} + + '@codemirror/lang-less@6.0.2': + resolution: {integrity: sha512-EYdQTG22V+KUUk8Qq582g7FMnCZeEHsyuOJisHRft/mQ+ZSZ2w51NupvDUHiqtsOy7It5cHLPGfHQLpMh9bqpQ==} + + '@codemirror/lang-liquid@6.3.0': + resolution: {integrity: sha512-fY1YsUExcieXRTsCiwX/bQ9+PbCTA/Fumv7C7mTUZHoFkibfESnaXwpr2aKH6zZVwysEunsHHkaIpM/pl3xETQ==} + + '@codemirror/lang-markdown@6.3.4': + resolution: {integrity: sha512-fBm0BO03azXnTAsxhONDYHi/qWSI+uSEIpzKM7h/bkIc9fHnFp9y7KTMXKON0teNT97pFhc1a9DQTtWBYEZ7ug==} + + '@codemirror/lang-php@6.0.2': + resolution: {integrity: sha512-ZKy2v1n8Fc8oEXj0Th0PUMXzQJ0AIR6TaZU+PbDHExFwdu+guzOA4jmCHS1Nz4vbFezwD7LyBdDnddSJeScMCA==} + + '@codemirror/lang-python@6.2.1': + resolution: {integrity: sha512-IRjC8RUBhn9mGR9ywecNhB51yePWCGgvHfY1lWN/Mrp3cKuHr0isDKia+9HnvhiWNnMpbGhWrkhuWOc09exRyw==} + + '@codemirror/lang-rust@6.0.2': + resolution: {integrity: sha512-EZaGjCUegtiU7kSMvOfEZpaCReowEf3yNidYu7+vfuGTm9ow4mthAparY5hisJqOHmJowVH3Upu+eJlUji6qqA==} + + '@codemirror/lang-sass@6.0.2': + resolution: {integrity: sha512-l/bdzIABvnTo1nzdY6U+kPAC51czYQcOErfzQ9zSm9D8GmNPD0WTW8st/CJwBTPLO8jlrbyvlSEcN20dc4iL0Q==} + + '@codemirror/lang-sql@6.10.0': + resolution: {integrity: sha512-6ayPkEd/yRw0XKBx5uAiToSgGECo/GY2NoJIHXIIQh1EVwLuKoU8BP/qK0qH5NLXAbtJRLuT73hx7P9X34iO4w==} + + '@codemirror/lang-vue@0.1.3': + resolution: {integrity: sha512-QSKdtYTDRhEHCfo5zOShzxCmqKJvgGrZwDQSdbvCRJ5pRLWBS7pD/8e/tH44aVQT6FKm0t6RVNoSUWHOI5vNug==} + + '@codemirror/lang-wast@6.0.2': + resolution: {integrity: sha512-Imi2KTpVGm7TKuUkqyJ5NRmeFWF7aMpNiwHnLQe0x9kmrxElndyH0K6H/gXtWwY6UshMRAhpENsgfpSwsgmC6Q==} + + '@codemirror/lang-xml@6.1.0': + resolution: {integrity: sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==} + + '@codemirror/lang-yaml@6.1.2': + resolution: {integrity: sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw==} + + '@codemirror/language-data@6.5.1': + resolution: {integrity: sha512-0sWxeUSNlBr6OmkqybUTImADFUP0M3P0IiSde4nc24bz/6jIYzqYSgkOSLS+CBIoW1vU8Q9KUWXscBXeoMVC9w==} + + '@codemirror/language@6.11.3': + resolution: {integrity: sha512-9HBM2XnwDj7fnu0551HkGdrUrrqmYq/WC5iv6nbY2WdicXdGbhR/gfbZOH73Aqj4351alY1+aoG9rCNfiwS1RA==} + + '@codemirror/legacy-modes@6.5.1': + resolution: {integrity: sha512-DJYQQ00N1/KdESpZV7jg9hafof/iBNp9h7TYo1SLMk86TWl9uDsVdho2dzd81K+v4retmK6mdC7WpuOQDytQqw==} + + '@codemirror/lint@6.8.5': + resolution: {integrity: sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==} + + '@codemirror/search@6.5.11': + resolution: {integrity: sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==} + + '@codemirror/state@6.5.2': + resolution: {integrity: sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==} + + '@codemirror/view@6.38.2': + resolution: {integrity: sha512-bTWAJxL6EOFLPzTx+O5P5xAO3gTqpatQ2b/ARQ8itfU/v2LlpS3pH2fkL0A3E/Fx8Y2St2KES7ZEV0sHTsSW/A==} + + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@element-plus/icons-vue@2.3.2': + resolution: {integrity: sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==} + peerDependencies: + vue: ^3.2.0 + + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@0.4.3': + resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} + engines: {node: ^10.12.0 || >=12.0.0} + + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@fortawesome/fontawesome-free@6.7.2': + resolution: {integrity: sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==} + engines: {node: '>=6'} + + '@humanwhocodes/config-array@0.5.0': + resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/object-schema@1.2.1': + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + deprecated: Use @eslint/object-schema instead + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@lezer/common@1.2.3': + resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} + + '@lezer/cpp@1.1.3': + resolution: {integrity: sha512-ykYvuFQKGsRi6IcE+/hCSGUhb/I4WPjd3ELhEblm2wS2cOznDFzO+ubK2c+ioysOnlZ3EduV+MVQFCPzAIoY3w==} + + '@lezer/css@1.3.0': + resolution: {integrity: sha512-pBL7hup88KbI7hXnZV3PQsn43DHy6TWyzuyk2AO9UyoXcDltvIdqWKE1dLL/45JVZ+YZkHe1WVHqO6wugZZWcw==} + + '@lezer/go@1.0.1': + resolution: {integrity: sha512-xToRsYxwsgJNHTgNdStpcvmbVuKxTapV0dM0wey1geMMRc9aggoVyKgzYp41D2/vVOx+Ii4hmE206kvxIXBVXQ==} + + '@lezer/highlight@1.2.1': + resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==} + + '@lezer/html@1.3.10': + resolution: {integrity: sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==} + + '@lezer/java@1.1.3': + resolution: {integrity: sha512-yHquUfujwg6Yu4Fd1GNHCvidIvJwi/1Xu2DaKl/pfWIA2c1oXkVvawH3NyXhCaFx4OdlYBVX5wvz2f7Aoa/4Xw==} + + '@lezer/javascript@1.5.4': + resolution: {integrity: sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==} + + '@lezer/json@1.0.3': + resolution: {integrity: sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==} + + '@lezer/lr@1.4.2': + resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} + + '@lezer/markdown@1.4.3': + resolution: {integrity: sha512-kfw+2uMrQ/wy/+ONfrH83OkdFNM0ye5Xq96cLlaCy7h5UT9FO54DU4oRoIc0CSBh5NWmWuiIJA7NGLMJbQ+Oxg==} + + '@lezer/php@1.0.4': + resolution: {integrity: sha512-D2dJ0t8Z28/G1guztRczMFvPDUqzeMLSQbdWQmaiHV7urc8NlEOnjYk9UrZ531OcLiRxD4Ihcbv7AsDpNKDRaQ==} + + '@lezer/python@1.1.18': + resolution: {integrity: sha512-31FiUrU7z9+d/ElGQLJFXl+dKOdx0jALlP3KEOsGTex8mvj+SoE1FgItcHWK/axkxCHGUSpqIHt6JAWfWu9Rhg==} + + '@lezer/rust@1.0.2': + resolution: {integrity: sha512-Lz5sIPBdF2FUXcWeCu1//ojFAZqzTQNRga0aYv6dYXqJqPfMdCAI0NzajWUd4Xijj1IKJLtjoXRPMvTKWBcqKg==} + + '@lezer/sass@1.1.0': + resolution: {integrity: sha512-3mMGdCTUZ/84ArHOuXWQr37pnf7f+Nw9ycPUeKX+wu19b7pSMcZGLbaXwvD2APMBDOGxPmpK/O6S1v1EvLoqgQ==} + + '@lezer/xml@1.0.6': + resolution: {integrity: sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==} + + '@lezer/yaml@1.0.3': + resolution: {integrity: sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA==} + + '@marijn/find-cluster-break@1.0.2': + resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@rollup/rollup-android-arm-eabi@4.52.0': + resolution: {integrity: sha512-VxDYCDqOaR7NXzAtvRx7G1u54d2kEHopb28YH/pKzY6y0qmogP3gG7CSiWsq9WvDFxOQMpNEyjVAHZFXfH3o/A==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.52.0': + resolution: {integrity: sha512-pqDirm8koABIKvzL59YI9W9DWbRlTX7RWhN+auR8HXJxo89m4mjqbah7nJZjeKNTNYopqL+yGg+0mhCpf3xZtQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.52.0': + resolution: {integrity: sha512-YCdWlY/8ltN6H78HnMsRHYlPiKvqKagBP1r+D7SSylxX+HnsgXGCmLiV3Y4nSyY9hW8qr8U9LDUx/Lo7M6MfmQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.52.0': + resolution: {integrity: sha512-z4nw6y1j+OOSGzuVbSWdIp1IUks9qNw4dc7z7lWuWDKojY38VMWBlEN7F9jk5UXOkUcp97vA1N213DF+Lz8BRg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.52.0': + resolution: {integrity: sha512-Q/dv9Yvyr5rKlK8WQJZVrp5g2SOYeZUs9u/t2f9cQ2E0gJjYB/BWoedXfUT0EcDJefi2zzVfhcOj8drWCzTviw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.52.0': + resolution: {integrity: sha512-kdBsLs4Uile/fbjZVvCRcKB4q64R+1mUq0Yd7oU1CMm1Av336ajIFqNFovByipciuUQjBCPMxwJhCgfG2re3rg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.52.0': + resolution: {integrity: sha512-aL6hRwu0k7MTUESgkg7QHY6CoqPgr6gdQXRJI1/VbFlUMwsSzPGSR7sG5d+MCbYnJmJwThc2ol3nixj1fvI/zQ==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.52.0': + resolution: {integrity: sha512-BTs0M5s1EJejgIBJhCeiFo7GZZ2IXWkFGcyZhxX4+8usnIo5Mti57108vjXFIQmmJaRyDwmV59Tw64Ap1dkwMw==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.52.0': + resolution: {integrity: sha512-uj672IVOU9m08DBGvoPKPi/J8jlVgjh12C9GmjjBxCTQc3XtVmRkRKyeHSmIKQpvJ7fIm1EJieBUcnGSzDVFyw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.52.0': + resolution: {integrity: sha512-/+IVbeDMDCtB/HP/wiWsSzduD10SEGzIZX2945KSgZRNi4TSkjHqRJtNTVtVb8IRwhJ65ssI56krlLik+zFWkw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.52.0': + resolution: {integrity: sha512-U1vVzvSWtSMWKKrGoROPBXMh3Vwn93TA9V35PldokHGqiUbF6erSzox/5qrSMKp6SzakvyjcPiVF8yB1xKr9Pg==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-gnu@4.52.0': + resolution: {integrity: sha512-X/4WfuBAdQRH8cK3DYl8zC00XEE6aM472W+QCycpQJeLWVnHfkv7RyBFVaTqNUMsTgIX8ihMjCvFF9OUgeABzw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.52.0': + resolution: {integrity: sha512-xIRYc58HfWDBZoLmWfWXg2Sq8VCa2iJ32B7mqfWnkx5mekekl0tMe7FHpY8I72RXEcUkaWawRvl3qA55og+cwQ==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.52.0': + resolution: {integrity: sha512-mbsoUey05WJIOz8U1WzNdf+6UMYGwE3fZZnQqsM22FZ3wh1N887HT6jAOjXs6CNEK3Ntu2OBsyQDXfIjouI4dw==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.52.0': + resolution: {integrity: sha512-qP6aP970bucEi5KKKR4AuPFd8aTx9EF6BvutvYxmZuWLJHmnq4LvBfp0U+yFDMGwJ+AIJEH5sIP+SNypauMWzg==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.52.0': + resolution: {integrity: sha512-nmSVN+F2i1yKZ7rJNKO3G7ZzmxJgoQBQZ/6c4MuS553Grmr7WqR7LLDcYG53Z2m9409z3JLt4sCOhLdbKQ3HmA==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.52.0': + resolution: {integrity: sha512-2d0qRo33G6TfQVjaMR71P+yJVGODrt5V6+T0BDYH4EMfGgdC/2HWDVjSSFw888GSzAZUwuska3+zxNUCDco6rQ==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openharmony-arm64@4.52.0': + resolution: {integrity: sha512-A1JalX4MOaFAAyGgpO7XP5khquv/7xKzLIyLmhNrbiCxWpMlnsTYr8dnsWM7sEeotNmxvSOEL7F65j0HXFcFsw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.0': + resolution: {integrity: sha512-YQugafP/rH0eOOHGjmNgDURrpYHrIX0yuojOI8bwCyXwxC9ZdTd3vYkmddPX0oHONLXu9Rb1dDmT0VNpjkzGGw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.52.0': + resolution: {integrity: sha512-zYdUYhi3Qe2fndujBqL5FjAFzvNeLxtIqfzNEVKD1I7C37/chv1VxhscWSQHTNfjPCrBFQMnynwA3kpZpZ8w4A==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.52.0': + resolution: {integrity: sha512-fGk03kQylNaCOQ96HDMeT7E2n91EqvCDd3RwvT5k+xNdFCeMGnj5b5hEgTGrQuyidqSsD3zJDQ21QIaxXqTBJw==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.0': + resolution: {integrity: sha512-6iKDCVSIUQ8jPMoIV0OytRKniaYyy5EbY/RRydmLW8ZR3cEBhxbWl5ro0rkUNe0ef6sScvhbY79HrjRm8i3vDQ==} + cpu: [x64] + os: [win32] + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@sxzz/popperjs-es@2.11.7': + resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==} + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.20': + resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/node@18.19.127': + resolution: {integrity: sha512-gSjxjrnKXML/yo0BO099uPixMqfpJU0TKYjpfLU7TrtA2WWDki412Np/RSTPRil1saKBhvVVKzVx/p/6p94nVA==} + + '@types/resize-observer-browser@0.1.11': + resolution: {integrity: sha512-cNw5iH8JkMkb3QkCoe7DaZiawbDQEUX8t7iuQaRTyLOyQCR2h+ibBD4GJt7p5yhUHrlOeL7ZtbxNHeipqNsBzQ==} + + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + + '@types/svgo@2.6.4': + resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} + + '@types/web-bluetooth@0.0.16': + resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@typescript-eslint/eslint-plugin@5.62.0': + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@5.62.0': + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/type-utils@5.62.0': + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@vavt/util@2.1.0': + resolution: {integrity: sha512-YIfAvArSFVXmWvoF+DEGD0FhkhVNcCtVWWkfYtj76eSrwHh/wuEEFhiEubg1XLNM3tChO8FH8xJCT/hnizjgFQ==} + + '@vitejs/plugin-vue@5.2.1': + resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@volar/language-core@1.11.1': + resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} + + '@volar/source-map@1.11.1': + resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} + + '@volar/typescript@1.11.1': + resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} + + '@vue/compiler-core@3.5.12': + resolution: {integrity: sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==} + + '@vue/compiler-core@3.5.21': + resolution: {integrity: sha512-8i+LZ0vf6ZgII5Z9XmUvrCyEzocvWT+TeR2VBUVlzIH6Tyv57E20mPZ1bCS+tbejgUgmjrEh7q/0F0bibskAmw==} + + '@vue/compiler-dom@3.5.12': + resolution: {integrity: sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==} + + '@vue/compiler-dom@3.5.21': + resolution: {integrity: sha512-jNtbu/u97wiyEBJlJ9kmdw7tAr5Vy0Aj5CgQmo+6pxWNQhXZDPsRr1UWPN4v3Zf82s2H3kF51IbzZ4jMWAgPlQ==} + + '@vue/compiler-sfc@3.5.12': + resolution: {integrity: sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==} + + '@vue/compiler-ssr@3.5.12': + resolution: {integrity: sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/language-core@1.8.27': + resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.5.12': + resolution: {integrity: sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==} + + '@vue/runtime-core@3.5.12': + resolution: {integrity: sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==} + + '@vue/runtime-dom@3.5.12': + resolution: {integrity: sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==} + + '@vue/server-renderer@3.5.12': + resolution: {integrity: sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==} + peerDependencies: + vue: 3.5.12 + + '@vue/shared@3.5.12': + resolution: {integrity: sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==} + + '@vue/shared@3.5.21': + resolution: {integrity: sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==} + + '@vueuse/core@13.9.0': + resolution: {integrity: sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/core@9.13.0': + resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + + '@vueuse/metadata@13.9.0': + resolution: {integrity: sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg==} + + '@vueuse/metadata@9.13.0': + resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + + '@vueuse/shared@13.9.0': + resolution: {integrity: sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/shared@9.13.0': + resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + animate.css@4.1.1: + resolution: {integrity: sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + + arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + + arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axios@1.12.2: + resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + blueimp-canvas-to-blob@3.29.0: + resolution: {integrity: sha512-0pcSSGxC0QxT+yVkivxIqW0Y4VlO2XSDPofBAqoJ1qJxgH9eiUDLv50Rixij2cDuEfx4M6DpD9UGZpRhT5Q8qg==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + codemirror@6.0.2: + resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==} + + collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + 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==} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + compressorjs@1.2.1: + resolution: {integrity: sha512-+geIjeRnPhQ+LLvvA7wxBQE5ddeLU7pJ3FsKFWirDw6veY3s9iLxAQEw7lXGHnhCJvBujEQWuNnGzZcvCvdkLQ==} + + computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + + copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssfilter@0.0.10: + resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} + + csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + date-fns-tz@2.0.1: + resolution: {integrity: sha512-fJCG3Pwx8HUoLhkepdsP7Z5RsucUi+ZBOxyM5d0ZZ6c4SdYustq0VMmOu6Wf7bli+yS/Jwp91TOCqn9jMcVrUA==} + peerDependencies: + date-fns: 2.x + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + dayjs@1.11.18: + resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + + define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + + define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-europe-js@0.1.2: + resolution: {integrity: sha512-lgdERlL3u0aUdHocoouzT10d9I89VVhk0qNRmll7mXdGfJT1/wqZ2ZLA4oJAjeACPY5fT1wsbq2AT+GkuInsow==} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + echarts@5.6.0: + resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==} + + element-plus@2.9.11: + resolution: {integrity: sha512-x4L/6YC8de4JtuE3vpaEugJdQIeHQaHtIYKyk67IeF6dTIiVax45aX4nWOygnh+xX+0gTvL6xO+9BZhPA3G82w==} + peerDependencies: + vue: ^3.2.0 + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + engines: {node: '>= 0.4'} + + 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'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-standard@16.0.3: + resolution: {integrity: sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==} + peerDependencies: + eslint: ^7.12.1 + eslint-plugin-import: ^2.22.1 + eslint-plugin-node: ^11.1.0 + eslint-plugin-promise: ^4.2.1 || ^5.0.0 + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-es@3.0.1: + resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-node@11.1.0: + resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=5.16.0' + + eslint-plugin-promise@5.2.0: + resolution: {integrity: sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: ^7.0.0 + + eslint-plugin-vue@8.7.1: + resolution: {integrity: sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + + eslint-utils@3.0.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + + eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@7.32.0: + resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} + engines: {node: ^10.12.0 || >=12.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@7.3.1: + resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} + engines: {node: ^10.12.0 || >=12.0.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + + extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-icons-vue@1.3.4: + resolution: {integrity: sha512-aX9YgGNuRgTdgyR/ESdB78M1VKnhrqov8KoKdFfKiRM7lxSOAJcu6/tu0rs+iCqnulMWZPYcrAoef1X3TX5PdA==} + + fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + font-awesome@4.7.0: + resolution: {integrity: sha512-U6kGnykA/6bFmg1M/oT9EkFeIYv7JlX3bozwQJWiiLz6L0w3F5vBVPxHlwyX/vtNq1ckcpRKOB9f2Qal/VtFpg==} + engines: {node: '>=0.10.3'} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + engines: {node: '>= 6'} + + fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + 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==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + 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'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + 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==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + 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'} + + has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + + has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + + has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + + has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + htmlparser2@3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + + idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + + ignore@4.0.6: + resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} + engines: {node: '>= 4'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + immutable@5.1.3: + resolution: {integrity: sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + is-accessor-descriptor@1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-blob@2.1.0: + resolution: {integrity: sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw==} + engines: {node: '>=6'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-descriptor@1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-descriptor@0.1.7: + resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} + engines: {node: '>= 0.4'} + + is-descriptor@1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-standalone-pwa@0.1.1: + resolution: {integrity: sha512-9Cbovsa52vNQCjdXOzeQq5CnCbAcRk05aU62K20WO372NrTv0NxibLFCK6lQ4/iZEFdEA3p3t2VNOn8AJ53F5g==} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + js-base64@2.6.4: + resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + + kind-of@5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + loader-utils@1.4.2: + resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} + engines: {node: '>=4.0.0'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash-unified@1.0.3: + resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} + peerDependencies: + '@types/lodash-es': '*' + lodash: '*' + lodash-es: '*' + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lunar-calendar@0.1.4: + resolution: {integrity: sha512-5r87vbg5yg56z/jkf3A+Ur+ZggUTiJw1VATT9P7RELQgWcTNhfJ+OLkNYroSna6r65bMqyaAgapo9vRN40L75A==} + + lunar-javascript@1.7.4: + resolution: {integrity: sha512-BuLEZ54sN92XBEQsKB9UOexC23mrimyS5HyC+0OJHJhuBr4SL1Op8fkYNuRAgez0Y9i9377PW1fBIA4FiAeYlw==} + + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + + map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + + map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + + markdown-it-image-figures@2.1.1: + resolution: {integrity: sha512-mwXSQ2nPeVUzCMIE3HlLvjRioopiqyJLNph0pyx38yf9mpqFDhNGnMpAXF9/A2Xv0oiF2cVyg9xwfF0HNAz05g==} + engines: {node: '>=12.0.0'} + peerDependencies: + markdown-it: '*' + + markdown-it-sub@2.0.0: + resolution: {integrity: sha512-iCBKgwCkfQBRg2vApy9vx1C1Tu6D8XYo8NvevI3OlwzBRmiMtsJ2sXupBgEA7PPxiDwNni3qIUkhZ6j5wofDUA==} + + markdown-it-sup@2.0.0: + resolution: {integrity: sha512-5VgmdKlkBd8sgXuoDoxMpiU+BiEt3I49GItBzzw7Mxq9CxvnhE/k09HFli09zgfFDRixDQDfDxi0mgBCXtaTvA==} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + md-editor-v3@4.21.3: + resolution: {integrity: sha512-9+RCioqFIWSExTsG0jf9T/RTrFhtH8SpRcKVjHeEQSlExAr/zsgYt/M9XUy/nuGx87hgNKDzK0PXp/uOlDumAw==} + peerDependencies: + vue: ^3.2.47 + + mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + medium-zoom@1.1.0: + resolution: {integrity: sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + + merge-options@1.0.1: + resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==} + engines: {node: '>=4'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@3.1.0: + resolution: {integrity: sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==} + engines: {node: '>=0.10.0'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + 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'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.3.1: + resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + normalize-wheel-es@1.2.0: + resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + 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-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@0.2.0: + resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pinia@2.3.1: + resolution: {integrity: sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==} + peerDependencies: + typescript: '>=4.4.4' + vue: ^2.7.0 || ^3.5.11 + peerDependenciesMeta: + typescript: + optional: true + + posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-prefix-selector@1.16.1: + resolution: {integrity: sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==} + peerDependencies: + postcss: '>4 <9' + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss@5.2.18: + resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==} + engines: {node: '>=0.12'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + posthtml-parser@0.2.1: + resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==} + + posthtml-rename-id@1.0.12: + resolution: {integrity: sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==} + + posthtml-render@1.4.0: + resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==} + engines: {node: '>=10'} + + posthtml-svg-mode@1.0.3: + resolution: {integrity: sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==} + + posthtml@0.9.2: + resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==} + engines: {node: '>=0.10.0'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + query-string@4.3.4: + resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==} + engines: {node: '>=0.10.0'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + + repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup@4.52.0: + resolution: {integrity: sha512-+IuescNkTJQgX7AkIDtITipZdIGcWF0pnVvZTWStiazUmcGA2ag8dfg0urest2XlXUi9kuhfQ+qmdc5Stc3z7g==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + + sass@1.93.0: + resolution: {integrity: sha512-CQi5/AzCwiubU3dSqRDJ93RfOfg/hhpW1l6wCIvolmehfwgCI35R/0QDs1+R+Ygrl8jFawwwIojE2w47/mf94A==} + engines: {node: '>=14.0.0'} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + + 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'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + + snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + + snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + + source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + + static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + style-mod@4.1.2: + resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} + + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-baker@1.7.0: + resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==} + + svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + + to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + + toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + + traverse@0.6.11: + resolution: {integrity: sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==} + engines: {node: '>= 0.4'} + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typedarray.prototype.slice@1.0.5: + resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==} + engines: {node: '>= 0.4'} + + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + engines: {node: '>=14.17'} + hasBin: true + + ua-is-frozen@0.1.2: + resolution: {integrity: sha512-RwKDW2p3iyWn4UbaxpP2+VxwqXh0jpvdxsYpZ5j/MLLiQOfbsV5shpgQiw93+KMYQPcteeMQ289MaAFzs3G9pw==} + + ua-parser-js@2.0.5: + resolution: {integrity: sha512-sZErtx3rhpvZQanWW5umau4o/snfoLqRcQwQIZ54377WtRzIecnIKvjpkd5JwPcSUMglGnbIgcsQBGAbdi3S9Q==} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici@7.16.0: + resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} + engines: {node: '>=20.18.1'} + + union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + + use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + v-calendar@3.1.2: + resolution: {integrity: sha512-QDWrnp4PWCpzUblctgo4T558PrHgHzDtQnTeUNzKxfNf29FkCeFpwGd9bKjAqktaa2aJLcyRl45T5ln1ku34kg==} + peerDependencies: + '@popperjs/core': ^2.0.0 + vue: ^3.2.0 + + v8-compile-cache@2.4.0: + resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite-plugin-svg-icons@2.0.1: + resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==} + peerDependencies: + vite: '>=2.0.0' + + vite@5.2.0: + resolution: {integrity: sha512-xMSLJNEjNk/3DJRgWlPADDwaU9AgYRodDH2t6oENhJnIlmU9Hx1Q6VpjyXua/JdMw1WJRbnAgHJ9xgET9gnIAg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-eslint-parser@8.3.0: + resolution: {integrity: sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + vue-router@4.5.1: + resolution: {integrity: sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==} + peerDependencies: + vue: ^3.2.0 + + vue-screen-utils@1.0.0-beta.13: + resolution: {integrity: sha512-EJ/8TANKhFj+LefDuOvZykwMr3rrLFPLNb++lNBqPOpVigT2ActRg6icH9RFQVm4nHwlHIHSGm5OY/Clar9yIg==} + peerDependencies: + vue: ^3.2.0 + + vue-template-compiler@2.7.16: + resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + + vue-tsc@1.8.27: + resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} + hasBin: true + peerDependencies: + typescript: '*' + + vue3-common@git+https://gitee.com/Cxx0822/vue3-common#0d4a3beb7b1bfb068fe6672c25839997cd8d2129: + resolution: {commit: 0d4a3beb7b1bfb068fe6672c25839997cd8d2129, repo: https://gitee.com/Cxx0822/vue3-common, type: git} + version: 1.0.0 + peerDependencies: + pinia: ^2.3.0 + vue: ^3.5.12 + vue-router: ^4.2.2 + + vue3-emoji-picker@1.1.8: + resolution: {integrity: sha512-k9tVHeQEBVLzVCLYAkFaI1nib3FJFQwdPhWD5khJkhks3ktg3g12z5wPGOSDpIuSLNtelRGvq1qdmZuJu5khfA==} + engines: {node: '>=16.0.0'} + + vue3-eslint@git+https://gitee.com/Cxx0822/vue3-eslint#849a4e0e783d3ecc57035fb2f92950998b6b2e41: + resolution: {commit: 849a4e0e783d3ecc57035fb2f92950998b6b2e41, repo: https://gitee.com/Cxx0822/vue3-eslint, type: git} + version: 1.0.0 + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.40.1 + '@typescript-eslint/parser': ^5.40.1 + eslint: ^7.32.0 + eslint-config-standard: ^16.0.3 + eslint-plugin-import: ^2.25.4 + eslint-plugin-node: ^11.1.0 + eslint-plugin-promise: ^5.2.0 + eslint-plugin-vue: ^8.5.0 + + vue@3.5.12: + resolution: {integrity: sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xss@1.0.15: + resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==} + engines: {node: '>= 0.10.0'} + hasBin: true + + zrender@5.6.1: + resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} + +snapshots: + + '@babel/code-frame@7.12.11': + dependencies: + '@babel/highlight': 7.25.9 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/highlight@7.25.9': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + + '@babel/runtime@7.28.4': {} + + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@codemirror/autocomplete@6.18.7': + dependencies: + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.2 + '@lezer/common': 1.2.3 + + '@codemirror/commands@6.8.1': + dependencies: + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.2 + '@lezer/common': 1.2.3 + + '@codemirror/lang-angular@0.1.4': + dependencies: + '@codemirror/lang-html': 6.4.10 + '@codemirror/lang-javascript': 6.2.4 + '@codemirror/language': 6.11.3 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@codemirror/lang-cpp@6.0.3': + dependencies: + '@codemirror/language': 6.11.3 + '@lezer/cpp': 1.1.3 + + '@codemirror/lang-css@6.3.1': + dependencies: + '@codemirror/autocomplete': 6.18.7 + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@lezer/common': 1.2.3 + '@lezer/css': 1.3.0 + + '@codemirror/lang-go@6.0.1': + dependencies: + '@codemirror/autocomplete': 6.18.7 + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@lezer/common': 1.2.3 + '@lezer/go': 1.0.1 + + '@codemirror/lang-html@6.4.10': + dependencies: + '@codemirror/autocomplete': 6.18.7 + '@codemirror/lang-css': 6.3.1 + '@codemirror/lang-javascript': 6.2.4 + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.2 + '@lezer/common': 1.2.3 + '@lezer/css': 1.3.0 + '@lezer/html': 1.3.10 + + '@codemirror/lang-java@6.0.2': + dependencies: + '@codemirror/language': 6.11.3 + '@lezer/java': 1.1.3 + + '@codemirror/lang-javascript@6.2.4': + dependencies: + '@codemirror/autocomplete': 6.18.7 + '@codemirror/language': 6.11.3 + '@codemirror/lint': 6.8.5 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.2 + '@lezer/common': 1.2.3 + '@lezer/javascript': 1.5.4 + + '@codemirror/lang-json@6.0.2': + dependencies: + '@codemirror/language': 6.11.3 + '@lezer/json': 1.0.3 + + '@codemirror/lang-less@6.0.2': + dependencies: + '@codemirror/lang-css': 6.3.1 + '@codemirror/language': 6.11.3 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@codemirror/lang-liquid@6.3.0': + dependencies: + '@codemirror/autocomplete': 6.18.7 + '@codemirror/lang-html': 6.4.10 + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.2 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@codemirror/lang-markdown@6.3.4': + dependencies: + '@codemirror/autocomplete': 6.18.7 + '@codemirror/lang-html': 6.4.10 + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.2 + '@lezer/common': 1.2.3 + '@lezer/markdown': 1.4.3 + + '@codemirror/lang-php@6.0.2': + dependencies: + '@codemirror/lang-html': 6.4.10 + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@lezer/common': 1.2.3 + '@lezer/php': 1.0.4 + + '@codemirror/lang-python@6.2.1': + dependencies: + '@codemirror/autocomplete': 6.18.7 + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@lezer/common': 1.2.3 + '@lezer/python': 1.1.18 + + '@codemirror/lang-rust@6.0.2': + dependencies: + '@codemirror/language': 6.11.3 + '@lezer/rust': 1.0.2 + + '@codemirror/lang-sass@6.0.2': + dependencies: + '@codemirror/lang-css': 6.3.1 + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@lezer/common': 1.2.3 + '@lezer/sass': 1.1.0 + + '@codemirror/lang-sql@6.10.0': + dependencies: + '@codemirror/autocomplete': 6.18.7 + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@codemirror/lang-vue@0.1.3': + dependencies: + '@codemirror/lang-html': 6.4.10 + '@codemirror/lang-javascript': 6.2.4 + '@codemirror/language': 6.11.3 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@codemirror/lang-wast@6.0.2': + dependencies: + '@codemirror/language': 6.11.3 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@codemirror/lang-xml@6.1.0': + dependencies: + '@codemirror/autocomplete': 6.18.7 + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.2 + '@lezer/common': 1.2.3 + '@lezer/xml': 1.0.6 + + '@codemirror/lang-yaml@6.1.2': + dependencies: + '@codemirror/autocomplete': 6.18.7 + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + '@lezer/yaml': 1.0.3 + + '@codemirror/language-data@6.5.1': + dependencies: + '@codemirror/lang-angular': 0.1.4 + '@codemirror/lang-cpp': 6.0.3 + '@codemirror/lang-css': 6.3.1 + '@codemirror/lang-go': 6.0.1 + '@codemirror/lang-html': 6.4.10 + '@codemirror/lang-java': 6.0.2 + '@codemirror/lang-javascript': 6.2.4 + '@codemirror/lang-json': 6.0.2 + '@codemirror/lang-less': 6.0.2 + '@codemirror/lang-liquid': 6.3.0 + '@codemirror/lang-markdown': 6.3.4 + '@codemirror/lang-php': 6.0.2 + '@codemirror/lang-python': 6.2.1 + '@codemirror/lang-rust': 6.0.2 + '@codemirror/lang-sass': 6.0.2 + '@codemirror/lang-sql': 6.10.0 + '@codemirror/lang-vue': 0.1.3 + '@codemirror/lang-wast': 6.0.2 + '@codemirror/lang-xml': 6.1.0 + '@codemirror/lang-yaml': 6.1.2 + '@codemirror/language': 6.11.3 + '@codemirror/legacy-modes': 6.5.1 + + '@codemirror/language@6.11.3': + dependencies: + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.2 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + style-mod: 4.1.2 + + '@codemirror/legacy-modes@6.5.1': + dependencies: + '@codemirror/language': 6.11.3 + + '@codemirror/lint@6.8.5': + dependencies: + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.2 + crelt: 1.0.6 + + '@codemirror/search@6.5.11': + dependencies: + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.2 + crelt: 1.0.6 + + '@codemirror/state@6.5.2': + dependencies: + '@marijn/find-cluster-break': 1.0.2 + + '@codemirror/view@6.38.2': + dependencies: + '@codemirror/state': 6.5.2 + crelt: 1.0.6 + style-mod: 4.1.2 + w3c-keyname: 2.2.8 + + '@ctrl/tinycolor@3.6.1': {} + + '@element-plus/icons-vue@2.3.2(vue@3.5.12(typescript@5.9.2))': + dependencies: + vue: 3.5.12(typescript@5.9.2) + + '@esbuild/aix-ppc64@0.20.2': + optional: true + + '@esbuild/android-arm64@0.20.2': + optional: true + + '@esbuild/android-arm@0.20.2': + optional: true + + '@esbuild/android-x64@0.20.2': + optional: true + + '@esbuild/darwin-arm64@0.20.2': + optional: true + + '@esbuild/darwin-x64@0.20.2': + optional: true + + '@esbuild/freebsd-arm64@0.20.2': + optional: true + + '@esbuild/freebsd-x64@0.20.2': + optional: true + + '@esbuild/linux-arm64@0.20.2': + optional: true + + '@esbuild/linux-arm@0.20.2': + optional: true + + '@esbuild/linux-ia32@0.20.2': + optional: true + + '@esbuild/linux-loong64@0.20.2': + optional: true + + '@esbuild/linux-mips64el@0.20.2': + optional: true + + '@esbuild/linux-ppc64@0.20.2': + optional: true + + '@esbuild/linux-riscv64@0.20.2': + optional: true + + '@esbuild/linux-s390x@0.20.2': + optional: true + + '@esbuild/linux-x64@0.20.2': + optional: true + + '@esbuild/netbsd-x64@0.20.2': + optional: true + + '@esbuild/openbsd-x64@0.20.2': + optional: true + + '@esbuild/sunos-x64@0.20.2': + optional: true + + '@esbuild/win32-arm64@0.20.2': + optional: true + + '@esbuild/win32-ia32@0.20.2': + optional: true + + '@esbuild/win32-x64@0.20.2': + optional: true + + '@eslint-community/eslint-utils@4.9.0(eslint@7.32.0)': + dependencies: + eslint: 7.32.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/eslintrc@0.4.3': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 7.3.1 + globals: 13.24.0 + ignore: 4.0.6 + import-fresh: 3.3.1 + js-yaml: 3.14.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.4': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/utils@0.2.10': {} + + '@fortawesome/fontawesome-free@6.7.2': {} + + '@humanwhocodes/config-array@0.5.0': + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/object-schema@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@lezer/common@1.2.3': {} + + '@lezer/cpp@1.1.3': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/css@1.3.0': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/go@1.0.1': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/highlight@1.2.1': + dependencies: + '@lezer/common': 1.2.3 + + '@lezer/html@1.3.10': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/java@1.1.3': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/javascript@1.5.4': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/json@1.0.3': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/lr@1.4.2': + dependencies: + '@lezer/common': 1.2.3 + + '@lezer/markdown@1.4.3': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + + '@lezer/php@1.0.4': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/python@1.1.18': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/rust@1.0.2': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/sass@1.1.0': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/xml@1.0.6': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/yaml@1.0.3': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@marijn/find-cluster-break@1.0.2': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + + '@popperjs/core@2.11.8': {} + + '@rollup/rollup-android-arm-eabi@4.52.0': + optional: true + + '@rollup/rollup-android-arm64@4.52.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.52.0': + optional: true + + '@rollup/rollup-darwin-x64@4.52.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.52.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.52.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.52.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.52.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.52.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.52.0': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.52.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.52.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.52.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.52.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.52.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.52.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.52.0': + optional: true + + '@rollup/rollup-openharmony-arm64@4.52.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.52.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.52.0': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.0': + optional: true + + '@rtsao/scc@1.1.0': {} + + '@sxzz/popperjs-es@2.11.7': {} + + '@trysound/sax@0.2.0': {} + + '@types/estree@1.0.8': {} + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/linkify-it@5.0.0': {} + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.20 + + '@types/lodash@4.17.20': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdurl@2.0.0': {} + + '@types/node@18.19.127': + dependencies: + undici-types: 5.26.5 + + '@types/resize-observer-browser@0.1.11': {} + + '@types/semver@7.7.1': {} + + '@types/svgo@2.6.4': + dependencies: + '@types/node': 18.19.127 + + '@types/web-bluetooth@0.0.16': {} + + '@types/web-bluetooth@0.0.21': {} + + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0)(typescript@5.9.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@5.9.2) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@7.32.0)(typescript@5.9.2) + '@typescript-eslint/utils': 5.62.0(eslint@7.32.0)(typescript@5.9.2) + debug: 4.4.3 + eslint: 7.32.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare-lite: 1.4.0 + semver: 7.7.2 + tsutils: 3.21.0(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.2) + debug: 4.4.3 + eslint: 7.32.0 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/type-utils@5.62.0(eslint@7.32.0)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.2) + '@typescript-eslint/utils': 5.62.0(eslint@7.32.0)(typescript@5.9.2) + debug: 4.4.3 + eslint: 7.32.0 + tsutils: 3.21.0(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.4.3 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.2 + tsutils: 3.21.0(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@7.32.0)(typescript@5.9.2)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@7.32.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.1 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.2) + eslint: 7.32.0 + eslint-scope: 5.1.1 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@vavt/util@2.1.0': {} + + '@vitejs/plugin-vue@5.2.1(vite@5.2.0(@types/node@18.19.127)(sass@1.93.0))(vue@3.5.12(typescript@5.9.2))': + dependencies: + vite: 5.2.0(@types/node@18.19.127)(sass@1.93.0) + vue: 3.5.12(typescript@5.9.2) + + '@volar/language-core@1.11.1': + dependencies: + '@volar/source-map': 1.11.1 + + '@volar/source-map@1.11.1': + dependencies: + muggle-string: 0.3.1 + + '@volar/typescript@1.11.1': + dependencies: + '@volar/language-core': 1.11.1 + path-browserify: 1.0.1 + + '@vue/compiler-core@3.5.12': + dependencies: + '@babel/parser': 7.28.4 + '@vue/shared': 3.5.12 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-core@3.5.21': + dependencies: + '@babel/parser': 7.28.4 + '@vue/shared': 3.5.21 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.12': + dependencies: + '@vue/compiler-core': 3.5.12 + '@vue/shared': 3.5.12 + + '@vue/compiler-dom@3.5.21': + dependencies: + '@vue/compiler-core': 3.5.21 + '@vue/shared': 3.5.21 + + '@vue/compiler-sfc@3.5.12': + dependencies: + '@babel/parser': 7.28.4 + '@vue/compiler-core': 3.5.12 + '@vue/compiler-dom': 3.5.12 + '@vue/compiler-ssr': 3.5.12 + '@vue/shared': 3.5.12 + estree-walker: 2.0.2 + magic-string: 0.30.19 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.12': + dependencies: + '@vue/compiler-dom': 3.5.12 + '@vue/shared': 3.5.12 + + '@vue/devtools-api@6.6.4': {} + + '@vue/language-core@1.8.27(typescript@5.9.2)': + dependencies: + '@volar/language-core': 1.11.1 + '@volar/source-map': 1.11.1 + '@vue/compiler-dom': 3.5.21 + '@vue/shared': 3.5.21 + computeds: 0.0.1 + minimatch: 9.0.5 + muggle-string: 0.3.1 + path-browserify: 1.0.1 + vue-template-compiler: 2.7.16 + optionalDependencies: + typescript: 5.9.2 + + '@vue/reactivity@3.5.12': + dependencies: + '@vue/shared': 3.5.12 + + '@vue/runtime-core@3.5.12': + dependencies: + '@vue/reactivity': 3.5.12 + '@vue/shared': 3.5.12 + + '@vue/runtime-dom@3.5.12': + dependencies: + '@vue/reactivity': 3.5.12 + '@vue/runtime-core': 3.5.12 + '@vue/shared': 3.5.12 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.12(vue@3.5.12(typescript@5.9.2))': + dependencies: + '@vue/compiler-ssr': 3.5.12 + '@vue/shared': 3.5.12 + vue: 3.5.12(typescript@5.9.2) + + '@vue/shared@3.5.12': {} + + '@vue/shared@3.5.21': {} + + '@vueuse/core@13.9.0(vue@3.5.12(typescript@5.9.2))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 13.9.0 + '@vueuse/shared': 13.9.0(vue@3.5.12(typescript@5.9.2)) + vue: 3.5.12(typescript@5.9.2) + + '@vueuse/core@9.13.0(vue@3.5.12(typescript@5.9.2))': + dependencies: + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.13.0 + '@vueuse/shared': 9.13.0(vue@3.5.12(typescript@5.9.2)) + vue-demi: 0.14.10(vue@3.5.12(typescript@5.9.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@13.9.0': {} + + '@vueuse/metadata@9.13.0': {} + + '@vueuse/shared@13.9.0(vue@3.5.12(typescript@5.9.2))': + dependencies: + vue: 3.5.12(typescript@5.9.2) + + '@vueuse/shared@9.13.0(vue@3.5.12(typescript@5.9.2))': + dependencies: + vue-demi: 0.14.10(vue@3.5.12(typescript@5.9.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + acorn-jsx@5.3.2(acorn@7.4.1): + dependencies: + acorn: 7.4.1 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@7.4.1: {} + + acorn@8.15.0: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + animate.css@4.1.1: {} + + ansi-colors@4.1.3: {} + + ansi-regex@2.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-styles@2.2.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + arr-diff@4.0.0: {} + + arr-flatten@1.1.0: {} + + arr-union@3.1.0: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array-union@2.1.0: {} + + array-unique@0.3.2: {} + + array.prototype.findlastindex@1.2.6: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + assign-symbols@1.0.0: {} + + astral-regex@2.0.0: {} + + async-function@1.0.0: {} + + async-validator@4.2.5: {} + + asynckit@0.4.0: {} + + atob@2.1.2: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axios@1.12.2: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.4 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + base@0.11.2: + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.1 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + + big.js@5.2.2: {} + + bluebird@3.7.2: {} + + blueimp-canvas-to-blob@3.29.0: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@2.3.2: + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + cache-base@1.0.1: + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.1 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + chalk@1.1.3: + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + class-utils@0.3.6: + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + + clone@2.1.2: {} + + codemirror@6.0.2: + dependencies: + '@codemirror/autocomplete': 6.18.7 + '@codemirror/commands': 6.8.1 + '@codemirror/language': 6.11.3 + '@codemirror/lint': 6.8.5 + '@codemirror/search': 6.5.11 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.2 + + collection-visit@1.0.0: + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@2.20.3: {} + + commander@7.2.0: {} + + component-emitter@1.3.1: {} + + compressorjs@1.2.1: + dependencies: + blueimp-canvas-to-blob: 3.29.0 + is-blob: 2.1.0 + + computeds@0.0.1: {} + + concat-map@0.0.1: {} + + copy-descriptor@0.1.1: {} + + copy-to-clipboard@3.3.3: + dependencies: + toggle-selection: 1.0.6 + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + crelt@1.0.6: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-js@4.2.0: {} + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-tree@1.1.3: + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + + css-what@6.2.2: {} + + cssesc@3.0.0: {} + + cssfilter@0.0.10: {} + + csso@4.2.0: + dependencies: + css-tree: 1.1.3 + + csstype@3.1.3: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + date-fns-tz@2.0.1(date-fns@2.30.0): + dependencies: + date-fns: 2.30.0 + + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.28.4 + + dayjs@1.11.18: {} + + de-indent@1.0.2: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-uri-component@0.2.2: {} + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + define-property@0.2.5: + dependencies: + is-descriptor: 0.1.7 + + define-property@1.0.0: + dependencies: + is-descriptor: 1.0.3 + + define-property@2.0.2: + dependencies: + is-descriptor: 1.0.3 + isobject: 3.0.1 + + delayed-stream@1.0.0: {} + + detect-europe-js@0.1.2: {} + + detect-libc@1.0.3: + optional: true + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-serializer@0.2.2: + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + domelementtype@1.3.1: {} + + domelementtype@2.3.0: {} + + domhandler@2.4.2: + dependencies: + domelementtype: 1.3.1 + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domutils@1.7.0: + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + echarts@5.6.0: + dependencies: + tslib: 2.3.0 + zrender: 5.6.1 + + element-plus@2.9.11(vue@3.5.12(typescript@5.9.2)): + dependencies: + '@ctrl/tinycolor': 3.6.1 + '@element-plus/icons-vue': 2.3.2(vue@3.5.12(typescript@5.9.2)) + '@floating-ui/dom': 1.7.4 + '@popperjs/core': '@sxzz/popperjs-es@2.11.7' + '@types/lodash': 4.17.20 + '@types/lodash-es': 4.17.12 + '@vueuse/core': 9.13.0(vue@3.5.12(typescript@5.9.2)) + async-validator: 4.2.5 + dayjs: 1.11.18 + escape-html: 1.0.3 + lodash: 4.17.21 + lodash-es: 4.17.21 + lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21) + memoize-one: 6.0.0 + normalize-wheel-es: 1.2.0 + vue: 3.5.12(typescript@5.9.2) + transitivePeerDependencies: + - '@vue/composition-api' + + emoji-regex@8.0.0: {} + + emojis-list@3.0.0: {} + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + entities@1.1.2: {} + + entities@2.2.0: {} + + entities@4.5.0: {} + + es-abstract@1.24.0: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + 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 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild@0.20.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-standard@16.0.3(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0))(eslint-plugin-node@11.1.0(eslint@7.32.0))(eslint-plugin-promise@5.2.0(eslint@7.32.0))(eslint@7.32.0): + dependencies: + eslint: 7.32.0 + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0) + eslint-plugin-node: 11.1.0(eslint@7.32.0) + eslint-plugin-promise: 5.2.0(eslint@7.32.0) + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.1(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@7.32.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@5.9.2) + eslint: 7.32.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-plugin-es@3.0.1(eslint@7.32.0): + dependencies: + eslint: 7.32.0 + eslint-utils: 2.1.0 + regexpp: 3.2.0 + + eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 7.32.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@7.32.0) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@5.9.2) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-node@11.1.0(eslint@7.32.0): + dependencies: + eslint: 7.32.0 + eslint-plugin-es: 3.0.1(eslint@7.32.0) + eslint-utils: 2.1.0 + ignore: 5.3.2 + minimatch: 3.1.2 + resolve: 1.22.10 + semver: 6.3.1 + + eslint-plugin-promise@5.2.0(eslint@7.32.0): + dependencies: + eslint: 7.32.0 + + eslint-plugin-vue@8.7.1(eslint@7.32.0): + dependencies: + eslint: 7.32.0 + eslint-utils: 3.0.0(eslint@7.32.0) + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.1.2 + semver: 7.7.2 + vue-eslint-parser: 8.3.0(eslint@7.32.0) + transitivePeerDependencies: + - supports-color + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-utils@2.1.0: + dependencies: + eslint-visitor-keys: 1.3.0 + + eslint-utils@3.0.0(eslint@7.32.0): + dependencies: + eslint: 7.32.0 + eslint-visitor-keys: 2.1.0 + + eslint-visitor-keys@1.3.0: {} + + eslint-visitor-keys@2.1.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint@7.32.0: + dependencies: + '@babel/code-frame': 7.12.11 + '@eslint/eslintrc': 0.4.3 + '@humanwhocodes/config-array': 0.5.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + doctrine: 3.0.0 + enquirer: 2.4.1 + escape-string-regexp: 4.0.0 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + eslint-visitor-keys: 2.1.0 + espree: 7.3.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 5.1.2 + globals: 13.24.0 + ignore: 4.0.6 + import-fresh: 3.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + js-yaml: 3.14.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + progress: 2.0.3 + regexpp: 3.2.0 + semver: 7.7.2 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + table: 6.9.0 + text-table: 0.2.0 + v8-compile-cache: 2.4.0 + transitivePeerDependencies: + - supports-color + + espree@7.3.1: + dependencies: + acorn: 7.4.1 + acorn-jsx: 5.3.2(acorn@7.4.1) + eslint-visitor-keys: 1.3.0 + + espree@9.6.1: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + expand-brackets@2.1.4: + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend-shallow@3.0.2: + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + + extglob@2.0.4: + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.1.0: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + file-icons-vue@1.3.4: {} + + fill-range@4.0.0: + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.3: {} + + follow-redirects@1.15.11: {} + + font-awesome@4.7.0: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + for-in@1.0.2: {} + + form-data@4.0.4: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fragment-cache@0.2.1: + dependencies: + map-cache: 0.2.2 + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functional-red-black-tree@1.0.1: {} + + functions-have-names@1.2.3: {} + + 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 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-value@2.0.6: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-ansi@2.0.0: + dependencies: + ansi-regex: 2.1.1 + + has-bigints@1.1.0: {} + + has-flag@1.0.0: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + has-value@0.3.1: + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + + has-value@1.0.0: + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + + has-values@0.1.4: {} + + has-values@1.0.0: + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + htmlparser2@3.10.1: + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + + idb@7.1.1: {} + + ignore@4.0.6: {} + + ignore@5.3.2: {} + + image-size@0.5.5: {} + + immutable@5.1.3: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + is-accessor-descriptor@1.0.1: + dependencies: + hasown: 2.0.2 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-blob@2.1.0: {} + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-buffer@1.1.6: {} + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-descriptor@1.0.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-descriptor@0.1.7: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-descriptor@1.0.3: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-extendable@0.1.1: {} + + is-extendable@1.0.1: + dependencies: + is-plain-object: 2.0.4 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@3.0.0: + dependencies: + kind-of: 3.2.2 + + is-number@7.0.0: {} + + is-plain-obj@1.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-standalone-pwa@0.1.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-windows@1.0.2: {} + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isobject@2.1.0: + dependencies: + isarray: 1.0.0 + + isobject@3.0.1: {} + + js-base64@2.6.4: {} + + js-cookie@3.0.5: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + kind-of@4.0.0: + dependencies: + is-buffer: 1.1.6 + + kind-of@5.1.0: {} + + kind-of@6.0.3: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + loader-utils@1.4.2: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 1.0.2 + + lodash-es@4.17.21: {} + + lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21): + dependencies: + '@types/lodash-es': 4.17.12 + lodash: 4.17.21 + lodash-es: 4.17.21 + + lodash.merge@4.6.2: {} + + lodash.truncate@4.4.2: {} + + lodash@4.17.21: {} + + lru-cache@10.4.3: {} + + lunar-calendar@0.1.4: {} + + lunar-javascript@1.7.4: {} + + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + map-cache@0.2.2: {} + + map-visit@1.0.0: + dependencies: + object-visit: 1.0.1 + + markdown-it-image-figures@2.1.1(markdown-it@14.1.0): + dependencies: + markdown-it: 14.1.0 + + markdown-it-sub@2.0.0: {} + + markdown-it-sup@2.0.0: {} + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + math-intrinsics@1.1.0: {} + + md-editor-v3@4.21.3(vue@3.5.12(typescript@5.9.2)): + dependencies: + '@codemirror/lang-markdown': 6.3.4 + '@codemirror/language-data': 6.5.1 + '@types/markdown-it': 14.1.2 + '@vavt/util': 2.1.0 + codemirror: 6.0.2 + copy-to-clipboard: 3.3.3 + lru-cache: 10.4.3 + markdown-it: 14.1.0 + markdown-it-image-figures: 2.1.1(markdown-it@14.1.0) + markdown-it-sub: 2.0.0 + markdown-it-sup: 2.0.0 + medium-zoom: 1.1.0 + vue: 3.5.12(typescript@5.9.2) + xss: 1.0.15 + + mdn-data@2.0.14: {} + + mdurl@2.0.0: {} + + medium-zoom@1.1.0: {} + + memoize-one@6.0.0: {} + + merge-options@1.0.1: + dependencies: + is-plain-obj: 1.1.0 + + merge2@1.4.1: {} + + micromatch@3.1.0: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 1.0.0 + extend-shallow: 2.0.1 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 5.1.0 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + mixin-deep@1.3.2: + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + + ms@2.0.0: {} + + ms@2.1.3: {} + + muggle-string@0.3.1: {} + + nanoid@3.3.11: {} + + nanomatch@1.2.13: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + natural-compare-lite@1.4.0: {} + + natural-compare@1.4.0: {} + + node-addon-api@7.1.1: + optional: true + + normalize-wheel-es@1.2.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-assign@4.1.1: {} + + object-copy@0.1.0: + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object-visit@1.0.1: + dependencies: + isobject: 3.0.1 + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + + object.pick@1.3.0: + dependencies: + isobject: 3.0.1 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + pascalcase@0.1.1: {} + + path-browserify@1.0.1: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-type@4.0.0: {} + + pathe@0.2.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pinia@2.3.1(typescript@5.9.2)(vue@3.5.12(typescript@5.9.2)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.12(typescript@5.9.2) + vue-demi: 0.14.10(vue@3.5.12(typescript@5.9.2)) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - '@vue/composition-api' + + posix-character-classes@0.1.1: {} + + possible-typed-array-names@1.1.0: {} + + postcss-prefix-selector@1.16.1(postcss@5.2.18): + dependencies: + postcss: 5.2.18 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@5.2.18: + dependencies: + chalk: 1.1.3 + js-base64: 2.6.4 + source-map: 0.5.7 + supports-color: 3.2.3 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + posthtml-parser@0.2.1: + dependencies: + htmlparser2: 3.10.1 + isobject: 2.1.0 + + posthtml-rename-id@1.0.12: + dependencies: + escape-string-regexp: 1.0.5 + + posthtml-render@1.4.0: {} + + posthtml-svg-mode@1.0.3: + dependencies: + merge-options: 1.0.1 + posthtml: 0.9.2 + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + + posthtml@0.9.2: + dependencies: + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + + prelude-ls@1.2.1: {} + + progress@2.0.3: {} + + proxy-from-env@1.1.0: {} + + punycode.js@2.3.1: {} + + punycode@2.3.1: {} + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + query-string@4.3.4: + dependencies: + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + + queue-microtask@1.2.3: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@4.1.2: {} + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regex-not@1.0.2: + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + regexpp@3.2.0: {} + + repeat-element@1.1.4: {} + + repeat-string@1.6.1: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve-url@0.2.1: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + ret@0.1.15: {} + + reusify@1.1.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rollup@4.52.0: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.0 + '@rollup/rollup-android-arm64': 4.52.0 + '@rollup/rollup-darwin-arm64': 4.52.0 + '@rollup/rollup-darwin-x64': 4.52.0 + '@rollup/rollup-freebsd-arm64': 4.52.0 + '@rollup/rollup-freebsd-x64': 4.52.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.0 + '@rollup/rollup-linux-arm-musleabihf': 4.52.0 + '@rollup/rollup-linux-arm64-gnu': 4.52.0 + '@rollup/rollup-linux-arm64-musl': 4.52.0 + '@rollup/rollup-linux-loong64-gnu': 4.52.0 + '@rollup/rollup-linux-ppc64-gnu': 4.52.0 + '@rollup/rollup-linux-riscv64-gnu': 4.52.0 + '@rollup/rollup-linux-riscv64-musl': 4.52.0 + '@rollup/rollup-linux-s390x-gnu': 4.52.0 + '@rollup/rollup-linux-x64-gnu': 4.52.0 + '@rollup/rollup-linux-x64-musl': 4.52.0 + '@rollup/rollup-openharmony-arm64': 4.52.0 + '@rollup/rollup-win32-arm64-msvc': 4.52.0 + '@rollup/rollup-win32-ia32-msvc': 4.52.0 + '@rollup/rollup-win32-x64-gnu': 4.52.0 + '@rollup/rollup-win32-x64-msvc': 4.52.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safe-regex@1.1.0: + dependencies: + ret: 0.1.15 + + sass@1.93.0: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.3 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 + + semver@6.3.1: {} + + semver@7.7.2: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + set-value@2.0.1: + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + slash@3.0.0: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + snapdragon-node@2.1.1: + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + + snapdragon-util@3.0.1: + dependencies: + kind-of: 3.2.2 + + snapdragon@0.8.2: + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + + source-map-js@1.2.1: {} + + source-map-resolve@0.5.3: + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + + source-map-url@0.4.1: {} + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + split-string@3.1.0: + dependencies: + extend-shallow: 3.0.2 + + sprintf-js@1.0.3: {} + + stable@0.1.8: {} + + static-extend@0.1.2: + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + strict-uri-encode@1.1.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@3.0.1: + dependencies: + ansi-regex: 2.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + strip-json-comments@3.1.1: {} + + style-mod@4.1.2: {} + + supports-color@2.0.0: {} + + supports-color@3.2.3: + dependencies: + has-flag: 1.0.0 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-baker@1.7.0: + dependencies: + bluebird: 3.7.2 + clone: 2.1.2 + he: 1.2.0 + image-size: 0.5.5 + loader-utils: 1.4.2 + merge-options: 1.0.1 + micromatch: 3.1.0 + postcss: 5.2.18 + postcss-prefix-selector: 1.16.1(postcss@5.2.18) + posthtml-rename-id: 1.0.12 + posthtml-svg-mode: 1.0.3 + query-string: 4.3.4 + traverse: 0.6.11 + transitivePeerDependencies: + - supports-color + + svgo@2.8.0: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.1.1 + stable: 0.1.8 + + table@6.9.0: + dependencies: + ajv: 8.17.1 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + text-table@0.2.0: {} + + to-object-path@0.3.0: + dependencies: + kind-of: 3.2.2 + + to-regex-range@2.1.1: + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + to-regex@3.0.2: + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + + toggle-selection@1.0.6: {} + + traverse@0.6.11: + dependencies: + gopd: 1.2.0 + typedarray.prototype.slice: 1.0.5 + which-typed-array: 1.1.19 + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@1.14.1: {} + + tslib@2.3.0: {} + + tsutils@3.21.0(typescript@5.9.2): + dependencies: + tslib: 1.14.1 + typescript: 5.9.2 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typedarray.prototype.slice@1.0.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-proto: 1.0.1 + math-intrinsics: 1.1.0 + typed-array-buffer: 1.0.3 + typed-array-byte-offset: 1.0.4 + + typescript@5.9.2: {} + + ua-is-frozen@0.1.2: {} + + ua-parser-js@2.0.5: + dependencies: + detect-europe-js: 0.1.2 + is-standalone-pwa: 0.1.1 + ua-is-frozen: 0.1.2 + undici: 7.16.0 + + uc.micro@2.1.0: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@5.26.5: {} + + undici@7.16.0: {} + + union-value@1.0.1: + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + + universalify@2.0.1: {} + + unset-value@1.0.0: + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + urix@0.1.0: {} + + use@3.1.1: {} + + util-deprecate@1.0.2: {} + + v-calendar@3.1.2(@popperjs/core@2.11.8)(vue@3.5.12(typescript@5.9.2)): + dependencies: + '@popperjs/core': 2.11.8 + '@types/lodash': 4.17.20 + '@types/resize-observer-browser': 0.1.11 + date-fns: 2.30.0 + date-fns-tz: 2.0.1(date-fns@2.30.0) + lodash: 4.17.21 + vue: 3.5.12(typescript@5.9.2) + vue-screen-utils: 1.0.0-beta.13(vue@3.5.12(typescript@5.9.2)) + + v8-compile-cache@2.4.0: {} + + vary@1.1.2: {} + + vite-plugin-svg-icons@2.0.1(vite@5.2.0(@types/node@18.19.127)(sass@1.93.0)): + dependencies: + '@types/svgo': 2.6.4 + cors: 2.8.5 + debug: 4.4.3 + etag: 1.8.1 + fs-extra: 10.1.0 + pathe: 0.2.0 + svg-baker: 1.7.0 + svgo: 2.8.0 + vite: 5.2.0(@types/node@18.19.127)(sass@1.93.0) + transitivePeerDependencies: + - supports-color + + vite@5.2.0(@types/node@18.19.127)(sass@1.93.0): + dependencies: + esbuild: 0.20.2 + postcss: 8.5.6 + rollup: 4.52.0 + optionalDependencies: + '@types/node': 18.19.127 + fsevents: 2.3.3 + sass: 1.93.0 + + vue-demi@0.14.10(vue@3.5.12(typescript@5.9.2)): + dependencies: + vue: 3.5.12(typescript@5.9.2) + + vue-eslint-parser@8.3.0(eslint@7.32.0): + dependencies: + debug: 4.4.3 + eslint: 7.32.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + lodash: 4.17.21 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + + vue-router@4.5.1(vue@3.5.12(typescript@5.9.2)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.12(typescript@5.9.2) + + vue-screen-utils@1.0.0-beta.13(vue@3.5.12(typescript@5.9.2)): + dependencies: + vue: 3.5.12(typescript@5.9.2) + + vue-template-compiler@2.7.16: + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + vue-tsc@1.8.27(typescript@5.9.2): + dependencies: + '@volar/typescript': 1.11.1 + '@vue/language-core': 1.8.27(typescript@5.9.2) + semver: 7.7.2 + typescript: 5.9.2 + + vue3-common@git+https://gitee.com/Cxx0822/vue3-common#0d4a3beb7b1bfb068fe6672c25839997cd8d2129(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0)(typescript@5.9.2))(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint-config-standard@16.0.3(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0))(eslint-plugin-node@11.1.0(eslint@7.32.0))(eslint-plugin-promise@5.2.0(eslint@7.32.0))(eslint@7.32.0))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0))(eslint-plugin-node@11.1.0(eslint@7.32.0))(eslint-plugin-promise@5.2.0(eslint@7.32.0))(eslint-plugin-vue@8.7.1(eslint@7.32.0))(eslint@7.32.0)(pinia@2.3.1(typescript@5.9.2)(vue@3.5.12(typescript@5.9.2)))(vue-router@4.5.1(vue@3.5.12(typescript@5.9.2)))(vue@3.5.12(typescript@5.9.2)): + dependencies: + '@fortawesome/fontawesome-free': 6.7.2 + '@popperjs/core': 2.11.8 + axios: 1.12.2 + compressorjs: 1.2.1 + crypto-js: 4.2.0 + dayjs: 1.11.18 + echarts: 5.6.0 + element-plus: 2.9.11(vue@3.5.12(typescript@5.9.2)) + js-cookie: 3.0.5 + lunar-calendar: 0.1.4 + lunar-javascript: 1.7.4 + path-browserify: 1.0.1 + pinia: 2.3.1(typescript@5.9.2)(vue@3.5.12(typescript@5.9.2)) + qs: 6.14.0 + v-calendar: 3.1.2(@popperjs/core@2.11.8)(vue@3.5.12(typescript@5.9.2)) + vue: 3.5.12(typescript@5.9.2) + vue-router: 4.5.1(vue@3.5.12(typescript@5.9.2)) + vue3-eslint: git+https://gitee.com/Cxx0822/vue3-eslint#849a4e0e783d3ecc57035fb2f92950998b6b2e41(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0)(typescript@5.9.2))(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint-config-standard@16.0.3(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0))(eslint-plugin-node@11.1.0(eslint@7.32.0))(eslint-plugin-promise@5.2.0(eslint@7.32.0))(eslint@7.32.0))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0))(eslint-plugin-node@11.1.0(eslint@7.32.0))(eslint-plugin-promise@5.2.0(eslint@7.32.0))(eslint-plugin-vue@8.7.1(eslint@7.32.0))(eslint@7.32.0) + transitivePeerDependencies: + - '@typescript-eslint/eslint-plugin' + - '@typescript-eslint/parser' + - '@vue/composition-api' + - debug + - eslint + - eslint-config-standard + - eslint-plugin-import + - eslint-plugin-node + - eslint-plugin-promise + - eslint-plugin-vue + + vue3-emoji-picker@1.1.8(typescript@5.9.2): + dependencies: + '@popperjs/core': 2.11.8 + idb: 7.1.1 + vue: 3.5.12(typescript@5.9.2) + transitivePeerDependencies: + - typescript + + vue3-eslint@git+https://gitee.com/Cxx0822/vue3-eslint#849a4e0e783d3ecc57035fb2f92950998b6b2e41(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0)(typescript@5.9.2))(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint-config-standard@16.0.3(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0))(eslint-plugin-node@11.1.0(eslint@7.32.0))(eslint-plugin-promise@5.2.0(eslint@7.32.0))(eslint@7.32.0))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0))(eslint-plugin-node@11.1.0(eslint@7.32.0))(eslint-plugin-promise@5.2.0(eslint@7.32.0))(eslint-plugin-vue@8.7.1(eslint@7.32.0))(eslint@7.32.0): + dependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0)(typescript@5.9.2) + '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@5.9.2) + eslint: 7.32.0 + eslint-config-standard: 16.0.3(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0))(eslint-plugin-node@11.1.0(eslint@7.32.0))(eslint-plugin-promise@5.2.0(eslint@7.32.0))(eslint@7.32.0) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.9.2))(eslint@7.32.0) + eslint-plugin-node: 11.1.0(eslint@7.32.0) + eslint-plugin-promise: 5.2.0(eslint@7.32.0) + eslint-plugin-vue: 8.7.1(eslint@7.32.0) + + vue@3.5.12(typescript@5.9.2): + dependencies: + '@vue/compiler-dom': 3.5.12 + '@vue/compiler-sfc': 3.5.12 + '@vue/runtime-dom': 3.5.12 + '@vue/server-renderer': 3.5.12(vue@3.5.12(typescript@5.9.2)) + '@vue/shared': 3.5.12 + optionalDependencies: + typescript: 5.9.2 + + w3c-keyname@2.2.8: {} + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrappy@1.0.2: {} + + xss@1.0.15: + dependencies: + commander: 2.20.3 + cssfilter: 0.0.10 + + zrender@5.6.1: + dependencies: + tslib: 2.3.0 diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..532912d --- /dev/null +++ b/src/App.vue @@ -0,0 +1,10 @@ + + + + + diff --git a/src/apis/blog.ts b/src/apis/blog.ts new file mode 100644 index 0000000..ab85190 --- /dev/null +++ b/src/apis/blog.ts @@ -0,0 +1,107 @@ +import { cloudService } from './index' +import { IBlog, IBlogCategory, IBlogComment, IBlogStats, IBlogVisit, INewBlog, IQueryBlog } from '@/types/blog' + +import qs from 'qs' +import { IPageRecord } from '@/types' + +export const queryBlogApi = (currentPage: number, pageSize: number): Promise => + cloudService({ + url: '/blog-api/blog/page', + method: 'get', + params: { currentPage, pageSize } + }) + +export const queryBlogByConditionApi = (query: IQueryBlog): Promise => + cloudService({ + url: '/blog-api/blog/condition', + method: 'get', + params: query, + paramsSerializer: (params) => { + return qs.stringify(params, { arrayFormat: 'indices' }) + } + }) + +export const queryBlogByIdApi = (id: number): Promise => + cloudService({ + url: `/blog-api/blog/content/${id}`, + method: 'get' + }) + +export const queryBlogCategoryApi = (): Promise => + cloudService({ + url: '/blog-api/blog/category', + method: 'get' + }) + +export const queryBlogStatsApi = (): Promise => + cloudService({ + url: '/blog-api/blog/stats', + method: 'get' + }) + +export const queryLatestBlogApi = (): Promise => + cloudService({ + url: '/blog-api/blog/latest', + method: 'get' + }) + +export const queryBlogCommentApi = (blogId: number): Promise => + cloudService({ + url: `/blog-api/blog/comment/${blogId}`, + method: 'get' + }) + +export const addBlogCommentApi = (blogComment: IBlogComment): Promise => + cloudService({ + url: '/blog-api/blog/comment', + method: 'put', + data: blogComment + }) + +export const queryAdminBlogApi = (currentPage: number, + pageSize: number): Promise> => + cloudService({ + url: '/admin-service/blog-manage/page', + method: 'get', + params: { currentPage, pageSize } + }) + +export const queryAdminBlogByIdApi = (id: number): Promise => + cloudService({ + url: `/admin-service/blog-manage/content/${id}`, + method: 'get' + }) + +export const queryAdminBlogCategoryApi = (): Promise => + cloudService({ + url: '/admin-service/blog-manage/category', + method: 'get' + }) + +export const addBlogApi = (blog: INewBlog): Promise => + cloudService({ + url: '/admin-service/blog-manage', + method: 'post', + data: blog + }) + +export const updateBlogApi = (id: number, blog: INewBlog): Promise => + cloudService({ + url: `/admin-service/blog-manage/${id}`, + method: 'put', + data: blog + }) + +export const deleteBlogApi = (id: number): Promise => + cloudService({ + url: `/admin-service/blog-manage/${id}`, + method: 'DELETE' + }) + +export const queryBlogVisitApi = (currentPage: number, + pageSize: number): Promise> => + cloudService({ + url: '/admin-service/blog-manage/visit', + method: 'get', + params: { currentPage, pageSize } + }) diff --git a/src/apis/index.ts b/src/apis/index.ts new file mode 100644 index 0000000..d60aee2 --- /dev/null +++ b/src/apis/index.ts @@ -0,0 +1,3 @@ +import createService from 'vue3-common/utils/axiosUtil' + +export const cloudService = createService() diff --git a/src/apis/session.ts b/src/apis/session.ts new file mode 100644 index 0000000..f2b6c60 --- /dev/null +++ b/src/apis/session.ts @@ -0,0 +1,16 @@ +import { cloudService } from './index' +import { ISession } from '@/types/auth' + +export const loginHomeApi = (name: string, password: string): Promise => + cloudService({ + url: '/home-service/session', + method: 'post', + params: { name, password } + }) + +export const loginAdminApi = (name: string, password: string): Promise => + cloudService({ + url: '/admin-service/session', + method: 'post', + params: { name, password } + }) diff --git a/src/apis/user.ts b/src/apis/user.ts new file mode 100644 index 0000000..8aa4ddf --- /dev/null +++ b/src/apis/user.ts @@ -0,0 +1,15 @@ +import { cloudService } from './index' +import { IUser } from '@/types/auth.ts' + +export const queryUserApi = (id: number): Promise => + cloudService({ + url: `/home-service/user/${id}`, + method: 'get' + }) + +export const updateUserApi = (id: number, user: IUser): Promise => + cloudService({ + url: `/home-service/user/${id}`, + method: 'put', + data: user + }) diff --git a/src/assets/font/custom.ttf b/src/assets/font/custom.ttf new file mode 100644 index 0000000..2ca97e8 Binary files /dev/null and b/src/assets/font/custom.ttf differ diff --git a/src/assets/vue.svg b/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/Archive/BlogArchive.vue b/src/components/Archive/BlogArchive.vue new file mode 100644 index 0000000..fe13a31 --- /dev/null +++ b/src/components/Archive/BlogArchive.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/src/components/Category/BlogCategory.vue b/src/components/Category/BlogCategory.vue new file mode 100644 index 0000000..c441ff7 --- /dev/null +++ b/src/components/Category/BlogCategory.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/src/components/Category/BlogCategoryDetail.vue b/src/components/Category/BlogCategoryDetail.vue new file mode 100644 index 0000000..4fedcc7 --- /dev/null +++ b/src/components/Category/BlogCategoryDetail.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/src/components/Comment/BlogComment.vue b/src/components/Comment/BlogComment.vue new file mode 100644 index 0000000..8ae963c --- /dev/null +++ b/src/components/Comment/BlogComment.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/Comment/BlogCommentEdit.vue b/src/components/Comment/BlogCommentEdit.vue new file mode 100644 index 0000000..ef79107 --- /dev/null +++ b/src/components/Comment/BlogCommentEdit.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/src/components/Comment/BlogCommentItem.vue b/src/components/Comment/BlogCommentItem.vue new file mode 100644 index 0000000..4ad73dd --- /dev/null +++ b/src/components/Comment/BlogCommentItem.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/src/components/Content/BlogDetail.vue b/src/components/Content/BlogDetail.vue new file mode 100644 index 0000000..d92644a --- /dev/null +++ b/src/components/Content/BlogDetail.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/src/components/Content/BlogLabel.vue b/src/components/Content/BlogLabel.vue new file mode 100644 index 0000000..5258ce0 --- /dev/null +++ b/src/components/Content/BlogLabel.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/src/components/Content/BlogOverview.vue b/src/components/Content/BlogOverview.vue new file mode 100644 index 0000000..0ce4876 --- /dev/null +++ b/src/components/Content/BlogOverview.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/src/components/Login/CommonLogin.vue b/src/components/Login/CommonLogin.vue new file mode 100644 index 0000000..aa03fcd --- /dev/null +++ b/src/components/Login/CommonLogin.vue @@ -0,0 +1,147 @@ + + + diff --git a/src/components/Login/EmailLogin.vue b/src/components/Login/EmailLogin.vue new file mode 100644 index 0000000..5199d70 --- /dev/null +++ b/src/components/Login/EmailLogin.vue @@ -0,0 +1,78 @@ + + + diff --git a/src/components/Login/LoginAuth.vue b/src/components/Login/LoginAuth.vue new file mode 100644 index 0000000..3b0d288 --- /dev/null +++ b/src/components/Login/LoginAuth.vue @@ -0,0 +1,182 @@ + + + + + diff --git a/src/components/Login/PhoneLogin.vue b/src/components/Login/PhoneLogin.vue new file mode 100644 index 0000000..d3eb694 --- /dev/null +++ b/src/components/Login/PhoneLogin.vue @@ -0,0 +1,78 @@ + + + diff --git a/src/layout/components/NavBar/index.vue b/src/layout/components/NavBar/index.vue new file mode 100644 index 0000000..be567ed --- /dev/null +++ b/src/layout/components/NavBar/index.vue @@ -0,0 +1,95 @@ + + + diff --git a/src/layout/components/SideBar/Logo.vue b/src/layout/components/SideBar/Logo.vue new file mode 100644 index 0000000..25b357a --- /dev/null +++ b/src/layout/components/SideBar/Logo.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/src/layout/components/SideBar/index.vue b/src/layout/components/SideBar/index.vue new file mode 100644 index 0000000..20bb74d --- /dev/null +++ b/src/layout/components/SideBar/index.vue @@ -0,0 +1,23 @@ + + + + diff --git a/src/layout/index.vue b/src/layout/index.vue new file mode 100644 index 0000000..20c6385 --- /dev/null +++ b/src/layout/index.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..1ff6e3a --- /dev/null +++ b/src/main.ts @@ -0,0 +1,30 @@ +import { createApp } from 'vue' +import { createPinia } from 'pinia' +import App from './App.vue' + +// 引入路由 +import router from './router' + +// 引入element-ui组件 +import ElementPlus from 'element-plus' +import 'element-plus/theme-chalk/src/index.scss' +import 'element-plus/theme-chalk/dark/css-vars.css' +import 'dayjs/locale/zh-cn' +import zhCn from 'element-plus/es/locale/lang/zh-cn' + +// 引入font-awesome +import 'font-awesome/css/font-awesome.min.css' +import '@fortawesome/fontawesome-free/css/all.css' + +import 'animate.css' + +// 创建Vue3实例 +const app = createApp(App) +// 使用路由 +app.use(router) +// 使用Pinia 需要ts 4.5以上 +app.use(createPinia()) +// 使用Element UI Plus +app.use(ElementPlus, { locale: zhCn }) +// 挂载到根组件上 +app.mount('#app') diff --git a/src/pages/login/index.vue b/src/pages/login/index.vue new file mode 100644 index 0000000..c56bdc1 --- /dev/null +++ b/src/pages/login/index.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/src/router/admin.ts b/src/router/admin.ts new file mode 100644 index 0000000..3670a83 --- /dev/null +++ b/src/router/admin.ts @@ -0,0 +1,7 @@ +import AdminLayout from '@/layout/index.vue' +import { adminMeta } from '@/views/meta' +import { getRoutersByModules, sortRoutesByOrder } from 'vue3-common/utils/routerUtil' + +const adminRoutes = getRoutersByModules(import.meta.glob('@/views/**/*.vue'), AdminLayout, adminMeta) + +export default sortRoutesByOrder(adminRoutes) diff --git a/src/router/constant.ts b/src/router/constant.ts new file mode 100644 index 0000000..e8b56a7 --- /dev/null +++ b/src/router/constant.ts @@ -0,0 +1,15 @@ +import { RouteRecordRaw } from 'vue-router' + +const constantRoutes: RouteRecordRaw[] = [ + { + path: '/', + redirect: '/login' + }, + { + path: '/login', + component: () => import('@/pages/login/index.vue'), + meta: { hidden: true } + } +] + +export default constantRoutes diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000..f794b06 --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,22 @@ +import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router' +import { setupRouteGuard } from 'vue3-common/utils/permissionUtil' + +// 使用 import.meta.glob 自动导入所有 src/router 目录下的 .ts 文件 +const routeModules = import.meta.glob('./*.ts', { eager: true }) + +// 将所有模块的默认导出(即路由配置)合并成一个路由数组 +const routes: RouteRecordRaw[] = Object.values(routeModules) + .map((module: any) => module.default) // 获取每个模块的默认导出 + .flat() // 扁平化数组,确保所有路由项都在一个数组中 + +const router = createRouter({ + history: createWebHashHistory(), + scrollBehavior: () => ({ top: 0 }), + routes +}) + +console.log(routes) + +setupRouteGuard(router) + +export default router diff --git a/src/store/app.ts b/src/store/app.ts new file mode 100644 index 0000000..636624b --- /dev/null +++ b/src/store/app.ts @@ -0,0 +1,96 @@ +import { defineStore } from 'pinia' +import { setCookie, getCookie, getLocalStorage, setLocalStorage } from 'vue3-common/utils/storageUtil' +import { useDark, useToggle } from '@vueuse/core' + +export const useAppStore = defineStore('ipp', { + state: () => ({ + appName: 'Sweet Hut', + sidebar: { + // !!:转为布尔值 + // 保存当前菜单栏显示和隐藏的状态 + opened: getCookie('sidebarStatus') ? !!getCookie('sidebarStatus') : true as boolean, + withoutAnimation: false as boolean + }, + device: 'desktop' as string, + homeTitle: '', + isLoading: false, + isLogin: false, + isShowMobileBack: false, + isShowSetting: false, + themeColor: '', + isDark: false, + isWebSocket: false, + serverIp: '14.103.235.151', + version: 'v1.0.0.2025042901' + }), + actions: { + // 控制菜单栏显示和隐藏的切换 + toggleSideBar() { + this.sidebar.opened = !this.sidebar.opened + this.sidebar.withoutAnimation = false + if (this.sidebar.opened) { + setCookie('sidebarStatus', String(1)) + } else { + setCookie('sidebarStatus', String(0)) + } + }, + initApp() { + this.setThemeColor(this.getThemeColor()) + this.setDartModel() + }, + setDartModel() { + const dark = useDark({ + selector: 'html', + attribute: 'class', + valueDark: 'dark', + valueLight: '' + }) + this.isDark = dark.value + }, + toggleDark(e: MouseEvent) { + const toggleDark = useToggle(useDark()) + + if (!document.startViewTransition) { + toggleDark() + this.isDark = !this.isDark + return + } + + const transition = document.startViewTransition(() => { + toggleDark() // 实际切换主题 + }) + + transition.ready.then(() => { + const x = e.clientX + const y = e.clientY + // 从点击点到窗口最远边缘的距离,这个距离即为圆的半径,用于确定一个圆形裁剪路径 (clip path) 的最大尺寸,以便覆盖整个视窗。 + // 勾股定理:a² + b² = c² + const a = Math.max(x, window.innerWidth - x) + const b = Math.max(y, window.innerHeight - y) + const radius = Math.sqrt((a ** 2) + (b ** 2)) + + const clipPath = [`circle(0 at ${x}px ${y}px)`, `circle(${radius}px at ${x}px ${y}px)`] + // 实现过渡的过程 circle + document.documentElement.animate( + { + clipPath: this.isDark ? clipPath.reverse() : clipPath + }, + { + duration: 500, + easing: 'ease-in', + pseudoElement: this.isDark ? '::view-transition-old(root)' : '::view-transition-new(root)' + } + ) + }) + + this.isDark = !this.isDark + }, + getThemeColor(): string { + return getLocalStorage('theme-color') as string || '#009FA8' + }, + setThemeColor(value: string) { + document.documentElement.style.setProperty('--el-color-primary', value) + setLocalStorage('theme-color', value) + } + } +}) diff --git a/src/store/auth.ts b/src/store/auth.ts new file mode 100644 index 0000000..4e58e62 --- /dev/null +++ b/src/store/auth.ts @@ -0,0 +1,128 @@ +import { defineStore } from 'pinia' +import { ILoginType, ISession } from '@/types/auth' +import { loginAdminApi, loginHomeApi } from '@/apis/session' +import { ElMessage } from 'element-plus' +import { emailPattern, phonePattern } from '@/utils/element/elRules' + +export const useAuthStore = defineStore('auth', { + state: () => ({ + loginForm: { + username: '', + password: '', + isRemember: false + }, + phoneLoginForm: { + phoneNumber: '', + code: '' + }, + emailLoginForm: { + email: '', + code: '' + }, + loginType: 'common' as ILoginType, + loginLoading: false, + loginAdminLoading: false, + isVerified: false, + isGettingCode: false, + getCodeCountdown: 60, + getCodeTimer: null as NodeJS.Timeout | null, + homeSession: {} as ISession + }), + actions: { + changeLoginType(type: ILoginType) { + this.loginType = type + + if (type === 'common') { + this.stopCountdown() + } + this.resetLoginForm() + }, + getAuthCode(type: ILoginType) { + switch (type) { + case 'phone': + if (phonePattern.test(this.phoneLoginForm.phoneNumber)) { + this.isGettingCode = true + ElMessage.success('验证码已发送至手机') + this.startCountdown() + } else { + ElMessage.error('请先输入正确的手机号') + } + break + case 'email': + if (emailPattern.test(this.emailLoginForm.email)) { + this.isGettingCode = true + ElMessage.success('验证码已发送至邮箱') + this.startCountdown() + } else { + ElMessage.error('请先输入正确的邮箱地址') + } + break + default: + break + } + }, + startCountdown() { + this.getCodeTimer = setInterval(() => { + if (this.getCodeCountdown > 0) { + this.getCodeCountdown-- + } else { + clearInterval(this.getCodeTimer as NodeJS.Timeout) + this.isGettingCode = false + this.getCodeCountdown = 60 + } + }, 1000) + }, + stopCountdown() { + if (this.getCodeTimer) { + clearInterval(this.getCodeTimer) + } + }, + async handleLogin(type: ILoginType) { + const { username, password } = this.loginForm + const { phoneNumber, code: phoneCode } = this.phoneLoginForm + const { email, code: emailCode } = this.emailLoginForm + switch (type) { + case 'common': + this.homeSession = await loginHomeApi(username, password) + break + case 'phone': + this.homeSession = await loginHomeApi(phoneNumber, phoneCode) + break + case 'email': + this.homeSession = await loginHomeApi(email, emailCode) + break + case 'admin': + this.homeSession = await loginAdminApi(username, password) + break + default: + break + } + ElMessage.success('登录成功') + }, + resetLoginForm() { + switch (this.loginType) { + case 'common': + this.loginForm = { + username: '', + password: '', + isRemember: false + } + break + case 'phone': + this.phoneLoginForm = { + phoneNumber: '', + code: '' + } + break + case 'email': + this.emailLoginForm = { + email: '', + code: '' + } + break + default: + break + } + } + } +}) diff --git a/src/store/blog.ts b/src/store/blog.ts new file mode 100644 index 0000000..eb1337a --- /dev/null +++ b/src/store/blog.ts @@ -0,0 +1,168 @@ +import { defineStore } from 'pinia' +import { + IBlog, IBlogCategory, IBlogComment, + IBlogLatest, IBlogNestedComment, IBlogStats, INewBlog, IQueryBlog +} from '@/types/blog' +import { + addBlogApi, addBlogCommentApi, deleteBlogApi, queryAdminBlogApi, queryAdminBlogByIdApi, queryAdminBlogCategoryApi, + queryBlogApi, queryBlogByConditionApi, queryBlogByIdApi, + queryBlogCategoryApi, queryBlogCommentApi, queryBlogStatsApi, queryLatestBlogApi, updateBlogApi +} from '@/apis/blog.ts' +import { IHandleApi } from 'vue3-common/types' +import { ElMessage } from 'element-plus' +import { ImagePathEnum } from '@/types' +import { flattenToTwoLevel } from '@/utils/blog/blogUtil.ts' + +export const useBlogStore = defineStore('blog', { + state: () => ({ + blogList: [] as IBlog[], + blogCommentList: [] as IBlogComment[], + blogNestedCommentList: [] as IBlogNestedComment[], + currentBlogComment: { + id: 0, + blogId: 0, + name: '', + website: '', + content: '', + ipAddress: '', + userAgent: '', + parentId: 0, + isApproved: true, + createTime: '' + } as IBlogComment, + currentBlogId: 0, + currentBlog: { + id: 0, + title: '', + topValue: 0, + isGreat: false, + categoryId: 0, + category: '', + summary: '', + content: '', + wordCount: 0, + readDuration: 0, + visitCount: 0, + createTime: '', + updateTime: '' + } as IBlog, + newBlog: {} as INewBlog, + blogCategoryList: [] as IBlogCategory[], + blogStats: {} as IBlogStats, + latestBlogList: [] as IBlogLatest[], + queryBlog: {} as IQueryBlog, + blogImagePath: ImagePathEnum.BLOG, + blogApiType: 'ADD' as IHandleApi, + pageInfo: { + currentPage: 1, + pageSize: 10, + totalSize: 1 + }, + isScrollEnd: false, + adminPageInfo: { + currentPage: 1, + pageSize: 10, + totalSize: 1 + }, + progressValue: '0%' + }), + actions: { + async queryBlog() { + const { currentPage, pageSize } = this.pageInfo + const result = await queryBlogApi(currentPage, pageSize) + this.blogList = result.records + this.pageInfo.totalSize = result.total + }, + async queryMobileBlog() { + const { currentPage, pageSize } = this.pageInfo + const result = await queryBlogApi(currentPage, pageSize) + this.blogList.push(...result.records) + this.pageInfo.totalSize = result.total + }, + async queryAdminBlog() { + const { currentPage, pageSize } = this.adminPageInfo + const result = await queryAdminBlogApi(currentPage, pageSize) + this.blogList = result.records + this.pageInfo.totalSize = result.total + }, + async queryBlogByCondition(query: IQueryBlog) { + this.blogList = await queryBlogByConditionApi(query) + }, + async queryBlogById(id: number) { + this.currentBlog = await queryBlogByIdApi(id) + await this.queryBlogComment(this.currentBlogId) + this.blogNestedCommentList = flattenToTwoLevel(this.blogCommentList) + }, + async queryAdminBlogById(id: number) { + this.currentBlog = await queryAdminBlogByIdApi(id) + }, + async queryBlogComment(blogId: number) { + this.blogCommentList = await queryBlogCommentApi(blogId) + }, + async addBlogComment(blogComment: IBlogComment) { + await addBlogCommentApi(blogComment) + await this.queryBlogById(blogComment.blogId) + }, + async queryBlogCategory() { + this.blogCategoryList = await queryBlogCategoryApi() + }, + async queryAdminBlogCategory() { + this.blogCategoryList = await queryAdminBlogCategoryApi() + }, + async queryBlogStats() { + this.blogStats = await queryBlogStatsApi() + }, + async queryLatestBlog() { + this.latestBlogList = await queryLatestBlogApi() + }, + async handleBlogApi(id?: number) { + switch (this.blogApiType) { + case 'ADD': + await addBlogApi(this.newBlog) + ElMessage.success('新增博客成功') + break + case 'UPDATE': + await updateBlogApi(this.newBlog.id as number, this.newBlog) + ElMessage.success('更新博客成功') + break + case 'DELETE': + await deleteBlogApi(id as number) + ElMessage.success('删除博客成功') + break + default: + break + } + await this.refreshInfo() + }, + async refreshInfo() { + this.pageInfo.currentPage = 1 + await this.queryBlog() + await this.queryBlogStats() + await this.queryLatestBlog() + }, + getEmptyBlog(): INewBlog { + return { + id: 0, + category: '', + content: '', + isGreat: false, + title: '', + topValue: 0 + } + }, + getEmptyBlogComment(): IBlogComment { + return { + blogId: 0, + content: '', + createTime: '', + id: 0, + ipAddress: '', + isApproved: true, + name: '', + parentId: 0, + userAgent: '', + website: '' + } + } + } +}) diff --git a/src/store/user.ts b/src/store/user.ts new file mode 100644 index 0000000..14ba506 --- /dev/null +++ b/src/store/user.ts @@ -0,0 +1,78 @@ +import { defineStore } from 'pinia' +import { getLocalStorage, setLocalStorage, removeLocalStorage } from 'vue3-common/utils/storageUtil' +import { ILoginForm } from 'vue3-common' +import { ISession, IUser } from '@/types/auth' +import { queryUserApi, updateUserApi } from '@/apis/user.ts' +import { ImagePathEnum } from '@/types' + +export const useUserStore = defineStore('user', { + state: () => ({ + userInfo: { + id: 0, + accountId: 0, + accountName: '', + username: '', + gender: 0, + idNumber: '', + phoneNumber: '', + email: '', + birthDate: '', + avatar: '', + description: '', + area: ['', ''], + address: '', + job: '', + tags: [] + } as IUser, + userImagePath: ImagePathEnum.USER + }), + + actions: { + setLoginForm(loginForm: ILoginForm) { + setLocalStorage('loginForm', JSON.stringify(loginForm)) + }, + getLoginForm() { + return getLocalStorage('loginForm') + }, + removeLoginForm() { + removeLocalStorage('loginForm') + }, + handleSession(session: ISession) { + this.setToken(session.saToken.tokenValue) + this.setUserId(session.userInfo.id) + this.userInfo = session.userInfo + }, + async queryUser() { + this.userInfo = await queryUserApi(Number(this.getUserId())) + }, + async updateUser() { + await updateUserApi(this.userInfo.id, this.userInfo) + }, + async updateAccountPassword(oldPassword: string, newPassword: string) { + console.log(this.userInfo.accountId) + // await updateAccountPasswordApi(this.userInfo.accountId, oldPassword, newPassword) + }, + setToken(token: string) { + setLocalStorage('token', token) + }, + getToken() { + return getLocalStorage('token') + }, + setUserId(userId: number) { + setLocalStorage('userId', String(userId)) + }, + getUserId() { + return getLocalStorage('userId') + }, + setAccount(accountName: string) { + setLocalStorage('account', accountName) + }, + getAccount() { + return getLocalStorage('account') + }, + removeAll() { + removeLocalStorage('token') + removeLocalStorage('account') + } + } +}) diff --git a/src/styles/admin.layout.module.scss b/src/styles/admin.layout.module.scss new file mode 100644 index 0000000..60f48dc --- /dev/null +++ b/src/styles/admin.layout.module.scss @@ -0,0 +1,223 @@ +$sidebar-width: 160px; +$sidebar-bg-color: #009FA8; +$hide-sidebar-width: 55px; + +$logo-bg-color: #FFFFFF; +$logo-font-size: 1.2rem; + +$menu-bg-color: #009FA8; +$menu-hover-color: #F3F0ED; +$menu-active-color: #FFFFFF; +$menu-font-size: 1rem; + +$navbar-bg-color: #FFFFFF; +$navbar-height: 50px; + +$app-main-bg-color: #009FA8; +$module-bg-color: #FFFFFF; + +$transition-time: 0.28s; + +// 全局布局 +.layout-admin { + position: relative; + height: 100%; + width: 100%; + + // 侧边栏 + .layout-sidebar { + // 宽度过渡时间 + transition: width $transition-time; + background-color: $sidebar-bg-color; + height: 100%; + position: fixed; + top: 0; + left: 0; + overflow: hidden; + + // Logo区域 + .layout-logo { + background: $logo-bg-color; + + .logo { + height: $navbar-height; + display: flex; + justify-content: center; + align-items: center; + text-decoration: none; + + img { + padding: 5px; + height: $navbar-height; + } + + .title { + font-size: $logo-font-size; + } + } + } + + // 菜单区域 + .layout-menu { + overflow: auto; + height: calc(100vh - $navbar-height); + padding: 5px 0; + + .el-menu { + // height: calc(100vh - $navbar-height); + background-color: $menu-bg-color; + border: none; + + // 一级菜单项和下级菜单项 + .el-menu-item, .el-sub-menu__title { + // border-top-left-radius: 20px; + // border-bottom-left-radius: 20px; + border-radius: 10px; + + display: flex; + gap: 0.5vw; + font-size: $menu-font-size; + color: #FFFFFF; + } + + // 悬浮时的颜色 + .el-menu-item:hover { + background-color: $menu-hover-color !important; + color: #000000; + } + + .el-sub-menu__title:hover { + color: #000000; + } + + // 选中时的颜色 + .el-menu-item.is-active { + background-color: $menu-active-color !important; + color: #000000; + } + } + } + } + + // 主体区域 + .layout-main { + min-height: 100%; + // margin-left过渡时间 + transition: margin-left $transition-time; + position: relative; + + // 导航栏 + .layout-navbar { + height: $navbar-height; + overflow: hidden; + background: $navbar-bg-color; + display: grid; + grid-template-columns: 1fr 1fr 1fr; + align-items: center; + + .left-container { + .hamburger-container { + height: calc($navbar-height / 2); + width: calc($navbar-height / 2); + cursor: pointer; + transition: background .3s; + -webkit-tap-highlight-color:transparent; + + &:hover { + background: rgba(0, 0, 0, .025) + } + } + } + + .title { + margin: auto; + font-size: 1.6vw; + } + + .right-container { + margin-left: auto; + display: flex; + align-items: center; + font-size: 1vw; + cursor: pointer; + + .note-wrapper { + display: flex; + + .item { + display: flex; + align-items: center; + margin-right: 0.2vw; + } + } + + .avatar-wrapper { + display: flex; + align-items: center; + gap: 2px; + margin-right: 10px; + cursor: pointer; + + &:focus { + outline: none; + } + + .username { + font-size: 1rem; + } + } + } + } + + // 内容区域 + .app-main { + background-color: $app-main-bg-color; + height: calc(100vh - $navbar-height); + width: 100%; + padding: 1vh 0.5vw; + overflow: auto; + } + } + + .admin-module { + height: 100%; + background-color: $module-bg-color; + padding: 1vh 0.5vw; + border-radius: 15px; + box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.3); + + display: flex; + flex-direction: column; + align-items: center; + gap: 1vh; + } + + .card-item { + background-color: #FFFFFF; + border: 1px solid #FFFFFF; + border-radius: 10px; + box-shadow: 5px 5px 5px #CFCFCF; + } +} + +// 打开侧边栏 +.openSidebar { + .layout-sidebar { + width: $sidebar-width; + } + + .layout-main { + margin-left: $sidebar-width; + } +} + +// 隐藏侧边栏 +.hideSidebar { + .layout-sidebar { + width: $hide-sidebar-width; + } + + .layout-main { + margin-left: $hide-sidebar-width; + } +} diff --git a/src/styles/app.loading.module.scss b/src/styles/app.loading.module.scss new file mode 100644 index 0000000..acc3ea0 --- /dev/null +++ b/src/styles/app.loading.module.scss @@ -0,0 +1,62 @@ +#app-loading { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background: #f8f9fa; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + z-index: 9999; + + /* 立方体的容器(让方块水平排列) */ + .cube-container { + display: flex; + gap: 15px; /* 方块之间的间距 */ + } + + /* 立体小方块 */ + .cube { + width: 40px; + height: 40px; + background: linear-gradient(145deg, #3498db, #2980b9); /* 渐变颜色 */ + border-radius: 5px; + position: relative; + animation: jump 1.2s infinite ease-in-out; + } + + /* 给不同的方块加不同颜色 */ + .cube1 { background: linear-gradient(145deg, #e74c3c, #c0392b); animation-delay: 0s; } + .cube2 { background: linear-gradient(145deg, #f1c40f, #d4ac0d); animation-delay: 0.2s; } + .cube3 { background: linear-gradient(145deg, #2ecc71, #27ae60); animation-delay: 0.4s; } + + /* 方块跳跃动画 */ + @keyframes jump { + 0%, 100% { + transform: translateY(0); + box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.2); + } + 50% { + transform: translateY(-30px); + box-shadow: 0px 15px 15px rgba(0, 0, 0, 0.3); + } + } + + /* 加载文字 */ + .loading-text { + margin-top: 20px; + font-size: 18px; + color: #555; + font-weight: bold; + letter-spacing: 2px; + animation: fade 1.5s infinite ease-in-out; + } + + /* 文字淡入淡出动画 */ + @keyframes fade { + 0%, 100% { opacity: 0.2; } + 50% { opacity: 1; } + } +} diff --git a/src/styles/blog/blog.archive.module.scss b/src/styles/blog/blog.archive.module.scss new file mode 100644 index 0000000..cf4726f --- /dev/null +++ b/src/styles/blog/blog.archive.module.scss @@ -0,0 +1,51 @@ +@use "blog.variable.module.scss" as blog; + +.blog-archive { + display: flex; + flex-direction: column; + gap: 3vh; + padding: 10vh 2vw; + + ::v-deep(.el-date-editor) { + align-self: center; + } + + .total { + align-self: center; + font-size: blog.$normal-font-size; + color: blog.$normal-text-color; + } + + .time-line { + height: 100%; + padding: 10px; + overflow: auto; + + .item { + height: 5vh; + + .date { + color: blog.$normal-text-color; + margin-right: 5px; + } + + .title { + font-size: blog.$normal-font-size; + color: blog.$normal-text-color; + cursor: pointer; + text-decoration: underline; + text-underline-offset: 0.2rem; + } + + .title:hover { + color: var(--color-text); + } + } + } +} + +@media screen and (max-width: 768px) { + .blog-archive { + padding: 20px 10px; + } +} diff --git a/src/styles/blog/blog.category.detail.module.scss b/src/styles/blog/blog.category.detail.module.scss new file mode 100644 index 0000000..e7cfb8f --- /dev/null +++ b/src/styles/blog/blog.category.detail.module.scss @@ -0,0 +1,59 @@ +@use "blog.variable.module.scss" as blog; + +.blog-category-detail { + padding: 10vh 2vw; + + display: flex; + flex-direction: column; + gap: 3vh; + + .name { + font-weight: bold; + text-align: center; + font-size: blog.$large-font-size; + } + + .category-detail-list { + height: 100%; + padding: 10px; + display: flex; + flex-direction: column; + gap: 2vh; + + .item { + display: grid; + grid-template-columns: 40px 200px 1fr; + justify-items: center; + align-items: center; + gap: 10px; + cursor: pointer; + color: blog.$normal-text-color; + + padding-bottom: 0.5vh; + border: none; + border-bottom: 1px dashed blog.$gray-text-color; + + .number, .date { + text-align: center; + } + + .title { + justify-self: start; + } + + span { + padding: 0.2vw; + } + } + + .item:hover { + color: var(--color-text); + } + } +} + +@media screen and (max-width: 768px) { + .blog-category-detail { + padding: 20px 10px; + } +} diff --git a/src/styles/blog/blog.category.module.scss b/src/styles/blog/blog.category.module.scss new file mode 100644 index 0000000..710f5ea --- /dev/null +++ b/src/styles/blog/blog.category.module.scss @@ -0,0 +1,69 @@ +@use "blog.variable.module.scss" as blog; + +.blog-category { + display: flex; + flex-direction: column; + gap: 3vh; + padding: 10vh 2vw; + + .total { + text-align: center; + font-size: blog.$normal-font-size; + color: blog.$normal-text-color; + } + + .category-list { + height: 100%; + padding: 10px; + display: flex; + flex-direction: column; + gap: 15px; + overflow: auto; + + .item { + display: flex; + align-items: center; + gap: 5px; + padding-bottom: 5px; + border-bottom: 1px dashed blog.$gray-text-color; + color: blog.$normal-text-color; + + i { + font-size:28px; + color: #0f8bc7; + } + + .content { + display: flex; + flex-direction: column; + gap: 5px; + + .label { + cursor: pointer; + color: blog.$normal-text-color; + font-size: blog.$normal-font-size; + } + + .label:hover { + color: blog.$hover-text-color; + } + + .value { + font-size: blog.$normal-font-size; + color: blog.$gray-text-color; + } + } + } + + .item:hover { + color: var(--color-text); + cursor: pointer; + } + } +} + +@media screen and (max-width: 768px) { + .blog-category { + padding: 20px 10px; + } +} diff --git a/src/styles/blog/blog.detail.module.scss b/src/styles/blog/blog.detail.module.scss new file mode 100644 index 0000000..3b8c66b --- /dev/null +++ b/src/styles/blog/blog.detail.module.scss @@ -0,0 +1,71 @@ +@use "blog.variable.module.scss" as blog; + +.blog-detail { + min-height: 100vh; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 2vh; + padding: 10vh 2vw 3vh 2vw; + + .blog-md { + height: 100%; + width: 100%; + padding: 10px; + overflow: auto; + + .md-editor { + height: 100%; + } + } +} + +.blog-title { + width: 100%; + display: grid; + grid-template-rows: 1fr 1fr; + align-items: center; + gap: 1vh; + + .title { + background-color: blog.$theme-color; + padding: 5px; + border: 2px solid blog.$theme-color; + border-radius: 10px; + text-align: center; + font-size: blog.$blog-title-font-size; + font-family: "华文楷体", serif; + } +} + +.blog-copyright { + width: 100%; + background-color: var(--color-copyright-bg); + + padding: 10px; + border-left: 3px solid #FD2C17; + font-size: blog.$small-font-size; + + display: flex; + flex-direction: column; + gap: 1vh; + + strong { + margin-right: 0.2vw; + } +} + +.blog-ending { + span { + color: #CFCFCF; + } +} + +.blog-detail-mobile { + padding: 10px; + + display: flex; + flex-direction: column; + gap: 2vh; +} diff --git a/src/styles/blog/blog.footbar.module.scss b/src/styles/blog/blog.footbar.module.scss new file mode 100644 index 0000000..856461d --- /dev/null +++ b/src/styles/blog/blog.footbar.module.scss @@ -0,0 +1,15 @@ +@use "blog.variable.module.scss" as blog; + +.blog-site-footer { + padding: 10px 0; + + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 10px; + + span { + font-size: blog.$small-font-size; + } +} diff --git a/src/styles/blog/blog.label.module.scss b/src/styles/blog/blog.label.module.scss new file mode 100644 index 0000000..bdb1270 --- /dev/null +++ b/src/styles/blog/blog.label.module.scss @@ -0,0 +1,57 @@ +@use "blog.variable.module.scss" as blog; + +.label-list { + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 1vh; + + margin-bottom: 1vh; + + .container { + display: flex; + align-items: center; + gap: 5px; + + .item { + font-size: blog.$small-font-size; + color: blog.$gray-text-color; + display: flex; + align-items: center; + gap: 5px; + + span { + font-size: blog.$small-font-size; + font-family: "Times New Roman", serif; + } + } + } + + .top-value { + color: #7d26cd !important; + } + + .great { + color: #FFFFFF !important; + background-color: #7d26cd; + padding: 2px; + } + + .date { + text-decoration: underline dotted; + text-underline-offset: 0.2em; + } + + .category { + text-decoration: underline; + text-underline-offset: 0.2em; + color: blog.$normal-text-color; + cursor: pointer; + } + + .category:hover { + color: blog.$hover-text-color; + } +} diff --git a/src/styles/blog/blog.module.scss b/src/styles/blog/blog.module.scss new file mode 100644 index 0000000..9d30e96 --- /dev/null +++ b/src/styles/blog/blog.module.scss @@ -0,0 +1,60 @@ +@use "blog.variable.module.scss" as blog; + +.blog-container { + // height: 100%; + background-color: var(--color-bg); + padding: 0 5vw; + + display: grid; + grid-template-columns: minmax(13vw, 200px) 1fr; + column-gap: 2vw; + + aside { + display: grid; + grid-template-rows: 40vh 60vh; + row-gap: 2vh; + z-index: 2; + + .blog-summary { + // 滚动到顶部固定 + position: sticky; + top: 0; + } + } + + section { + z-index: 2; + + display: flex; + flex-direction: column; + gap: 2vh; + + .blog-section { + // height: 100%; + min-height: 100vh; + box-shadow: 0 2px 2px 0 rgba(0,0,0,0.12), + 0 3px 1px -2px rgba(0,0,0,0.06), + 0 1px 5px 0 rgba(0,0,0,0.12), + 0 -1px 0.5px 0 rgba(0,0,0,0.09); + + .module-title { + background-color: blog.$theme-color; + padding: 5px; + border: 2px solid blog.$theme-color; + border-radius: 10px; + text-align: center; + font-size: blog.$large-font-size; + font-family: "华文楷体", serif; + } + } + } + + .card-item { + background-color: var(--color-card-bg); + border: 1px solid var(--color-border-bg); + border-radius: blog.$border-radius; + // box-shadow: 3px 3px 3px #CFCFCF; + } +} + + diff --git a/src/styles/blog/blog.overview.module.scss b/src/styles/blog/blog.overview.module.scss new file mode 100644 index 0000000..7759d56 --- /dev/null +++ b/src/styles/blog/blog.overview.module.scss @@ -0,0 +1,87 @@ +@use "blog.variable.module.scss" as blog; + +$blog-content-list-item-height: 38vh; +$blog-content-title-font-size: 1.6rem; +$hr-color: #CFCFCF; + +.blog-content-list { + display: flex; + flex-direction: column; + align-items: center; + gap: 5vh; + padding: 10vh 2vw 2vh 2vw; + position: relative; + + .blog-content { + width: 100%; + height: $blog-content-list-item-height; + padding: 4vh 1vw; + + border: 1px solid blog.$border-color; + border-radius: 15px; + box-shadow: 0 0 5px blog.$border-color; + } + + .blog-content-empty { + display: flex; + justify-content: center; + align-items: center; + } + + .blog-content-summary { + display: grid; + grid-template-rows: 1fr 1fr 8vh 1fr 1fr; + justify-items: center; + align-items: center; + gap: 2vh; + + .title { + font-size: $blog-content-title-font-size; + font-family: "华文楷体", serif; + font-weight: bolder; + position: relative; + } + + // 自动展开下划线 + .title:after { + content: ""; + width: 0; + height: 2px; + background: blog.$theme-color; + // 初始位置在底部中间 + position: absolute; + top: 100%; + left: 50%; + // 动画时间 + transition: all .8s; + } + + // 悬浮式展开到100% + .title:hover::after { + width: 100%; + left: 0; + } + + .content { + font-size: blog.$normal-font-size; + line-height: 150%; + } + + hr { + width: 10%; + height: 1px; + background-color: $hr-color; + border: none; + } + + span, p { + font-family: '华为行楷',serif; + } + } +} + +@media screen and (max-width: 768px) { + .blog-content-list { + padding: 10px; + } +} diff --git a/src/styles/blog/blog.sidebar.module.scss b/src/styles/blog/blog.sidebar.module.scss new file mode 100644 index 0000000..657968b --- /dev/null +++ b/src/styles/blog/blog.sidebar.module.scss @@ -0,0 +1,281 @@ +@use "blog.variable.module.scss" as blog; + +$title-font-color: #FFFFFF; +$title-font-size: 1.8rem; +$sub-title-font-size: 1rem; + +.blog-aside { + .top-container { + width: 100%; + display: grid; + grid-template-rows: 2fr 3fr; + + .title-container { + background-color: blog.$theme-color; + border-top-left-radius: 15px; + border-top-right-radius: 15px; + + display: grid; + grid-template-rows: 1fr 1fr; + justify-items: center; + align-items: center; + + padding: 10px; + + .title { + color: $title-font-color; + font-size: $title-font-size; + } + + .sub-title { + font-family: "华文楷体", serif; + font-size: $sub-title-font-size; + text-align: center; + line-height: 150%; + } + } + + .blog-menu-container { + align-self: center; + height: 90%; + display: grid; + grid-template-rows: repeat(4, 1fr); + align-items: center; + + .el-menu-item { + height: 5vh; + gap: 0.5vw; + font-size: blog.$normal-font-size; + + .menu-title { + + } + + .value { + position: absolute; + right: 10%; + line-height: 2vh; + + background-color: blog.$normal-bg-color; + padding: 2px; + border: solid 1px blog.$normal-bg-color; + border-radius: 15px; + + color: var(--color-bg); + font-size: blog.$small-font-size; + font-family: "Times New Roman",serif; + } + } + } + + .el-menu { + border: none; + } + } + + .blog-summary { + display: flex; + flex-direction: column; + align-items: center; + gap: 1vh; + + .blog-summary-tab { + margin-top: 1vh; + height: 5vh; + display: flex; + align-items: center; + gap: 1vw; + + span { + font-size: blog.$small-font-size; + } + + span:hover { + color: #FC6423; + cursor: pointer; + } + + .tab-active { + color: #FC6423; + text-decoration: underline; + text-underline-offset: 0.5em; + } + } + + .blog-brief { + height: 100%; + width: 100%; + display: grid; + grid-template-rows: 150px 50px 50px 1fr; + justify-items: center; + align-items: center; + gap: 1vh; + + .avatar { + padding: 1vh 1vw; + display: grid; + grid-template-rows: 100px 1fr; + justify-items: center; + align-items: center; + gap: 1vh; + + img { + width: 100px; + height: 100px; + border-radius: 50%; + transition: all 2.0s; + cursor: pointer; + } + + img:hover { + transform: rotate(360deg); + } + + span { + font-weight: bold; + } + } + + .info { + display: grid; + grid-template-columns: 1fr 1fr; + justify-items: center; + align-items: center; + gap: 1vw; + + .item { + display: grid; + grid-template-rows: 1fr 1fr; + justify-items: center; + align-items: center; + gap: 5px; + cursor: pointer; + + .name { + color: blog.$gray-text-color; + } + + .name:hover { + color: var(--color-text); + } + } + } + + .social { + width: 100%; + display: grid; + grid-template-columns: 1fr 1fr; + cursor: pointer; + + .item { + width: 100%; + padding: 5px; + display: flex; + justify-content: center; + align-items: center; + gap: 5px; + color: blog.$normal-text-color; + font-size: blog.$small-font-size; + + .name { + font-size: blog.$small-font-size; + } + } + + .item:hover { + background-color: var(--color-card-bg); + color: var(--color-text); + } + } + + .latest-blog { + height: 100%; + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + gap: 1vh; + + .title { + span { + margin-left: 5px; + font-weight: bold; + } + } + + .blog-list { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + gap: 1.5vh; + cursor: pointer; + + span { + text-align: center; + text-decoration: underline; + text-underline-offset: 0.1em; + font-size: blog.$small-font-size; + color: blog.$normal-text-color; + + width: 80%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + span:hover { + color: var(--color-text); + } + } + } + + .blog-time { + width: 10vw; + height: 100%; + } + + span { + font-size: blog.$normal-font-size; + } + } + + .md-editor-catalog { + height: 100%; + width: 100%; + overflow: auto; + + span { + word-break: break-all; + white-space: normal; + font-size: blog.$smaller-font-size; + color: #666666; + } + } + + .scroll-container { + padding: 2px 0; + width: 100%; + border-color: blog.$border-color; + border-bottom-left-radius: blog.$border-radius; + border-bottom-right-radius: blog.$border-radius; + background-color: var(--color-scroll-card-bg); + + text-align: center; + + .fa-arrow-up { + color: blog.$theme-color; + margin-right: 0.2vw; + } + + span { + font-size: blog.$small-font-size; + color: #A19FA0; + } + } + + .scroll-container:hover { + cursor: pointer; + } + } +} diff --git a/src/styles/blog/blog.tools.module.scss b/src/styles/blog/blog.tools.module.scss new file mode 100644 index 0000000..73e949b --- /dev/null +++ b/src/styles/blog/blog.tools.module.scss @@ -0,0 +1,129 @@ +@use "blog.variable.module.scss" as blog; + +.blog-tools { + position: absolute; + + .book-mark-link { + border-bottom: none; + display: block; + position: fixed; + top: -2px; + left: 20px; + color: #222; + font-size: 26px; + transition: .3s; + z-index: 2; + } + + .github-corner { + border-bottom: none; + display: block; + position: fixed; + top: 0; + right: 0; + color: #222; + font-size: 26px; + transition: .3s; + z-index: 2; + } + + .github-corner:hover .octo-arm { + animation: octocat-wave 560ms ease-in-out + } + + @keyframes octocat-wave { + 0%, 100% { + transform: rotate(0) + } + 20%, 60% { + transform: rotate(-25deg) + } + 40%, 80% { + transform: rotate(10deg) + } + } + + @media (max-width: 500px) { + .github-corner:hover .octo-arm { + animation: none + } + .github-corner .octo-arm { + animation: octocat-wave 560ms ease-in-out + } + } + + #particles { + position: absolute; + z-index: 0; + } + + .heart { + position: fixed; + opacity: 1; + scale: 1; + width: 10px; + height: 10px; + background: red; + transform: rotate(45deg); + z-index: 2; + } + + .heart:after, .heart:before { + content: ""; + width: inherit; + height: inherit; + background: inherit; + border-radius: 50%; + position: absolute; + } + + .heart:after { + top: -5px; + } + + .heart:before { + left: -5px; + } + + @keyframes move { + 100% { + transform: translateY(-20px) rotate(45deg); + opacity: 0; + } + } + + .blog-progress { + /* Positioning */ + position: fixed; + left: 0; + top: 0; + width: 100%; + height: 3px; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border: none; + background-color: transparent; + color: blog.$theme-color; + z-index: 3; + } + + .blog-progress::-webkit-progress-bar { + background-color: transparent; + } + + .blog-progress::-webkit-progress-value { + background-color: blog.$theme-color; + } + + .blog-progress::-moz-progress-bar { + background-color: blog.$theme-color; + } + + .theme-button { + position: fixed; + top: -2px; + left: 50px; + z-index: 10; + } +} diff --git a/src/styles/blog/blog.variable.module.scss b/src/styles/blog/blog.variable.module.scss new file mode 100644 index 0000000..383b7f5 --- /dev/null +++ b/src/styles/blog/blog.variable.module.scss @@ -0,0 +1,23 @@ +$bg-color: #EEEEEE; +$card-bg-color: #FFFFFF; + +// 主题颜色 +$theme-color: #009FA8; +// 正常文本颜色 +$normal-text-color: #555555; +// 悬浮文本颜色 +$hover-text-color: #000000; +// 灰色文本颜色 +$gray-text-color: #9C9C9C; + +$normal-bg-color: #CCCCCC; +$hover-bg-color: #F9F9F9; + +$blog-title-font-size: 1.6rem; +$large-font-size: 1.3rem; +$normal-font-size: 1rem; +$small-font-size: 0.9rem; +$smaller-font-size: 0.8rem; + +$border-color: #EEEEEE; +$border-radius: 15px; diff --git a/src/styles/element/index.module.scss b/src/styles/element/index.module.scss new file mode 100644 index 0000000..5c91999 --- /dev/null +++ b/src/styles/element/index.module.scss @@ -0,0 +1,10 @@ +@use 'element-plus/theme-chalk/src/common/var.scss' with ( + $colors: ( + 'primary': ( + 'base': #009FA8, // 设置你的主题色 + ), + ) +); + +// 也可以在此引入其他 Element Plus 样式 +//@use 'element-plus/theme-chalk/src/index.scss' as *; diff --git a/src/styles/home.layout.module.scss b/src/styles/home.layout.module.scss new file mode 100644 index 0000000..ba35023 --- /dev/null +++ b/src/styles/home.layout.module.scss @@ -0,0 +1,163 @@ +@use "home.variable.module" as home; + +.layout-home { + display: flex; + flex-direction: column; + + .layout-navbar { + background-color: home.$navbar-bg-color; + position: sticky; + top: 0; + z-index: 2; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3); + + display: grid; + grid-template-columns: 1fr 70% 1fr; + align-items: center; + + .title-container { + + } + + .right-container { + margin-right: 10px; + justify-self: flex-end; + + display: flex; + justify-content: center; + gap: 1vw; + + .el-avatar:hover { + cursor: pointer; + } + } + + .layout-menu { + .el-menu { + display: flex; + justify-content: center; + background-color: home.$navbar-bg-color !important; + overflow: auto; + border-bottom: none !important; + + .el-menu-item, .el-sub-menu__title { + height: home.$navbar-height; + font-family: "华文楷体", serif; + font-size: 1rem; + } + + .el-icon, span { + color: #FFFFFF; + } + } + } + } + + .layout-main { + height: calc(100vh - #{home.$navbar-height}); + overflow: auto; + background-color: home.$body-bg-color; + padding: 10px; + } + + .layout-main::-webkit-scrollbar { + display: none; + } + + .common-view { + height: 100%; + + .body-container { + height: 100%; + display: grid; + grid-template-columns: 1fr minmax(400px, 30%); + gap: 1vw; + + .left-container { + display: flex; + flex-direction: column; + gap: 1vh; + + .common-statistics { + display: grid; + grid-template-columns: repeat(4, 1fr); + justify-items: center; + gap: 1vw; + } + } + + .right-container { + display: flex; + flex-direction: column; + gap: 1vh; + + .common-query { + align-self: center; + + display: flex; + gap: 10px; + } + } + + .add-new { + position: absolute; + right: 1%; + bottom: 2%; + + width: 50px; + height: 50px; + + font-size: 1.8rem; + box-shadow: 0 4px 10px #CFCFCF; + } + } + + @media (max-width: 1200px) { + .body-container { + grid-template-columns: 1fr 1fr; + } + } + } + + .plan-view { + .body-container { + grid-template-columns: 1fr minmax(350px, 30%); + } + } + + .common-section { + height: 100%; + overflow: auto; + } + + .card-item { + background-color: #FFFFFF; + border: 1px solid #FFFFFF; + border-radius: 15px; + box-shadow: 3px 3px 3px #CFCFCF; + } + + .record-card-item { + background-color: var(--color-record-card-bg); + border: 1px solid var(--color-record-card-bg); + border-radius: 10px; + // box-shadow: 3px 3px 3px #CFCFCF; + } + + .el-switch { + .el-switch__core { + height: 32px; + width: 80px; + } + } +} + +.el-menu--popup-container { + .el-menu--popup { + min-width: 8vw; + } + + .el-menu-item.is-active { + background-color: home.$menu-active-color !important; + } +} diff --git a/src/styles/home.variable.module.scss b/src/styles/home.variable.module.scss new file mode 100644 index 0000000..1af7066 --- /dev/null +++ b/src/styles/home.variable.module.scss @@ -0,0 +1,15 @@ +$theme-color: #009FA8; + +$navbar-bg-color: #138BBF; +$body-bg-color: #F5F5F5; +$footer-bg-color: #F5F5DC; +$menu-active-color: #009FA8; + +$navbar-height: 60px; +$foot-height: 50px; +$common-padding: 10px; + +$query-height: 60px; + +$main-top-padding: 2vh; +$main-left-padding: 0.5vw; diff --git a/src/styles/home/bill.mobile.module.scss b/src/styles/home/bill.mobile.module.scss new file mode 100644 index 0000000..6aad67e --- /dev/null +++ b/src/styles/home/bill.mobile.module.scss @@ -0,0 +1,89 @@ +.mobile-bill-view { + display: flex; + flex-direction: column; + gap: 10px; + + .el-date-editor { + align-self: center; + } + + .bill-chart { + display: grid; + grid-template-rows: repeat(4, 1fr); + gap: 10px; + + .chart-container { + display: grid; + grid-template-rows: 40px 1fr; + + .content { + padding: 0 5px; + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1px solid #009FA8; + + .title { + font-size: 1em; + font-weight: bold; + } + } + + .chart { + height: 300px; + width: 100%; + } + + .rank-chart { + overflow: auto; + display: flex; + flex-direction: column; + gap: 5px; + + .rank-item { + padding: 10px; + display: grid; + grid-template-columns: 20px 1fr 80px; + align-items: center; + + .rank-amount { + justify-self: flex-end; + } + } + + .rank-item:nth-child(1) { + color: #d4af37; + font-weight: bold; + } + + .rank-item:nth-child(2) { + color: #a8a8a8; + } + + .rank-item:nth-child(3) { + color: #b87333; + } + } + } + } + + .el-switch { + .el-switch__core { + height: 32px; + width: 80px; + } + } + + .bill-setting { + display: flex; + flex-direction: column; + gap: 10px; + + .button-container { + align-self: center; + + display: flex; + gap: 10px; + } + } +} diff --git a/src/styles/home/bill.module.scss b/src/styles/home/bill.module.scss new file mode 100644 index 0000000..1f439a4 --- /dev/null +++ b/src/styles/home/bill.module.scss @@ -0,0 +1,48 @@ +.bill-view { + .bill-chart { + flex-grow: 1; + + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: 1fr 1fr; + gap: 2vh; + + .chart-container { + display: grid; + grid-template-rows: 40px 1fr; + + .content { + padding: 0 5px; + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1px solid #009FA8; + + .title { + font-size: 1em; + font-weight: bold; + } + } + } + } + + @media (max-width: 1200px) { + .bill-chart { + display: grid; + grid-template-columns: 1fr; + grid-template-rows: 1fr; + gap: 2vh; + + .chart-container { + .chart { + min-width: 300px; + min-height: 250px; + } + } + } + } + + .bill-dialog { + width: 950px; + } +} diff --git a/src/styles/home/food.mobile.module.scss b/src/styles/home/food.mobile.module.scss new file mode 100644 index 0000000..80d3406 --- /dev/null +++ b/src/styles/home/food.mobile.module.scss @@ -0,0 +1,20 @@ +.mobile-food-view { + display: flex; + flex-direction: column; + gap: 10px; + + .food-list { + position: relative; + display: flex; + flex-direction: column; + justify-content: space-between; + //align-items: center; + gap: 1vh; + + .list { + display: flex; + flex-direction: column; + gap: 10px; + } + } +} diff --git a/src/styles/home/food.module.scss b/src/styles/home/food.module.scss new file mode 100644 index 0000000..e3c2ab4 --- /dev/null +++ b/src/styles/home/food.module.scss @@ -0,0 +1,39 @@ +.food-view { + .food-list { + background-color: #F5F5F5; + flex-grow: 1; + + overflow: auto; + position: relative; + display: flex; + flex-direction: column; + justify-content: space-between; + //align-items: center; + gap: 1vh; + + padding: 10px; + + .list { + display: grid; + grid-template-columns: repeat(3, 1fr); + column-gap: 2vw; + row-gap: 2vh; + } + + @media (min-width: 1280px) and (max-width: 1500px) { + .list { + grid-template-columns: repeat(2, 1fr); + } + } + + @media (max-width: 1280px) { + .list { + grid-template-columns: repeat(1, 1fr); + } + } + + .el-pagination { + align-self: center; + } + } +} diff --git a/src/styles/home/life.detail.module.scss b/src/styles/home/life.detail.module.scss new file mode 100644 index 0000000..4ddded4 --- /dev/null +++ b/src/styles/home/life.detail.module.scss @@ -0,0 +1,232 @@ +.life-detail { + position: relative; + display: grid; + grid-template-rows: 40px 1fr; + align-items: center; + + .title { + text-align: center; + font-weight: bold; + font-size: 1.4rem; + } + + section { + .info-container, .record-container { + .info-item { + padding: 1vh 1vw; + display: flex; + flex-direction: column; + gap: 1vh; + + .title-info { + display: flex; + align-items: center; + gap: 5px; + + svg { + height: 1.4em; + width: 1.4em; + } + + .sub-title { + font-size: large; + font-weight: bold; + } + } + + .info { + margin-left: 2vw; + } + } + } + + .info-container { + display: flex; + flex-direction: column; + gap: 10px; + + .food-basic-info { + display: flex; + gap: 1vh; + } + + .travel-basic-info { + display: flex; + flex-direction: column; + gap: 1vh; + + .basic-item { + display: flex; + flex-direction: column; + gap: 1vh; + + .basic-title { + font-weight: bold; + } + + .basic-content { + margin-left: 1vw; + display: flex; + gap: 1vh; + } + } + } + + .material-info { + display: flex; + flex-direction: column; + gap: 1vh; + + .material-item { + display: flex; + flex-direction: column; + gap: 1vh; + + .material-title { + font-weight: bold; + } + + .material-content { + margin-left: 1vw; + display: flex; + gap: 1vh; + } + } + } + + .step-info { + margin-left: 1vw; + display: flex; + flex-direction: column; + justify-content: space-between; + gap: 1vh; + min-height: 28vh; + + .step-container { + display: grid; + grid-template-columns: 50px 1fr; + gap: 1vw; + + .step-body { + display: flex; + flex-direction: column; + gap: 1vh; + + .step-content { + font-weight: bold; + } + + .step-image { + height: 100%; + width: 100%; + + max-height: 300px; + max-width: 300px; + } + } + } + + } + + .others-info { + margin-left: 1vw; + display: flex; + gap: 1vw; + + .others-title { + font-weight: bold; + } + } + + .guide-info { + display: flex; + flex-direction: column; + gap: 1vh; + + .guide-item { + display: flex; + flex-direction: column; + gap: 1vh; + + .guide-title { + font-weight: bold; + } + + .guide-content { + min-height: 6vh; + margin-left: 1vw; + display: flex; + gap: 1vh; + } + } + } + } + + .info-container .info-item:last-child { + flex-grow: 1; + } + + .record-container { + overflow: auto; + display: flex; + flex-direction: column; + gap: 2vh; + + .record-info { + .el-timeline { + .el-timeline-item__wrapper { + .el-timeline-item__timestamp { + color: #000000; + font-weight: bold; + } + } + } + + .record-card { + .el-card__body { + display: grid; + grid-template-rows: 20px 250px; + gap: 10px; + + .record-content { + font-weight: bold; + } + + .el-carousel { + .el-carousel__container { + height: 100%; + } + } + } + } + } + } + } + + .back-button { + position: absolute; + top: 0; + left: 0; + } +} + +@media screen and (min-width: 768px) { + .life-detail { + section { + height: calc(100vh - 40px - 40px - 4vh); + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px; + } + } +} + +@media screen and (max-width: 768px) { + .life-detail { + section { + display: flex; + flex-direction: column; + gap: 10px; + } + } +} diff --git a/src/styles/home/life.record.module.scss b/src/styles/home/life.record.module.scss new file mode 100644 index 0000000..fd6a75a --- /dev/null +++ b/src/styles/home/life.record.module.scss @@ -0,0 +1,90 @@ +$card-image-height: 200px; + +.life-record-card { + display: grid; + grid-template-rows: minmax($card-image-height, 26vh) 1fr; + + .el-carousel { + border-top-left-radius: 15px; + border-top-right-radius: 15px; + + .el-carousel__container { + height: 100%; + } + + .el-image { + width: 100%; + height: 100%; + + display: flex; + justify-content: center; + align-items: center; + } + } + + .record-info { + border-top: 1px solid var(--el-color-primary); + padding: 1vh; + position: relative; + display: flex; + flex-direction: column; + gap: 8px; + + .top-container, .bottom-container { + display: flex; + justify-content: space-between; + align-items: center; + + .info-list { + display: flex; + align-items: center; + gap: 8px; + + .el-rate { + height: auto; + } + + .info-item { + display: flex; + align-items: center; + gap: 3px; + + .title { + font-size: 1.2rem; + font-weight: bold; + } + } + + .category-item { + color: #0d9488; + } + + .location-item { + color: #0d9488; + } + + .amount-item { + font-size: 1.2rem; + color: #CFB53B; + } + + .fa-solid.fa-location-dot { + color: #008000; + } + + .fa-solid.fa-flag { + color: #0000FF; + } + + .fa-regular.fa-calendar-check { + color: #FF0000; + } + } + } + + .bottom-container { + font-size: small; + color: #9C9C9C; + } + } +} diff --git a/src/styles/home/plan.mobile.module.scss b/src/styles/home/plan.mobile.module.scss new file mode 100644 index 0000000..4b2c22b --- /dev/null +++ b/src/styles/home/plan.mobile.module.scss @@ -0,0 +1,28 @@ +.mobile-plan-view { + display: flex; + flex-direction: column; + gap: 10px; + + #planCalendar { + .fc-view { + height: calc(100vh - 210px); + + .fc-timegrid-body { + // 单元格高度 + tr { + height: 3.5vh; + } + } + } + } + + .plan-list { + .el-scrollbar { + .el-scrollbar__view { + display: flex; + flex-direction: column; + gap: 2vh; + } + } + } +} diff --git a/src/styles/home/plan.module.scss b/src/styles/home/plan.module.scss new file mode 100644 index 0000000..d1603cc --- /dev/null +++ b/src/styles/home/plan.module.scss @@ -0,0 +1,13 @@ +.plan-view { + .plan-list { + height: calc(100vh - 120px); + + .el-scrollbar { + .el-scrollbar__view { + display: flex; + flex-direction: column; + gap: 2vh; + } + } + } +} diff --git a/src/styles/home/travel.mobile.module.scss b/src/styles/home/travel.mobile.module.scss new file mode 100644 index 0000000..b5702e0 --- /dev/null +++ b/src/styles/home/travel.mobile.module.scss @@ -0,0 +1,20 @@ +.mobile-travel-view { + display: flex; + flex-direction: column; + gap: 10px; + + .travel-list { + position: relative; + display: flex; + flex-direction: column; + justify-content: space-between; + //align-items: center; + gap: 1vh; + + .list { + display: flex; + flex-direction: column; + gap: 10px; + } + } +} diff --git a/src/styles/home/travel.module.scss b/src/styles/home/travel.module.scss new file mode 100644 index 0000000..75ef085 --- /dev/null +++ b/src/styles/home/travel.module.scss @@ -0,0 +1,33 @@ +.travel-view { + .travel-spot-list { + background-color: #F5F5F5; + flex-grow: 1; + + overflow: auto; + position: relative; + display: flex; + flex-direction: column; + justify-content: space-between; + //align-items: center; + gap: 1vh; + + padding: 10px; + + .list { + display: grid; + grid-template-columns: repeat(3, 1fr); + column-gap: 4vw; + row-gap: 2vh; + } + + @media (max-width: 1280px) { + .list { + grid-template-columns: repeat(1, 1fr); + } + } + + .el-pagination { + align-self: center; + } + } +} diff --git a/src/styles/index.module.scss b/src/styles/index.module.scss new file mode 100644 index 0000000..b629794 --- /dev/null +++ b/src/styles/index.module.scss @@ -0,0 +1,85 @@ +body { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + font-family: CustomFont, sans-serif; +} + +*, +*:before, +*:after { + box-sizing: border-box; +} + +a:focus, +a:active { + outline: none; +} + +a, +a:focus, +a:hover { + cursor: pointer; + color: inherit; + text-decoration: none; +} + +html, body { + height: 100%; + margin: 0; + padding: 0; +} + +#app { + height: 100%; +} + +html { + font-size: 16px; +} + +span, input { + font-family: 'CustomFont', serif; +} + +// 明亮主题变量 +:root { + // 基础颜色 + --color-bg: #F5F5F5; + --color-card-bg: #FFFFFF; + --color-record-card-bg: #F5F5DC; + --color-border-bg: #FFFFFF; + --color-text: #000000; +} + +// 暗黑主题变量 +.dark { + --color-bg: #000000; + --color-card-bg: #000000; + --color-record-card-bg: #4C4D4F; + --color-border-bg: #4C4D4F; + --color-text: #FFFFFF; +} + +::view-transition-old(root), +::view-transition-new(root) { + animation: none; +} +.dark::view-transition-old(root) { + z-index: 9999; +} + +@media (max-width: 1280px) { + html { + font-size: 13px; + } +} + +@font-face { + font-family: 'CustomFont'; + src: url('@/assets/font/custom.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +@import "//at.alicdn.com/t/c/font_4793264_6bh098pu52x.css"; diff --git a/src/styles/mobile.home.layout.module.scss b/src/styles/mobile.home.layout.module.scss new file mode 100644 index 0000000..a339e99 --- /dev/null +++ b/src/styles/mobile.home.layout.module.scss @@ -0,0 +1,154 @@ +@use "home.variable.module" as home; + +$titleBar-height: 40px; +$tabBar-height: 70px; + +.layout-mobile-home { + height: 100%; + + .common-mobile-view { + height: calc(100vh - $tabBar-height - $titleBar-height); + overflow: auto; + background-color: var(--color-bg); + color: var(--color-text); + padding: 10px; + } + + .common-query { + align-self: center; + + display: flex; + gap: 10px; + } + + .mobile-common-query { + padding: 10px; + display: flex; + flex-direction: column; + gap: 10px; + + .query-item { + overflow-x: auto; + white-space: nowrap; + -webkit-overflow-scrolling: touch; + } + } + + .common-statistics { + display: grid; + grid-template-columns: repeat(2, 1fr); + justify-items: center; + gap: 10px; + } + + .title-bar { + background-color: var(--el-color-primary); + height: $titleBar-height; + padding: 0 10px; + display: grid; + grid-template-columns: repeat(3, 1fr); + justify-items: center; + align-items: center; + + .left-container { + justify-self: flex-start; + color: #FFFFFF; + + .logo-container { + display: flex; + align-items: center; + gap: 5px; + + .logo { + width: 20px; + height: 20px; + } + } + } + + .title-container { + color: #FFFFFF; + font-weight: bold; + font-size: 1.2rem; + } + + .right-container { + justify-self: flex-end; + + display: flex; + align-items: center; + gap: 5px; + } + } + + .tab-bar { + position: fixed; + bottom: 0; + left: 0; + right: 0; + + height: $tabBar-height; + display: flex; + justify-content: space-around; + background-color: var(--color-card-bg); + color: var(--color-text); + box-shadow: 0 -1px 2px var(--color-border-bg); + padding: 10px 0; + + .item { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + gap: 5px; + + i { + font-size: 24px; + } + } + + .router-link-active { + color: var(--el-color-primary); + } + } + + .add-new { + position: absolute; + right: 2%; + bottom: 9%; + + font-size: 1.8rem; + } + + .vc-container { + width: 100%; + + .vc-day { + min-height: 40px; + } + + .vc-day-box-center-bottom { + height: 105%; + display: flex; + } + } + + .common-section { + height: 100%; + overflow: auto; + } + + .card-item { + background-color: var(--color-card-bg); + border: 1px solid var(--color-border-bg); + border-radius: 10px; + // box-shadow: 3px 3px 3px #CFCFCF; + } + + .record-card-item { + background-color: var(--color-record-card-bg); + border: 1px solid var(--color-record-card-bg); + border-radius: 10px; + // box-shadow: 3px 3px 3px #CFCFCF; + } +} diff --git a/src/types/auth.ts b/src/types/auth.ts new file mode 100644 index 0000000..8f0cd2e --- /dev/null +++ b/src/types/auth.ts @@ -0,0 +1,48 @@ +export type ILoginType = 'common' | 'phone' | 'email' | 'admin' + +export type IAccountType = 'QQ' | 'WeChat' | 'Phone' | 'EMail' + +export interface IUser { + id: number; + accountId: number; + accountName: string; + username: string; + gender: number; + idNumber: string; + phoneNumber: string; + email: string; + birthDate: string; + avatar: string; + description: string; + area: string[]; + address: string; + job: string; + tags: string[]; +} + +export interface ISession { + saToken: { + tokenName: string; + tokenValue: string; + isLogin: boolean; + loginId: string; + loginType: string; + tokenTimeout: number; + sessionTimeout: number; + tokenSessionTimeout: number; + tokenActiveTimeout: number; + loginDevice: string; + tag: string; + }; + userInfo: IUser; +} + +export interface IAccount { + id: number; + accountName: string; + password: string; + confirmPassword: string; + username: string; + state: number; + date: string; +} diff --git a/src/types/blog.ts b/src/types/blog.ts new file mode 100644 index 0000000..3f500ca --- /dev/null +++ b/src/types/blog.ts @@ -0,0 +1,84 @@ +export interface IBlog { + id: number; + title: string; + topValue: number; + isGreat: boolean; + categoryId: number; + category: string; + summary: string; + content: string; + wordCount: number; + readDuration: number; + visitCount: number; + createTime: string; + updateTime: string; +} + +export interface INewBlog { + id: number; + title: string; + topValue: number; + isGreat: boolean; + category: string; + content: string; +} + +export interface IQueryBlog { + category?: string; + title?: string; + year?: number; +} + +export interface IBasicBlog { + category: string; + topValue: number; + isGreat: boolean; + wordCount: number; + readDuration: number; + visitCount: number; + createTime: string; + updateTime: string; +} + +export interface IBlogCategory { + name: string; + count: number; +} + +export interface IBlogStats { + blogCount: number; + categoryCount: number; + wordCount: number; +} + +export interface IBlogLatest { + id: number; + title: string; +} + +export interface IBlogVisit { + ip: string; + os: string; + browser: string; + uri: string; + title: string; + visitTime: string; +} + +export interface IBlogComment { + id: number; + blogId: number; + name: string; + website: string; + content: string; + ipAddress: string; + userAgent: string; + parentId: number; + isApproved: boolean; + createTime: string; +} + +export interface IBlogNestedComment { + comment: IBlogComment; + replies: IBlogComment[]; +} diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..0e3ccbc --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,25 @@ +export enum ImagePathEnum { + BLOG= 'blog', + BILL = 'bill', + FOOD = 'food', + TRAVEL = 'travel', + PRODUCT = 'product', + JOURNAL = 'journal', + LEDGER = 'ledger', + USER = 'user' +} + +export interface IPageRecord { + current: number; + size: number; + total: number; + pages: number; + records: T[]; +} + +export type IDateType = 'month' | 'year' + +export interface ICategory { + label: string; + value: string; +} diff --git a/src/utils/blog/blogUtil.ts b/src/utils/blog/blogUtil.ts new file mode 100644 index 0000000..8a1465d --- /dev/null +++ b/src/utils/blog/blogUtil.ts @@ -0,0 +1,194 @@ +import { ElMessage } from 'element-plus' +import { IBasicBlog, IBlog, IBlogComment, IBlogNestedComment } from '@/types/blog.ts' +import dayjs from 'dayjs' + +/** + * 粒子特效 + */ +export const particlesOptions = { + background: { + color: {} + }, + fpsLimit: 60, + interactivity: { + events: { + // 点击时事件 + onClick: { + enable: false, + mode: 'push' // 可用的click模式有: "push", "remove", "repulse", "bubble"。 + }, + // 悬浮时事件 + onHover: { + enable: true, + mode: 'grab' // 可用的hover模式有: "grab", "repulse", "bubble"。 + }, + resize: true + }, + modes: { + bubble: { + distance: 400, + duration: 2, + opacity: 0.8, + size: 40 + }, + push: { + quantity: 4 + }, + repulse: { + distance: 200, + duration: 0.4 + } + } + }, + particles: { + color: { + value: '#000000' + }, + links: { + color: '#000000', // '#dedede'。线条颜色。 + distance: 150, // 线条长度 + enable: true, // 是否有线条 + opacity: 0.5, // 线条透明度。 + width: 1 // 线条宽度。 + }, + collisions: { + enable: false + }, + move: { + direction: 'none', + enable: true, + outMode: 'bounce', + random: false, + speed: 4, // 粒子运动速度。 + straight: false + }, + number: { + density: { + enable: true, + area: 800 + }, + value: 50 // 粒子数量。 + }, + opacity: { + value: 0.1 // 粒子透明度。 + }, + shape: { + type: 'edge' // 可用的粒子外观类型有:"circle","edge","triangle", "polygon","star" + }, + size: { + random: true, + value: 5 + } + }, + detectRetina: true +} + +/** + * 创建鼠标点击爱心特效 + * @param leftPosition 左侧位置 + * @param topPosition 右侧位置 + */ +export const createHeartDiv = (leftPosition: number, topPosition: number) => { + const heart = document.createElement('div') + document.body.appendChild(heart) + heart.classList.add('heart') + heart.style.left = `${leftPosition}px` + heart.style.top = `${topPosition}px` + heart.style.animation = 'move 1s normal forwards' + setTimeout(() => { + document.body.removeChild(heart) + }, 1000) + heart.style.backgroundColor = `rgb(${Math.random() * 255},${Math.random() * 255},${Math.random() * 255})` +} + +/** + * 校验博客上传图片 + * @param files 文件 + */ +export const validateBlogImage = (files: File[]): boolean => { + if (files.length > 1) { + ElMessage.error('请上传1张图片') + return false + } + + const uploadFile = files[0] + const fileTypeList = ['png', 'jpg', 'jpeg', 'bmp', 'gif', 'webp', 'psd', 'svg', 'tiff'] + if (fileTypeList.indexOf(uploadFile.type.toLowerCase()) !== -1) { + ElMessage.error('请上传图片文件') + return false + } + + const maxFileSize = 5 * 1024 * 1024 + if (uploadFile.size > maxFileSize) { + ElMessage.error('请上传5M以内的图片') + return false + } + + return true +} + +export const formatBlogWordCount = (count: number): string => { + if (!count) { + return '' + } + + if (count < 10000) return count.toString() + + const units = ['万', '亿', '兆'] + let unitIndex = -1 + + while (count >= 10000 && unitIndex < units.length - 1) { + count /= 10000 + unitIndex++ + } + + // 保留两位小数,并移除末尾可能的零 + const formattedNum = count.toFixed(2).replace(/\.?0+$/, '') + return `${formattedNum}${units[unitIndex]}` +} + +export const getBlogRunTotalTime = (startDateStr: string):string => { + const startDate = dayjs(startDateStr) + const endDate = dayjs() // 当前时间 + + // 计算完整时间间隔(年、月、日) + const years = endDate.diff(startDate, 'year') + const months = endDate.diff(startDate.add(years, 'year'), 'month') + const days = endDate.diff(startDate.add(years, 'year').add(months, 'month'), 'day') + + return `${years}年${months}月${days}日` +} + +export const getBasicBlog = (blog: IBlog): IBasicBlog => { + return { + category: blog.category, + isGreat: blog.isGreat, + readDuration: blog.readDuration, + topValue: blog.topValue, + wordCount: blog.wordCount, + visitCount: blog.visitCount, + createTime: blog.createTime, + updateTime: blog.updateTime + } +} + +// 扁平化数据转两层嵌套结构 +export function flattenToTwoLevel(comments: IBlogComment[]): IBlogNestedComment[] { + // 创建评论映射表,快速查找评论 + const commentMap = new Map() + comments.forEach((comment) => commentMap.set(comment.id, comment)) + + // 结果数组 + const result: IBlogNestedComment[] = [] + + // 遍历所有评论,构建两层结构 + comments.forEach((comment) => { + if (comment.parentId === 0) { + // 顶层评论 + const replies = comments.filter((reply) => reply.parentId === comment.id) + result.push({ comment, replies }) + } + }) + + return result +} diff --git a/src/utils/blog/ribbon.ts b/src/utils/blog/ribbon.ts new file mode 100644 index 0000000..9a08944 --- /dev/null +++ b/src/utils/blog/ribbon.ts @@ -0,0 +1,164 @@ +const { random } = Math + +const randomColor = [ + ['#95e1d3', '#eaffd0', '#fce38a', '#f38181'], + ['#6a2c70', '#b83b5e', '#f08a5d', '#f9ed69'], + ['#edb1f1', '#d59bf6', '#9896f1', '#8ef6e4'], + ['#ff9de2', '#8c82fc', '#b693fe', '#7effdb'], + ['#fff5a5', '#ffaa64', '#ff8264', '#ff6464'] +] + +export interface IRibbonOptions { + zIndex: number; + alpha: number; + size: number; +} + +interface IRibbonPoint { + x: number; + y: number; +} + +const getRandomInt = (value: number) => { + return Math.floor(Math.random() * value) +} + +export class Ribbon { + /** + * 画布元素 + */ + canvas: HTMLCanvasElement; + /** + * Canvas中的Context + */ + ctx: CanvasRenderingContext2D; + /** + * 轨迹路径 + */ + path: IRibbonPoint[]; + /** + * 区域宽度 + */ + width: number; + /** + * 区域高度 + */ + height: number; + /** + * 颜色色系 + */ + colorIndex: number; + /** + * 配置项 + */ + options: IRibbonOptions + + constructor(options: IRibbonOptions = { + alpha: 0.6, + size: 300, + zIndex: 0 + }) { + this.options = options + // 生成Canvas元素 并添加到Body中 + this.canvas = document.createElement('canvas') + this.canvas.classList.add('ribbon-canvas') + this.canvas.style.cssText = `position:fixed;top:0;left:0;z-index:${this.options.zIndex}` + document.getElementsByTagName('body')[0].appendChild(this.canvas) + + this.ctx = this.canvas.getContext('2d') as CanvasRenderingContext2D + this.width = window.innerWidth + this.height = window.innerHeight + + // 返回实际宽高 + const dpr = window.devicePixelRatio || 1 + this.canvas.width = this.width * dpr + this.canvas.height = this.height * dpr + // 水平、竖直方向缩放 + this.ctx.scale(dpr, dpr) + // 图形透明度 + this.ctx.globalAlpha = this.options.alpha + this.path = [] + this.colorIndex = 0 + + this.reDraw() + } + + /** + * 重新绘制 + */ + reDraw() { + // 清除之前绘制的图形 + this.ctx.clearRect(0, 0, this.width, this.height) + // 生成新的点和路径 + const point1: IRibbonPoint = { + x: 0, + y: this.height * 0.7 + this.options.size + } + const point2: IRibbonPoint = { + x: 0, + y: this.height * 0.7 - this.options.size + } + this.path = [point1, point2] + // 随机选择色系 + this.colorIndex = getRandomInt(randomColor.length) + // 路径没有填满屏幕宽度时,绘制路径 + while (this.path[1].x < this.width + this.options.size) { + this.draw(this.path[0], this.path[1]) + } + } + + /** + * 绘制线 + * @param start 起点 + * @param end 终点 + */ + draw(start: IRibbonPoint, end: IRibbonPoint) { + // 绘制当前点 + this.ctx.beginPath() + this.ctx.moveTo(start.x, start.y) + this.ctx.lineTo(end.x, end.y) + const nextX = this.geneX(end.x) + const nextY = this.geneY(end.y) + this.ctx.lineTo(nextX, nextY) + this.ctx.closePath() + + // 随机生成颜色 + const color = randomColor[this.colorIndex] + this.ctx.fillStyle = `${color[getRandomInt(color.length)]}` + // 根据当前样式填充路径 + this.ctx.fill() + + // 继续绘制下一个点 + // 起点更新为当前终点 + this.path[0] = this.path[1] + // 更新终点 + this.path[1] = { x: nextX, y: nextY } + } + + /** + * 生成下一个x坐标 + * @param x 当前x坐标 + */ + geneX(x: number) { + // 当前坐标向上平移 + return x + this.options.size + } + + /** + * 生成下一个y坐标 + * @param y 当前y坐标 + */ + geneY(y: number) { + // 当前坐标向右平移 + const temp = y + (random() * 2 - 1.1) * this.options.size + return (temp > this.height || temp < 0) ? this.height : temp + } + + /** + * 清除画布 + */ + clear() { + this.canvas.remove() + } +} + diff --git a/src/utils/blog/timeCanvas.ts b/src/utils/blog/timeCanvas.ts new file mode 100644 index 0000000..22c90a4 --- /dev/null +++ b/src/utils/blog/timeCanvas.ts @@ -0,0 +1,345 @@ +const timeColors = ['#33B5E5', '#0099CC', '#AA66CC', '#9933CC', '#99CC00', '#669900', '#FFBB33', '#FF8800', '#FF4444', '#CC0000'] +const timeDigits = [ + [ + [0, 0, 1, 1, 1, 0, 0], + [0, 1, 1, 0, 1, 1, 0], + [1, 1, 0, 0, 0, 1, 1], + [1, 1, 0, 0, 0, 1, 1], + [1, 1, 0, 0, 0, 1, 1], + [1, 1, 0, 0, 0, 1, 1], + [1, 1, 0, 0, 0, 1, 1], + [1, 1, 0, 0, 0, 1, 1], + [0, 1, 1, 0, 1, 1, 0], + [0, 0, 1, 1, 1, 0, 0] + ], // 0 + [ + [0, 0, 0, 1, 1, 0, 0], + [0, 1, 1, 1, 1, 0, 0], + [0, 0, 0, 1, 1, 0, 0], + [0, 0, 0, 1, 1, 0, 0], + [0, 0, 0, 1, 1, 0, 0], + [0, 0, 0, 1, 1, 0, 0], + [0, 0, 0, 1, 1, 0, 0], + [0, 0, 0, 1, 1, 0, 0], + [0, 0, 0, 1, 1, 0, 0], + [1, 1, 1, 1, 1, 1, 1] + ], // 1 + [ + [0, 1, 1, 1, 1, 1, 0], + [1, 1, 0, 0, 0, 1, 1], + [0, 0, 0, 0, 0, 1, 1], + [0, 0, 0, 0, 1, 1, 0], + [0, 0, 0, 1, 1, 0, 0], + [0, 0, 1, 1, 0, 0, 0], + [0, 1, 1, 0, 0, 0, 0], + [1, 1, 0, 0, 0, 0, 0], + [1, 1, 0, 0, 0, 1, 1], + [1, 1, 1, 1, 1, 1, 1] + ], // 2 + [ + [1, 1, 1, 1, 1, 1, 1], + [0, 0, 0, 0, 0, 1, 1], + [0, 0, 0, 0, 1, 1, 0], + [0, 0, 0, 1, 1, 0, 0], + [0, 0, 1, 1, 1, 0, 0], + [0, 0, 0, 0, 1, 1, 0], + [0, 0, 0, 0, 0, 1, 1], + [0, 0, 0, 0, 0, 1, 1], + [1, 1, 0, 0, 0, 1, 1], + [0, 1, 1, 1, 1, 1, 0] + ], // 3 + [ + [0, 0, 0, 0, 1, 1, 0], + [0, 0, 0, 1, 1, 1, 0], + [0, 0, 1, 1, 1, 1, 0], + [0, 1, 1, 0, 1, 1, 0], + [1, 1, 0, 0, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1], + [0, 0, 0, 0, 1, 1, 0], + [0, 0, 0, 0, 1, 1, 0], + [0, 0, 0, 0, 1, 1, 0], + [0, 0, 0, 1, 1, 1, 1] + ], // 4 + [ + [1, 1, 1, 1, 1, 1, 1], + [1, 1, 0, 0, 0, 0, 0], + [1, 1, 0, 0, 0, 0, 0], + [1, 1, 1, 1, 1, 1, 0], + [0, 0, 0, 0, 0, 1, 1], + [0, 0, 0, 0, 0, 1, 1], + [0, 0, 0, 0, 0, 1, 1], + [0, 0, 0, 0, 0, 1, 1], + [1, 1, 0, 0, 0, 1, 1], + [0, 1, 1, 1, 1, 1, 0] + ], // 5 + [ + [0, 0, 0, 0, 1, 1, 0], + [0, 0, 1, 1, 0, 0, 0], + [0, 1, 1, 0, 0, 0, 0], + [1, 1, 0, 0, 0, 0, 0], + [1, 1, 0, 1, 1, 1, 0], + [1, 1, 0, 0, 0, 1, 1], + [1, 1, 0, 0, 0, 1, 1], + [1, 1, 0, 0, 0, 1, 1], + [1, 1, 0, 0, 0, 1, 1], + [0, 1, 1, 1, 1, 1, 0] + ], // 6 + [ + [1, 1, 1, 1, 1, 1, 1], + [1, 1, 0, 0, 0, 1, 1], + [0, 0, 0, 0, 1, 1, 0], + [0, 0, 0, 0, 1, 1, 0], + [0, 0, 0, 1, 1, 0, 0], + [0, 0, 0, 1, 1, 0, 0], + [0, 0, 1, 1, 0, 0, 0], + [0, 0, 1, 1, 0, 0, 0], + [0, 0, 1, 1, 0, 0, 0], + [0, 0, 1, 1, 0, 0, 0] + ], // 7 + [ + [0, 1, 1, 1, 1, 1, 0], + [1, 1, 0, 0, 0, 1, 1], + [1, 1, 0, 0, 0, 1, 1], + [1, 1, 0, 0, 0, 1, 1], + [0, 1, 1, 1, 1, 1, 0], + [1, 1, 0, 0, 0, 1, 1], + [1, 1, 0, 0, 0, 1, 1], + [1, 1, 0, 0, 0, 1, 1], + [1, 1, 0, 0, 0, 1, 1], + [0, 1, 1, 1, 1, 1, 0] + ], // 8 + [ + [0, 1, 1, 1, 1, 1, 0], + [1, 1, 0, 0, 0, 1, 1], + [1, 1, 0, 0, 0, 1, 1], + [1, 1, 0, 0, 0, 1, 1], + [0, 1, 1, 1, 0, 1, 1], + [0, 0, 0, 0, 0, 1, 1], + [0, 0, 0, 0, 0, 1, 1], + [0, 0, 0, 0, 1, 1, 0], + [0, 0, 0, 1, 1, 0, 0], + [0, 1, 1, 0, 0, 0, 0] + ], // 9 + [ + [0, 0, 0, 0], + [0, 0, 0, 0], + [0, 1, 1, 0], + [0, 1, 1, 0], + [0, 0, 0, 0], + [0, 0, 0, 0], + [0, 1, 1, 0], + [0, 1, 1, 0], + [0, 0, 0, 0], + [0, 0, 0, 0] + ]// : +] + +interface ITimeCanvasNum { + num: number; + offsetX: number; + offsetY: number; +} + +interface ITimeCanvasBall { + offsetX: number; + offsetY: number; + color: string; + g: number; + vx: number; + vy: number; +} + +export class TimeCanvas { + context: CanvasRenderingContext2D + width: number + height: number + options: { + RADIUS: number; // 球半径 + NUMBER_GAP: number; // 数字之间的间隙 + u: number; // 碰撞能量损耗系数 + timeColor: string; // 时间颜色 + colors: string[]; // 彩色小球的颜色 + digit: any[]; // 数字显示 + offsetX: number; // 初始x偏移 + offsetY: number; // 初始y偏移 + } + currentNums: ITimeCanvasNum[] = [] // 屏幕显示的8个字符 + balls: ITimeCanvasBall[] = [] // 存储彩色的小球 + + constructor(context: CanvasRenderingContext2D, width: number, height: number) { + this.context = context + this.width = width + this.height = height + this.options = { + RADIUS: 1.2, // 球半径 + NUMBER_GAP: 10, // 数字之间的间隙 + u: 0.4, // 碰撞能量损耗系数 + timeColor: '#1677FF', + colors: timeColors, // 彩色小球的颜色 + digit: timeDigits, // 数字显示 + offsetX: 0, + offsetY: 10 + } + } + + /** + * 绘制时间 + */ + drawDatetime(): void { + // 计算需要显示的时间数字信息 + const timeNums = [] as ITimeCanvasNum[] + + const date = new Date() + const hours = date.getHours() + const hour1 = Math.floor(hours / 10) + const hour2 = hours % 10 + timeNums.push({ num: hour1, offsetX: 0, offsetY: 0 }) + timeNums.push({ num: hour2, offsetX: 0, offsetY: 0 }) + // 添加冒号 下同 + timeNums.push({ num: 10, offsetX: 0, offsetY: 0 }) + + const minutes = date.getMinutes() + const minute1 = Math.floor(minutes / 10) + const minute2 = minutes % 10 + timeNums.push({ num: minute1, offsetX: 0, offsetY: 0 }) + timeNums.push({ num: minute2, offsetX: 0, offsetY: 0 }) + timeNums.push({ num: 10, offsetX: 0, offsetY: 0 }) + + const seconds = date.getSeconds() + const second1 = Math.floor(seconds / 10) + const second2 = seconds % 10 + timeNums.push({ num: second1, offsetX: 0, offsetY: 0 }) + timeNums.push({ num: second2, offsetX: 0, offsetY: 0 }) + + // canvas绘制时的初始x偏移 + let { offsetX } = this.options + // canvas绘制时的初始y偏移 + const { offsetY } = this.options + for (let x = 0; x < timeNums.length; x++) { + timeNums[x].offsetX = offsetX + timeNums[x].offsetY = offsetY + offsetX = this.drawSingleNumber(timeNums[x]) + // 两个数字连一块,应该间隔一些距离 + if (x < timeNums.length - 1) { + offsetX += this.options.NUMBER_GAP + } + } + + // 第一次绘制 + if (this.currentNums.length === 0) { + this.currentNums = timeNums + } else { + // 后续绘制时 替换不同的部分 并添加爆炸小球 + for (let index = 0; index < this.currentNums.length; index++) { + if (this.currentNums[index].num !== timeNums[index].num) { + // 不一样时,添加彩色小球 + // this.addBalls(timeNums[index]) + this.currentNums[index].num = timeNums[index].num + } + } + } + + // 渲染小球 + // this.renderBalls() + // 更新小球 + // this.updateBalls() + } + + /** + * 添加小球 + * @param item 小球数字 + */ + addBalls(item: ITimeCanvasNum) { + const { num, offsetX } = item + const numMatrix = this.options.digit[num] + + for (let y = 0; y < numMatrix.length; y++) { + for (let x = 0; x < numMatrix[y].length; x++) { + if (numMatrix[y][x] === 1) { + const ball: ITimeCanvasBall = { + offsetX: offsetX + this.options.RADIUS + this.options.RADIUS * 2 * x, + offsetY: this.options.offsetY + this.options.RADIUS + this.options.RADIUS * 2 * y, + color: this.options.colors[Math.floor(Math.random() * this.options.colors.length)], + g: 1.5 + Math.random(), + vx: Math.pow(-1, Math.ceil(Math.random() * 10)) * 4 + Math.random(), + vy: -5 + } + this.balls.push(ball) + } + } + } + } + + /** + * 渲染小球 + */ + renderBalls() { + for (let index = 0; index < this.balls.length; index++) { + const ball = this.balls[index] + this.context.beginPath() + this.context.fillStyle = this.balls[index].color + this.context.arc(ball.offsetX, ball.offsetY, this.options.RADIUS, 0, 2 * Math.PI) + this.context.fill() + } + } + + /** + * 更新小球 + */ + updateBalls() { + let i = 0 + const radius = this.options.RADIUS + for (let index = 0; index < this.balls.length; index++) { + const ball = this.balls[index] + ball.offsetX += ball.vx + ball.offsetY += ball.vy + ball.vy += ball.g + + if (ball.offsetY > (this.height - radius)) { + ball.offsetY = this.height - radius + ball.vy = -ball.vy * this.options.u + } + + if (ball.offsetX > radius && ball.offsetX < (this.width - radius)) { + this.balls[i] = this.balls[index] + i++ + } + } + + // 去除出边界的球 + for (;i < this.balls.length; i++) { + this.balls.pop() + } + + // 防止切换至其他窗口 仍然在生成粒子 + if (this.balls.length > 100) { + this.balls = [] + } + } + + /** + * 获取单个数字 + * @param timeNums 数字 + */ + drawSingleNumber(timeNums: ITimeCanvasNum): number { + const numMatrix = this.options.digit[timeNums.num] + const radius = this.options.RADIUS + + for (let y = 0; y < numMatrix.length; y++) { + for (let x = 0; x < numMatrix[y].length; x++) { + if (numMatrix[y][x] === 1) { + this.context.beginPath() + const arcX = timeNums.offsetX + radius + radius * 2 * x + const arcY = timeNums.offsetY + radius + radius * 2 * y + this.context.arc(arcX, arcY, radius, 0, 2 * Math.PI) + this.context.fill() + this.context.fillStyle = this.options.timeColor + } + } + } + this.context.beginPath() + timeNums.offsetX += numMatrix[0].length * radius * 2 + + return timeNums.offsetX as number + } +} diff --git a/src/utils/echats/billCharts.ts b/src/utils/echats/billCharts.ts new file mode 100644 index 0000000..3b565b2 --- /dev/null +++ b/src/utils/echats/billCharts.ts @@ -0,0 +1,27 @@ +export const billRateChartOption = (value: number, color: string) => { + return { + series: [ + { + type: 'liquidFill', + center: ['50%', '50%'], + radius: '90%', + data: [ + { + value, + itemStyle: { color } + } + ], + label: { + fontSize: 14 + }, + outline: { + show: false + }, + backgroundStyle: { + color: 'white', + shadowBlur: 3 + } + } + ] + } +} diff --git a/src/utils/echats/foodCharts.ts b/src/utils/echats/foodCharts.ts new file mode 100644 index 0000000..9bf9822 --- /dev/null +++ b/src/utils/echats/foodCharts.ts @@ -0,0 +1,38 @@ +import { commonTitle, commonGrid, emptyGraphic } from 'vue3-common/utils/eChartsUtil' + +export const foodWorkChartOption = (datasetSource: string[][]) => { + return { + title: commonTitle('📊成果统计'), + graphic: emptyGraphic(datasetSource.length), + grid: commonGrid, + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'shadow' + } + }, + legend: {}, + dataset: { + source: datasetSource + }, + xAxis: { type: 'category' }, + yAxis: {}, + series: [ + { + type: 'bar', + barWidth: '20%', + label: { + show: true, + position: 'top' + } + }, + { + type: 'bar', + barWidth: '20%', + label: { + show: true, + position: 'top' + } + }] + } +} diff --git a/src/utils/element/elRules.ts b/src/utils/element/elRules.ts new file mode 100644 index 0000000..6fb6db7 --- /dev/null +++ b/src/utils/element/elRules.ts @@ -0,0 +1,373 @@ + +export const chinesePattern = /^[\u4e00-\u9fa5a-zA-Z0-9]+$/ + +export const amountPattern = /^\d+(\.?\d{1,2})?$/ + +export const phonePattern = /^1[3-9]\d{9}$/ + +export const emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/ + +export const blogRules = { + title: [ + { required: true, message: '请输入博客标题', trigger: 'change' } + ], + category: [ + { required: true, message: '请输入或选择博客分类', trigger: 'change' }, + // { pattern: new RegExp(chinesePattern), message: '请输入中英文或数字' }, + { min: 1, max: 10, message: '请输入10字以内的类别', trigger: 'blur' }] +} + +export const loginRules = { + username: [ + { required: true, message: '请输入账号', trigger: 'blur' }, + { pattern: /^[0-9a-zA-Z]+$/, message: '请输入正确的格式: 数字或英文字母', trigger: ['blur'] } + ], + password: [ + { required: true, message: '请输入密码', trigger: 'blur' }, + { pattern: /^[0-9a-zA-Z]+$/, message: '请输入正确的格式: 数字或英文字母', trigger: ['blur'] } + ], + phoneNumber: [ + { required: true, message: '请输入手机号', trigger: 'blur' }, + { pattern: phonePattern, message: '请输入正确的手机号格式', trigger: ['blur'] } + ], + email: [ + { required: true, message: '请输入邮箱地址', trigger: 'blur' }, + { pattern: emailPattern, message: '请输入正确的邮箱格式', trigger: ['blur'] } + ], + code: [ + { required: true, message: '请输入验证码', trigger: 'blur' }, + { pattern: /^\d{6}$/, message: '请输入6位数字验证码', trigger: ['blur'] } + ] +} + +export const billRecordRules = { + bookName: [ + { required: true, message: '请选择账本类型', trigger: 'change' } + ], + type: [ + { required: true, message: '请选择账单类别', trigger: 'change' } + ], + category: [ + { required: true, message: '请选择账单分类', trigger: 'change' } + ], + date: [ + { required: true, message: '请选择账单时间', trigger: 'change' } + ], + payAccount: [ + { required: true, message: '请选择账单账户', trigger: 'change' } + ], + amount: [ + { required: true, message: '请输入账单金额', trigger: 'change' }, + { pattern: new RegExp(amountPattern), message: '请输入正确的金额(最多两位小数)' } + ], + location: [ + + ], + content: [ + { required: true, message: '请输入账单内容', trigger: 'change' } + ] +} + +export const billPayRules = { + name: [ + { required: true, message: '请输入账户名称', trigger: 'blur' }, + { pattern: new RegExp(chinesePattern), message: '请输入中英文或数字' } + ], + icon: [ + { required: true, message: '请输入账户图标', trigger: 'blur' } + ], + color: [ + { required: true, message: '请输入图标颜色', trigger: 'change' } + ] +} + +export const billBookRules = { + name: [ + { required: true, message: '请输入账本名称', trigger: 'blur' }, + { pattern: new RegExp(chinesePattern), message: '请输入中英文或数字' } + ], + icon: [ + { required: true, message: '请输入账本图标', trigger: 'blur' } + ], + color: [ + { required: true, message: '请输入图标颜色', trigger: 'change' } + ] +} + +export const billCategoryRules = { + bookName: [ + { required: true, message: '请选择账本类型', trigger: 'change' } + ], + name: [ + { required: true, message: '请输入类别名称', trigger: 'blur' }, + { pattern: new RegExp(chinesePattern), message: '请输入中英文或数字' } + ], + type: [ + { required: true, message: '请选择类型名称', trigger: 'change' } + ], + icon: [ + { required: true, message: '请输入类别图标', trigger: 'blur' } + ], + color: [ + { required: true, message: '请输入图标颜色', trigger: 'change' } + ] +} + +export const budgetRules = { + category: [ + { required: true, message: '请输入或选择预算类别', trigger: 'blur' }, + { pattern: new RegExp(chinesePattern), message: '请输入中英文或数字' } + ], + project: [ + { required: true, message: '请输入预算项目', trigger: 'blur' }, + { pattern: new RegExp(chinesePattern), message: '请输入中英文或数字' } + ], + content: [ + { required: true, message: '请输入预算内容', trigger: 'blur' }, + { pattern: new RegExp(chinesePattern), message: '请输入中英文或数字' } + ], + vendor: [ + { pattern: new RegExp(chinesePattern), message: '请输入中英文或数字' } + ], + budget: [ + { pattern: new RegExp(amountPattern), message: '请输入正确的金额(最多两位小数)' } + ], + actual: [ + { pattern: new RegExp(amountPattern), message: '请输入正确的金额(最多两位小数)' } + ], + remake: [ + { pattern: new RegExp(chinesePattern), message: '请输入中英文或数字' } + ] +} + +export const foodRules = { + name: [ + { required: true, message: '请输入名称', trigger: 'blur' }, + { pattern: new RegExp(chinesePattern), message: '请输入中英文或数字' } + ], + category: [ + { required: true, message: '请选择菜系', trigger: 'change' } + ] +} + +export const foodMaterialRules = { + type: [ + { required: true, message: '请选择类型', trigger: 'change' } + ], + name: [ + { required: true, message: '请输入名称', trigger: 'blur' } + ], + amount: [ + { required: true, message: '请输入分量', trigger: 'blur' } + ] +} + +export const foodStepRules = { + content: [ + { required: true, message: '请输入内容', trigger: 'blur' } + ] +} + +export const foodRecordRules = { + name: [ + { required: true, message: '请选择菜谱名称', trigger: 'change' } + ], + date: [ + { required: true, message: '请选择完成时间', trigger: 'change' } + ], + person: [ + { required: true, message: '请选择完成人', trigger: 'change' } + ] +} + +export const travelRules = { + area: [ + { required: true, message: '请选择景点地区', trigger: 'change' } + ], + name: [ + { required: true, message: '请输入景点名称', trigger: 'change' }, + { pattern: new RegExp(chinesePattern), message: '请输入中英文或数字' } + ], + address: [ + { pattern: new RegExp(chinesePattern), message: '请输入中英文或数字' } + ], + price: [ + { pattern: new RegExp(amountPattern), message: '请输入正确的金额(最多两位小数)' } + ] +} + +export const travelRecordRules = { + name: [ + { required: true, message: '请选择景点名称', trigger: 'change' } + ], + date: [ + { required: true, message: '请选择旅行日期', trigger: 'change' } + ], + persons: [ + { required: true, message: '请输入旅行人', trigger: 'blur' } + ] +} + +export const planRules = { + title: [ + { required: true, message: '请输入标题', trigger: 'blur' } + ], + email: [ + { pattern: emailPattern, message: '请输入正确的邮箱格式', trigger: ['blur'] } + ] +} + +export const anniversaryRules = { + title: [ + { required: true, message: '请输入标题', trigger: 'blur' } + ], + date: [ + { required: true, message: '请选择日期', trigger: 'change' } + ], + recurring: [ + { required: true, message: '请选择是否重复', trigger: 'change' } + ], + type: [ + { required: true, message: '请选择类型', trigger: 'change' } + ] +} + +export const productRules = { + name: [ + { required: true, message: '请输入物品名称', trigger: 'blur' } + ], + price: [ + { required: true, message: '请输入物品价格', trigger: 'change' } + ], + purchaseDate: [ + { required: true, message: '请选择购买日期', trigger: 'change' } + ], + purchaser: [ + { required: true, message: '请选择购买人', trigger: 'change' } + ] +} + +export const journalRules = { + content: [ + { required: true, message: '请输入内容', trigger: 'blur' } + ], + date: [ + { required: true, message: '请选择日期', trigger: 'change' } + ] +} + +export const kpiRules = { + patientName: [ + { required: true, message: '请输入患者名称', trigger: 'blur' } + ], + date: [ + { required: true, message: '请选择日期', trigger: 'change' } + ], + project: [ + { required: true, message: '请输入项目', trigger: 'change' } + ], + price: [ + { required: true, message: '请选择价格', trigger: 'change' } + ] +} + +export const assetRules = { + category: [ + { required: true, message: '请选择类型', trigger: 'change' } + ], + name: [ + { required: true, message: '请输入/选择名称', trigger: 'change' }, + { pattern: new RegExp(chinesePattern), message: '请输入中英文或数字' } + ], + owner: [ + { required: true, message: '请选择所属人', trigger: 'change' } + ], + amount: [ + { required: true, message: '请输入金额', trigger: 'change' }, + { pattern: new RegExp(amountPattern), message: '请输入正确的金额(最多两位小数)' } + ] +} + +export const ledgerRules = { + book: [ + { required: true, message: '请输入账本名称', trigger: 'blur' } + ], + category: [ + { required: true, message: '请输入类别', trigger: 'blur' } + ], + content: [ + { required: true, message: '请输入内容', trigger: 'blur' } + ], + price: [ + { required: true, message: '请输入金额', trigger: 'change' }, + { pattern: new RegExp(amountPattern), message: '请输入正确的金额(最多两位小数)' } + ], + number: [ + { required: true, message: '请输入数量', trigger: 'blur' } + ], + unit: [ + { required: true, message: '请输入单位', trigger: 'blur' } + ], + payer: [ + { required: true, message: '请输入付款人', trigger: 'blur' } + ] +} + +export const passwordRules = { + title: [ + { required: true, message: '请输入标题', trigger: 'blur' } + ], + username: [ + { required: true, message: '请输入账号', trigger: 'blur' } + ], + password: [ + { required: true, message: '请输入密码', trigger: 'blur' } + ], + owner: [ + { required: true, message: '请选择所属人', trigger: 'change' } + ] +} + +export const accountRules = { + accountName: [ + { required: true, message: '请输入账号名称', trigger: 'blur' } + ], + username: [ + { required: true, message: '请输入用户姓名', trigger: 'blur' } + ], + password: [ + { required: true, message: '请输入账号密码', trigger: 'blur' }, + { min: 6, max: 20, message: '请输入6~20位的密码', trigger: 'change' } + ], + confirmPassword: [ + { required: true, message: '请输入确认密码', trigger: 'blur' }, + { min: 6, max: 20, message: '请输入6~20位的密码', trigger: 'change' } + ] +} + +export const profileInfoRules = { + username: [ + { required: true, message: '请输入用户姓名', trigger: 'blur' } + ], + phoneNumber: [ + { pattern: phonePattern, message: '请输入正确的手机号格式', trigger: ['blur'] } + ], + email: [ + { pattern: emailPattern, message: '请输入正确的邮箱格式', trigger: ['blur'] } + ] +} + +export const profilePasswordRules = { + oldPassword: [ + { required: true, message: '请输入旧密码', trigger: 'blur' }, + { min: 6, max: 20, message: '请输入6~20位的密码', trigger: 'change' } + ], + newPassword: [ + { required: true, message: '请输入新密码', trigger: 'blur' }, + { min: 6, max: 20, message: '请输入6~20位的密码', trigger: 'change' } + ], + confirmPassword: [ + { required: true, message: '请输入确认密码', trigger: 'blur' }, + { min: 6, max: 20, message: '请输入6~20位的密码', trigger: 'change' } + ] +} diff --git a/src/utils/home/anniversaryUtil.ts b/src/utils/home/anniversaryUtil.ts new file mode 100644 index 0000000..50f8635 --- /dev/null +++ b/src/utils/home/anniversaryUtil.ts @@ -0,0 +1,38 @@ +import axios from 'axios' +import { IAnniversary, IAnniversaryCategory } from '@/types/anniversary' +import dayjs from 'dayjs' +import { formatDate, getDateDifference, isBeforeDate } from 'vue3-common/utils/dateUtil' + +export const anniversaryCategoryMap: Map = new Map([ + ['生活', { name: '生活', title: '🏡 生活', subTitle: '点滴生活,值得铭记', color: '#E6C200' }], + ['工作', { name: '工作', title: '💼 工作', subTitle: '见证成长,每步精彩', color: '#007BFF' }], + ['家庭', { name: '家庭', title: '👨‍👩‍👧‍👦 家庭', subTitle: '家人陪伴,温暖常在', color: '#FF5733' }], + ['成就', { name: '成就', title: '🏆 成就', subTitle: '记录辉煌,见证成长', color: '#28A745' }], + ['爱情', { name: '爱情', title: '💖 爱情', subTitle: '铭记心动,珍藏爱意', color: '#FF69B4' }], + ['生日', { name: '生日', title: '🎂 生日', subTitle: '记录成长,珍藏祝福', color: '#FF9900' }], + ['旅行', { name: '旅行', title: '✈️ 旅行', subTitle: '探索世界,留下足迹', color: '#32CD32' }], + ['宠物', { name: '宠物', title: '🐾 宠物', subTitle: '陪伴成长,忠实伙伴', color: '#D2691E' }] +]) + +export const getHolidays = async () => { + const year = new Date().getFullYear() + const countryCode = 'CN' + const apiUrl = `https://date.nager.at/api/v3/PublicHolidays/${year}/${countryCode}` + const response = await axios.get(apiUrl) + return response.data +} + +export const getAnniversaryRemainDays = (dateItem: IAnniversary): number => { + if (dateItem.type === 'countUp') { + return getDateDifference(dateItem.date, formatDate(new Date()), 'days') + } else if (dateItem.recurring) { + const currentYear = new Date().getFullYear() + let thisYear = dayjs(`${currentYear}-${dateItem.date.slice(5)}`) + if (isBeforeDate(thisYear, formatDate(new Date()))) { + thisYear = thisYear.add(1, 'year') + } + return Math.abs(getDateDifference(thisYear, formatDate(new Date()), 'days')) + } else { + return Math.abs(getDateDifference(dateItem.date, formatDate(new Date()), 'days')) + } +} diff --git a/src/utils/home/billUtil.ts b/src/utils/home/billUtil.ts new file mode 100644 index 0000000..9520d8e --- /dev/null +++ b/src/utils/home/billUtil.ts @@ -0,0 +1,115 @@ +import { + IBillCalendarDaily, + IBillCategory, + IBillRecord, + IBillSummaryStats, IBillType +} from '@/types/bill' +import { formatDate } from 'vue3-common/utils/dateUtil' + +/** + * 获取日程日期 + * @param billRecordList 账单记录 + * @param type 账单类型 + */ +export const getCalendarDateList = (billRecordList: IBillRecord[], type: 'expensive' | 'income'): string[] => { + const resultSet = new Set() + billRecordList.forEach((item) => { + if (item.type === type) { + resultSet.add(formatDate(item.date)) + } + }) + + return [...resultSet] as string[] +} + +/** + * 获取日程日期 + * @param billRecordList 账单记录 + * @param date 日期 + */ +export const getCalendarDailyCount = (billRecordList: IBillRecord[], + date: string): IBillCalendarDaily => { + const calendarDaily: IBillCalendarDaily = { + dailyRecordList: [], + totalExpensive: 0, + totalIncome: 0 + } + + billRecordList.forEach((value) => { + // 判断是否是当前日期 + if (formatDate(value.date) === date) { + calendarDaily.dailyRecordList.push(value) + // 统计当前日期的收入和支出总和 + if (value.type === 'expensive') { + calendarDaily.totalExpensive += value.amount + } else { + calendarDaily.totalIncome += value.amount + } + } + }) + + return calendarDaily +} + +/** + * 计算账单概要统计 + * @param billRecordList 账单记录 + */ +export const getBillSummaryStats = (billRecordList: IBillRecord[]): IBillSummaryStats => { + const billSummaryStats: IBillSummaryStats = { + balance: 0, + expensive: 0, + income: 0, + rate: 0 + } + + billRecordList.forEach((value) => { + // 统计当前日期的支出和收入总和 + if (value.type === 'expensive') { + billSummaryStats.expensive += value.amount + } else { + billSummaryStats.income += value.amount + } + }) + + billSummaryStats.balance = billSummaryStats.income - billSummaryStats.expensive + + // 计算支出/收入 + if (billSummaryStats.expensive === 0) { + billSummaryStats.rate = 0 + } else if (billSummaryStats.income === 0) { + billSummaryStats.rate = 1 + } else { + billSummaryStats.rate = Math.min(billSummaryStats.expensive / billSummaryStats.income, 1) + } + + return billSummaryStats +} + +export const getCategoryByName = (categoryList: IBillCategory[], name: string): IBillCategory => { + return categoryList.find((item) => item.name === name) || { + bookName: '', + name: '', + type: '', + icon: '' + } +} + +export const getBillSortByAmount = (billRecordList: IBillRecord[], + billType: IBillType): IBillRecord[] => { + return billRecordList.filter((item) => item.type === billType) + .sort((a, b) => b.amount - a.amount) +} + +/** + * 根据值显示不同的颜色 + */ +export const getRateColor = (rate: number) => { + if (rate <= 0.3) { + return '#008B8B' + } else if (rate > 0.3 && rate <= 0.6) { + return '#FFA500' + } else { + return '#CD4F39' + } +} diff --git a/src/utils/home/planUtil.ts b/src/utils/home/planUtil.ts new file mode 100644 index 0000000..6cf033e --- /dev/null +++ b/src/utils/home/planUtil.ts @@ -0,0 +1,197 @@ +import dayjs from 'dayjs' +import { Calendar } from '@fullcalendar/core' +import dayGridPlugin from '@fullcalendar/daygrid' +import interactionPlugin from '@fullcalendar/interaction' +import timeGridPlugin from '@fullcalendar/timegrid' + +/** + * 日程配置参数 + */ +export const calendarConfig = { + height: 'auto', + slotMinTime: '08:00', + slotMaxTime: '18:00', + allDaySlot: false, + firstDay: (new Date()).getDay(), + initialDate: new Date(), + buttonText: { + today: '今天', + month: '月视图', + week: '周视图', + day: '日视图', + list: '列表视图' + }, + locale: 'zh-cn', + slotLabelFormat: { + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + meridiem: false, + hour12: false + }, + /** + * 月视图 每天最多显示几个事件 + */ + dayMaxEventRows: 3, + /** + * 自定义标题模板 + * @param arg + */ + // eventContent(arg) { + // return { html: `
${arg.event.title}
` } + // }, + editable: true, + selectable: true, + /** + * 禁止拖动 + */ + eventStartEditable: false, + /** + * 禁止拖动资源 + */ + eventResourceEditable: false +} + +/** + * 初始化普通视图日程 + * @param element 挂载元素 + * @param select 日期选择事件 + * @param eventClick 事件点击 + * @param updateDateEvent 更新日期事件 + */ +export const initCommonCalendar = (element: HTMLElement, + select: Function, + eventClick: Function, + updateDateEvent: Function) => { + const { height, slotMinTime, slotMaxTime, allDaySlot, firstDay, initialDate, buttonText, + locale, dayMaxEventRows, editable, selectable, eventStartEditable } = calendarConfig + + const plugins = [dayGridPlugin, interactionPlugin, timeGridPlugin] + const initialView = 'dayGridMonth' + const headerToolbar = { + left: 'timeGridDay,timeGridWeek,dayGridMonth', + center: 'title', + right: 'prev,today,next' + } + + return new Calendar(element, { + height, + plugins, + initialView, + slotMinTime, + slotMaxTime, + allDaySlot, + firstDay, + initialDate, + headerToolbar, + buttonText, + locale, + slotLabelFormat: { + hour: '2-digit', + minute: '2-digit', + meridiem: false, + hour12: false + }, + dayMaxEventRows, + editable, + selectable, + eventStartEditable, + select, + eventClick, + datesSet: updateDateEvent + }) +} + +export const initMobileCalendar = (element: HTMLElement, + select: Function, + eventClick: Function, + updateDateEvent: Function) => { + const { height, slotMinTime, slotMaxTime, allDaySlot, firstDay, initialDate, buttonText, + locale, dayMaxEventRows, editable, selectable, eventStartEditable } = calendarConfig + + const plugins = [dayGridPlugin, interactionPlugin, timeGridPlugin] + const initialView = 'weekView' + const headerToolbar = { + left: 'dayView,weekView', + center: 'title', + right: 'prev,today,next' + } + + return new Calendar(element, { + height, + plugins, + initialView, + views: { + dayView: { + type: 'timeGrid', + buttonText: '日' + }, + weekView: { + type: 'timeGrid', + duration: { days: 4 }, + buttonText: '周' + } + }, + slotMinTime, + slotMaxTime, + allDaySlot, + firstDay, + initialDate, + headerToolbar, + buttonText, + locale, + slotLabelFormat: { + hour: '2-digit', + minute: '2-digit', + meridiem: false, + hour12: false + }, + dayMaxEventRows, + editable, + selectable, + eventStartEditable, + select, + eventClick, + datesSet: updateDateEvent + }) +} + +export const getRemainDays = (targetDate: string): string => { + const today = dayjs() + const target = dayjs(targetDate) + + const totalDays = target.diff(today, 'days') + + const isExpired = totalDays < 0 + const isToday = totalDays === 0 + const absTotalDays = Math.abs(totalDays) + + // 计算年、月、周、天 + const years = Math.floor(absTotalDays / 365) + const months = Math.floor((absTotalDays % 365) / 30) + const weeks = Math.floor((absTotalDays % 30) / 7) + const days = absTotalDays % 7 + + // 根据不同情况返回不同的结果 + let result = '' + if (isToday) { + result = '今天到期' + } else { + const type = isExpired ? '过期' : '剩余' + result = `${type}: ` + if (years > 0) result += `${years}年 ` + if (months > 0) result += `${months}个月 ` + if (weeks > 0) result += `${weeks}周 ` + if (days > 0) result += `${days}天` + } + + return result.trim() +} + +export const isBeforeToday = (targetDate: string) => { + return dayjs(targetDate).isBefore(dayjs(), 'day') +} + +export const isBeforeTime = (startTime: string, endTime: string) => { + return dayjs(startTime, 'HH:mm').isBefore(dayjs(endTime, 'HH:mm')) +} diff --git a/src/utils/home/travelUtil.ts b/src/utils/home/travelUtil.ts new file mode 100644 index 0000000..ceb27e8 --- /dev/null +++ b/src/utils/home/travelUtil.ts @@ -0,0 +1,7 @@ +export const parsePerson = (persons: string[]): string => { + if (persons.length === 1) { + return persons[0] + } else { + return `${persons[0]}等` + } +} diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..96fb8be --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,41 @@ +/** + * 设置激活样式 + * @param parentClassName 父组件类名 + * @param elementTag 元素类型 + * @param currentElement 当前元素 + * @param activeClassName 激活的样式名称 + */ +export const setActiveClass = (parentClassName: string, elementTag: string, + currentElement: Element, activeClassName: string) => { + const container = document.getElementsByClassName(parentClassName)[0] + const elementList = container.getElementsByTagName(elementTag) + // 去除class样式 + for (let i = 0; i < elementList.length; i++) { + elementList[i].removeAttribute('class') + } + + // 增加当前激活的菜单样式 + currentElement.setAttribute('class', activeClassName) +} + +/** + * 文件服务器地址 + */ +export const fileServiceUrl = '/home-service/file' + +/** + * 服务器文件路径根地址 + */ +export const serviceFileRootPath = '/home-service/' + +/** + * 获取assets静态资源 + * @param url 路径 + */ +export const getAssetsImageFile = (url: string) => { + return new URL(`/src/assets/${url}`, import.meta.url).href +} + +export const isLargeScreen = (innerWidth = 1200): boolean => { + return window.innerWidth > innerWidth +} diff --git a/src/views/article/article.vue b/src/views/article/article.vue new file mode 100644 index 0000000..2ac2da6 --- /dev/null +++ b/src/views/article/article.vue @@ -0,0 +1,109 @@ + + + diff --git a/src/views/article/category.vue b/src/views/article/category.vue new file mode 100644 index 0000000..4e1fa31 --- /dev/null +++ b/src/views/article/category.vue @@ -0,0 +1,82 @@ + + + diff --git a/src/views/article/detail[id].vue b/src/views/article/detail[id].vue new file mode 100644 index 0000000..c268230 --- /dev/null +++ b/src/views/article/detail[id].vue @@ -0,0 +1,149 @@ + + + + + diff --git a/src/views/article/preview[id].vue b/src/views/article/preview[id].vue new file mode 100644 index 0000000..6bba992 --- /dev/null +++ b/src/views/article/preview[id].vue @@ -0,0 +1,34 @@ + + + diff --git a/src/views/dashboard/index.vue b/src/views/dashboard/index.vue new file mode 100644 index 0000000..7493b66 --- /dev/null +++ b/src/views/dashboard/index.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/src/views/meta.ts b/src/views/meta.ts new file mode 100644 index 0000000..4162f2a --- /dev/null +++ b/src/views/meta.ts @@ -0,0 +1,44 @@ +import { IRouteMetaConfig } from 'vue3-common/types' + +export const adminMeta: IRouteMetaConfig = { + '/dashboard': { + title: '总览', + icon: '', + order: 1, + redirect: '/dashboard/index' + }, + '/dashboard/index': { + title: '', + icon: '' + }, + '/article': { + title: '文章管理', + icon: '', + redirect: '/article/article' + }, + '/article/article': { + title: '', + icon: '' + }, + '/article/category': { + title: '', + icon: '' + }, + '/article/detail/:id': { + title: '', + icon: '' + }, + '/article/preview/:id': { + title: '', + icon: '' + }, + '/monitor': { + title: '监控管理', + icon: '', + redirect: '/monitor/visit' + }, + '/monitor/visit': { + title: '', + icon: '' + } +} diff --git a/src/views/monitor/visit.vue b/src/views/monitor/visit.vue new file mode 100644 index 0000000..49f7e4d --- /dev/null +++ b/src/views/monitor/visit.vue @@ -0,0 +1,69 @@ + + + diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..646682c --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true, + + // 设置 @ 路径 + "baseUrl": ".", + "paths": { + "@/*": [ + "src/*" + ], + "vue3-common/*": ["node_modules/vue3-common/dist/*"] + } + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..9728af2 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..ebb6c01 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,46 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +import path from 'path' +import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' + +// const API_HOST = '14.103.235.151' +const API_HOST = '127.0.0.1' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + createSvgIconsPlugin({ + // 指定需要缓存的图标文件夹 + iconDirs: [path.resolve(process.cwd(), 'src/icons/svg')], + // 指定symbolId格式 + symbolId: 'icon-[dir]-[name]' + }) + ], + css: { + preprocessorOptions: { + scss: { + additionalData: '@use "./src/styles/element/index.module.scss" as *;' + } + } + }, + base: '/blog-admin/', + resolve: { + // 配置路径别名 + alias: { + '@': path.resolve(__dirname, './src') + } + }, + server: { + port: 5174, + // 服务器代理 服务器没有部署Nginx的情况下使用 + proxy: { + '/blog-api': { + target: `http://${API_HOST}:8082`, + changeOrigin: true, + rewrite: (item) => item.replace(/^\/blog-api/, '') + } + } + } +})