diff --git a/forge.config.ts b/forge.config.ts index ef7e82a..6c8448b 100644 --- a/forge.config.ts +++ b/forge.config.ts @@ -27,12 +27,12 @@ const config: ForgeConfig = { build: [ { // `entry` is just an alias for `build.lib.entry` in the corresponding file of `config`. - entry: 'src/electron/main/main.ts', + entry: 'src/main/main.ts', config: 'vite.main.config.ts', target: 'main', }, { - entry: 'src/electron/preload/preload.ts', + entry: 'src/preload.ts', config: 'vite.preload.config.ts', target: 'preload', }, diff --git a/global.d.ts b/global.d.ts new file mode 100644 index 0000000..c03a1d0 --- /dev/null +++ b/global.d.ts @@ -0,0 +1,7 @@ +declare module "@store/*"; +declare module "@utils/*"; +declare module "@assets/images/*"; +declare module "@constant/*"; +declare module "@remixicon/vue"; +declare module "vue-router"; + diff --git a/package-lock.json b/package-lock.json index 551a349..c74d5e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,15 +10,20 @@ "license": "MIT", "dependencies": { "@remixicon/vue": "^4.7.0", + "@vueuse/core": "^14.1.0", "axios": "^1.12.2", "bytenode": "^1.5.7", "crypto": "^1.0.1", + "dotenv-cli": "^11.0.0", + "electron-log": "^5.4.3", "electron-squirrel-startup": "^1.0.1", "element-plus": "^2.12.0", "lodash-es": "^4.17.21", "log4js": "^6.9.1", "pinia": "^2.3.1", "vue": "^3.5.22", + "vue-i18n": "^11.1.9", + "vue-markdown-render": "^2.3.0", "vue-router": "^4.5.1" }, "devDependencies": { @@ -31,11 +36,10 @@ "@electron-forge/plugin-fuses": "^7.10.2", "@electron-forge/plugin-vite": "^7.10.2", "@electron/fuses": "^1.8.0", - "@tailwindcss/postcss": "^4.1.14", - "@tailwindcss/vite": "^4.0.0", + "@tailwindcss/typography": "^0.5.19", + "@tailwindcss/vite": "^4.1.17", "@types/electron-squirrel-startup": "^1.0.2", "@types/lodash-es": "^4.17.12", - "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "@vitejs/plugin-vue": "^5.2.4", "autoprefixer": "^10.4.21", @@ -43,25 +47,11 @@ "eslint": "^8.57.1", "eslint-plugin-import": "^2.32.0", "eslint-plugin-vue": "^10.6.0", - "postcss": "^8.5.6", "sass-embedded": "^1.89.1", - "tailwindcss": "^3.4.18", - "typescript": "~4.5.4", - "vite": "^7.1.9", - "vue-eslint-parser": "^10.2.0" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "tailwindcss": "^4.1.11", + "typescript": "^5.8.3", + "unplugin-auto-import": "^20.3.0", + "vite": "^7.1.9" } }, "node_modules/@babel/helper-string-parser": { @@ -1758,6 +1748,50 @@ "node": ">=18" } }, + "node_modules/@intlify/core-base": { + "version": "11.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-11.2.2.tgz", + "integrity": "sha512-0mCTBOLKIqFUP3BzwuFW23hYEl9g/wby6uY//AC5hTgQfTsM2srCYF2/hYGp+a5DZ/HIFIgKkLJMzXTt30r0JQ==", + "license": "MIT", + "dependencies": { + "@intlify/message-compiler": "11.2.2", + "@intlify/shared": "11.2.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "11.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-11.2.2.tgz", + "integrity": "sha512-XS2p8Ff5JxWsKhgfld4/MRQzZRQ85drMMPhb7Co6Be4ZOgqJX1DzcZt0IFgGTycgqL8rkYNwgnD443Q+TapOoA==", + "license": "MIT", + "dependencies": { + "@intlify/shared": "11.2.2", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "11.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-11.2.2.tgz", + "integrity": "sha512-OtCmyFpSXxNu/oET/aN6HtPCbZ01btXVd0f3w00YsHOb13Kverk1jzA2k47pAekM55qbUw421fvPF1yxZ+gicw==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -2314,13 +2348,6 @@ "tailwindcss": "4.1.17" } }, - "node_modules/@tailwindcss/node/node_modules/tailwindcss": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", - "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@tailwindcss/oxide": { "version": "4.1.17", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.17.tgz", @@ -2562,30 +2589,36 @@ "node": ">= 10" } }, - "node_modules/@tailwindcss/postcss": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.17.tgz", - "integrity": "sha512-+nKl9N9mN5uJ+M7dBOOCzINw94MPstNR/GtIhz1fpZysxL/4a+No64jCBD6CPN+bIHWFx3KWuu8XJRrj/572Dw==", + "node_modules/@tailwindcss/typography": { + "version": "0.5.19", + "resolved": "https://registry.npmmirror.com/@tailwindcss/typography/-/typography-0.5.19.tgz", + "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==", "dev": true, "license": "MIT", "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.1.17", - "@tailwindcss/oxide": "4.1.17", - "postcss": "^8.4.41", - "tailwindcss": "4.1.17" + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, - "node_modules/@tailwindcss/postcss/node_modules/tailwindcss": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", - "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", + "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } }, "node_modules/@tailwindcss/vite": { "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.17.tgz", + "resolved": "https://registry.npmmirror.com/@tailwindcss/vite/-/vite-4.1.17.tgz", "integrity": "sha512-4+9w8ZHOiGnpcGI6z1TVVfWaX/koK7fKeSYF3qlYg2xpBtbteP2ddBxiarL+HVgfSJGeK5RIxRQmKm4rTJJAwA==", "dev": true, "license": "MIT", @@ -2598,13 +2631,6 @@ "vite": "^5.2.0 || ^6 || ^7" } }, - "node_modules/@tailwindcss/vite/node_modules/tailwindcss": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", - "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -2751,11 +2777,10 @@ "@types/node": "*" } }, - "node_modules/@types/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", - "dev": true, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", "license": "MIT" }, "node_modules/@types/wrap-ansi": { @@ -2776,41 +2801,6 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@typescript-eslint/parser": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", @@ -2857,34 +2847,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@typescript-eslint/types": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", @@ -2927,33 +2889,6 @@ } } }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", @@ -3106,6 +3041,44 @@ "integrity": "sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==", "license": "MIT" }, + "node_modules/@vueuse/core": { + "version": "14.1.0", + "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-14.1.0.tgz", + "integrity": "sha512-rgBinKs07hAYyPF834mDTigH7BtPqvZ3Pryuzt1SD/lg5wEcWqvwzXXYGEDb2/cP0Sj5zSvHl3WkmMELr5kfWw==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "14.1.0", + "@vueuse/shared": "14.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/metadata": { + "version": "14.1.0", + "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-14.1.0.tgz", + "integrity": "sha512-7hK4g015rWn2PhKcZ99NyT+ZD9sbwm7SGvp7k+k+rKGWnLjS/oQozoIZzWfCewSUeBmnJkIb+CNr7Zc/EyRnnA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "14.1.0", + "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-14.1.0.tgz", + "integrity": "sha512-EcKxtYvn6gx1F8z9J5/rsg3+lTQnvOruQd8fUecW99DCK04BkWD7z5KQ/wTAx+DazyoEE9dJt/zV8OIEQbM6kw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", @@ -3488,39 +3461,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "license": "MIT" - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { @@ -3800,19 +3744,6 @@ "baseline-browser-mapping": "dist/cli.js" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -4126,16 +4057,6 @@ "node": ">=6" } }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001757", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz", @@ -4181,44 +4102,6 @@ "dev": true, "license": "MIT" }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -4466,6 +4349,13 @@ "dev": true, "license": "MIT" }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "dev": true, + "license": "MIT" + }, "node_modules/cross-dirname": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", @@ -4477,7 +4367,6 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -4746,13 +4635,6 @@ "license": "MIT", "optional": true }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/dir-compare": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", @@ -4777,13 +4659,6 @@ "node": ">=8" } }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true, - "license": "MIT" - }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -4797,6 +4672,60 @@ "node": ">=6.0.0" } }, + "node_modules/dotenv": { + "version": "17.2.3", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-17.2.3.tgz", + "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-cli": { + "version": "11.0.0", + "resolved": "https://registry.npmmirror.com/dotenv-cli/-/dotenv-cli-11.0.0.tgz", + "integrity": "sha512-r5pA8idbk7GFWuHEU7trSTflWcdBpQEK+Aw17UrSHjS6CReuhrrPcyC3zcQBPQvhArRHnBo/h6eLH1fkCvNlww==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.6", + "dotenv": "^17.1.0", + "dotenv-expand": "^12.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "dotenv": "cli.js" + } + }, + "node_modules/dotenv-expand": { + "version": "12.0.3", + "resolved": "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-12.0.3.tgz", + "integrity": "sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==", + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand/node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -5239,6 +5168,15 @@ "node": ">=10" } }, + "node_modules/electron-log": { + "version": "5.4.3", + "resolved": "https://registry.npmmirror.com/electron-log/-/electron-log-5.4.3.tgz", + "integrity": "sha512-sOUsM3LjZdugatazSQ/XTyNcw8dfvH1SYhXWiJyfYodAAKOZdHs0txPiLDXFzOZbhXgAgshQkshH2ccq0feyLQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/electron-squirrel-startup": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/electron-squirrel-startup/-/electron-squirrel-startup-1.0.1.tgz", @@ -6270,6 +6208,13 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "dev": true, + "license": "MIT" + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -7410,19 +7355,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-boolean-object": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", @@ -7848,7 +7780,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, "license": "ISC" }, "node_modules/jest-worker": { @@ -7892,6 +7823,13 @@ "jiti": "lib/jiti-cli.mjs" } }, + "node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, "node_modules/js-yaml": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", @@ -8262,26 +8200,15 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" + "dependencies": { + "uc.micro": "^2.0.0" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, "node_modules/listr2": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz", @@ -8390,6 +8317,24 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -8656,6 +8601,23 @@ "node": ">=6" } }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmmirror.com/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, "node_modules/matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -8679,6 +8641,12 @@ "node": ">= 0.4" } }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "license": "MIT" + }, "node_modules/mem": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", @@ -8789,7 +8757,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8905,6 +8872,38 @@ "node": ">=10" } }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -8921,18 +8920,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -8958,13 +8945,6 @@ "dev": true, "license": "MIT" }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true, - "license": "MIT" - }, "node_modules/negotiator": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", @@ -9079,16 +9059,6 @@ "semver": "bin/semver" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", @@ -9154,26 +9124,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -9562,7 +9512,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -9585,6 +9534,13 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, "node_modules/pe-library": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-1.0.1.tgz", @@ -9658,14 +9614,16 @@ } } }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 6" + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" } }, "node_modules/plist": { @@ -9721,133 +9679,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", - "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-nested/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-selector-parser": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", @@ -9989,6 +9820,32 @@ "node": ">=6" } }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -10046,16 +9903,6 @@ "read-binary-file-arch": "cli.js" } }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, "node_modules/read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -10176,19 +10023,6 @@ "node": ">= 6" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/rechoir": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", @@ -10961,6 +10795,13 @@ "dev": true, "license": "MIT" }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "dev": true, + "license": "MIT" + }, "node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -11076,7 +10917,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -11089,7 +10929,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -11574,6 +11413,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/strip-outer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", @@ -11597,39 +11449,6 @@ "node": ">=0.8.0" } }, - "node_modules/sucrase": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "tinyglobby": "^0.2.11", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", @@ -11693,66 +11512,11 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.18", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", - "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", + "version": "4.1.17", + "resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-4.1.17.tgz", + "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.7", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/tailwindcss/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } + "license": "MIT" }, "node_modules/tapable": { "version": "2.3.0", @@ -11908,29 +11672,6 @@ "dev": true, "license": "MIT" }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/tiny-each-async": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz", @@ -12047,13 +11788,6 @@ "node": ">=0.8.0" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -12195,9 +11929,9 @@ } }, "node_modules/typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "version": "5.9.3", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -12205,9 +11939,22 @@ "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "dev": true, + "license": "MIT" + }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", @@ -12234,6 +11981,68 @@ "dev": true, "license": "MIT" }, + "node_modules/unimport": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/unimport/-/unimport-5.5.0.tgz", + "integrity": "sha512-/JpWMG9s1nBSlXJAQ8EREFTFy3oy6USFd8T6AoBaw1q2GGcF4R9yp3ofg32UODZlYEO5VD0EWE1RpI9XDWyPYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.19", + "mlly": "^1.8.0", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "pkg-types": "^2.3.0", + "scule": "^1.3.0", + "strip-literal": "^3.1.0", + "tinyglobby": "^0.2.15", + "unplugin": "^2.3.10", + "unplugin-utils": "^0.3.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unimport/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unimport/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/unimport/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/unique-filename": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", @@ -12270,6 +12079,111 @@ "node": ">= 10.0.0" } }, + "node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unplugin-auto-import": { + "version": "20.3.0", + "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-20.3.0.tgz", + "integrity": "sha512-RcSEQiVv7g0mLMMXibYVKk8mpteKxvyffGuDKqZZiFr7Oq3PB1HwgHdK5O7H4AzbhzHoVKG0NnMnsk/1HIVYzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "local-pkg": "^1.1.2", + "magic-string": "^0.30.21", + "picomatch": "^4.0.3", + "unimport": "^5.5.0", + "unplugin": "^2.3.11", + "unplugin-utils": "^0.3.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^4.0.0", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } + } + }, + "node_modules/unplugin-auto-import/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.3.1.tgz", + "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-utils/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unplugin/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", @@ -12485,86 +12399,36 @@ } } }, - "node_modules/vue-eslint-parser": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.2.0.tgz", - "integrity": "sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==", - "dev": true, + "node_modules/vue-i18n": { + "version": "11.2.2", + "resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-11.2.2.tgz", + "integrity": "sha512-ULIKZyRluUPRCZmihVgUvpq8hJTtOqnbGZuv4Lz+byEKZq4mU0g92og414l6f/4ju+L5mORsiUuEPYrAuX2NJg==", "license": "MIT", "dependencies": { - "debug": "^4.4.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "esquery": "^1.6.0", - "semver": "^7.6.3" + "@intlify/core-base": "11.2.2", + "@intlify/shared": "11.2.2", + "@vue/devtools-api": "^6.5.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 16" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/kazupon" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" + "vue": "^3.0.0" } }, - "node_modules/vue-eslint-parser/node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/vue-markdown-render": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/vue-markdown-render/-/vue-markdown-render-2.3.0.tgz", + "integrity": "sha512-ZWVVKba8t0tKBlaUGaWmNynIk38gE7Bt3psC/iN2NsqpdGY15VGfBeBvF0A8cEmwHnjNVJo2IzUUqkhhfldhtg==", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "markdown-it": "^14.1.0" }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/vue-eslint-parser/node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/vue-eslint-parser/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" + "peerDependencies": { + "vue": "^3.3.4" } }, "node_modules/vue-router": { @@ -12672,6 +12536,13 @@ "node": ">=10.13.0" } }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -12687,7 +12558,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" diff --git a/package.json b/package.json index 1abb5fe..36b9cd2 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "description": "My Electron application description", "main": ".vite/build/main.js", "scripts": { - "start": "electron-forge start", + "start": "dotenv -e .env -- electron-forge start", "package": "electron-forge package", "make": "electron-forge make", "publish": "electron-forge publish", @@ -30,11 +30,10 @@ "@electron-forge/plugin-fuses": "^7.10.2", "@electron-forge/plugin-vite": "^7.10.2", "@electron/fuses": "^1.8.0", - "@tailwindcss/postcss": "^4.1.14", - "@tailwindcss/vite": "^4.0.0", + "@tailwindcss/typography": "^0.5.19", + "@tailwindcss/vite": "^4.1.17", "@types/electron-squirrel-startup": "^1.0.2", "@types/lodash-es": "^4.17.12", - "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "@vitejs/plugin-vue": "^5.2.4", "autoprefixer": "^10.4.21", @@ -42,15 +41,17 @@ "eslint": "^8.57.1", "eslint-plugin-import": "^2.32.0", "eslint-plugin-vue": "^10.6.0", - "postcss": "^8.5.6", "sass-embedded": "^1.89.1", - "tailwindcss": "^3.4.18", - "typescript": "~4.5.4", - "vite": "^7.1.9", - "vue-eslint-parser": "^10.2.0" + "tailwindcss": "^4.1.11", + "typescript": "^5.8.3", + "unplugin-auto-import": "^20.3.0", + "vite": "^7.1.9" }, "dependencies": { "@remixicon/vue": "^4.7.0", + "@vueuse/core": "^14.1.0", + "dotenv-cli": "^11.0.0", + "electron-log": "^5.4.3", "axios": "^1.12.2", "bytenode": "^1.5.7", "crypto": "^1.0.1", @@ -60,6 +61,8 @@ "log4js": "^6.9.1", "pinia": "^2.3.1", "vue": "^3.5.22", + "vue-i18n": "^11.1.9", + "vue-markdown-render": "^2.3.0", "vue-router": "^4.5.1" } } diff --git a/shims-vue.d.ts b/shims-vue.d.ts deleted file mode 100644 index a622f87..0000000 --- a/shims-vue.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -declare module '*.vue' { - import type { DefineComponent } from 'vue' - // 泛型参数:Props类型、Emits类型、Slots类型(默认任意) - const component: DefineComponent<{}, {}, any> - export default component -} diff --git a/src/common/constants.ts b/src/common/constants.ts new file mode 100644 index 0000000..653125e --- /dev/null +++ b/src/common/constants.ts @@ -0,0 +1,108 @@ +// 渲染进程|主进程常量定义 + +export enum IPC_EVENTS { + EXTERNAL_OPEN = 'external-open', + WINDOW_MINIMIZE = 'window-minimize', + WINDOW_MAXIMIZE = 'window-maximize', + WINDOW_CLOSE = 'window-close', + APP_SET_FRAMELESS = 'app:set-frameless', + TAB_CREATE = 'tab:create', + TAB_LIST = 'tab:list', + TAB_NAVIGATE = 'tab:navigate', + TAB_RELOAD = 'tab:reload', + TAB_BACK = 'tab:back', + TAB_FORWARD = 'tab:forward', + TAB_SWITCH = 'tab:switch', + TAB_CLOSE = 'tab:close', + LOG_TO_MAIN = 'log-to-main', + READ_FILE = 'read-file', + INVOKE = 'ipc:invoke', + INVOKE_ASYNC = 'ipc:invokeAsync', + APP_MINIMIZE ='app:minimize', + APP_MAXIMIZE ='app:maximize', + APP_QUIT ='app:quit', + FILE_READ = 'file:read', + FILE_WRITE = 'file:write', + GET_WINDOW_ID='get-window-id', + CUSTOM_EVENT ='custom:event', + TIME_UPDATE = 'time:update' +} + +export const MAIN_WIN_SIZE = { + width: 1440, + height: 900, + minWidth: 1440, + minHeight: 900, +} as const + + +// 定义每个通道的参数和返回值类型 +interface IPCTypings { + // 同步通信 + [IPC_EVENTS.APP_MINIMIZE]: { + params: [window:number] + return: {success: boolean, error?: string} + } + [IPC_EVENTS.APP_MAXIMIZE]: { + params: [window:number] + return: {success: boolean, error?: string} + } + [IPC_EVENTS.GET_WINDOW_ID]: { + params: [] + return: number + } + + // 异步通信 + [IPC_EVENTS.FILE_READ]: { + params: [filePath: string] + return: Promise<{success: boolean, data?: string, error?: string}> + } + [IPC_EVENTS.FILE_WRITE]: { + params: [filePath: string, content: string] + return: Promise<{success: boolean, error?: string}> + } + + // 事件通信 + [IPC_EVENTS.TIME_UPDATE]: { + params: [time: string] + return: void + } + [IPC_EVENTS.CUSTOM_EVENT]: { + params: [message: string] + return: void + } +} + +// 定义IPC API 接口 +export interface WindowApi { + invoke(channel: T, ...args: IPCTypings[T]['params']): IPCTypings[T]['return'], + invokeAsync(channel: T, ...args: IPCTypings[T]['params']): IPCTypings[T]['return'], + on(channel: T, callback: (...args: IPCTypings[T]['params']) => void): () => void + send(channel: T, ...args: IPCTypings[T]['params']): void, + getCurrentWindowId(): number, + versions: NodeJS.ProcessVersions, + external: { + open: (url: string) => void + }, + window: { + minimize: () => void, + maximize: () => void, + close: () => void + }, + app: { + setFrameless: (route?: string) => void + }, + tabs: { + create: (url?: string) => void, + list: () => void, + navigate: (tabId: string, url: string) => void, + reload: (tabId: string) => void, + back: (tabId: string) => void, + forward: (tabId: string) => void, + switch: (tabId: string) => void, + close: (tabId: string) => void, + on: (event: 'tab-updated' | 'tab-created' | 'tab-closed' | 'tab-switched', handler: (payload: any) => void) => void + }, + readFile: (filePath: string) => Promise<{success: boolean, data?: string, error?: string}>, + logToMain: (logLevel: string, message: string) => void, +} diff --git a/src/electron/automation/baidu-automation.js b/src/electron/automation/baidu-automation.js deleted file mode 100644 index 90016a8..0000000 --- a/src/electron/automation/baidu-automation.js +++ /dev/null @@ -1,28 +0,0 @@ -const { chromium } = require("playwright"); - -(async () => { - const browser = await chromium.launch(); - const context = await browser.newContext(); - const page = await context.newPage(); - - try { - // 打开百度 - await page.goto("https://www.baidu.com"); - - // 输入搜索关键词并回车 - await page.fill("textarea#chat-textarea", "Playwright 自动化"); - await page.keyboard.press("Enter"); - - // 等待搜索结果加载 - await page.waitForSelector("#content_left"); - - console.log("百度搜索执行成功"); - } catch (e) { - console.error("自动化执行失败:", e); - process.exitCode = 1; - } finally { - // 保持几秒以方便观察,再关闭 - await page.waitForTimeout(2000); - await browser.close(); - } -})(); diff --git a/src/electron/automation/recording-automation.js b/src/electron/automation/recording-automation.js deleted file mode 100644 index 234ee72..0000000 --- a/src/electron/automation/recording-automation.js +++ /dev/null @@ -1,247 +0,0 @@ -const { chromium } = require('playwright'); -const fs = require('fs'); -const path = require('path'); - -// 录制配置 -const recordingConfig = { - outputFile: 'recorded-steps.json', - headless: false, // 显示浏览器窗口 - slowMo: 100, // 减慢操作速度,便于观察 - viewport: { width: 1280, height: 720 } -}; - -// 存储录制的步骤 -let recordedSteps = []; -let recordingStartTime = Date.now(); -let isRecording = true; - -// 生成时间戳 -function getTimestamp() { - return Date.now() - recordingStartTime; -} - -// 记录步骤 -function recordStep(step) { - const stepWithTimestamp = { - ...step, - timestamp: getTimestamp() - }; - recordedSteps.push(stepWithTimestamp); - console.log(`📹 录制步骤: ${step.type} - ${step.description}`); -} - -// 保存录制的步骤到文件 -function saveRecordedSteps() { - const outputPath = path.join(__dirname, recordingConfig.outputFile); - const data = { - steps: recordedSteps, - metadata: { - totalSteps: recordedSteps.length, - duration: getTimestamp(), - recordedAt: new Date().toISOString() - } - }; - - fs.writeFileSync(outputPath, JSON.stringify(data, null, 2)); - console.log(`\n✅ 录制完成!共录制 ${recordedSteps.length} 个步骤`); - console.log(`📁 录制文件已保存到: ${outputPath}`); -} - -// 监听页面事件 -async function setupPageListeners(page) { - // 监听点击事件 - await page.exposeFunction('__recordClick', (selector, coordinates) => { - if (!isRecording) return; - - recordStep({ - type: 'click', - description: `点击元素: ${selector || '未知元素'}`, - selector: selector || '', - coordinates: coordinates || {} - }); - }); - - // 监听输入事件 - await page.exposeFunction('__recordInput', (selector, text) => { - if (!isRecording) return; - - recordStep({ - type: 'type', - description: `输入文本: "${text || ''}"`, - selector: selector || '', - text: text || '' - }); - }); - - // 注入脚本监听用户操作 - await page.addInitScript(() => { - // 监听点击事件 - document.addEventListener('click', (event) => { - const target = event.target; - const selector = generateSelector(target); - const coordinates = { x: event.clientX, y: event.clientY }; - - if (window.__recordClick) { - window.__recordClick(selector, coordinates); - } - }, true); - - // 监听输入事件 - document.addEventListener('input', (event) => { - const target = event.target; - const selector = generateSelector(target); - const text = target.value || target.textContent || ''; - - if (window.__recordInput) { - window.__recordInput(selector, text); - } - }, true); - - // 生成元素选择器 - function generateSelector(element) { - if (!element) return ''; - - // 优先使用 ID - if (element.id) { - return `#${element.id}`; - } - - // 使用 class 和标签名 - const tagName = element.tagName.toLowerCase(); - if (element.className) { - const classes = element.className.split(' ').filter(c => c.trim()); - if (classes.length > 0) { - return `${tagName}.${classes.join('.')}`; - } - } - - // 使用属性 - const attributes = ['name', 'placeholder', 'type']; - for (const attr of attributes) { - if (element.getAttribute(attr)) { - return `${tagName}[${attr}="${element.getAttribute(attr)}"]`; - } - } - - // 使用路径 - return getElementPath(element); - } - - function getElementPath(element) { - const path = []; - while (element && element.nodeType === Node.ELEMENT_NODE) { - let selector = element.nodeName.toLowerCase(); - if (element.id) { - selector += `#${element.id}`; - path.unshift(selector); - break; - } else { - let sibling = element; - let nth = 1; - while (sibling = sibling.previousElementSibling) { - if (sibling.nodeName.toLowerCase() === selector) nth++; - } - if (nth !== 1) selector += `:nth-of-type(${nth})`; - } - path.unshift(selector); - element = element.parentNode; - } - return path.join(' > '); - } - }); -} - -// 主录制函数 -async function startRecording() { - console.log('🎬 开始自动化录制...'); - console.log('请在浏览器中进行操作,系统会自动记录您的操作步骤'); - console.log('按 Ctrl+C 停止录制并保存结果\n'); - - let browser; - let page; - - try { - // 启动浏览器 - browser = await chromium.launch({ - headless: recordingConfig.headless, - slowMo: recordingConfig.slowMo - }); - - // 创建新页面 - page = await browser.newPage({ - viewport: recordingConfig.viewport - }); - - // 设置页面监听器 - await setupPageListeners(page); - - // 监听页面导航 - page.on('framenavigated', async (frame) => { - if (frame === page.mainFrame() && isRecording) { - recordStep({ - type: 'navigate', - description: `导航到: ${frame.url()}`, - url: frame.url() - }); - - // 重新设置监听器 - await setupPageListeners(page); - } - }); - - // 导航到百度首页作为起始页面 - console.log('🌐 正在打开百度首页...'); - await page.goto('https://www.baidu.com'); - - recordStep({ - type: 'navigate', - description: '打开百度首页', - url: 'https://www.baidu.com' - }); - - console.log('✅ 录制已启动!请在浏览器中进行操作...'); - console.log('💡 您可以:'); - console.log(' - 点击页面元素'); - console.log(' - 在输入框中输入文本'); - console.log(' - 导航到其他页面'); - console.log(' - 按回车键或其他键盘操作'); - console.log(''); - console.log('⚠️ 按 Ctrl+C 停止录制并保存结果'); - - // 保持浏览器打开,直到用户手动停止 - await new Promise((resolve) => { - process.on('SIGINT', () => { - console.log('\n🛑 用户停止录制'); - isRecording = false; - resolve(); - }); - }); - - } catch (error) { - console.error('❌ 录制过程中发生错误:', error); - } finally { - if (browser) { - // 保存录制的步骤 - saveRecordedSteps(); - await browser.close(); - } - } -} - -// 处理程序终止 -process.on('SIGINT', () => { - console.log('\n🛑 用户停止录制'); - saveRecordedSteps(); - process.exit(0); -}); - -process.on('SIGTERM', () => { - console.log('\n🛑 程序终止'); - saveRecordedSteps(); - process.exit(0); -}); - -// 启动录制 -(async () => { - await startRecording(); -})(); \ No newline at end of file diff --git a/src/electron/preload/preload.ts b/src/electron/preload/preload.ts deleted file mode 100644 index 1c58a1c..0000000 --- a/src/electron/preload/preload.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { contextBridge, ipcRenderer } from 'electron' -import { IPCChannel, IPCAPI } from '@/shared/types/ipc.types' - -const api: IPCAPI = { - versions: process.versions, - - external: { - open: (url: string) => ipcRenderer.invoke('external-open', url) - }, - - window: { - minimize: () => ipcRenderer.send('window-min'), - maximize: () => ipcRenderer.send('window-max'), - close: () => ipcRenderer.send('window-close') - }, - - app: { - setFrameless: (route?: string) => ipcRenderer.invoke('app:set-frameless', route) - }, - - tabs: { - create: (url?: string) => ipcRenderer.invoke('tab:create', url), - list: () => ipcRenderer.invoke('tab:list'), - navigate: (tabId: string, url: string) => ipcRenderer.invoke('tab:navigate', { tabId, url }), - reload: (tabId: string) => ipcRenderer.invoke('tab:reload', tabId), - back: (tabId: string) => ipcRenderer.invoke('tab:back', tabId), - forward: (tabId: string) => ipcRenderer.invoke('tab:forward', tabId), - switch: (tabId: string) => ipcRenderer.invoke('tab:switch', tabId), - close: (tabId: string) => ipcRenderer.invoke('tab:close', tabId), - on: (event: 'tab-updated' | 'tab-created' | 'tab-closed' | 'tab-switched', handler: (payload: any) => void) => { - const listener = (_e: any, payload: any) => handler(payload) - ipcRenderer.on(event, listener) - return () => ipcRenderer.removeListener(event, listener) - } - }, - - // 通过 IPC 调用主进程 - readFile: (filePath: string) => ipcRenderer.invoke('read-file', filePath), - - // 同步调用 - invoke: (channel: IPCChannel, ...args: any[]) => ipcRenderer.sendSync('ipc:invoke', channel, ...args), - - // 异步调用 - invokeAsync: (channel: IPCChannel, ...args: any[]) => { - try { - ipcRenderer.invoke('ipc:invokeAsync', channel, ...args) - } catch (error) { - throw error - } - }, - - // 监听主进程消息 - on: (event: IPCChannel, callback: (...args: any[]) => void) => { - const subscription = (_event: any, ...args: any[]) => callback(...args) - ipcRenderer.on(event, subscription) - return () => ipcRenderer.removeListener(event, subscription) - }, - - // 发送消息到主进程 - send: (channel: IPCChannel, ...args: any[]) => ipcRenderer.send(channel, ...args), - - // 获取窗口ID - getCurrentWindowId: () => ipcRenderer.sendSync(IPCChannel.GET_WINDOW_ID), - - // 发送日志 - logToMain: (logLevel: string, message: string) => ipcRenderer.send('log-to-main', logLevel, message), - - // 打开新窗口 - openNewTab: (url: string) => ipcRenderer.invoke('open-new-tab', url) -} - -contextBridge.exposeInMainWorld('ipcAPI', api) \ No newline at end of file diff --git a/src/electron/main/main.ts b/src/main/main.ts similarity index 100% rename from src/electron/main/main.ts rename to src/main/main.ts diff --git a/src/electron/main/modules/ipc/index.ts b/src/main/modules/ipc/index.ts similarity index 100% rename from src/electron/main/modules/ipc/index.ts rename to src/main/modules/ipc/index.ts diff --git a/src/electron/main/modules/logger/index.ts b/src/main/modules/logger/index.ts similarity index 100% rename from src/electron/main/modules/logger/index.ts rename to src/main/modules/logger/index.ts diff --git a/src/electron/main/modules/tab-manager/index.ts b/src/main/modules/tab-manager/index.ts similarity index 100% rename from src/electron/main/modules/tab-manager/index.ts rename to src/main/modules/tab-manager/index.ts diff --git a/src/electron/main/modules/tray/index.ts b/src/main/modules/tray/index.ts similarity index 100% rename from src/electron/main/modules/tray/index.ts rename to src/main/modules/tray/index.ts diff --git a/src/electron/main/modules/window-size/index.ts b/src/main/modules/window-size/index.ts similarity index 100% rename from src/electron/main/modules/window-size/index.ts rename to src/main/modules/window-size/index.ts diff --git a/src/plugins/bytenode/vite-plugin-electron-encrypt.ts b/src/plugins/bytenode/vite-plugin-electron-encrypt.ts index c3e4ab9..10b8bd5 100644 --- a/src/plugins/bytenode/vite-plugin-electron-encrypt.ts +++ b/src/plugins/bytenode/vite-plugin-electron-encrypt.ts @@ -21,6 +21,7 @@ export default function electronBytecode(options?: ElectronBytecodeOptions): Plu const outputPath = entryPath.replace(/\.js$/, '.jsc') const backupPath = `${entryPath}.bak` + fs.copyFileSync(entryPath, backupPath) await bytenode.compileFile({ filename: entryPath, output: outputPath }) const stub = [ diff --git a/src/preload.ts b/src/preload.ts new file mode 100644 index 0000000..bd0e09f --- /dev/null +++ b/src/preload.ts @@ -0,0 +1,69 @@ +import { contextBridge, ipcRenderer } from 'electron' +import { IPC_EVENTS, WindowApi } from '@common/constants'; + +const api: WindowApi = { + versions: process.versions, + + external: { + open: (url: string) => ipcRenderer.invoke('external-open', url) + }, + + window: { + minimize: () => ipcRenderer.send(IPC_EVENTS.WINDOW_MINIMIZE), + maximize: () => ipcRenderer.send(IPC_EVENTS.WINDOW_MAXIMIZE), + close: () => ipcRenderer.send(IPC_EVENTS.WINDOW_CLOSE) + }, + + app: { + setFrameless: (route?: string) => ipcRenderer.invoke(IPC_EVENTS.APP_SET_FRAMELESS, route) + }, + + tabs: { + create: (url?: string) => ipcRenderer.invoke(IPC_EVENTS.TAB_CREATE, url), + list: () => ipcRenderer.invoke(IPC_EVENTS.TAB_LIST), + navigate: (tabId: string, url: string) => ipcRenderer.invoke(IPC_EVENTS.TAB_NAVIGATE, { tabId, url }), + reload: (tabId: string) => ipcRenderer.invoke(IPC_EVENTS.TAB_RELOAD, tabId), + back: (tabId: string) => ipcRenderer.invoke(IPC_EVENTS.TAB_BACK, tabId), + forward: (tabId: string) => ipcRenderer.invoke(IPC_EVENTS.TAB_FORWARD, tabId), + switch: (tabId: string) => ipcRenderer.invoke(IPC_EVENTS.TAB_SWITCH, tabId), + close: (tabId: string) => ipcRenderer.invoke(IPC_EVENTS.TAB_CLOSE, tabId), + on: (event: 'tab-updated' | 'tab-created' | 'tab-closed' | 'tab-switched', handler: (payload: any) => void) => { + const listener = (_e: any, payload: any) => handler(payload) + ipcRenderer.on(event, listener) + return () => ipcRenderer.removeListener(event, listener) + } + }, + + // 通过 IPC 调用主进程 + readFile: (filePath: string) => ipcRenderer.invoke(IPC_EVENTS.READ_FILE, filePath), + + // 同步调用 + invoke: (channel: IPC_EVENTS, ...args: any[]) => ipcRenderer.sendSync(IPC_EVENTS.INVOKE, channel, ...args), + + // 异步调用 + invokeAsync: (channel: IPC_EVENTS, ...args: any[]) => { + try { + ipcRenderer.invoke(IPC_EVENTS.INVOKE_ASYNC, channel, ...args) + } catch (error) { + throw error + } + }, + + // 监听主进程消息 + on: (event: IPC_EVENTS, callback: (...args: any[]) => void) => { + const subscription = (_event: any, ...args: any[]) => callback(...args) + ipcRenderer.on(event, subscription) + return () => ipcRenderer.removeListener(event, subscription) + }, + + // 发送消息到主进程 + send: (channel: IPC_EVENTS, ...args: any[]) => ipcRenderer.send(channel, ...args), + + // 获取窗口ID + getCurrentWindowId: () => ipcRenderer.sendSync(IPC_EVENTS.GET_WINDOW_ID), + + // 发送日志 + logToMain: (logLevel: string, message: string) => ipcRenderer.send(IPC_EVENTS.LOG_TO_MAIN, logLevel, message), +} + +contextBridge.exposeInMainWorld('api', api) \ No newline at end of file diff --git a/src/renderer/auto-imports.d.ts b/src/renderer/auto-imports.d.ts new file mode 100644 index 0000000..a0380aa --- /dev/null +++ b/src/renderer/auto-imports.d.ts @@ -0,0 +1,317 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// noinspection JSUnusedGlobalSymbols +// Generated by unplugin-auto-import +// biome-ignore lint: disable +export {} +declare global { + const EffectScope: typeof import('vue').EffectScope + const acceptHMRUpdate: typeof import('pinia').acceptHMRUpdate + const asyncComputed: typeof import('@vueuse/core').asyncComputed + const autoResetRef: typeof import('@vueuse/core').autoResetRef + const computed: typeof import('vue').computed + const computedAsync: typeof import('@vueuse/core').computedAsync + const computedEager: typeof import('@vueuse/core').computedEager + const computedInject: typeof import('@vueuse/core').computedInject + const computedWithControl: typeof import('@vueuse/core').computedWithControl + const controlledComputed: typeof import('@vueuse/core').controlledComputed + const controlledRef: typeof import('@vueuse/core').controlledRef + const createApp: typeof import('vue').createApp + const createEventHook: typeof import('@vueuse/core').createEventHook + const createGlobalState: typeof import('@vueuse/core').createGlobalState + const createInjectionState: typeof import('@vueuse/core').createInjectionState + const createPinia: typeof import('pinia').createPinia + const createReactiveFn: typeof import('@vueuse/core').createReactiveFn + const createRef: typeof import('@vueuse/core').createRef + const createReusableTemplate: typeof import('@vueuse/core').createReusableTemplate + const createSharedComposable: typeof import('@vueuse/core').createSharedComposable + const createTemplatePromise: typeof import('@vueuse/core').createTemplatePromise + const createUnrefFn: typeof import('@vueuse/core').createUnrefFn + const customRef: typeof import('vue').customRef + const debouncedRef: typeof import('@vueuse/core').debouncedRef + const debouncedWatch: typeof import('@vueuse/core').debouncedWatch + const defineAsyncComponent: typeof import('vue').defineAsyncComponent + const defineComponent: typeof import('vue').defineComponent + const defineStore: typeof import('pinia').defineStore + const eagerComputed: typeof import('@vueuse/core').eagerComputed + const effectScope: typeof import('vue').effectScope + const extendRef: typeof import('@vueuse/core').extendRef + const getActivePinia: typeof import('pinia').getActivePinia + const getCurrentInstance: typeof import('vue').getCurrentInstance + const getCurrentScope: typeof import('vue').getCurrentScope + const getCurrentWatcher: typeof import('vue').getCurrentWatcher + const h: typeof import('vue').h + const ignorableWatch: typeof import('@vueuse/core').ignorableWatch + const inject: typeof import('vue').inject + const injectLocal: typeof import('@vueuse/core').injectLocal + const isDefined: typeof import('@vueuse/core').isDefined + const isProxy: typeof import('vue').isProxy + const isReactive: typeof import('vue').isReactive + const isReadonly: typeof import('vue').isReadonly + const isRef: typeof import('vue').isRef + const isShallow: typeof import('vue').isShallow + const makeDestructurable: typeof import('@vueuse/core').makeDestructurable + const mapActions: typeof import('pinia').mapActions + const mapGetters: typeof import('pinia').mapGetters + const mapState: typeof import('pinia').mapState + const mapStores: typeof import('pinia').mapStores + const mapWritableState: typeof import('pinia').mapWritableState + const markRaw: typeof import('vue').markRaw + const nextTick: typeof import('vue').nextTick + const onActivated: typeof import('vue').onActivated + const onBeforeMount: typeof import('vue').onBeforeMount + const onBeforeRouteLeave: typeof import('vue-router').onBeforeRouteLeave + const onBeforeRouteUpdate: typeof import('vue-router').onBeforeRouteUpdate + const onBeforeUnmount: typeof import('vue').onBeforeUnmount + const onBeforeUpdate: typeof import('vue').onBeforeUpdate + const onClickOutside: typeof import('@vueuse/core').onClickOutside + const onDeactivated: typeof import('vue').onDeactivated + const onElementRemoval: typeof import('@vueuse/core').onElementRemoval + const onErrorCaptured: typeof import('vue').onErrorCaptured + const onKeyStroke: typeof import('@vueuse/core').onKeyStroke + const onLongPress: typeof import('@vueuse/core').onLongPress + const onMounted: typeof import('vue').onMounted + const onRenderTracked: typeof import('vue').onRenderTracked + const onRenderTriggered: typeof import('vue').onRenderTriggered + const onScopeDispose: typeof import('vue').onScopeDispose + const onServerPrefetch: typeof import('vue').onServerPrefetch + const onStartTyping: typeof import('@vueuse/core').onStartTyping + const onUnmounted: typeof import('vue').onUnmounted + const onUpdated: typeof import('vue').onUpdated + const onWatcherCleanup: typeof import('vue').onWatcherCleanup + const pausableWatch: typeof import('@vueuse/core').pausableWatch + const provide: typeof import('vue').provide + const provideLocal: typeof import('@vueuse/core').provideLocal + const reactify: typeof import('@vueuse/core').reactify + const reactifyObject: typeof import('@vueuse/core').reactifyObject + const reactive: typeof import('vue').reactive + const reactiveComputed: typeof import('@vueuse/core').reactiveComputed + const reactiveOmit: typeof import('@vueuse/core').reactiveOmit + const reactivePick: typeof import('@vueuse/core').reactivePick + const readonly: typeof import('vue').readonly + const ref: typeof import('vue').ref + const refAutoReset: typeof import('@vueuse/core').refAutoReset + const refDebounced: typeof import('@vueuse/core').refDebounced + const refDefault: typeof import('@vueuse/core').refDefault + const refManualReset: typeof import('@vueuse/core').refManualReset + const refThrottled: typeof import('@vueuse/core').refThrottled + const refWithControl: typeof import('@vueuse/core').refWithControl + const resolveComponent: typeof import('vue').resolveComponent + const resolveRef: typeof import('@vueuse/core').resolveRef + const setActivePinia: typeof import('pinia').setActivePinia + const setMapStoreSuffix: typeof import('pinia').setMapStoreSuffix + const shallowReactive: typeof import('vue').shallowReactive + const shallowReadonly: typeof import('vue').shallowReadonly + const shallowRef: typeof import('vue').shallowRef + const storeToRefs: typeof import('pinia').storeToRefs + const syncRef: typeof import('@vueuse/core').syncRef + const syncRefs: typeof import('@vueuse/core').syncRefs + const templateRef: typeof import('@vueuse/core').templateRef + const throttledRef: typeof import('@vueuse/core').throttledRef + const throttledWatch: typeof import('@vueuse/core').throttledWatch + const toRaw: typeof import('vue').toRaw + const toReactive: typeof import('@vueuse/core').toReactive + const toRef: typeof import('vue').toRef + const toRefs: typeof import('vue').toRefs + const toValue: typeof import('vue').toValue + const triggerRef: typeof import('vue').triggerRef + const tryOnBeforeMount: typeof import('@vueuse/core').tryOnBeforeMount + const tryOnBeforeUnmount: typeof import('@vueuse/core').tryOnBeforeUnmount + const tryOnMounted: typeof import('@vueuse/core').tryOnMounted + const tryOnScopeDispose: typeof import('@vueuse/core').tryOnScopeDispose + const tryOnUnmounted: typeof import('@vueuse/core').tryOnUnmounted + const unref: typeof import('vue').unref + const unrefElement: typeof import('@vueuse/core').unrefElement + const until: typeof import('@vueuse/core').until + const useActiveElement: typeof import('@vueuse/core').useActiveElement + const useAnimate: typeof import('@vueuse/core').useAnimate + const useArrayDifference: typeof import('@vueuse/core').useArrayDifference + const useArrayEvery: typeof import('@vueuse/core').useArrayEvery + const useArrayFilter: typeof import('@vueuse/core').useArrayFilter + const useArrayFind: typeof import('@vueuse/core').useArrayFind + const useArrayFindIndex: typeof import('@vueuse/core').useArrayFindIndex + const useArrayFindLast: typeof import('@vueuse/core').useArrayFindLast + const useArrayIncludes: typeof import('@vueuse/core').useArrayIncludes + const useArrayJoin: typeof import('@vueuse/core').useArrayJoin + const useArrayMap: typeof import('@vueuse/core').useArrayMap + const useArrayReduce: typeof import('@vueuse/core').useArrayReduce + const useArraySome: typeof import('@vueuse/core').useArraySome + const useArrayUnique: typeof import('@vueuse/core').useArrayUnique + const useAsyncQueue: typeof import('@vueuse/core').useAsyncQueue + const useAsyncState: typeof import('@vueuse/core').useAsyncState + const useAttrs: typeof import('vue').useAttrs + const useBase64: typeof import('@vueuse/core').useBase64 + const useBattery: typeof import('@vueuse/core').useBattery + const useBluetooth: typeof import('@vueuse/core').useBluetooth + const useBreakpoints: typeof import('@vueuse/core').useBreakpoints + const useBroadcastChannel: typeof import('@vueuse/core').useBroadcastChannel + const useBrowserLocation: typeof import('@vueuse/core').useBrowserLocation + const useCached: typeof import('@vueuse/core').useCached + const useClipboard: typeof import('@vueuse/core').useClipboard + const useClipboardItems: typeof import('@vueuse/core').useClipboardItems + const useCloned: typeof import('@vueuse/core').useCloned + const useColorMode: typeof import('@vueuse/core').useColorMode + const useConfirmDialog: typeof import('@vueuse/core').useConfirmDialog + const useCountdown: typeof import('@vueuse/core').useCountdown + const useCounter: typeof import('@vueuse/core').useCounter + const useCssModule: typeof import('vue').useCssModule + const useCssVar: typeof import('@vueuse/core').useCssVar + const useCssVars: typeof import('vue').useCssVars + const useCurrentElement: typeof import('@vueuse/core').useCurrentElement + const useCycleList: typeof import('@vueuse/core').useCycleList + const useDark: typeof import('@vueuse/core').useDark + const useDateFormat: typeof import('@vueuse/core').useDateFormat + const useDebounce: typeof import('@vueuse/core').useDebounce + const useDebounceFn: typeof import('@vueuse/core').useDebounceFn + const useDebouncedRefHistory: typeof import('@vueuse/core').useDebouncedRefHistory + const useDeviceMotion: typeof import('@vueuse/core').useDeviceMotion + const useDeviceOrientation: typeof import('@vueuse/core').useDeviceOrientation + const useDevicePixelRatio: typeof import('@vueuse/core').useDevicePixelRatio + const useDevicesList: typeof import('@vueuse/core').useDevicesList + const useDisplayMedia: typeof import('@vueuse/core').useDisplayMedia + const useDocumentVisibility: typeof import('@vueuse/core').useDocumentVisibility + const useDraggable: typeof import('@vueuse/core').useDraggable + const useDropZone: typeof import('@vueuse/core').useDropZone + const useElementBounding: typeof import('@vueuse/core').useElementBounding + const useElementByPoint: typeof import('@vueuse/core').useElementByPoint + const useElementHover: typeof import('@vueuse/core').useElementHover + const useElementSize: typeof import('@vueuse/core').useElementSize + const useElementVisibility: typeof import('@vueuse/core').useElementVisibility + const useEventBus: typeof import('@vueuse/core').useEventBus + const useEventListener: typeof import('@vueuse/core').useEventListener + const useEventSource: typeof import('@vueuse/core').useEventSource + const useEyeDropper: typeof import('@vueuse/core').useEyeDropper + const useFavicon: typeof import('@vueuse/core').useFavicon + const useFetch: typeof import('@vueuse/core').useFetch + const useFileDialog: typeof import('@vueuse/core').useFileDialog + const useFileSystemAccess: typeof import('@vueuse/core').useFileSystemAccess + const useFocus: typeof import('@vueuse/core').useFocus + const useFocusWithin: typeof import('@vueuse/core').useFocusWithin + const useFps: typeof import('@vueuse/core').useFps + const useFullscreen: typeof import('@vueuse/core').useFullscreen + const useGamepad: typeof import('@vueuse/core').useGamepad + const useGeolocation: typeof import('@vueuse/core').useGeolocation + const useId: typeof import('vue').useId + const useIdle: typeof import('@vueuse/core').useIdle + const useImage: typeof import('@vueuse/core').useImage + const useInfiniteScroll: typeof import('@vueuse/core').useInfiniteScroll + const useIntersectionObserver: typeof import('@vueuse/core').useIntersectionObserver + const useInterval: typeof import('@vueuse/core').useInterval + const useIntervalFn: typeof import('@vueuse/core').useIntervalFn + const useKeyModifier: typeof import('@vueuse/core').useKeyModifier + const useLastChanged: typeof import('@vueuse/core').useLastChanged + const useLink: typeof import('vue-router').useLink + const useLocalStorage: typeof import('@vueuse/core').useLocalStorage + const useMagicKeys: typeof import('@vueuse/core').useMagicKeys + const useManualRefHistory: typeof import('@vueuse/core').useManualRefHistory + const useMediaControls: typeof import('@vueuse/core').useMediaControls + const useMediaQuery: typeof import('@vueuse/core').useMediaQuery + const useMemoize: typeof import('@vueuse/core').useMemoize + const useMemory: typeof import('@vueuse/core').useMemory + const useModel: typeof import('vue').useModel + const useMounted: typeof import('@vueuse/core').useMounted + const useMouse: typeof import('@vueuse/core').useMouse + const useMouseInElement: typeof import('@vueuse/core').useMouseInElement + const useMousePressed: typeof import('@vueuse/core').useMousePressed + const useMutationObserver: typeof import('@vueuse/core').useMutationObserver + const useNavigatorLanguage: typeof import('@vueuse/core').useNavigatorLanguage + const useNetwork: typeof import('@vueuse/core').useNetwork + const useNow: typeof import('@vueuse/core').useNow + const useObjectUrl: typeof import('@vueuse/core').useObjectUrl + const useOffsetPagination: typeof import('@vueuse/core').useOffsetPagination + const useOnline: typeof import('@vueuse/core').useOnline + const usePageLeave: typeof import('@vueuse/core').usePageLeave + const useParallax: typeof import('@vueuse/core').useParallax + const useParentElement: typeof import('@vueuse/core').useParentElement + const usePerformanceObserver: typeof import('@vueuse/core').usePerformanceObserver + const usePermission: typeof import('@vueuse/core').usePermission + const usePointer: typeof import('@vueuse/core').usePointer + const usePointerLock: typeof import('@vueuse/core').usePointerLock + const usePointerSwipe: typeof import('@vueuse/core').usePointerSwipe + const usePreferredColorScheme: typeof import('@vueuse/core').usePreferredColorScheme + const usePreferredContrast: typeof import('@vueuse/core').usePreferredContrast + const usePreferredDark: typeof import('@vueuse/core').usePreferredDark + const usePreferredLanguages: typeof import('@vueuse/core').usePreferredLanguages + const usePreferredReducedMotion: typeof import('@vueuse/core').usePreferredReducedMotion + const usePreferredReducedTransparency: typeof import('@vueuse/core').usePreferredReducedTransparency + const usePrevious: typeof import('@vueuse/core').usePrevious + const useRafFn: typeof import('@vueuse/core').useRafFn + const useRefHistory: typeof import('@vueuse/core').useRefHistory + const useResizeObserver: typeof import('@vueuse/core').useResizeObserver + const useRoute: typeof import('vue-router').useRoute + const useRouter: typeof import('vue-router').useRouter + const useSSRWidth: typeof import('@vueuse/core').useSSRWidth + const useScreenOrientation: typeof import('@vueuse/core').useScreenOrientation + const useScreenSafeArea: typeof import('@vueuse/core').useScreenSafeArea + const useScriptTag: typeof import('@vueuse/core').useScriptTag + const useScroll: typeof import('@vueuse/core').useScroll + const useScrollLock: typeof import('@vueuse/core').useScrollLock + const useSessionStorage: typeof import('@vueuse/core').useSessionStorage + const useShare: typeof import('@vueuse/core').useShare + const useSlots: typeof import('vue').useSlots + const useSorted: typeof import('@vueuse/core').useSorted + const useSpeechRecognition: typeof import('@vueuse/core').useSpeechRecognition + const useSpeechSynthesis: typeof import('@vueuse/core').useSpeechSynthesis + const useStepper: typeof import('@vueuse/core').useStepper + const useStorage: typeof import('@vueuse/core').useStorage + const useStorageAsync: typeof import('@vueuse/core').useStorageAsync + const useStyleTag: typeof import('@vueuse/core').useStyleTag + const useSupported: typeof import('@vueuse/core').useSupported + const useSwipe: typeof import('@vueuse/core').useSwipe + const useTemplateRef: typeof import('vue').useTemplateRef + const useTemplateRefsList: typeof import('@vueuse/core').useTemplateRefsList + const useTextDirection: typeof import('@vueuse/core').useTextDirection + const useTextSelection: typeof import('@vueuse/core').useTextSelection + const useTextareaAutosize: typeof import('@vueuse/core').useTextareaAutosize + const useThrottle: typeof import('@vueuse/core').useThrottle + const useThrottleFn: typeof import('@vueuse/core').useThrottleFn + const useThrottledRefHistory: typeof import('@vueuse/core').useThrottledRefHistory + const useTimeAgo: typeof import('@vueuse/core').useTimeAgo + const useTimeAgoIntl: typeof import('@vueuse/core').useTimeAgoIntl + const useTimeout: typeof import('@vueuse/core').useTimeout + const useTimeoutFn: typeof import('@vueuse/core').useTimeoutFn + const useTimeoutPoll: typeof import('@vueuse/core').useTimeoutPoll + const useTimestamp: typeof import('@vueuse/core').useTimestamp + const useTitle: typeof import('@vueuse/core').useTitle + const useToNumber: typeof import('@vueuse/core').useToNumber + const useToString: typeof import('@vueuse/core').useToString + const useToggle: typeof import('@vueuse/core').useToggle + const useTransition: typeof import('@vueuse/core').useTransition + const useUrlSearchParams: typeof import('@vueuse/core').useUrlSearchParams + const useUserMedia: typeof import('@vueuse/core').useUserMedia + const useVModel: typeof import('@vueuse/core').useVModel + const useVModels: typeof import('@vueuse/core').useVModels + const useVibrate: typeof import('@vueuse/core').useVibrate + const useVirtualList: typeof import('@vueuse/core').useVirtualList + const useWakeLock: typeof import('@vueuse/core').useWakeLock + const useWebNotification: typeof import('@vueuse/core').useWebNotification + const useWebSocket: typeof import('@vueuse/core').useWebSocket + const useWebWorker: typeof import('@vueuse/core').useWebWorker + const useWebWorkerFn: typeof import('@vueuse/core').useWebWorkerFn + const useWindowFocus: typeof import('@vueuse/core').useWindowFocus + const useWindowScroll: typeof import('@vueuse/core').useWindowScroll + const useWindowSize: typeof import('@vueuse/core').useWindowSize + const watch: typeof import('vue').watch + const watchArray: typeof import('@vueuse/core').watchArray + const watchAtMost: typeof import('@vueuse/core').watchAtMost + const watchDebounced: typeof import('@vueuse/core').watchDebounced + const watchDeep: typeof import('@vueuse/core').watchDeep + const watchEffect: typeof import('vue').watchEffect + const watchIgnorable: typeof import('@vueuse/core').watchIgnorable + const watchImmediate: typeof import('@vueuse/core').watchImmediate + const watchOnce: typeof import('@vueuse/core').watchOnce + const watchPausable: typeof import('@vueuse/core').watchPausable + const watchPostEffect: typeof import('vue').watchPostEffect + const watchSyncEffect: typeof import('vue').watchSyncEffect + const watchThrottled: typeof import('@vueuse/core').watchThrottled + const watchTriggerable: typeof import('@vueuse/core').watchTriggerable + const watchWithFilter: typeof import('@vueuse/core').watchWithFilter + const whenever: typeof import('@vueuse/core').whenever +} +// for type re-export +declare global { + // @ts-ignore + export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, ShallowRef, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue' + import('vue') +} diff --git a/src/renderer/browser/BrowserLayout.vue b/src/renderer/browser/BrowserLayout.vue index 106a7f2..3fc5328 100644 --- a/src/renderer/browser/BrowserLayout.vue +++ b/src/renderer/browser/BrowserLayout.vue @@ -57,26 +57,26 @@ const refreshActiveAddress = () => { } const syncList = async () => { - const list: TabInfo[] = await (window as any).ipcAPI.tabs.list() + const list: TabInfo[] = await (window as any).api.tabs.list() tabs.splice(0, tabs.length, ...list) if (!activeId.value && list.length > 0) activeId.value = list[0].id refreshActiveAddress() } const onNewTab = async () => { - const info: TabInfo = await (window as any).ipcAPI.tabs.create('about:blank') + const info: TabInfo = await (window as any).api.tabs.create('about:blank') activeId.value = info.id } const onSwitch = async (id: string) => { - await (window as any).ipcAPI.tabs.switch(id) + await (window as any).api.tabs.switch(id) activeId.value = id refreshActiveAddress() } const onCloseTab = async () => { if (!activeId.value) return - await (window as any).ipcAPI.tabs.close(activeId.value) + await (window as any).api.tabs.close(activeId.value) } const normalizeUrl = (u: string) => { @@ -90,46 +90,46 @@ const onNavigate = async () => { if (!activeId.value || !address.value) return const url = normalizeUrl(address.value) if (!url) return - await (window as any).ipcAPI.tabs.navigate(activeId.value, url) + await (window as any).api.tabs.navigate(activeId.value, url) } const onReload = async () => { if (!activeId.value) return - await (window as any).ipcAPI.tabs.reload(activeId.value) + await (window as any).api.tabs.reload(activeId.value) } const onBack = async () => { if (!activeId.value) return - await (window as any).ipcAPI.tabs.back(activeId.value) + await (window as any).api.tabs.back(activeId.value) } const onForward = async () => { if (!activeId.value) return - await (window as any).ipcAPI.tabs.forward(activeId.value) + await (window as any).api.tabs.forward(activeId.value) } const onCloseTabId = async (id: string) => { - await (window as any).ipcAPI.tabs.close(id) + await (window as any).api.tabs.close(id) } -const onCloseWindow = () => (window as any).ipcAPI.window.close() -const onMinimizeWindow = () => (window as any).ipcAPI.window.minimize() -const onMaximizeWindow = () => (window as any).ipcAPI.window.maximize() +const onCloseWindow = () => (window as any).api.window.close() +const onMinimizeWindow = () => (window as any).api.window.minimize() +const onMaximizeWindow = () => (window as any).api.window.maximize() onMounted(async () => { await syncList() - ; (window as any).ipcAPI.tabs.on('tab-created', (info: TabInfo) => { + ; (window as any).api.tabs.on('tab-created', (info: TabInfo) => { const i = tabs.findIndex(t => t.id === info.id) if (i === -1) tabs.push(info) activeId.value = info.id refreshActiveAddress() }) - ; (window as any).ipcAPI.tabs.on('tab-updated', (info: TabInfo) => { + ; (window as any).api.tabs.on('tab-updated', (info: TabInfo) => { const i = tabs.findIndex(t => t.id === info.id) if (i >= 0) tabs[i] = info if (activeId.value === info.id) refreshActiveAddress() }) - ; (window as any).ipcAPI.tabs.on('tab-closed', ({ tabId }: { tabId: string }) => { + ; (window as any).api.tabs.on('tab-closed', ({ tabId }: { tabId: string }) => { const i = tabs.findIndex(t => t.id === tabId) if (i >= 0) tabs.splice(i, 1) if (activeId.value === tabId) { @@ -138,7 +138,7 @@ onMounted(async () => { refreshActiveAddress() } }) - ; (window as any).ipcAPI.tabs.on('tab-switched', ({ tabId }: { tabId: string }) => { + ; (window as any).api.tabs.on('tab-switched', ({ tabId }: { tabId: string }) => { activeId.value = tabId refreshActiveAddress() }) diff --git a/src/renderer/browser/README.md b/src/renderer/browser/README.md index c06b324..58ef366 100644 --- a/src/renderer/browser/README.md +++ b/src/renderer/browser/README.md @@ -103,7 +103,7 @@ tab-switched: { tabId: TabId } 1. 核心能力(主进程 + IPC + 预加载) - 实现 `TabManager` 与全部导航方法 - 注册 IPC(tabs/bookmarks/plugins)与广播 - - 预加载扩展 `window.ipcAPI.tabs/*`、事件订阅封装 + - 预加载扩展 `window.api.tabs/*`、事件订阅封装 2. 渲染层界面 - 新建 `BrowserLayout` 与基础组件(TabBar、AddressBar、Controls) - 打通地址栏与导航;同步标题与加载状态 diff --git a/src/renderer/env.d.ts b/src/renderer/env.d.ts deleted file mode 100644 index 5eea330..0000000 --- a/src/renderer/env.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -declare module "@store/counter"; -declare module "@utils/request"; -declare module "@assets/images/*"; -declare module "@constant/rate"; -declare module "@constant/menus"; -declare module "@remixicon/vue"; -declare module "vue-router"; \ No newline at end of file diff --git a/src/renderer/index.css b/src/renderer/index.css deleted file mode 100644 index e0461e9..0000000 --- a/src/renderer/index.css +++ /dev/null @@ -1,12 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -body { - margin: 0; - padding: 0; -} - -.bg { - background: linear-gradient( 180deg, #EFF6FF 0%, #F5F7FA 40%); -} \ No newline at end of file diff --git a/src/renderer/main.ts b/src/renderer/main.ts index a7e7fab..aa0d98a 100644 --- a/src/renderer/main.ts +++ b/src/renderer/main.ts @@ -1,4 +1,4 @@ -import "./index.css"; +import "./styles/index.css"; import { createApp } from "vue"; import { createPinia } from "pinia"; import router from "./router"; @@ -16,9 +16,7 @@ app.use(createPinia()); // 使用 Vue Router app.use(router); -app.use(ElementPlus, { - locale, -}) +app.use(ElementPlus, { locale }) // 挂载应用到 DOM app.mount("#app"); diff --git a/src/renderer/styles/index.css b/src/renderer/styles/index.css new file mode 100644 index 0000000..7e89054 --- /dev/null +++ b/src/renderer/styles/index.css @@ -0,0 +1,12 @@ +@import "tailwindcss"; +@import "./theme/index.css"; +@plugin "@tailwindcss/typography"; + +body { + margin: 0; + padding: 0; +} + +.bg { + background: linear-gradient(180deg, #EFF6FF 0%, #F5F7FA 40%); +} \ No newline at end of file diff --git a/src/renderer/styles/index.scss b/src/renderer/styles/index.scss deleted file mode 100644 index e69de29..0000000 diff --git a/src/renderer/styles/theme/dark.css b/src/renderer/styles/theme/dark.css new file mode 100644 index 0000000..c72d2e6 --- /dev/null +++ b/src/renderer/styles/theme/dark.css @@ -0,0 +1,126 @@ +@media (prefers-color-scheme: dark) { + :root { + --primary-color: #07C160; + --bg-color: #1E1E1E; + --bg-secondary: #2C2C2C; + + --text-primary: #E0E0E0; + --text-secondary: #A0A0A0; + + --bubble-self: var(--primary-color); + --bubble-others: #3A3A3A; + --input-bg: #333333; + --ripple-color: var(--text-secondary); + --ripple-opacity: 0.2; + } + + pre code.hljs { + display: block; + overflow-x: auto; + padding: 1em + } + code.hljs { + padding: 3px 5px + } + /*! + Theme: GitHub Dark + Description: Dark theme as seen on github.com + Author: github.com + Maintainer: @Hirse + Updated: 2021-05-15 + + Outdated base version: https://github.com/primer/github-syntax-dark + Current colors taken from GitHub's CSS + */ + .hljs { + color: var(--text-primary); + background: var(--input-bg); + } + .hljs-doctag, + .hljs-keyword, + .hljs-meta .hljs-keyword, + .hljs-template-tag, + .hljs-template-variable, + .hljs-type, + .hljs-variable.language_ { + /* prettylights-syntax-keyword */ + color: #ff7b72 + } + .hljs-title, + .hljs-title.class_, + .hljs-title.class_.inherited__, + .hljs-title.function_ { + /* prettylights-syntax-entity */ + color: #d2a8ff + } + .hljs-attr, + .hljs-attribute, + .hljs-literal, + .hljs-meta, + .hljs-number, + .hljs-operator, + .hljs-variable, + .hljs-selector-attr, + .hljs-selector-class, + .hljs-selector-id { + /* prettylights-syntax-constant */ + color: #79c0ff + } + .hljs-regexp, + .hljs-string, + .hljs-meta .hljs-string { + /* prettylights-syntax-string */ + color: #a5d6ff + } + .hljs-built_in, + .hljs-symbol { + /* prettylights-syntax-variable */ + color: #ffa657 + } + .hljs-comment, + .hljs-code, + .hljs-formula { + /* prettylights-syntax-comment */ + color: #8b949e + } + .hljs-name, + .hljs-quote, + .hljs-selector-tag, + .hljs-selector-pseudo { + /* prettylights-syntax-entity-tag */ + color: #7ee787 + } + .hljs-subst { + /* prettylights-syntax-storage-modifier-import */ + color: #c9d1d9 + } + .hljs-section { + /* prettylights-syntax-markup-heading */ + color: #1f6feb; + font-weight: bold + } + .hljs-bullet { + /* prettylights-syntax-markup-list */ + color: #f2cc60 + } + .hljs-emphasis { + /* prettylights-syntax-markup-italic */ + color: #c9d1d9; + font-style: italic + } + .hljs-strong { + /* prettylights-syntax-markup-bold */ + color: #c9d1d9; + font-weight: bold + } + .hljs-addition { + /* prettylights-syntax-markup-inserted */ + color: #aff5b4; + background-color: #033a16 + } + .hljs-deletion { + /* prettylights-syntax-markup-deleted */ + color: #ffdcd7; + background-color: #67060c + } +} diff --git a/src/renderer/styles/theme/index.css b/src/renderer/styles/theme/index.css new file mode 100644 index 0000000..46fd54d --- /dev/null +++ b/src/renderer/styles/theme/index.css @@ -0,0 +1,18 @@ +@import './dark.css'; +@import './light.css'; + +@theme { + --color-primary: var(--primary-color); + --color-primary-light: var(--primary-color-light); + --color-primary-dark: var(--primary-color-dark); + --color-primary-hover: var(--primary-color-hover); + --color-primary-active: var(--primary-color-active); + --color-primary-subtle: var(--primary-color-subtle); + --color-main: var(--bg-color); + --color-secondary: var(--bg-secondary); + --color-input: var(--input-bg); + --color-bubble-self: var(--bubble-self); + --color-bubble-others: var(--bubble-others); + --color-tx-primary: var(--text-primary); + --color-tx-secondary: var(--text-secondary); +} \ No newline at end of file diff --git a/src/renderer/styles/theme/light.css b/src/renderer/styles/theme/light.css new file mode 100644 index 0000000..69e36b4 --- /dev/null +++ b/src/renderer/styles/theme/light.css @@ -0,0 +1,129 @@ +@media (prefers-color-scheme: light) { + :root { + --primary-color: #07C160; + --bg-color: #FFFFFF; + --bg-secondary: #F5F5F5; + --text-primary: #000000; + --text-secondary: #7F7F7F; + + --header-bg: var(--primary-color); + --bubble-self: var(--primary-color); + --bubble-others: #FFFFFF; + --input-bg: #F0F0F0; + --ripple-color: var(--text-secondary); + --ripple-opacity: 0.2; + } + + pre code.hljs { + display: block; + overflow-x: auto; + padding: 1em + } + code.hljs { + padding: 3px 5px + } + /*! + Theme: GitHub + Description: Light theme as seen on github.com + Author: github.com + Maintainer: @Hirse + Updated: 2021-05-15 + + Outdated base version: https://github.com/primer/github-syntax-light + Current colors taken from GitHub's CSS + */ + .hljs { + /* color: #24292e; + background: #ffffff */ + + color: var(--text-primary); + background: var(--input-bg); + } + .hljs-doctag, + .hljs-keyword, + .hljs-meta .hljs-keyword, + .hljs-template-tag, + .hljs-template-variable, + .hljs-type, + .hljs-variable.language_ { + /* prettylights-syntax-keyword */ + color: #d73a49 + } + .hljs-title, + .hljs-title.class_, + .hljs-title.class_.inherited__, + .hljs-title.function_ { + /* prettylights-syntax-entity */ + color: #6f42c1 + } + .hljs-attr, + .hljs-attribute, + .hljs-literal, + .hljs-meta, + .hljs-number, + .hljs-operator, + .hljs-variable, + .hljs-selector-attr, + .hljs-selector-class, + .hljs-selector-id { + /* prettylights-syntax-constant */ + color: #005cc5 + } + .hljs-regexp, + .hljs-string, + .hljs-meta .hljs-string { + /* prettylights-syntax-string */ + color: #032f62 + } + .hljs-built_in, + .hljs-symbol { + /* prettylights-syntax-variable */ + color: #e36209 + } + .hljs-comment, + .hljs-code, + .hljs-formula { + /* prettylights-syntax-comment */ + color: #6a737d + } + .hljs-name, + .hljs-quote, + .hljs-selector-tag, + .hljs-selector-pseudo { + /* prettylights-syntax-entity-tag */ + color: #22863a + } + .hljs-subst { + /* prettylights-syntax-storage-modifier-import */ + color: #24292e + } + .hljs-section { + /* prettylights-syntax-markup-heading */ + color: #005cc5; + font-weight: bold + } + .hljs-bullet { + /* prettylights-syntax-markup-list */ + color: #735c0f + } + .hljs-emphasis { + /* prettylights-syntax-markup-italic */ + color: #24292e; + font-style: italic + } + .hljs-strong { + /* prettylights-syntax-markup-bold */ + color: #24292e; + font-weight: bold + } + .hljs-addition { + /* prettylights-syntax-markup-inserted */ + color: #22863a; + background-color: #f0fff4 + } + .hljs-deletion { + /* prettylights-syntax-markup-deleted */ + color: #b31d28; + background-color: #ffeef0 + } +} \ No newline at end of file diff --git a/src/renderer/views/login/index.vue b/src/renderer/views/login/index.vue index a77cf23..7ba0a82 100644 --- a/src/renderer/views/login/index.vue +++ b/src/renderer/views/login/index.vue @@ -105,7 +105,7 @@ const onSubmit = async () => { // const token = res && (res.token || res.data?.token || res.access_token); // if (!token) throw new Error("登录失败"); // localStorage.setItem("token", token); - // await (window as any).ipcAPI.app.setFrameless('/home') + // await (window as any).api.app.setFrameless('/home') router.push('/home'); } finally { // loading.value = false; diff --git a/src/shared/types/ipc.types.ts b/src/shared/types/ipc.types.ts deleted file mode 100644 index 1c54374..0000000 --- a/src/shared/types/ipc.types.ts +++ /dev/null @@ -1,83 +0,0 @@ -export enum IPCChannel { - APP_MINIMIZE ='app:minimize', - APP_MAXIMIZE ='app:maximize', - APP_QUIT ='app:quit', - FILE_READ = 'file:read', - FILE_WRITE = 'file:write', - GET_WINDOW_ID='get-window-id', - CUSTOM_EVENT ='custom:event', - TIME_UPDATE = 'time:update' -} - -// 定义每个通道的参数和返回值类型 -export interface IPCTypings { - // 同步通信 - [IPCChannel.APP_MINIMIZE]: { - params: [window:number] - return: {success: boolean, error?: string} - } - [IPCChannel.APP_MAXIMIZE]: { - params: [window:number] - return: {success: boolean, error?: string} - } - [IPCChannel.GET_WINDOW_ID]: { - params: [] - return: number - } - - // 异步通信 - [IPCChannel.FILE_READ]: { - params: [filePath: string] - return: Promise<{success: boolean, data?: string, error?: string}> - } - [IPCChannel.FILE_WRITE]: { - params: [filePath: string, content: string] - return: Promise<{success: boolean, error?: string}> - } - - // 事件通信 - [IPCChannel.TIME_UPDATE]: { - params: [time: string] - return: void - } - [IPCChannel.CUSTOM_EVENT]: { - params: [message: string] - return: void - } -} - -// 定义IPC API 接口 -export interface IPCAPI { - invoke(channel: T, ...args: IPCTypings[T]['params']): IPCTypings[T]['return'], - invokeAsync(channel: T, ...args: IPCTypings[T]['params']): IPCTypings[T]['return'], - on(channel: T, callback: (...args: IPCTypings[T]['params']) => void): () => void - send(channel: T, ...args: IPCTypings[T]['params']): void, - getCurrentWindowId(): number, - versions: NodeJS.ProcessVersions, - external: { - open: (url: string) => void - }, - window: { - minimize: () => void, - maximize: () => void, - close: () => void - }, - app: { - setFrameless: (route?: string) => void - }, - tabs: { - create: (url?: string) => void, - list: () => void, - navigate: (tabId: string, url: string) => void, - reload: (tabId: string) => void, - back: (tabId: string) => void, - forward: (tabId: string) => void, - switch: (tabId: string) => void, - close: (tabId: string) => void, - on: (event: 'tab-updated' | 'tab-created' | 'tab-closed' | 'tab-switched', handler: (payload: any) => void) => void - }, - readFile: (filePath: string) => Promise<{success: boolean, data?: string, error?: string}>, - logToMain: (logLevel: string, message: string) => void, - // 打开新窗口 - openNewTab: (url: string) => Promise, -} diff --git a/tailwind.config.cjs b/tailwind.config.cjs deleted file mode 100644 index 7849f91..0000000 --- a/tailwind.config.cjs +++ /dev/null @@ -1,11 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -module.exports = { - content: [ - "./index.html", - "./src/**/*.{vue,js,ts,jsx,tsx}", - ], - theme: { - extend: {}, - }, - plugins: [], -} diff --git a/tsconfig.json b/tsconfig.json index 846ad3b..8ff7fcd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,16 +17,17 @@ "paths": { "@/*": ["src/renderer/*"], "@assets/*": ["src/assets/*"], + "@common/*": ["src/common/*"], "@store/*": ["src/renderer/store/*"], "@constant/*": ["src/renderer/constant/*"], "@utils/*": ["src/renderer/utils/*"], "@api/*": ["src/renderer/api/*"], "@/types": ["src/renderer/types/index.ts"], - "@modules/*": ["src/electron/main/modules/*"], + "@modules/*": ["src/main/modules/*"], "@/shared/*": ["src/shared/*"], }, "outDir": "dist", - "moduleResolution": "bundler", + "moduleResolution": "Bundler", "resolveJsonModule": true, "types": ["element-plus/global"] }, @@ -34,7 +35,11 @@ "src/**/*", "./package.json", "./forge.config.ts", - "*.ts", - "vite.renderer.config.ts" -, "packages/electron-chrome-context-menu", "packages/chrome-ui" ] + "forge.env.d.ts", + "**/*.ts", + "**/*.d.ts", + "vite.renderer.config.ts", + "packages/electron-chrome-context-menu", + "packages/chrome-ui" + ] } diff --git a/vite.main.config.ts b/vite.main.config.ts index a15be3e..f68017b 100644 --- a/vite.main.config.ts +++ b/vite.main.config.ts @@ -1,14 +1,18 @@ import { defineConfig } from "vite"; import { resolve } from "path"; -import electronBytecode from "./src/plugins/bytenode/vite-plugin-electron-encrypt"; // https://vitejs.dev/config -export default defineConfig({ - plugins: [electronBytecode({ entry: ".vite/build/main.js", keepSource: false })], - resolve: { - alias: { - "@": resolve(__dirname, "./src/electron"), - "@modules": resolve(__dirname, "./src/electron/main/modules"), +export default defineConfig( async () => { + const electronBytecode = (await import("./src/plugins/bytenode/vite-plugin-electron-encrypt")).default + + return { + plugins: [electronBytecode({ entry: ".vite/build/main.js", keepSource: false })], + resolve: { + alias: { + "@": resolve(__dirname, "./src/main"), + '@common': resolve(__dirname, './src/common'), + "@modules": resolve(__dirname, "./src/main/modules"), + }, }, - }, + } }); diff --git a/vite.preload.config.ts b/vite.preload.config.ts index 8487510..f531aea 100644 --- a/vite.preload.config.ts +++ b/vite.preload.config.ts @@ -3,9 +3,10 @@ import { resolve } from "path"; // https://vitejs.dev/config export default defineConfig({ - resolve: { + resolve: { alias: { - "@": resolve(__dirname, "./src") + "@": resolve(__dirname, "./src"), + '@common': resolve(__dirname, './src/common'), }, }, }); diff --git a/vite.renderer.config.ts b/vite.renderer.config.ts index 9662aae..9cd1fc8 100644 --- a/vite.renderer.config.ts +++ b/vite.renderer.config.ts @@ -1,25 +1,34 @@ import { resolve } from "path"; -import vue from "@vitejs/plugin-vue"; -import { defineConfig } from "vite"; +import { defineConfig, type CSSOptions } from "vite"; // https://vitejs.dev/config -export default defineConfig({ - plugins: [vue()], - css: { - postcss: { - plugins: [require("tailwindcss"), require("autoprefixer")], +export default defineConfig(async () => { + const vue = (await import("@vitejs/plugin-vue")).default + const tailwindcss = (await import('@tailwindcss/vite')).default; + const autoImport = (await import('unplugin-auto-import/vite')).default; + + return { + plugins: [vue(), tailwindcss(), autoImport({ + imports: ['vue', 'vue-router', 'pinia', '@vueuse/core'], + dts: 'src/renderer/auto-imports.d.ts' + })], + + css: { + transformer: 'lightningcss' as CSSOptions['transformer'], }, - }, - resolve: { - preserveSymlinks: true, - alias: { - "@": resolve(__dirname, "./src/renderer"), - "@assets": resolve(__dirname, "./src/assets"), - "@store": resolve(__dirname, "./src/renderer/store"), - "@constant": resolve(__dirname, "./src/renderer/constant"), - "@utils": resolve(__dirname, "./src/renderer/utils"), - "@api": resolve(__dirname, "./src/renderer/api"), - "@/types": resolve(__dirname, "./src/renderer/types"), + + resolve: { + preserveSymlinks: true, + alias: { + "@": resolve(__dirname, "./src/renderer"), + "@api": resolve(__dirname, "./src/renderer/api"), + "@assets": resolve(__dirname, "./src/assets"), + '@common': resolve(__dirname, './src/common'), + "@constant": resolve(__dirname, "./src/renderer/constant"), + "@store": resolve(__dirname, "./src/renderer/store"), + "@utils": resolve(__dirname, "./src/renderer/utils"), + "@/types": resolve(__dirname, "./src/renderer/types"), + }, }, - }, + } });