From ac3bdf0e0c81ef0418270f84f830f3d41c61fa14 Mon Sep 17 00:00:00 2001 From: liRQ <813144884@qq.com> Date: Thu, 18 Jun 2026 14:39:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E6=8F=90=E4=BA=A4=EF=BC=9A?= =?UTF-8?q?=E7=BD=91=E7=9B=98=E7=AE=A1=E7=90=86=E8=B7=A8=E7=AB=AF=E5=BA=94?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .qoder/repowiki/knowledge/zh/_index.yaml | 112 + .../zh/网盘管理跨端应用/_module.yaml | 105 + .../knowledge/zh/网盘管理跨端应用/技术栈.md | 1 + .../knowledge/zh/网盘管理跨端应用/架构设计.md | 4 + .../knowledge/zh/网盘管理跨端应用/概述.md | 1 + .../zh/网盘管理跨端应用/特殊配置与命令.md | 1 + .../knowledge/zh/网盘管理跨端应用/编码规范.md | 2 + vue/.gitignore | 24 + vue/.vscode/extensions.json | 3 + vue/APK_BUILD_OPTIONS.md | 286 ++ vue/APP_GUIDE.md | 240 ++ vue/PACKAGING_SUMMARY.md | 274 ++ vue/README.md | 5 + vue/android/.gitignore | 101 + vue/android/app/.gitignore | 2 + vue/android/app/build.gradle | 54 + vue/android/app/capacitor.build.gradle | 21 + vue/android/app/proguard-rules.pro | 21 + .../myapp/ExampleInstrumentedTest.java | 26 + vue/android/app/src/main/AndroidManifest.xml | 41 + .../java/com/wangpan/app/MainActivity.java | 5 + .../main/res/drawable-land-hdpi/splash.png | Bin 0 -> 7705 bytes .../main/res/drawable-land-mdpi/splash.png | Bin 0 -> 4040 bytes .../main/res/drawable-land-xhdpi/splash.png | Bin 0 -> 9251 bytes .../main/res/drawable-land-xxhdpi/splash.png | Bin 0 -> 13984 bytes .../main/res/drawable-land-xxxhdpi/splash.png | Bin 0 -> 17683 bytes .../main/res/drawable-port-hdpi/splash.png | Bin 0 -> 7934 bytes .../main/res/drawable-port-mdpi/splash.png | Bin 0 -> 4096 bytes .../main/res/drawable-port-xhdpi/splash.png | Bin 0 -> 9875 bytes .../main/res/drawable-port-xxhdpi/splash.png | Bin 0 -> 13346 bytes .../main/res/drawable-port-xxxhdpi/splash.png | Bin 0 -> 17489 bytes .../drawable-v24/ic_launcher_foreground.xml | 34 + .../res/drawable/ic_launcher_background.xml | 170 + .../app/src/main/res/drawable/splash.png | Bin 0 -> 4040 bytes .../app/src/main/res/layout/activity_main.xml | 12 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2786 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 3450 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4341 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1869 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 2110 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2725 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3981 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 5036 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6593 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6644 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 9793 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10455 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9441 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 15529 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15916 bytes .../res/values/ic_launcher_background.xml | 4 + .../app/src/main/res/values/strings.xml | 7 + .../app/src/main/res/values/styles.xml | 22 + .../app/src/main/res/xml/file_paths.xml | 5 + .../getcapacitor/myapp/ExampleUnitTest.java | 18 + vue/android/build.gradle | 35 + vue/android/capacitor.settings.gradle | 12 + vue/android/gradle.properties | 22 + vue/android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43764 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + vue/android/gradlew | 251 ++ vue/android/gradlew.bat | 94 + vue/android/settings.gradle | 5 + vue/android/variables.gradle | 16 + vue/build-apk.bat | 52 + vue/capacitor.config.json | 20 + vue/index.html | 17 + vue/package-lock.json | 2434 +++++++++++++ vue/package.json | 25 + vue/public/logo.png | Bin 0 -> 123172 bytes vue/public/vite.svg | 3220 +++++++++++++++++ vue/src/App.vue | 1946 ++++++++++ vue/src/api/index.js | 689 ++++ vue/src/assets/vue.svg | 1 + vue/src/components/ConfirmDialog.vue | 210 ++ vue/src/components/DriveManageDialog.vue | 1544 ++++++++ vue/src/components/FolderDialog.vue | 101 + vue/src/components/FolderTree.vue | 58 + vue/src/components/IconManageDialog.vue | 780 ++++ vue/src/components/LoginView.vue | 297 ++ vue/src/components/PosterCard.vue | 54 + vue/src/components/RecordDialog.vue | 160 + vue/src/components/SimpleDialog.vue | 56 + vue/src/components/TreeNode.vue | 299 ++ vue/src/components/UserManageDialog.vue | 1340 +++++++ vue/src/main.js | 5 + vue/src/style.css | 2857 +++++++++++++++ vue/src/utils/captcha.js | 47 + vue/src/utils/data.js | 224 ++ vue/src/utils/scrollLock.js | 25 + vue/src/utils/storage.js | 21 + vue/vite.config.js | 19 + 94 files changed, 18554 insertions(+) create mode 100644 .qoder/repowiki/knowledge/zh/_index.yaml create mode 100644 .qoder/repowiki/knowledge/zh/网盘管理跨端应用/_module.yaml create mode 100644 .qoder/repowiki/knowledge/zh/网盘管理跨端应用/技术栈.md create mode 100644 .qoder/repowiki/knowledge/zh/网盘管理跨端应用/架构设计.md create mode 100644 .qoder/repowiki/knowledge/zh/网盘管理跨端应用/概述.md create mode 100644 .qoder/repowiki/knowledge/zh/网盘管理跨端应用/特殊配置与命令.md create mode 100644 .qoder/repowiki/knowledge/zh/网盘管理跨端应用/编码规范.md create mode 100644 vue/.gitignore create mode 100644 vue/.vscode/extensions.json create mode 100644 vue/APK_BUILD_OPTIONS.md create mode 100644 vue/APP_GUIDE.md create mode 100644 vue/PACKAGING_SUMMARY.md create mode 100644 vue/README.md create mode 100644 vue/android/.gitignore create mode 100644 vue/android/app/.gitignore create mode 100644 vue/android/app/build.gradle create mode 100644 vue/android/app/capacitor.build.gradle create mode 100644 vue/android/app/proguard-rules.pro create mode 100644 vue/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java create mode 100644 vue/android/app/src/main/AndroidManifest.xml create mode 100644 vue/android/app/src/main/java/com/wangpan/app/MainActivity.java create mode 100644 vue/android/app/src/main/res/drawable-land-hdpi/splash.png create mode 100644 vue/android/app/src/main/res/drawable-land-mdpi/splash.png create mode 100644 vue/android/app/src/main/res/drawable-land-xhdpi/splash.png create mode 100644 vue/android/app/src/main/res/drawable-land-xxhdpi/splash.png create mode 100644 vue/android/app/src/main/res/drawable-land-xxxhdpi/splash.png create mode 100644 vue/android/app/src/main/res/drawable-port-hdpi/splash.png create mode 100644 vue/android/app/src/main/res/drawable-port-mdpi/splash.png create mode 100644 vue/android/app/src/main/res/drawable-port-xhdpi/splash.png create mode 100644 vue/android/app/src/main/res/drawable-port-xxhdpi/splash.png create mode 100644 vue/android/app/src/main/res/drawable-port-xxxhdpi/splash.png create mode 100644 vue/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 vue/android/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 vue/android/app/src/main/res/drawable/splash.png create mode 100644 vue/android/app/src/main/res/layout/activity_main.xml create mode 100644 vue/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 vue/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 vue/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 vue/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 vue/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 vue/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 vue/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 vue/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 vue/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 vue/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 vue/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 vue/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 vue/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 vue/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 vue/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 vue/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 vue/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 vue/android/app/src/main/res/values/ic_launcher_background.xml create mode 100644 vue/android/app/src/main/res/values/strings.xml create mode 100644 vue/android/app/src/main/res/values/styles.xml create mode 100644 vue/android/app/src/main/res/xml/file_paths.xml create mode 100644 vue/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java create mode 100644 vue/android/build.gradle create mode 100644 vue/android/capacitor.settings.gradle create mode 100644 vue/android/gradle.properties create mode 100644 vue/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 vue/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 vue/android/gradlew create mode 100644 vue/android/gradlew.bat create mode 100644 vue/android/settings.gradle create mode 100644 vue/android/variables.gradle create mode 100644 vue/build-apk.bat create mode 100644 vue/capacitor.config.json create mode 100644 vue/index.html create mode 100644 vue/package-lock.json create mode 100644 vue/package.json create mode 100644 vue/public/logo.png create mode 100644 vue/public/vite.svg create mode 100644 vue/src/App.vue create mode 100644 vue/src/api/index.js create mode 100644 vue/src/assets/vue.svg create mode 100644 vue/src/components/ConfirmDialog.vue create mode 100644 vue/src/components/DriveManageDialog.vue create mode 100644 vue/src/components/FolderDialog.vue create mode 100644 vue/src/components/FolderTree.vue create mode 100644 vue/src/components/IconManageDialog.vue create mode 100644 vue/src/components/LoginView.vue create mode 100644 vue/src/components/PosterCard.vue create mode 100644 vue/src/components/RecordDialog.vue create mode 100644 vue/src/components/SimpleDialog.vue create mode 100644 vue/src/components/TreeNode.vue create mode 100644 vue/src/components/UserManageDialog.vue create mode 100644 vue/src/main.js create mode 100644 vue/src/style.css create mode 100644 vue/src/utils/captcha.js create mode 100644 vue/src/utils/data.js create mode 100644 vue/src/utils/scrollLock.js create mode 100644 vue/src/utils/storage.js create mode 100644 vue/vite.config.js diff --git a/.qoder/repowiki/knowledge/zh/_index.yaml b/.qoder/repowiki/knowledge/zh/_index.yaml new file mode 100644 index 0000000..b2cb594 --- /dev/null +++ b/.qoder/repowiki/knowledge/zh/_index.yaml @@ -0,0 +1,112 @@ +# 知识卡导出索引文件 +schema_version: 1 +locale: zh-CN +branch: Q0DeR-MaG1C-BrAnCh-Fo2-NoN-GiT-Or-No-C0MmIt +exported_at: "2026-06-12T08:09:05Z" +modules: + "": + dir_name: 网盘管理跨端应用 + title: 网盘管理跨端应用 + scope: + - vue\.gitignore + - vue\.vscode\extensions.json + - vue\APK_BUILD_OPTIONS.md + - vue\APP_GUIDE.md + - vue\PACKAGING_SUMMARY.md + - vue\README.md + - vue\android\.gitignore + - vue\android\app\.gitignore + - vue\android\app\build.gradle + - vue\android\app\capacitor.build.gradle + - vue\android\app\proguard-rules.pro + - vue\android\app\src\androidTest\java\com\getcapacitor\myapp\ExampleInstrumentedTest.java + - vue\android\app\src\main\AndroidManifest.xml + - vue\android\app\src\main\assets\capacitor.config.json + - vue\android\app\src\main\assets\capacitor.plugins.json + - vue\android\app\src\main\assets\public\assets\index-DrjxTYTT.css + - vue\android\app\src\main\assets\public\assets\index-xOoYtVTp.js + - vue\android\app\src\main\assets\public\cordova.js + - vue\android\app\src\main\assets\public\cordova_plugins.js + - vue\android\app\src\main\assets\public\index.html + - vue\android\app\src\main\assets\public\logo.png + - vue\android\app\src\main\assets\public\vite.svg + - vue\android\app\src\main\java\com\wangpan\app\MainActivity.java + - vue\android\app\src\main\res\drawable-land-hdpi\splash.png + - vue\android\app\src\main\res\drawable-land-mdpi\splash.png + - vue\android\app\src\main\res\drawable-land-xhdpi\splash.png + - vue\android\app\src\main\res\drawable-land-xxhdpi\splash.png + - vue\android\app\src\main\res\drawable-land-xxxhdpi\splash.png + - vue\android\app\src\main\res\drawable-port-hdpi\splash.png + - vue\android\app\src\main\res\drawable-port-mdpi\splash.png + - vue\android\app\src\main\res\drawable-port-xhdpi\splash.png + - vue\android\app\src\main\res\drawable-port-xxhdpi\splash.png + - vue\android\app\src\main\res\drawable-port-xxxhdpi\splash.png + - vue\android\app\src\main\res\drawable-v24\ic_launcher_foreground.xml + - vue\android\app\src\main\res\drawable\ic_launcher_background.xml + - vue\android\app\src\main\res\drawable\splash.png + - vue\android\app\src\main\res\layout\activity_main.xml + - vue\android\app\src\main\res\mipmap-anydpi-v26\ic_launcher.xml + - vue\android\app\src\main\res\mipmap-anydpi-v26\ic_launcher_round.xml + - vue\android\app\src\main\res\mipmap-hdpi\ic_launcher.png + - vue\android\app\src\main\res\mipmap-hdpi\ic_launcher_foreground.png + - vue\android\app\src\main\res\mipmap-hdpi\ic_launcher_round.png + - vue\android\app\src\main\res\mipmap-mdpi\ic_launcher.png + - vue\android\app\src\main\res\mipmap-mdpi\ic_launcher_foreground.png + - vue\android\app\src\main\res\mipmap-mdpi\ic_launcher_round.png + - vue\android\app\src\main\res\mipmap-xhdpi\ic_launcher.png + - vue\android\app\src\main\res\mipmap-xhdpi\ic_launcher_foreground.png + - vue\android\app\src\main\res\mipmap-xhdpi\ic_launcher_round.png + - vue\android\app\src\main\res\mipmap-xxhdpi\ic_launcher.png + - vue\android\app\src\main\res\mipmap-xxhdpi\ic_launcher_foreground.png + - vue\android\app\src\main\res\mipmap-xxhdpi\ic_launcher_round.png + - vue\android\app\src\main\res\mipmap-xxxhdpi\ic_launcher.png + - vue\android\app\src\main\res\mipmap-xxxhdpi\ic_launcher_foreground.png + - vue\android\app\src\main\res\mipmap-xxxhdpi\ic_launcher_round.png + - vue\android\app\src\main\res\values\ic_launcher_background.xml + - vue\android\app\src\main\res\values\strings.xml + - vue\android\app\src\main\res\values\styles.xml + - vue\android\app\src\main\res\xml\config.xml + - vue\android\app\src\main\res\xml\file_paths.xml + - vue\android\app\src\test\java\com\getcapacitor\myapp\ExampleUnitTest.java + - vue\android\build.gradle + - vue\android\capacitor-cordova-android-plugins\build.gradle + - vue\android\capacitor-cordova-android-plugins\cordova.variables.gradle + - vue\android\capacitor-cordova-android-plugins\src\main\AndroidManifest.xml + - vue\android\capacitor-cordova-android-plugins\src\main\java\.gitkeep + - vue\android\capacitor-cordova-android-plugins\src\main\res\.gitkeep + - vue\android\capacitor.settings.gradle + - vue\android\gradle.properties + - vue\android\gradle\wrapper\gradle-wrapper.jar + - vue\android\gradle\wrapper\gradle-wrapper.properties + - vue\android\gradlew + - vue\android\gradlew.bat + - vue\android\settings.gradle + - vue\android\variables.gradle + - vue\build-apk.bat + - vue\capacitor.config.json + - vue\index.html + - vue\package-lock.json + - vue\package.json + - vue\public\logo.png + - vue\public\vite.svg + - vue\src\App.vue + - vue\src\api\index.js + - vue\src\assets\vue.svg + - vue\src\components\DriveManageDialog.vue + - vue\src\components\FolderTree.vue + - vue\src\components\LoginView.vue + - vue\src\components\PosterCard.vue + - vue\src\components\RecordDialog.vue + - vue\src\components\SimpleDialog.vue + - vue\src\components\TreeNode.vue + - vue\src\components\UserManageDialog.vue + - vue\src\main.js + - vue\src\style.css + - vue\src\utils\captcha.js + - vue\src\utils\data.js + - vue\src\utils\storage.js + - vue\vite.config.js + source_files: [] + children: [] + depends_on: [] + related_to: [] diff --git a/.qoder/repowiki/knowledge/zh/网盘管理跨端应用/_module.yaml b/.qoder/repowiki/knowledge/zh/网盘管理跨端应用/_module.yaml new file mode 100644 index 0000000..a6b797e --- /dev/null +++ b/.qoder/repowiki/knowledge/zh/网盘管理跨端应用/_module.yaml @@ -0,0 +1,105 @@ +schema_version: 1 +module_path: "" +title: 网盘管理跨端应用 +scope: + - vue\.gitignore + - vue\.vscode\extensions.json + - vue\APK_BUILD_OPTIONS.md + - vue\APP_GUIDE.md + - vue\PACKAGING_SUMMARY.md + - vue\README.md + - vue\android\.gitignore + - vue\android\app\.gitignore + - vue\android\app\build.gradle + - vue\android\app\capacitor.build.gradle + - vue\android\app\proguard-rules.pro + - vue\android\app\src\androidTest\java\com\getcapacitor\myapp\ExampleInstrumentedTest.java + - vue\android\app\src\main\AndroidManifest.xml + - vue\android\app\src\main\assets\capacitor.config.json + - vue\android\app\src\main\assets\capacitor.plugins.json + - vue\android\app\src\main\assets\public\assets\index-DrjxTYTT.css + - vue\android\app\src\main\assets\public\assets\index-xOoYtVTp.js + - vue\android\app\src\main\assets\public\cordova.js + - vue\android\app\src\main\assets\public\cordova_plugins.js + - vue\android\app\src\main\assets\public\index.html + - vue\android\app\src\main\assets\public\logo.png + - vue\android\app\src\main\assets\public\vite.svg + - vue\android\app\src\main\java\com\wangpan\app\MainActivity.java + - vue\android\app\src\main\res\drawable-land-hdpi\splash.png + - vue\android\app\src\main\res\drawable-land-mdpi\splash.png + - vue\android\app\src\main\res\drawable-land-xhdpi\splash.png + - vue\android\app\src\main\res\drawable-land-xxhdpi\splash.png + - vue\android\app\src\main\res\drawable-land-xxxhdpi\splash.png + - vue\android\app\src\main\res\drawable-port-hdpi\splash.png + - vue\android\app\src\main\res\drawable-port-mdpi\splash.png + - vue\android\app\src\main\res\drawable-port-xhdpi\splash.png + - vue\android\app\src\main\res\drawable-port-xxhdpi\splash.png + - vue\android\app\src\main\res\drawable-port-xxxhdpi\splash.png + - vue\android\app\src\main\res\drawable-v24\ic_launcher_foreground.xml + - vue\android\app\src\main\res\drawable\ic_launcher_background.xml + - vue\android\app\src\main\res\drawable\splash.png + - vue\android\app\src\main\res\layout\activity_main.xml + - vue\android\app\src\main\res\mipmap-anydpi-v26\ic_launcher.xml + - vue\android\app\src\main\res\mipmap-anydpi-v26\ic_launcher_round.xml + - vue\android\app\src\main\res\mipmap-hdpi\ic_launcher.png + - vue\android\app\src\main\res\mipmap-hdpi\ic_launcher_foreground.png + - vue\android\app\src\main\res\mipmap-hdpi\ic_launcher_round.png + - vue\android\app\src\main\res\mipmap-mdpi\ic_launcher.png + - vue\android\app\src\main\res\mipmap-mdpi\ic_launcher_foreground.png + - vue\android\app\src\main\res\mipmap-mdpi\ic_launcher_round.png + - vue\android\app\src\main\res\mipmap-xhdpi\ic_launcher.png + - vue\android\app\src\main\res\mipmap-xhdpi\ic_launcher_foreground.png + - vue\android\app\src\main\res\mipmap-xhdpi\ic_launcher_round.png + - vue\android\app\src\main\res\mipmap-xxhdpi\ic_launcher.png + - vue\android\app\src\main\res\mipmap-xxhdpi\ic_launcher_foreground.png + - vue\android\app\src\main\res\mipmap-xxhdpi\ic_launcher_round.png + - vue\android\app\src\main\res\mipmap-xxxhdpi\ic_launcher.png + - vue\android\app\src\main\res\mipmap-xxxhdpi\ic_launcher_foreground.png + - vue\android\app\src\main\res\mipmap-xxxhdpi\ic_launcher_round.png + - vue\android\app\src\main\res\values\ic_launcher_background.xml + - vue\android\app\src\main\res\values\strings.xml + - vue\android\app\src\main\res\values\styles.xml + - vue\android\app\src\main\res\xml\config.xml + - vue\android\app\src\main\res\xml\file_paths.xml + - vue\android\app\src\test\java\com\getcapacitor\myapp\ExampleUnitTest.java + - vue\android\build.gradle + - vue\android\capacitor-cordova-android-plugins\build.gradle + - vue\android\capacitor-cordova-android-plugins\cordova.variables.gradle + - vue\android\capacitor-cordova-android-plugins\src\main\AndroidManifest.xml + - vue\android\capacitor-cordova-android-plugins\src\main\java\.gitkeep + - vue\android\capacitor-cordova-android-plugins\src\main\res\.gitkeep + - vue\android\capacitor.settings.gradle + - vue\android\gradle.properties + - vue\android\gradle\wrapper\gradle-wrapper.jar + - vue\android\gradle\wrapper\gradle-wrapper.properties + - vue\android\gradlew + - vue\android\gradlew.bat + - vue\android\settings.gradle + - vue\android\variables.gradle + - vue\build-apk.bat + - vue\capacitor.config.json + - vue\index.html + - vue\package-lock.json + - vue\package.json + - vue\public\logo.png + - vue\public\vite.svg + - vue\src\App.vue + - vue\src\api\index.js + - vue\src\assets\vue.svg + - vue\src\components\DriveManageDialog.vue + - vue\src\components\FolderTree.vue + - vue\src\components\LoginView.vue + - vue\src\components\PosterCard.vue + - vue\src\components\RecordDialog.vue + - vue\src\components\SimpleDialog.vue + - vue\src\components\TreeNode.vue + - vue\src\components\UserManageDialog.vue + - vue\src\main.js + - vue\src\style.css + - vue\src\utils\captcha.js + - vue\src\utils\data.js + - vue\src\utils\storage.js + - vue\vite.config.js +source_files: [] +depends_on: [] +related_to: [] diff --git a/.qoder/repowiki/knowledge/zh/网盘管理跨端应用/技术栈.md b/.qoder/repowiki/knowledge/zh/网盘管理跨端应用/技术栈.md new file mode 100644 index 0000000..caf28a1 --- /dev/null +++ b/.qoder/repowiki/knowledge/zh/网盘管理跨端应用/技术栈.md @@ -0,0 +1 @@ +Vue 3.5, Vite 7, Capacitor 8, Android Gradle Plugin \ No newline at end of file diff --git a/.qoder/repowiki/knowledge/zh/网盘管理跨端应用/架构设计.md b/.qoder/repowiki/knowledge/zh/网盘管理跨端应用/架构设计.md new file mode 100644 index 0000000..0e08580 --- /dev/null +++ b/.qoder/repowiki/knowledge/zh/网盘管理跨端应用/架构设计.md @@ -0,0 +1,4 @@ +- **前端架构**:采用 Vite + Vue 3 (Composition API) 技术栈,通过 `src/api/index.js` 封装 RESTful 请求并处理 Token 鉴权。 +- **跨端桥接**:利用 Capacitor 8 将 Web 应用(`dist` 目录)嵌入原生 Android Shell (`BridgeActivity`),实现从 Web 到 Native 的无缝转换。 +- **配置管理**:通过 `capacitor.config.json` 定义应用 ID、启动屏及状态栏样式,并通过 `vite.config.js` 代理后端 API 请求。 +- **构建流程**:遵循“Vite 构建 Web -> Cap sync 同步资源 -> Gradle 编译 APK”的标准化流水线,由 `build-apk.bat` 脚本自动化执行。 \ No newline at end of file diff --git a/.qoder/repowiki/knowledge/zh/网盘管理跨端应用/概述.md b/.qoder/repowiki/knowledge/zh/网盘管理跨端应用/概述.md new file mode 100644 index 0000000..a504770 --- /dev/null +++ b/.qoder/repowiki/knowledge/zh/网盘管理跨端应用/概述.md @@ -0,0 +1 @@ +基于 Vue 3 与 Capacitor 构建的网盘资源管理与海报展示跨端应用,支持 Android APK 打包。 \ No newline at end of file diff --git a/.qoder/repowiki/knowledge/zh/网盘管理跨端应用/特殊配置与命令.md b/.qoder/repowiki/knowledge/zh/网盘管理跨端应用/特殊配置与命令.md new file mode 100644 index 0000000..bfc7aa9 --- /dev/null +++ b/.qoder/repowiki/knowledge/zh/网盘管理跨端应用/特殊配置与命令.md @@ -0,0 +1 @@ +- **APK 打包**:运行根目录下的 `build-apk.bat` 脚本,自动完成 Web 资源构建、Capacitor 同步并唤起 Android Studio 进行最终编译。 \ No newline at end of file diff --git a/.qoder/repowiki/knowledge/zh/网盘管理跨端应用/编码规范.md b/.qoder/repowiki/knowledge/zh/网盘管理跨端应用/编码规范.md new file mode 100644 index 0000000..ab9fc8b --- /dev/null +++ b/.qoder/repowiki/knowledge/zh/网盘管理跨端应用/编码规范.md @@ -0,0 +1,2 @@ +- API 模块统一在 `src/api/index.js` 中导出,使用自定义 `request` 包装器处理全局认证头与 401/403 状态分发。 +- 组件采用 ` + + diff --git a/vue/package-lock.json b/vue/package-lock.json new file mode 100644 index 0000000..cc54867 --- /dev/null +++ b/vue/package-lock.json @@ -0,0 +1,2434 @@ +{ + "name": "vue", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "vue", + "version": "0.0.0", + "dependencies": { + "@capacitor/android": "^8.4.0", + "@capacitor/app": "^8.1.0", + "@capacitor/cli": "^8.4.0", + "@capacitor/core": "^8.4.0", + "@capacitor/ios": "^8.4.0", + "@capacitor/splash-screen": "^8.0.1", + "@capacitor/status-bar": "^8.0.2", + "vue": "^3.5.17" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.0", + "vite": "^7.0.4" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@capacitor/android": { + "version": "8.4.0", + "resolved": "https://registry.npmmirror.com/@capacitor/android/-/android-8.4.0.tgz", + "integrity": "sha512-K1ZPkQzvRzPEALz9nBdLx5p5nAPzp5fsTYWk7LRiKZeH/NXqjDvqfTv7lrLgrziQNoDeaL6ijg64oBREzXiV+g==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": "^8.4.0" + } + }, + "node_modules/@capacitor/app": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/@capacitor/app/-/app-8.1.0.tgz", + "integrity": "sha512-MlmttTOWHDedr/G4SrhNRxsXMqY+R75S4MM4eIgzsgCzOYhb/MpCkA5Q3nuOCfL1oHm26xjUzqZ5aupbOwdfYg==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": ">=8.0.0" + } + }, + "node_modules/@capacitor/cli": { + "version": "8.4.0", + "resolved": "https://registry.npmmirror.com/@capacitor/cli/-/cli-8.4.0.tgz", + "integrity": "sha512-5Z9RKHxiqJYRTLrfMeZmzR4qrlg5B85MxsWZ5goyXsLkO3bgpW9a1qV/6fR1SX9s5gwLza5y7PZVwITl/hDJ7g==", + "license": "MIT", + "dependencies": { + "@ionic/cli-framework-output": "^2.2.8", + "@ionic/utils-subprocess": "^3.0.1", + "@ionic/utils-terminal": "^2.3.5", + "commander": "^12.1.0", + "debug": "^4.4.0", + "env-paths": "^2.2.0", + "fs-extra": "^11.2.0", + "kleur": "^4.1.5", + "native-run": "^2.0.3", + "open": "^8.4.0", + "plist": "^3.1.0", + "prompts": "^2.4.2", + "rimraf": "^6.0.1", + "semver": "^7.6.3", + "tar": "^7.5.3", + "tslib": "^2.8.1", + "xml2js": "^0.6.2" + }, + "bin": { + "cap": "bin/capacitor", + "capacitor": "bin/capacitor" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@capacitor/core": { + "version": "8.4.0", + "resolved": "https://registry.npmmirror.com/@capacitor/core/-/core-8.4.0.tgz", + "integrity": "sha512-LrS1xPIrqLtJABBIPDGXxxKmI9OyesrzWw8DiHbxhSC9JoiLUleUAJlX1a0LWIVLRbuY4Szgf9huFeRqYH2SAQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@capacitor/ios": { + "version": "8.4.0", + "resolved": "https://registry.npmmirror.com/@capacitor/ios/-/ios-8.4.0.tgz", + "integrity": "sha512-tnwstEdbTJ2nHAfoAwnurXgYRscWeLY+IIGdz69o24gN2Crfj9Xc0TWo8L5uFLF1LmpbUywH1IT0U1oHV8c+CA==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": "^8.4.0" + } + }, + "node_modules/@capacitor/splash-screen": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/@capacitor/splash-screen/-/splash-screen-8.0.1.tgz", + "integrity": "sha512-c/ew/Z3eA7z8l06WoRAtzVF16VwYYrExmHmfGq1Cg675pVzaC/yuucB8/1xG1vhEfnW4fZ1KhSf/kzR1RiVYgg==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": ">=8.0.0" + } + }, + "node_modules/@capacitor/status-bar": { + "version": "8.0.2", + "resolved": "https://registry.npmmirror.com/@capacitor/status-bar/-/status-bar-8.0.2.tgz", + "integrity": "sha512-WXs8YB8B9eEaPZz+bcdY6t2nForF1FLoj/JU0Dl9RRgQnddnS98FEEyDooQhaY7wivr000j4+SC1FyeJkrFO7A==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": ">=8.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@ionic/cli-framework-output": { + "version": "2.2.8", + "resolved": "https://registry.npmmirror.com/@ionic/cli-framework-output/-/cli-framework-output-2.2.8.tgz", + "integrity": "sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==", + "license": "MIT", + "dependencies": { + "@ionic/utils-terminal": "2.3.5", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-array": { + "version": "2.1.6", + "resolved": "https://registry.npmmirror.com/@ionic/utils-array/-/utils-array-2.1.6.tgz", + "integrity": "sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==", + "license": "MIT", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-fs": { + "version": "3.1.7", + "resolved": "https://registry.npmmirror.com/@ionic/utils-fs/-/utils-fs-3.1.7.tgz", + "integrity": "sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==", + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^8.0.0", + "debug": "^4.0.0", + "fs-extra": "^9.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-fs/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@ionic/utils-object": { + "version": "2.1.6", + "resolved": "https://registry.npmmirror.com/@ionic/utils-object/-/utils-object-2.1.6.tgz", + "integrity": "sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==", + "license": "MIT", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-process": { + "version": "2.1.12", + "resolved": "https://registry.npmmirror.com/@ionic/utils-process/-/utils-process-2.1.12.tgz", + "integrity": "sha512-Jqkgyq7zBs/v/J3YvKtQQiIcxfJyplPgECMWgdO0E1fKrrH8EF0QGHNJ9mJCn6PYe2UtHNS8JJf5G21e09DfYg==", + "license": "MIT", + "dependencies": { + "@ionic/utils-object": "2.1.6", + "@ionic/utils-terminal": "2.3.5", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "tree-kill": "^1.2.2", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmmirror.com/@ionic/utils-stream/-/utils-stream-3.1.7.tgz", + "integrity": "sha512-eSELBE7NWNFIHTbTC2jiMvh1ABKGIpGdUIvARsNPMNQhxJB3wpwdiVnoBoTYp+5a6UUIww4Kpg7v6S7iTctH1w==", + "license": "MIT", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-subprocess": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/@ionic/utils-subprocess/-/utils-subprocess-3.0.1.tgz", + "integrity": "sha512-cT4te3AQQPeIM9WCwIg8ohroJ8TjsYaMb2G4ZEgv9YzeDqHZ4JpeIKqG2SoaA3GmVQ3sOfhPM6Ox9sxphV/d1A==", + "license": "MIT", + "dependencies": { + "@ionic/utils-array": "2.1.6", + "@ionic/utils-fs": "3.1.7", + "@ionic/utils-process": "2.1.12", + "@ionic/utils-stream": "3.1.7", + "@ionic/utils-terminal": "2.3.5", + "cross-spawn": "^7.0.3", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-terminal": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@ionic/utils-terminal/-/utils-terminal-2.3.5.tgz", + "integrity": "sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==", + "license": "MIT", + "dependencies": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.61.1.tgz", + "integrity": "sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.61.1.tgz", + "integrity": "sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.61.1.tgz", + "integrity": "sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.61.1.tgz", + "integrity": "sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.61.1.tgz", + "integrity": "sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.61.1.tgz", + "integrity": "sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.61.1.tgz", + "integrity": "sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.61.1.tgz", + "integrity": "sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.61.1.tgz", + "integrity": "sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.61.1.tgz", + "integrity": "sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.61.1.tgz", + "integrity": "sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.61.1.tgz", + "integrity": "sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.61.1.tgz", + "integrity": "sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.61.1.tgz", + "integrity": "sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.61.1.tgz", + "integrity": "sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.61.1.tgz", + "integrity": "sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.61.1.tgz", + "integrity": "sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.61.1.tgz", + "integrity": "sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.61.1.tgz", + "integrity": "sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.61.1.tgz", + "integrity": "sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.61.1.tgz", + "integrity": "sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.61.1.tgz", + "integrity": "sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.61.1.tgz", + "integrity": "sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.61.1.tgz", + "integrity": "sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.61.1.tgz", + "integrity": "sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/fs-extra": { + "version": "8.1.5", + "resolved": "https://registry.npmmirror.com/@types/fs-extra/-/fs-extra-8.1.5.tgz", + "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "25.9.2", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-25.9.2.tgz", + "integrity": "sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==", + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.7.tgz", + "integrity": "sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.35.tgz", + "integrity": "sha512-BUmHaR1J+O+CKZ9uJucdVTEr1LHsdyvv7vG3eNRhK3CczEHeMd/LtsHAuD7PbrxvI2envCY2v7HI1vC1aBRzKw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@vue/shared": "3.5.35", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.35.tgz", + "integrity": "sha512-k+bprkXxuqhVajgTx5mUHuir7TwQzUKOWR40ng1ncAqQRPnrLngGGgqVEEhOnTMlc8btHYVKmrP8s5Qyg0hvYA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.35", + "@vue/shared": "3.5.35" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.35.tgz", + "integrity": "sha512-G5VPMcXTSywXBgtFOZOnHKBxKSrwXUcvY1iaF5/hRcy7t0J6CH/d8ha9F4nzi00Fax1eLV0QHM7v4mQu68jydw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@vue/compiler-core": "3.5.35", + "@vue/compiler-dom": "3.5.35", + "@vue/compiler-ssr": "3.5.35", + "@vue/shared": "3.5.35", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.15", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.35.tgz", + "integrity": "sha512-rGhAeXgdM7/ffTJGXT69rCCdTmjDewnFuUZfBQQHTdcEBeWdT5HCGY60y2ytLJr9/Dsu7IntUi5z/w0h6Rjnzw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.35", + "@vue/shared": "3.5.35" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.35.tgz", + "integrity": "sha512-tVc+SsHConvh/Lz64qq1pP3rYArBmK42xonovEcxY74SQtvctZodG/zhq54P5dr38cVuw25d27cPNRdlMidpGQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.35" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.35.tgz", + "integrity": "sha512-A/xFNX9loIcWDygeQuNCfKuh0CoYBzxhqEMNah5TSFg9Z53DrFYEN2qi5CU9necjM1OWYegYREUTHmXTmhfXtg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.35", + "@vue/shared": "3.5.35" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.35.tgz", + "integrity": "sha512-odrJ1C391dbGnyDRh8U+rnP7J2amIEzfmRk5vXy7xi3aZhEXofTvpi0T4HJb6jlNqQZTNPR5MPHSB3RHNkIORA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.35", + "@vue/runtime-core": "3.5.35", + "@vue/shared": "3.5.35", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.35.tgz", + "integrity": "sha512-NkebSOYdB97wi8OQcO3HqzZSlymJi/aWsN/7h74OSVhRTm6qGs3Jp3e0rCXynmWwSlKeRrnlIug+ilYoHBmQDA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.35", + "@vue/shared": "3.5.35" + }, + "peerDependencies": { + "vue": "3.5.35" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.35.tgz", + "integrity": "sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==", + "license": "MIT" + }, + "node_modules/@xmldom/xmldom": { + "version": "0.9.10", + "resolved": "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.9.10.tgz", + "integrity": "sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==", + "license": "MIT", + "engines": { + "node": ">=14.6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmmirror.com/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "license": "MIT", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/elementtree": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", + "license": "Apache-2.0", + "dependencies": { + "sax": "1.1.4" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmmirror.com/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmmirror.com/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lru-cache": { + "version": "11.5.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/native-run": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/native-run/-/native-run-2.0.3.tgz", + "integrity": "sha512-U1PllBuzW5d1gfan+88L+Hky2eZx+9gv3Pf6rNBxKbORxi7boHzqiA6QFGSnqMem4j0A9tZ08NMIs5+0m/VS1Q==", + "license": "MIT", + "dependencies": { + "@ionic/utils-fs": "^3.1.7", + "@ionic/utils-terminal": "^2.3.4", + "bplist-parser": "^0.3.2", + "debug": "^4.3.4", + "elementtree": "^0.1.7", + "ini": "^4.1.1", + "plist": "^3.1.0", + "split2": "^4.2.0", + "through2": "^4.0.2", + "tslib": "^2.6.2", + "yauzl": "^2.10.0" + }, + "bin": { + "native-run": "bin/native-run" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmmirror.com/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/plist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/plist/-/plist-3.1.1.tgz", + "integrity": "sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.9.10", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rimraf": { + "version": "6.1.3", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-6.1.3.tgz", + "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^13.0.3", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.61.1.tgz", + "integrity": "sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.61.1", + "@rollup/rollup-android-arm64": "4.61.1", + "@rollup/rollup-darwin-arm64": "4.61.1", + "@rollup/rollup-darwin-x64": "4.61.1", + "@rollup/rollup-freebsd-arm64": "4.61.1", + "@rollup/rollup-freebsd-x64": "4.61.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.61.1", + "@rollup/rollup-linux-arm-musleabihf": "4.61.1", + "@rollup/rollup-linux-arm64-gnu": "4.61.1", + "@rollup/rollup-linux-arm64-musl": "4.61.1", + "@rollup/rollup-linux-loong64-gnu": "4.61.1", + "@rollup/rollup-linux-loong64-musl": "4.61.1", + "@rollup/rollup-linux-ppc64-gnu": "4.61.1", + "@rollup/rollup-linux-ppc64-musl": "4.61.1", + "@rollup/rollup-linux-riscv64-gnu": "4.61.1", + "@rollup/rollup-linux-riscv64-musl": "4.61.1", + "@rollup/rollup-linux-s390x-gnu": "4.61.1", + "@rollup/rollup-linux-x64-gnu": "4.61.1", + "@rollup/rollup-linux-x64-musl": "4.61.1", + "@rollup/rollup-openbsd-x64": "4.61.1", + "@rollup/rollup-openharmony-arm64": "4.61.1", + "@rollup/rollup-win32-arm64-msvc": "4.61.1", + "@rollup/rollup-win32-ia32-msvc": "4.61.1", + "@rollup/rollup-win32-x64-gnu": "4.61.1", + "@rollup/rollup-win32-x64-msvc": "4.61.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", + "license": "ISC" + }, + "node_modules/semver": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.3.tgz", + "integrity": "sha512-wnilbGyMxzbY7dNOl7jpKbLSjcfeweJWU5j4+u5qW+6/wuGD9KzIGOyZnQVSBM9E7DtWaaH3CyHkppYrKYoxwg==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "7.5.16", + "resolved": "https://registry.npmmirror.com/tar/-/tar-7.5.16.tgz", + "integrity": "sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "license": "MIT", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.5.tgz", + "integrity": "sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.35.tgz", + "integrity": "sha512-cx89fnr+0kVGHiNFG6y6s0bdjypJRFNZn6x3WPstNdQR1bi1mbB7h4v5IBGTsPJU3nK1+0Iqj3Zf+hZWMieR4Q==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.35", + "@vue/compiler-sfc": "3.5.35", + "@vue/runtime-dom": "3.5.35", + "@vue/server-renderer": "3.5.35", + "@vue/shared": "3.5.35" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/vue/package.json b/vue/package.json new file mode 100644 index 0000000..3355124 --- /dev/null +++ b/vue/package.json @@ -0,0 +1,25 @@ +{ + "name": "vue", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@capacitor/android": "^8.4.0", + "@capacitor/app": "^8.1.0", + "@capacitor/cli": "^8.4.0", + "@capacitor/core": "^8.4.0", + "@capacitor/ios": "^8.4.0", + "@capacitor/splash-screen": "^8.0.1", + "@capacitor/status-bar": "^8.0.2", + "vue": "^3.5.17" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.0", + "vite": "^7.0.4" + } +} diff --git a/vue/public/logo.png b/vue/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f48003881e359a34517dd4981d17a873a26d0d53 GIT binary patch literal 123172 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%0DjnQnR&nXKT_cv5y zeu9%Ho~8}C`~vWwJIaTR^A$jn!rOJY_H|iM*%bAkV1e65)`A-3ntuQ=oT4^OOuR)p zP6Q|*FnVjHiC(hENW@FjjE{rTi+o4nK+TAhwEwZy*=M3Lwo_6jeL}P51nBm{d$RQ>kk;&uN1710fQ%`O<{JOp~1GL!ut^Clj4-XVSf4*bhJDFb6R3AD~@Ot!j&D*~! zoEZf!#Cu1doIG>zUF5@)15avtb>oy(gIj$Ft=FE;zxIU$d7#jSL3GgnUmYWR>yK(2 z`t~w?(d|E1+y1IKG1Ss^Zn4zprC1qpjox0H`aIIWrYZ2nb^@^TpE$Ll#Pd6|W+By) z3nMlb#h3mrZ6TjO7n4^~bBB4c;?YyY?WDi0e{O2n#nAN5(Ub|6>F9NQLS`N2$8(WB zvBFr-iK@bKa?gd(8PiZ86MEHW|2eX_R{!`~t>&c@Rg+rX$%fm_yu|lF_lYSw41Z?g9%WVnK-!b5mD|`I{zUzB+3Mevd&wpO=MvAwl@=j zXh|ghsX)DnsU&%q1F!H3!wicKGg8G802Qim%tv$kM^vHTNk>t+{YYh$hR#$MdvZ<2Gc5Wk7qdT|Q3i*b_R4 zYny~FW6h^R-4xNuM*JgA1mkrTW~1B1=sGh-^lta5T5yUW7^)uqkOIpjK%c`Uj^@6I zPM5IVs6l)7aO*L8a}E$_Aa--M5f}79aG?{%y=0P6-b+s||@!9?P26SHQBus{r zKD^B`6Zma#r9D7-I-0_|oF#ofS-0ck(HJXic)xN#aq0-v;m$*Ot5efY?3zTodK0-} z+$~a{mA=59eS|~Eg zLobKzbRr&{{THx5=kWZ^==a@Ae%ji}u@81Wul^E5 zonNorIM}mO-(ZERH+Pn2e>#hq(02dYS|!N={brX#v_?>EtYJbxW%-WW9_5;Z?H?X8&K?AOlE)}IXHUDY2z%W`<#RWfB@f&)+g*lbZ)0(VKUURwfc6II|B z5x*Q!$8LM0>wD7op?MJ7XKB7};Mmg6B|p+m^6Jm{BkfRf@dJfviMKkyfD##w^L?aG zA0rt)RkJ4i8T&KtVuQw)wk4|GL3bsA`v0y08N~l-^)pV5D9&qoX=B3gBpeb>?Z3^RQ_956@kpdfv%Bm2aW%Hw!gEog1nT{r8&tqex%Ii{9y5yBRZ<>H({U zI|sa*qMF=1aNiC8`0MtrTV13f-zbY3tKZ!kpO2pvLT__)gVf6I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vue/src/App.vue b/vue/src/App.vue new file mode 100644 index 0000000..92de3c8 --- /dev/null +++ b/vue/src/App.vue @@ -0,0 +1,1946 @@ + + + diff --git a/vue/src/api/index.js b/vue/src/api/index.js new file mode 100644 index 0000000..f4bc3ae --- /dev/null +++ b/vue/src/api/index.js @@ -0,0 +1,689 @@ +import { reactive } from 'vue' +import { AUTH_SESSION_STORAGE_KEY, readStorage, removeStorage } from '../utils/storage' +import { createLoginLog } from '../utils/data' + +const API_BASE_URL = '/api' +const TOKEN_EXPIRING_SOON_MS = 10 * 60 * 1000 + +/** + * 全局请求状态(响应式) + * pendingCount > 0 表示有请求正在进行 + */ +export const requestState = reactive({ pendingCount: 0 }) + +function getAuthSession() { + return readStorage(AUTH_SESSION_STORAGE_KEY, null) +} + +function isSessionExpired(session) { + if (!session?.token) return true + if (!session?.expiresAt) return false + return Date.now() >= session.expiresAt +} + +function clearExpiredSession() { + removeStorage(AUTH_SESSION_STORAGE_KEY) +} + +function dispatchUnauthorized(reason = '登录状态已失效,请重新登录') { + if (typeof window === 'undefined') return + window.dispatchEvent(new CustomEvent('wangpan:unauthorized', { detail: { reason } })) +} + +function dispatchForbidden(reason = '当前账号无权执行此操作') { + if (typeof window === 'undefined') return + window.dispatchEvent(new CustomEvent('wangpan:forbidden', { detail: { reason } })) +} + +function dispatchSessionExpiring(reason = '登录状态将在 10 分钟内过期,请注意及时重新登录') { + if (typeof window === 'undefined') return + window.dispatchEvent(new CustomEvent('wangpan:session-expiring', { detail: { reason } })) +} + +function notifySessionExpiring(session) { + if (!session?.expiresAt || session?.expiringSoonNotified) return + const remainingMs = session.expiresAt - Date.now() + if (remainingMs > 0 && remainingMs <= TOKEN_EXPIRING_SOON_MS) { + const nextSession = { + ...session, + expiringSoonNotified: true, + } + localStorage.setItem(AUTH_SESSION_STORAGE_KEY, JSON.stringify(nextSession)) + dispatchSessionExpiring() + } +} + +function buildAuthHeaders(extraHeaders = {}) { + const session = getAuthSession() + if (isSessionExpired(session)) { + clearExpiredSession() + return extraHeaders + } + + const token = session?.token + const tokenType = session?.tokenType || 'Bearer' + + if (!token) { + return extraHeaders + } + + return { + Authorization: `${tokenType} ${token}`, + ...extraHeaders, + } +} + +async function request(url, options = {}) { + // 延迟显示:150ms内完成的请求不显示加载动画(避免闪烁) + let showTimer = null + let incremented = false + if (!options.silent) { + showTimer = setTimeout(() => { requestState.pendingCount++; incremented = true }, 150) + } + + const session = getAuthSession() + const requiresAuth = options.requiresAuth !== false + + if (requiresAuth && isSessionExpired(session)) { + clearTimeout(showTimer) + clearExpiredSession() + dispatchUnauthorized('登录已过期,请重新登录') + const error = new Error('登录已过期,请重新登录') + error.status = 401 + error.code = 401 + throw error + } + + if (requiresAuth) { + notifySessionExpiring(session) + } + + try { + console.log(`[API Request] ${options.method || 'GET'} ${url}`) + + const isFormData = options.body instanceof FormData + const response = await fetch(url, { + headers: { + ...(isFormData ? {} : { 'Content-Type': 'application/json' }), + ...buildAuthHeaders(options.headers || {}), + }, + ...options, + }) + + const contentType = response.headers.get('content-type') || '' + const data = contentType.includes('application/json') ? await response.json() : null + + console.log(`[API Response] ${response.status}`, data) + + if (!response.ok) { + if (response.status === 401) { + clearExpiredSession() + dispatchUnauthorized(data?.message || '登录状态已失效,请重新登录') + } + + if (response.status === 403) { + dispatchForbidden(data?.message || '当前账号无权执行此操作') + } + + const error = new Error(data?.message || `请求失败:${response.status}`) + error.status = response.status + error.code = data?.code ?? response.status + error.payload = data + throw error + } + + return data + } catch (err) { + // 网络错误(如 Failed to fetch) + if (err.name === 'TypeError' && err.message === 'Failed to fetch') { + console.error('[Network Error] 无法连接到后端服务,请检查:') + console.error('1. 后端服务是否启动在 http://localhost:8888') + console.error('2. 是否有 CORS 跨域问题') + console.error('3. 网络连接是否正常') + + const networkError = new Error('无法连接到后端服务,请检查后端是否启动') + networkError.isNetworkError = true + throw networkError + } + + // 其他错误直接抛出 + throw err + } finally { + clearTimeout(showTimer) + if (incremented) { + requestState.pendingCount-- + } + } +} + +export function login(payload) { + return request(`${API_BASE_URL}/login`, { + method: 'POST', + requiresAuth: false, + body: JSON.stringify({ + username: payload.username, + password: payload.password, + }), + }) +} + +export function register(payload) { + const body = { username: payload.username, password: payload.password } + if (payload.email) body.email = payload.email + if (payload.phone) body.phone = payload.phone + return request(`${API_BASE_URL}/register`, { + method: 'POST', + requiresAuth: false, + body: JSON.stringify(body), + }) +} + +export function fetchDashboardData() { + return Promise.resolve({ + code: 200, + data: [], + }) +} + +export function saveRecord(payload) { + return Promise.resolve({ + code: 200, + data: payload, + }) +} + +export function deleteRecord(id) { + return Promise.resolve({ + code: 200, + data: { id }, + }) +} + +export function exportData() { + return Promise.resolve({ + code: 200, + data: {}, + }) +} + +export function resetData() { + return Promise.resolve({ + code: 200, + data: [], + }) +} + +export function fetchLoginLogs(params = {}) { + const searchParams = new URLSearchParams() + if (params.userId) searchParams.set('userId', String(params.userId)) + if (params.username) searchParams.set('username', params.username) + if (params.result) searchParams.set('result', params.result) + if (params.startDate) searchParams.set('startDate', params.startDate) + if (params.endDate) searchParams.set('endDate', params.endDate) + if (params.pageNo) searchParams.set('pageNo', String(params.pageNo)) + if (params.pageSize) searchParams.set('pageSize', String(params.pageSize)) + + const query = searchParams.toString() + return request(`${API_BASE_URL}/login-logs${query ? `?${query}` : ''}`, { + method: 'GET', + }).then((res) => ({ + ...res, + data: { + ...(res?.data || {}), + list: Array.isArray(res?.data?.list) + ? res.data.list.map((item) => + createLoginLog( + item?.userAgent || '未知设备', + item?.loginIp || '127.0.0.1', + { + id: item?.id, + time: item?.loginTime, + hashSeed: `${item?.userId || ''}-${item?.loginUsername || ''}-${item?.loginTime || ''}`, + username: item?.loginUsername, + result: item?.loginResult, + userId: item?.userId, + rawUserAgent: item?.userAgent, + failReason: item?.failReason, + }, + ), + ) + : [], + total: res?.data?.total || 0, // 返回总记录数 + }, + })) +} + +export function fetchTmdbConfig() { + return request(`${API_BASE_URL}/tmdb/key`, { + method: 'GET', + }) +} + +export function saveTmdbConfig(payload) { + return request(`${API_BASE_URL}/tmdb/key`, { + method: 'POST', + body: JSON.stringify({ + tmdbApiKey: payload.tmdbApiKey, + }), + }) +} + +// ==================== 网盘管理 API ==================== + +/** + * 创建网盘 + * @param {Object} payload - { name, description, logoData } + * @returns {Promise} + */ +export function createDrive(payload) { + return request(`${API_BASE_URL}/drive`, { + method: 'POST', + body: JSON.stringify({ + name: payload.name, + description: payload.description || '', + logoData: payload.logoData || '', + }), + }) +} + +/** + * 查询网盘列表 + * @param {Object} params - { pageNo, pageSize } + * @returns {Promise} + */ +export function fetchDriveList(params = {}) { + const searchParams = new URLSearchParams() + if (params.pageNo) searchParams.set('pageNo', String(params.pageNo)) + if (params.pageSize) searchParams.set('pageSize', String(params.pageSize)) + + const query = searchParams.toString() + return request(`${API_BASE_URL}/drive${query ? `?${query}` : ''}`, { + method: 'GET', + }) +} + +/** + * 删除网盘 + * @param {string} driveId - 网盘ID + * @returns {Promise} + */ +export function deleteDrive(driveId) { + return request(`${API_BASE_URL}/drive/${driveId}`, { + method: 'DELETE', + }) +} + +/** + * 更新网盘 + * @param {string} driveId - 网盘ID + * @param {Object} payload - { name, description, logoData } + * @returns {Promise} + */ +export function updateDrive(driveId, payload) { + return request(`${API_BASE_URL}/drive/${driveId}`, { + method: 'PUT', + body: JSON.stringify({ + name: payload.name, + description: payload.description, + logoData: payload.logoData, + }), + }) +} + +// ==================== 文件夹管理 API ==================== + +/** + * 查询文件夹列表 + * @param {string|number} driveId - 网盘ID + * @param {Object} params - { parentId } + * @returns {Promise} + */ +export function fetchFolders(driveId, params = {}) { + const searchParams = new URLSearchParams() + if (params.parentId !== undefined) searchParams.set('parentId', String(params.parentId)) + const query = searchParams.toString() + return request(`${API_BASE_URL}/drive/${driveId}/folders${query ? `?${query}` : ''}`, { + method: 'GET', + }) +} + +/** + * 查询文件夹详情 + * @param {string|number} driveId - 网盘ID + * @param {string|number} folderId - 文件夹ID + * @returns {Promise} + */ +export function fetchFolderDetail(driveId, folderId) { + return request(`${API_BASE_URL}/drive/${driveId}/folders/${folderId}`, { + method: 'GET', + }) +} + +/** + * 创建文件夹 + * @param {string|number} driveId - 网盘ID + * @param {Object} payload - { name, parentId, description, sortWeight } + * @returns {Promise} + */ +export function createFolderInDrive(driveId, payload) { + return request(`${API_BASE_URL}/drive/${driveId}/folders`, { + method: 'POST', + body: JSON.stringify({ + name: payload.name, + parentId: payload.parentId ?? 0, + description: payload.description || '', + sortWeight: payload.sortWeight ?? 0, + }), + }) +} + +/** + * 更新文件夹 + * @param {string|number} driveId - 网盘ID + * @param {string|number} folderId - 文件夹ID + * @param {Object} payload - { name, description, sortWeight } + * @returns {Promise} + */ +export function updateFolderInDrive(driveId, folderId, payload) { + const body = {} + if (payload.name !== undefined) body.name = payload.name + if (payload.description !== undefined) body.description = payload.description + if (payload.sortWeight !== undefined) body.sortWeight = payload.sortWeight + return request(`${API_BASE_URL}/drive/${driveId}/folders/${folderId}`, { + method: 'PUT', + body: JSON.stringify(body), + }) +} + +/** + * 删除文件夹 + * @param {string|number} driveId - 网盘ID + * @param {string|number} folderId - 文件夹ID + * @returns {Promise} + */ +export function deleteFolderInDrive(driveId, folderId) { + return request(`${API_BASE_URL}/drive/${driveId}/folders/${folderId}`, { + method: 'DELETE', + }) +} + +// ==================== 电影文件管理 API ==================== + +/** + * 查询指定文件夹下的电影列表 + * @param {string|number} driveId - 网盘ID + * @param {string|number} folderId - 文件夹ID,0表示根目录 + * @param {Object} params - { pageNo, pageSize } + * @returns {Promise} + */ +export function fetchFolderMovies(driveId, folderId, params = {}) { + const searchParams = new URLSearchParams() + if (params.pageNo) searchParams.set('pageNo', String(params.pageNo)) + if (params.pageSize) searchParams.set('pageSize', String(params.pageSize)) + const query = searchParams.toString() + return request(`${API_BASE_URL}/drive/${driveId}/folders/${folderId}/movies${query ? `?${query}` : ''}`, { + method: 'GET', + }) +} + +/** + * 查询电影列表 + * @param {string|number} driveId - 网盘ID + * @param {Object} params - { folderId, pageNo, pageSize } + * @returns {Promise} + */ +export function fetchMovieList(driveId, params = {}) { + const searchParams = new URLSearchParams() + if (params.folderId !== undefined) searchParams.set('folderId', String(params.folderId)) + if (params.pageNo) searchParams.set('pageNo', String(params.pageNo)) + if (params.pageSize) searchParams.set('pageSize', String(params.pageSize)) + const query = searchParams.toString() + return request(`${API_BASE_URL}/drive/${driveId}/movies${query ? `?${query}` : ''}`, { + method: 'GET', + }) +} + +/** + * 查询电影详情 + * @param {string|number} driveId - 网盘ID + * @param {string|number} movieId - 电影ID + * @returns {Promise} + */ +export function fetchMovieDetail(driveId, movieId) { + return request(`${API_BASE_URL}/drive/${driveId}/movies/${movieId}`, { + method: 'GET', + }) +} + +/** + * 创建电影(仅登记文件名) + * @param {string|number} driveId - 网盘ID + * @param {Object} payload - { title, folderId } + * @returns {Promise} + */ +export function createMovieInDrive(driveId, payload) { + return request(`${API_BASE_URL}/drive/${driveId}/movies`, { + method: 'POST', + body: JSON.stringify({ + title: payload.title, + folderId: payload.folderId ?? 0, + }), + }) +} + +/** + * 更新电影信息 + * @param {string|number} driveId - 网盘ID + * @param {string|number} movieId - 电影ID + * @param {Object} payload - 可选字段:title, originalName, subtitle, description, rating, tags, category + * @returns {Promise} + */ +export function updateMovieInDrive(driveId, movieId, payload) { + const body = {} + if (payload.title !== undefined) body.title = payload.title + if (payload.originalName !== undefined) body.originalName = payload.originalName + if (payload.subtitle !== undefined) body.subtitle = payload.subtitle + if (payload.description !== undefined) body.description = payload.description + if (payload.rating !== undefined) body.rating = payload.rating + if (payload.tags !== undefined) body.tags = payload.tags + if (payload.category !== undefined) body.category = payload.category + + return request(`${API_BASE_URL}/drive/${driveId}/movies/${movieId}`, { + method: 'PUT', + body: JSON.stringify(body), + }) +} + +/** + * 删除电影 + * @param {string|number} driveId - 网盘ID + * @param {string|number} movieId - 电影ID + * @returns {Promise} + */ +export function deleteMovieInDrive(driveId, movieId) { + return request(`${API_BASE_URL}/drive/${driveId}/movies/${movieId}`, { + method: 'DELETE', + }) +} + +/** + * 查询重复电影 + * @returns {Promise} + */ +export function fetchMovieDuplicates() { + return request(`${API_BASE_URL}/drive/movies/duplicates`, { + method: 'GET', + }) +} + +// ==================== 图标管理 API ==================== + +/** + * 查询图标列表 + * @returns {Promise} + */ +export function fetchIconList() { + return request(`${API_BASE_URL}/icon`, { method: 'GET' }) +} + +/** + * 查询单个图标详情 + * @param {string|number} id - 图标ID + * @returns {Promise} + */ +export function fetchIconDetail(id) { + return request(`${API_BASE_URL}/icon/${id}`, { method: 'GET' }) +} + +/** + * 创建图标 + * @param {Object} payload - { name, url?, internalUrl?, linkType?, description?, sortOrder? } + * @returns {Promise} + */ +export function createIcon(payload) { + return request(`${API_BASE_URL}/icon`, { + method: 'POST', + body: JSON.stringify({ + name: payload.name, + url: payload.url || '', + internalUrl: payload.internalUrl || '', + linkType: payload.linkType || 'external', + description: payload.description || '', + sortOrder: payload.sortOrder ?? 0, + }), + }) +} + +/** + * 更新图标 + * @param {string|number} id - 图标ID + * @param {Object} payload - { name?, url?, internalUrl?, linkType?, description?, sortOrder? } + * @returns {Promise} + */ +export function updateIcon(id, payload) { + const body = {} + if (payload.name !== undefined) body.name = payload.name + if (payload.url !== undefined) body.url = payload.url + if (payload.internalUrl !== undefined) body.internalUrl = payload.internalUrl + if (payload.linkType !== undefined) body.linkType = payload.linkType + if (payload.description !== undefined) body.description = payload.description + if (payload.sortOrder !== undefined) body.sortOrder = payload.sortOrder + return request(`${API_BASE_URL}/icon/${id}`, { + method: 'PUT', + body: JSON.stringify(body), + }) +} + +/** + * 删除图标 + * @param {string|number} id - 图标ID + * @returns {Promise} + */ +export function deleteIcon(id) { + return request(`${API_BASE_URL}/icon/${id}`, { method: 'DELETE' }) +} + +/** + * 上传图标 Logo 图片 + * @param {string|number} id - 图标ID + * @param {File} file - 图片文件(png/jpg/gif/webp/ico,最大 1MB) + * @returns {Promise} 返回 { code, data: { id, name, logoUrl, updateTime } } + */ +export function uploadIconLogo(id, file) { + const formData = new FormData() + formData.append('file', file) + return request(`${API_BASE_URL}/icon/${id}/logo`, { + method: 'POST', + body: formData, + }) +} + +// ==================== 用户管理 API(仅管理员) ==================== + +/** + * 查询用户列表 + * @param {Object} params - 查询参数 + * @param {string} [params.username] - 用户名模糊搜索 + * @param {number} [params.status] - 状态:0=禁用, 1=正常, 2=锁定 + * @param {number} [params.userType] - 角色:0=普通, 1=VIP, 2=管理员 + * @param {number} [params.pageNo] - 页码,默认1 + * @param {number} [params.pageSize] - 每页条数,默认20 + * @returns {Promise} 返回格式:{ code: 200, data: { total, list: [{ id, username, userType, status, ... }], pageNo, pageSize } } + */ +export function fetchUserList(params = {}) { + const searchParams = new URLSearchParams() + if (params.username) searchParams.set('username', params.username) + if (params.status !== undefined && params.status !== '') searchParams.set('status', String(params.status)) + if (params.userType !== undefined && params.userType !== '') searchParams.set('userType', String(params.userType)) + if (params.pageNo) searchParams.set('pageNo', String(params.pageNo)) + if (params.pageSize) searchParams.set('pageSize', String(params.pageSize)) + + const query = searchParams.toString() + return request(`${API_BASE_URL}/users${query ? `?${query}` : ''}`, { + method: 'GET', + }) +} + +/** + * 新增用户 + * @param {Object} payload - 用户信息 + * @param {string} payload.username - 用户名(必填) + * @param {string} payload.password - 密码(必填) + * @param {string} [payload.email] - 邮箱(可选) + * @param {string} [payload.phone] - 手机号(可选) + * @param {string} [payload.realName] - 真实姓名(可选) + * @param {number} [payload.status=1] - 状态:0=禁用, 1=正常 + * @param {number} [payload.userType=0] - 角色:0=普通, 1=VIP, 2=管理员 + * @returns {Promise} + */ +export function createUser(payload) { + return request(`${API_BASE_URL}/users`, { + method: 'POST', + body: JSON.stringify({ + username: payload.username, + password: payload.password, + email: payload.email || '', + phone: payload.phone || '', + realName: payload.realName || '', + status: payload.status !== undefined ? payload.status : 1, + userType: payload.userType !== undefined ? payload.userType : 0, + }), + }) +} + +/** + * 修改用户信息 + * @param {number} userId - 用户ID + * @param {Object} payload - 需要修改的字段(部分更新) + * @param {string} [payload.email] - 邮箱 + * @param {string} [payload.phone] - 手机号 + * @param {string} [payload.realName] - 真实姓名 + * @param {number} [payload.status] - 状态:0=禁用, 1=正常, 2=锁定 + * @param {number} [payload.userType] - 角色:0=普通, 1=VIP, 2=管理员 + * @returns {Promise} + */ +export function updateUser(userId, payload) { + // 构建请求体,只包含需要更新的字段 + const body = {} + if (payload.email !== undefined) body.email = payload.email + if (payload.phone !== undefined) body.phone = payload.phone + if (payload.realName !== undefined) body.realName = payload.realName + if (payload.status !== undefined) body.status = payload.status + if (payload.userType !== undefined) body.userType = payload.userType + + return request(`${API_BASE_URL}/users/${userId}`, { + method: 'PUT', + body: JSON.stringify(body), + }) +} + +/** + * 删除用户(软删除,将is_deleted设为1) + * @param {number} userId - 要删除的用户ID + * @returns {Promise} + */ +export function deleteUser(userId) { + return request(`${API_BASE_URL}/users/${userId}`, { + method: 'DELETE', + }) +} diff --git a/vue/src/assets/vue.svg b/vue/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/vue/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vue/src/components/ConfirmDialog.vue b/vue/src/components/ConfirmDialog.vue new file mode 100644 index 0000000..2a3e474 --- /dev/null +++ b/vue/src/components/ConfirmDialog.vue @@ -0,0 +1,210 @@ + + + + + diff --git a/vue/src/components/DriveManageDialog.vue b/vue/src/components/DriveManageDialog.vue new file mode 100644 index 0000000..bf52a2e --- /dev/null +++ b/vue/src/components/DriveManageDialog.vue @@ -0,0 +1,1544 @@ + + + + + diff --git a/vue/src/components/FolderDialog.vue b/vue/src/components/FolderDialog.vue new file mode 100644 index 0000000..70d49a7 --- /dev/null +++ b/vue/src/components/FolderDialog.vue @@ -0,0 +1,101 @@ + + + diff --git a/vue/src/components/FolderTree.vue b/vue/src/components/FolderTree.vue new file mode 100644 index 0000000..529ffde --- /dev/null +++ b/vue/src/components/FolderTree.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/vue/src/components/IconManageDialog.vue b/vue/src/components/IconManageDialog.vue new file mode 100644 index 0000000..9d70723 --- /dev/null +++ b/vue/src/components/IconManageDialog.vue @@ -0,0 +1,780 @@ + + + + + diff --git a/vue/src/components/LoginView.vue b/vue/src/components/LoginView.vue new file mode 100644 index 0000000..9bcbeb0 --- /dev/null +++ b/vue/src/components/LoginView.vue @@ -0,0 +1,297 @@ + + + diff --git a/vue/src/components/PosterCard.vue b/vue/src/components/PosterCard.vue new file mode 100644 index 0000000..2df5255 --- /dev/null +++ b/vue/src/components/PosterCard.vue @@ -0,0 +1,54 @@ + + + diff --git a/vue/src/components/RecordDialog.vue b/vue/src/components/RecordDialog.vue new file mode 100644 index 0000000..c64c9ba --- /dev/null +++ b/vue/src/components/RecordDialog.vue @@ -0,0 +1,160 @@ + + + diff --git a/vue/src/components/SimpleDialog.vue b/vue/src/components/SimpleDialog.vue new file mode 100644 index 0000000..8582594 --- /dev/null +++ b/vue/src/components/SimpleDialog.vue @@ -0,0 +1,56 @@ + + + diff --git a/vue/src/components/TreeNode.vue b/vue/src/components/TreeNode.vue new file mode 100644 index 0000000..be67866 --- /dev/null +++ b/vue/src/components/TreeNode.vue @@ -0,0 +1,299 @@ + + + + + diff --git a/vue/src/components/UserManageDialog.vue b/vue/src/components/UserManageDialog.vue new file mode 100644 index 0000000..3443a78 --- /dev/null +++ b/vue/src/components/UserManageDialog.vue @@ -0,0 +1,1340 @@ + + + + + + diff --git a/vue/src/main.js b/vue/src/main.js new file mode 100644 index 0000000..2425c0f --- /dev/null +++ b/vue/src/main.js @@ -0,0 +1,5 @@ +import { createApp } from 'vue' +import './style.css' +import App from './App.vue' + +createApp(App).mount('#app') diff --git a/vue/src/style.css b/vue/src/style.css new file mode 100644 index 0000000..27bbd4c --- /dev/null +++ b/vue/src/style.css @@ -0,0 +1,2857 @@ +:root { + color-scheme: light; + --bg: #f4f7fb; + --panel: #ffffff; + --ink: #172033; + --muted: #64748b; + --line: #d9e2ef; + --brand: #0f766e; + --brand-dark: #0b5d57; + --accent: #f59e0b; + --danger: #dc2626; + --shadow: 0 18px 50px rgba(19, 31, 51, 0.14); +} + +* { + box-sizing: border-box; + -webkit-tap-highlight-color: transparent; +} + +html { + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + touch-action: manipulation; +} + +html, +body { + min-width: 0; + min-height: 100%; + overflow: hidden auto; + -webkit-overflow-scrolling: touch; +} + +#app { + min-width: 0; + min-height: 100%; + min-height: -webkit-fill-available; +} + +button, +input, +textarea, +select { + font: inherit; +} + +button { + border: 0; + border-radius: 999px; + background: var(--brand); + color: #fff; + cursor: pointer; + min-height: 40px; + padding: 0 18px; + font-weight: 700; + transition: + transform 0.2s ease, + background 0.2s ease, + opacity 0.2s ease; +} + +button:hover { + background: var(--brand-dark); + transform: translateY(-1px); +} + +button:disabled { + opacity: 0.72; + cursor: not-allowed; + transform: none; +} + +button.secondary { + background: #e7eef7; + color: #243247; +} + +button.secondary:hover { + background: #d8e3f1; +} + +button.danger, +.icon-btn.danger { + background: #fee2e2; + color: var(--danger); +} + +button.danger:hover, +.icon-btn.danger:hover { + background: #fecaca; +} + +input, +textarea, +select { + width: 100%; + border: 1px solid var(--line); + border-radius: 14px; + background: #fff; + color: var(--ink); + outline: none; + padding: 12px 14px; +} + +textarea { + min-height: 110px; + resize: vertical; +} + +input:focus, +textarea:focus, +select:focus { + border-color: var(--brand); + box-shadow: 0 0 0 3px rgba(15, 118, 110, 0.14); +} + +ul { + margin: 0; + padding-left: 18px; +} + +.app-wrapper { + min-height: 100vh; +} + +.login-shell { + display: flex; + align-items: center; + justify-content: center; + min-height: 100vh; + padding: 12px 16px; + overflow: hidden; + background: + radial-gradient(ellipse at 50% 80%, rgba(99, 31, 191, 0.8) 0%, rgba(3, 2, 12, 0.95) 60%), + linear-gradient(135deg, #060310, #0a0520); + isolation: isolate; +} + +.login-panel { + position: relative; + width: min(500px, 100%); + max-height: none; + overflow: hidden; + border: 1px solid rgba(197, 170, 255, 0.24); + border-radius: 24px; + background: rgba(12, 8, 32, 0.88); + box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6); + padding: 20px 32px 24px; + text-align: center; + backdrop-filter: blur(16px); +} + +.login-panel::before { + content: ''; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 140px; + border-radius: 0 0 24px 24px; + background: radial-gradient(ellipse at 50% 100%, rgba(139, 67, 255, 0.36), transparent 72%); + pointer-events: none; + z-index: 0; +} + +.login-panel > * { + position: relative; + z-index: 1; +} + +.brand-mark { + display: block; + width: 64px; + height: 64px; + margin: 0 auto 10px; + border-radius: 16px; + object-fit: cover; +} + +.brand-mark--fallback { + display: grid; + place-items: center; + background: linear-gradient(135deg, #8d72ff, #5b38ff); + color: #fff; + font-size: 24px; + font-weight: 800; + letter-spacing: 1px; + box-shadow: 0 12px 24px rgba(91, 56, 255, 0.28); +} + +.login-panel h1 { + margin: 0 0 2px; + color: #f8f7ff; + font-size: 22px; +} + +.login-panel p { + max-width: 380px; + margin: 6px auto 0; + color: rgba(223, 215, 255, 0.72); + line-height: 1.4; + font-size: 13px; +} + +.auth-switch { + display: inline-grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 4px; + width: min(240px, 100%); + margin: 12px auto 0; + padding: 4px; + border: 1px solid rgba(183, 157, 255, 0.18); + border-radius: 999px; + background: rgba(255, 255, 255, 0.08); +} + +.switch-chip { + min-height: 30px; + border-radius: 999px; + background: transparent; + color: rgba(236, 232, 255, 0.84); + box-shadow: none; +} + +.switch-chip:hover { + background: rgba(255, 255, 255, 0.12); +} + +.switch-chip.active { + background: linear-gradient(90deg, rgba(255, 255, 255, 0.94), #8d72ff 48%, #5b38ff); + color: #fff; +} + +.login-form { + display: grid; + gap: 10px; + margin-top: 14px; +} + +.login-form label, +.tmdb-config label, +.field-grid label { + display: grid; + gap: 5px; + text-align: left; +} + +.login-form label span, +.tmdb-config label span, +.field-grid label span { + font-size: 13px; + font-weight: 700; +} + +.login-form label { + color: rgba(236, 232, 255, 0.82); +} + +.captcha-row { + display: grid; + grid-template-columns: minmax(0, 1fr) 120px; + gap: 8px; +} + +canvas { + width: 120px; + height: 40px; + border: 1px solid rgba(183, 157, 255, 0.28); + border-radius: 8px; + background: rgba(15, 12, 35, 0.88); + cursor: pointer; +} + +.form-message { + min-height: 16px; + color: #fecaca; + font-size: 13px; +} + +.form-message.warning { + color: #fde68a; +} + +.form-message.success { + color: #bbf7d0; +} + +.login-form input { + border-color: rgba(183, 157, 255, 0.24); + background: rgba(8, 7, 25, 0.86); + color: #f8f7ff; + padding: 9px 12px; +} + +.login-form input::placeholder { + color: rgba(221, 215, 244, 0.52); +} + +.login-form button[type='submit'] { + min-height: 44px; + margin-top: 4px; + border-radius: 10px; + background: linear-gradient(90deg, rgba(255, 255, 255, 0.9), #8d72ff 42%, #5b38ff); + color: #fff; + box-shadow: 0 10px 28px rgba(99, 74, 255, 0.38); +} + +/* ==================== 快捷图标区域 ==================== */ +.quick-icons { + width: min(1500px, calc(100% - 48px)); + margin: 0 auto 20px; + padding: 20px 24px; + background: linear-gradient(135deg, rgba(255,255,255,0.85) 0%, rgba(248,250,252,0.9) 100%); + border-radius: 16px; + box-shadow: 0 2px 12px rgba(0,0,0,0.04); +} +.quick-icons__header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 16px; +} +.quick-icons__header h3 { + font-size: 15px; + font-weight: 700; + color: #1e293b; + margin: 0; +} +.quick-icons__manage { + padding: 6px 14px; + border: none; + border-radius: 10px; + background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); + color: #fff; + cursor: pointer; + font-size: 14px; + font-weight: 600; + transition: all 0.25s; + box-shadow: 0 2px 8px rgba(99, 102, 241, 0.3); + display: flex; + align-items: center; + gap: 4px; +} +.quick-icons__manage:hover { + transform: translateY(-1px); + box-shadow: 0 4px 14px rgba(99, 102, 241, 0.45); + background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%); +} + +/* 快捷入口头部操作区(切换+管理) */ +.quick-icons__actions { + display: flex; + align-items: center; + gap: 12px; +} + +/* 内外网切换按钮组 */ +.network-toggle { + display: flex; + background: rgba(99, 102, 241, 0.08); + border-radius: 10px; + padding: 3px; + gap: 2px; +} + +.network-toggle__btn { + padding: 5px 14px; + border: none; + border-radius: 8px; + background: transparent; + color: #64748b; + font-size: 13px; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; + white-space: nowrap; +} + +.network-toggle__btn:hover { + color: #6366f1; + background: rgba(255, 255, 255, 0.6); +} + +.network-toggle__btn--active { + background: #fff; + color: #6366f1; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08); +} + +.network-toggle__btn--active:hover { + background: #fff; +} +.quick-icons__grid { + display: flex; + flex-wrap: wrap; + gap: 20px; +} +.quick-icons__item { + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + text-decoration: none; + color: inherit; + padding: 12px 8px; + border-radius: 14px; + transition: all 0.25s ease; + min-width: 80px; + cursor: pointer; +} +.quick-icons__item:hover { + background: rgba(99, 102, 241, 0.08); + transform: translateY(-2px); + box-shadow: 0 4px 16px rgba(99, 102, 241, 0.12); +} +.quick-icons__thumb { + width: 52px; + height: 52px; + border-radius: 14px; + background: linear-gradient(135deg, #e0e7ff 0%, #c7d2fe 100%); + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + box-shadow: 0 2px 8px rgba(99, 102, 241, 0.15); + transition: box-shadow 0.25s ease; +} +.quick-icons__item:hover .quick-icons__thumb { + box-shadow: 0 4px 16px rgba(99, 102, 241, 0.25); +} +.quick-icons__thumb img { + width: 32px; + height: 32px; + object-fit: contain; +} +.quick-icons__fallback { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + font-size: 22px; + font-weight: 700; + color: #6366f1; +} +.quick-icons__label { + font-size: 12px; + font-weight: 600; + color: #334155; + text-align: center; + max-width: 80px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.quick-icons__empty { + padding: 20px; + text-align: center; + color: #94a3b8; + font-size: 13px; +} + +.topbar, +.stats-row, +.content-grid, +.poster-showcase, +.search-topbar, +.hero-carousel, +.manage-layout { + width: min(1500px, calc(100% - 48px)); + margin: 0 auto; +} + +.search-topbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 18px; + padding: 18px 0 10px; +} + +.search-topbar__input { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 12px; + flex: 1; +} + +.search-topbar__input input { + min-height: 52px; + border-radius: 999px; + padding: 0 20px; + transition: all 0.3s ease; + outline: none; +} + +.search-topbar__input input:focus { + box-shadow: 0 0 0 4px rgba(99, 102, 241, 0.15); + border-color: #6366f1; + background: #fff; +} + +.search-topbar__actions { + justify-content: flex-end; +} + +/* 个人中心菜单 */ +.user-menu { + position: relative; +} + +.user-menu__trigger { + display: flex; + align-items: center; + gap: 10px; + padding: 8px 16px; + background: #fff; + border: 2px solid var(--line); + border-radius: 999px; + cursor: pointer; + transition: all 0.2s; + min-height: 48px; +} + +.user-menu__trigger:hover { + border-color: var(--brand); + box-shadow: 0 4px 12px rgba(99, 102, 241, 0.15); +} + +.user-menu__avatar { + width: 36px; + height: 36px; + border-radius: 50%; + object-fit: cover; + border: 2px solid var(--line); +} + +.user-menu__avatar--fallback { + display: flex; + align-items: center; + justify-content: center; + background: linear-gradient(135deg, #6366f1, #8b5cf6); + color: #fff; + font-weight: 700; + font-size: 16px; +} + +.user-menu__name { + font-weight: 600; + color: var(--ink); + max-width: 120px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.user-menu__arrow { + font-size: 10px; + color: var(--muted); + transition: transform 0.2s; +} + +.user-menu__dropdown { + position: absolute; + top: calc(100% + 8px); + right: 0; + min-width: 280px; + background: #fff; + border-radius: 16px; + box-shadow: 0 12px 40px rgba(0, 0, 0, 0.15); + padding: 16px; + z-index: 1000; + animation: dropdownFadeIn 0.2s ease; +} + +@keyframes dropdownFadeIn { + from { + opacity: 0; + transform: translateY(-8px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.user-menu__header { + display: flex; + align-items: center; + gap: 12px; + padding-bottom: 12px; + position: relative; +} + +.user-menu__avatar--lg { + width: 56px; + height: 56px; + font-size: 24px; +} + +.user-menu__info { + flex: 1; + min-width: 0; +} + +.user-menu__username { + font-weight: 700; + font-size: 16px; + color: var(--ink); + margin-bottom: 4px; +} + +.user-menu__email { + font-size: 13px; + color: var(--muted); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.user-menu__edit-avatar { + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); + width: 32px; + height: 32px; + border-radius: 50%; + background: rgba(99, 102, 241, 0.1); + border: none; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + font-size: 16px; + transition: all 0.2s; +} + +.user-menu__edit-avatar:hover { + background: rgba(99, 102, 241, 0.2); + transform: translateY(-50%) scale(1.1); +} + +.user-menu__divider { + height: 1px; + background: var(--line); + margin: 8px 0; +} + +.user-menu__item { + display: flex; + align-items: center; + gap: 12px; + width: 100%; + padding: 12px 16px; + background: transparent; + border: none; + border-radius: 10px; + cursor: pointer; + font-size: 14px; + font-weight: 500; + color: var(--ink); + transition: all 0.2s; + text-align: left; +} + +.user-menu__item:hover { + background: rgba(99, 102, 241, 0.08); +} + +.user-menu__icon { + font-size: 18px; + width: 24px; + text-align: center; +} + +.user-menu__item--danger { + color: var(--danger); +} + +.user-menu__item--danger:hover { + background: rgba(220, 38, 38, 0.08); +} + +.dashboard-topbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 18px; + padding: 10px 0 18px; +} + +.dashboard-brand { + display: grid; + gap: 6px; +} + +.dashboard-brand strong { + color: #10213a; + font-size: clamp(22px, 2.4vw, 28px); +} + +.dashboard-brand span { + color: var(--muted); + font-size: 14px; +} + +.view-switch { + display: inline-grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 4px; + padding: 5px; + min-width: 240px; + border: 1px solid rgba(15, 118, 110, 0.12); + border-radius: 999px; + background: linear-gradient(180deg, #f8fbff, #e7eef7); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.72); +} + +.view-switch__btn { + min-height: 40px; + padding: 0 20px; + background: transparent; + color: #35506b; + font-weight: 700; + box-shadow: none; +} + +.view-switch__btn:hover { + background: rgba(20, 184, 166, 0.08); +} + +.view-switch__btn.active { + background: linear-gradient(90deg, #14b8a6, #0f766e); + color: #fff; + box-shadow: 0 10px 24px rgba(15, 118, 110, 0.26); +} + +.top-actions, +.tools { + display: flex; + flex-wrap: wrap; + gap: 10px; +} + +.icon-action { + min-height: 34px; + background: transparent; + color: var(--ink); + padding: 0 12px; +} + +.icon-action:hover { + background: rgba(15, 118, 110, 0.08); +} + +.btn-export { + background: #14b8a6; +} + +.hero-carousel { + padding-bottom: 6px; +} + +.hero-slide { + border-radius: 32px; +} + +.hero-slide--single { + min-height: 460px; + outline: none; +} + +.hero-fade-enter-active, +.hero-fade-leave-active { + transition: opacity 0.35s ease, transform 0.35s ease; +} + +.hero-fade-enter-from, +.hero-fade-leave-to { + opacity: 0; + transform: translateX(18px) scale(0.985); +} + +.hero-fade-enter-to, +.hero-fade-leave-from { + opacity: 1; + transform: translateX(0) scale(1); +} + +.hero-slide__topbar { + display: flex; + align-items: center; + gap: 16px; +} + +.hero-slide__content { + display: grid; + align-content: center; + gap: 16px; + max-width: 760px; +} + +.hero-slide__overlay { + display: grid; + align-content: center; + gap: 24px; + min-height: 460px; + padding: 32px; + color: #fff; +} + +.hero-slide__badge { + display: inline-flex; + width: fit-content; + padding: 9px 16px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.16); + font-size: 14px; + font-weight: 700; +} + +.hero-slide h2 { + margin: 0; + font-size: clamp(32px, 3.4vw, 44px); +} + +.hero-slide p { + margin: 0; + color: rgba(255, 255, 255, 0.88); + font-size: 16px; + line-height: 1.8; +} + +.hero-slide__meta { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 10px; +} + +.hero-slide__meta span { + padding: 6px 12px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.14); + font-size: 13px; + line-height: 1.2; +} + +.content-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 18px; + margin-bottom: 18px; +} + +.content-toolbar h2 { + margin: 0; + color: #10213a; +} + +.content-toolbar p { + margin: 6px 0 0; + color: var(--muted); +} + +.content-actions { + justify-content: flex-end; +} + +.stats-row { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 18px; + margin-top: 28px; +} + +.insight-row { + width: min(1500px, calc(100% - 48px)); + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 18px; + margin: 18px auto 0; +} + +.insight-card { + display: grid; + gap: 6px; + padding: 20px 24px; + border-radius: 20px; + background: rgba(255, 255, 255, 0.88); + box-shadow: var(--shadow); +} + +.insight-card strong { + font-size: 20px; + color: #032541; +} + +.insight-card span { + color: var(--muted); + font-size: 13px; +} + +.stats-row > div, +.duplicate-panel, +.poster-card, +.app-dialog::backdrop { + border-radius: 24px; +} + +.stats-row > div { + display: grid; + gap: 6px; + padding: 24px; + background: var(--panel); + box-shadow: var(--shadow); +} + +.stats-row span { + font-size: 32px; + font-weight: 800; +} + +.stats-row small, +.poster-time, +.poster-owner small, +.duplicate-item li, +.log-detail, +.tmdb-config p { + color: var(--muted); +} + +/* ==================== 全局加载条(顶部细条) ==================== */ +.global-loading-bar { + position: fixed; + top: 0; + left: 0; + right: 0; + height: 3px; + z-index: 99999; + background: rgba(99, 102, 241, 0.1); + overflow: hidden; +} + +.global-loading-bar__progress { + height: 100%; + width: 40%; + background: linear-gradient(90deg, #6366f1 0%, #a78bfa 50%, #6366f1 100%); + background-size: 200% 100%; + border-radius: 0 2px 2px 0; + animation: topbar-slide 1.2s ease-in-out infinite; +} + +@keyframes topbar-slide { + 0% { transform: translateX(-100%); background-position: 0% 0; } + 50% { transform: translateX(150%); background-position: 100% 0; } + 100% { transform: translateX(-100%); background-position: 0% 0; } +} + +/* 加载条淡入淡出过渡 */ +.topbar-fade-enter-active { transition: opacity 0.2s ease; } +.topbar-fade-leave-active { transition: opacity 0.4s ease 0.1s; } +.topbar-fade-enter-from, +.topbar-fade-leave-to { opacity: 0; } + +/* ==================== 加载动画通用旋转spinner ==================== */ +.loading-spinner, +.drive-spinner { + width: 32px; + height: 32px; + border-radius: 50%; + border: 3px solid rgba(99, 102, 241, 0.15); + border-top-color: #6366f1; + animation: spinner-rotate 0.7s linear infinite; +} + +@keyframes spinner-rotate { + to { transform: rotate(360deg); } +} + +.loading-panel { + width: min(1500px, calc(100% - 48px)); + margin: 28px auto 0; +} + +.global-notice { + position: fixed; + top: 80px; + right: 24px; + min-width: 320px; + max-width: 500px; + padding: 16px 20px; + border-radius: 12px; + font-weight: 600; + font-size: 14px; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15); + z-index: 10000; + backdrop-filter: blur(10px); +} + +/* Vue Transition 动画 */ +.notice-enter-active { + animation: slideInRight 0.3s ease-out; +} + +.notice-leave-active { + animation: slideOutRight 0.3s ease-in; +} + +@keyframes slideInRight { + from { + opacity: 0; + transform: translateX(100%); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +@keyframes slideOutRight { + from { + opacity: 1; + transform: translateX(0); + } + to { + opacity: 0; + transform: translateX(100%); + } +} + +.global-notice::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 3px; + background: currentColor; + border-radius: 12px 12px 0 0; +} + +.global-notice--warning { + background: rgba(255, 255, 255, 0.95); + color: #b45309; + border-left: 4px solid #f59e0b; +} + +.global-notice--danger { + background: rgba(255, 255, 255, 0.95); + color: #b91c1c; + border-left: 4px solid #dc2626; +} + +.global-notice--error { + background: rgba(255, 255, 255, 0.95); + color: #dc2626; + border-left: 4px solid #ef4444; +} + +.global-notice--success { + background: rgba(255, 255, 255, 0.95); + color: #16a34a; + border-left: 4px solid #22c55e; +} + +.loading-card { + display: flex; + align-items: center; + gap: 12px; + padding: 18px 24px; + border-radius: 20px; + background: rgba(255, 255, 255, 0.82); + box-shadow: var(--shadow); + color: var(--muted); + font-weight: 600; + font-size: 14px; +} + +/* 搜索聚焦时的内容虚化效果 */ +.content-blur { + filter: blur(8px); + opacity: 0.5; + pointer-events: none; + transition: filter 0.3s ease, opacity 0.3s ease; +} + +/* 搜索结果为空的样式 */ +.empty-search-result { + display: flex; + align-items: center; + justify-content: center; + min-height: 400px; + padding: 40px 20px; +} + +.empty-search-content { + text-align: center; + max-width: 400px; +} + +.empty-search-icon { + font-size: 80px; + margin-bottom: 20px; + animation: float 3s ease-in-out infinite; +} + +@keyframes float { + 0%, 100% { + transform: translateY(0); + } + 50% { + transform: translateY(-10px); + } +} + +.empty-search-content h3 { + font-size: 28px; + font-weight: 700; + color: var(--text); + margin-bottom: 12px; +} + +.empty-search-content p { + font-size: 16px; + color: var(--muted); + margin-bottom: 24px; + line-height: 1.6; +} + +/* 搜索聚焦时的提示样式 */ +.search-focus-hint { + display: flex; + align-items: center; + justify-content: center; + min-height: 400px; + padding: 40px 20px; +} + +.search-focus-content { + text-align: center; + max-width: 400px; +} + +.search-focus-icon { + font-size: 80px; + margin-bottom: 20px; + animation: pulse 2s ease-in-out infinite; +} + +@keyframes pulse { + 0%, 100% { + transform: scale(1); + opacity: 1; + } + 50% { + transform: scale(1.1); + opacity: 0.8; + } +} + +.search-focus-content h3 { + font-size: 28px; + font-weight: 700; + color: var(--text); + margin-bottom: 12px; +} + +.search-focus-content p { + font-size: 16px; + color: var(--muted); + line-height: 1.6; +} + +/* Vue Transition - Fade 动画 */ +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.3s ease; +} + +.fade-enter-from, +.fade-leave-to { + opacity: 0; +} + +.content-grid { + display: grid; + grid-template-columns: minmax(0, 1fr) 340px; + gap: 24px; + margin-top: 28px; + padding-bottom: 28px; +} + +.poster-list { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); + gap: 20px; +} + +.poster-list--manage { + display: flex; + flex-direction: column; + gap: 14px; +} + +.folder-tree-container { + background: rgba(255, 255, 255, 0.6); + border-radius: 16px; + padding: 20px; + min-height: 400px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); +} + +/* 网盘管理布局 */ +.manage-layout { + display: grid; + grid-template-columns: 1fr 380px; + gap: 24px; + margin-top: 28px; + padding-bottom: 28px; + position: relative; /* 为网盘加载遮罩层提供定位参考 */ +} + +.manage-main { + display: flex; + flex-direction: column; + gap: 0; +} + +.content-toolbar { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 20px; + margin-bottom: 16px; +} + +.content-toolbar h2 { + font-size: 22px; + font-weight: 700; + color: #032541; + margin: 0; +} + +.content-toolbar p { + margin: 6px 0 0; + color: var(--muted); + font-size: 14px; +} + +.top-actions { + display: flex; + gap: 10px; + flex-shrink: 0; +} + +.content-actions button { + padding: 10px 18px; + border: none; + border-radius: 12px; + background: #6366f1; + color: white; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; +} + +.content-actions button:hover { + background: #4f46e5; + transform: translateY(-1px); +} + +.content-actions button.secondary { + background: rgba(99, 102, 241, 0.1); + color: #6366f1; +} + +.content-actions button.secondary:hover { + background: rgba(99, 102, 241, 0.2); +} + +/* 文件夹树操作按钮 */ +.folder-tree-actions { + margin-bottom: 16px; + padding-bottom: 16px; + border-bottom: 1px solid var(--line); +} + +.folder-tree-actions__btn { + padding: 10px 20px; + border: 2px dashed var(--line); + border-radius: 12px; + background: rgba(99, 102, 241, 0.05); + color: #6366f1; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; + width: 100%; +} + +.folder-tree-actions__btn:hover { + background: rgba(99, 102, 241, 0.1); + border-color: #6366f1; +} + +/* 网盘标签页 */ +.drive-tabs { + display: flex; + gap: 8px; + margin: 16px 0; + padding: 12px; + background: rgba(99, 102, 241, 0.05); + border-radius: 12px; + overflow-x: auto; +} + +.drive-tab { + position: relative; + display: flex; + align-items: center; + gap: 8px; + padding: 10px 16px; + border-radius: 8px; + background: white; + cursor: pointer; + transition: all 0.2s; + border: 2px solid transparent; + font-weight: 500; + color: #4b5563; + white-space: nowrap; +} + +.drive-tab:hover { + background: rgba(99, 102, 241, 0.1); + border-color: rgba(99, 102, 241, 0.3); +} + +.drive-tab.active { + background: rgba(99, 102, 241, 0.15); + border-color: #6366f1; + color: #4f46e5; + font-weight: 600; +} + +.drive-tab__name { + flex: 1; +} + +/* 网盘标签页 Logo */ +.drive-tab__logo { + width: 20px; + height: 20px; + border-radius: 4px; + object-fit: cover; + flex-shrink: 0; +} +.drive-tab__logo--fallback { + display: flex; + align-items: center; + justify-content: center; + background: rgba(99, 102, 241, 0.15); + font-size: 12px; + line-height: 1; +} + + +/* 通用悬浮提示框(Teleport 到 body,position: fixed) */ +.app-tooltip { + position: fixed; + z-index: 99999; + background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%); + border-radius: 12px; + padding: 0; + min-width: 240px; + max-width: 340px; + box-shadow: + 0 12px 40px rgba(0, 0, 0, 0.12), + 0 4px 12px rgba(0, 0, 0, 0.08), + 0 0 0 1px rgba(99, 102, 241, 0.08); + pointer-events: none; + overflow: hidden; +} +.app-tooltip__header { + display: flex; + align-items: center; + gap: 8px; + padding: 12px 16px; + background: linear-gradient(90deg, rgba(99, 102, 241, 0.08) 0%, rgba(139, 92, 246, 0.06) 100%); + border-bottom: 1px solid rgba(99, 102, 241, 0.1); +} +.app-tooltip__icon { + font-size: 16px; + flex-shrink: 0; +} +.app-tooltip__title { + font-size: 13px; + font-weight: 700; + color: #1e293b; + letter-spacing: 0.01em; +} +.app-tooltip__body { + padding: 12px 16px; +} +.app-tooltip__desc { + font-size: 12px; + color: #64748b; + line-height: 1.7; + word-break: break-word; + margin: 0; +} +.app-tooltip__empty { + font-size: 12px; + color: #94a3b8; + font-style: italic; +} +.app-tooltip__meta { + margin-top: 8px; + padding-top: 8px; + border-top: 1px dashed #e2e8f0; + font-size: 11px; + color: #94a3b8; +} +.app-tooltip__arrow { + position: absolute; + top: -5px; + left: 50%; + transform: translateX(-50%) rotate(45deg); + width: 10px; + height: 10px; + background: #fff; + border-left: 1px solid rgba(99, 102, 241, 0.08); + border-top: 1px solid rgba(99, 102, 241, 0.08); +} + +/* 悬浮提示过渡动画(标签页用) */ +.tooltip-fade-enter-active { + transition: opacity 0.2s ease; +} +.tooltip-fade-leave-active { + transition: opacity 0.15s ease; +} +.tooltip-fade-enter-from, +.tooltip-fade-leave-to { + opacity: 0; +} + +.drive-tab__actions { + display: flex; + gap: 4px; + opacity: 0; + transition: opacity 0.2s; +} + +.drive-tab:hover .drive-tab__actions { + opacity: 1; +} + +.drive-tab__edit, +.drive-tab__delete { + padding: 4px; + border: none; + background: transparent; + cursor: pointer; + font-size: 14px; + transition: all 0.2s; + border-radius: 4px; +} + +.drive-tab__edit:hover { + background: rgba(99, 102, 241, 0.2); +} + +.drive-tab__delete:hover { + background: rgba(239, 68, 68, 0.2); +} + +.drive-tab--add { + background: transparent; + border: 2px dashed rgba(99, 102, 241, 0.3); + color: #6366f1; + font-weight: 600; +} + +.drive-tab--add:hover { + background: rgba(99, 102, 241, 0.1); + border-color: #6366f1; +} + +.poster-card-wrap { + display: grid; + gap: 10px; +} + +.poster-card-wrap--manage { + grid-template-columns: 160px minmax(0, 1fr); + align-items: center; + gap: 16px; +} + +.poster-card-wrap--manage .poster-card-actions { + justify-content: flex-start; +} + +.poster-card-wrap--manage .poster-card { + display: grid; + grid-template-columns: 168px minmax(0, 1fr); + align-items: stretch; + min-height: 168px; +} + +.poster-card-wrap--manage .poster-thumb { + aspect-ratio: auto; + height: 100%; +} + +.poster-card-wrap--manage .poster-body { + display: grid; + align-content: center; + padding: 20px 22px; +} + +.poster-card-actions { + display: flex; + justify-content: flex-end; +} + +.poster-card { + overflow: hidden; + background: #fff; + box-shadow: var(--shadow); + transition: all 0.2s; +} + +.poster-card:not(.is-readonly) { + cursor: pointer; +} + +.poster-card:not(.is-readonly):hover { + transform: translateY(-4px); + box-shadow: 0 12px 32px rgba(0, 0, 0, 0.12); +} + +.poster-card.is-readonly { + cursor: default; +} + +.poster-thumb { + position: relative; + aspect-ratio: 0.74; + overflow: hidden; + background: #d9e2ef; +} + +.poster-thumb img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.score-badge { + position: absolute; + right: 14px; + bottom: 14px; + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 44px; + min-height: 44px; + padding: 0 8px; + border-radius: 999px; + background: rgba(3, 37, 65, 0.92); + color: #7ee8bc; + font-weight: 800; +} + +.poster-body { + display: grid; + gap: 12px; + padding: 18px; +} + +.poster-meta-row, +.poster-owner { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + flex-wrap: wrap; +} + +.poster-sheet { + display: inline-block; + padding: 4px 12px; + border-radius: 999px; + background: rgba(99, 102, 241, 0.12); + color: #6366f1; + font-weight: 600; + font-size: 13px; +} + +.poster-body h3 { + margin: 0; + font-size: 22px; +} + +.poster-body p { + margin: 0; + color: #41556e; +} + +.status-pill { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 30px; + padding: 0 12px; + border-radius: 999px; + font-size: 13px; + font-weight: 700; +} + +.status-pill.is-normal { + background: rgba(34, 197, 94, 0.12); + color: #15803d; +} + +.status-pill.is-warning { + background: rgba(245, 158, 11, 0.14); + color: #b45309; +} + +.status-pill.is-danger { + background: rgba(220, 38, 38, 0.12); + color: #b91c1c; +} + +.tag-list { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.tag-list span { + display: inline-flex; + align-items: center; + min-height: 28px; + padding: 0 12px; + border-radius: 999px; + background: #ecf4ff; + color: #245; + font-size: 13px; + font-weight: 700; +} + +.duplicate-section { + margin-top: 28px; + padding-bottom: 28px; +} + +.duplicate-panel { + display: grid; + align-content: start; + gap: 18px; + padding: 24px; + background: #fff; + box-shadow: var(--shadow); +} + +.duplicate-panel header { + display: flex; + align-items: center; + justify-content: space-between; +} + +.duplicate-panel header span { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 40px; + min-height: 40px; + border-radius: 999px; + background: #f3f7fb; + font-weight: 800; +} + +.duplicate-list, +.login-log-list, +.column-list { + display: grid; + gap: 12px; +} + +.log-loading, +.log-empty { + padding: 40px 20px; + text-align: center; + color: var(--muted); + font-size: 14px; +} + +.log-loading { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; +} + +.log-loading::before { + content: ''; + width: 20px; + height: 20px; + border: 3px solid var(--line); + border-top-color: #6366f1; + border-radius: 50%; + animation: spin 0.8s linear infinite; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +.empty-note { + padding: 14px; + border: 1px dashed var(--line); + border-radius: 16px; + color: var(--muted); + background: #fbfdff; +} + +.duplicate-item, +.log-entry, +.column-item { + padding: 14px; + border: 1px solid var(--line); + border-radius: 16px; + background: #fbfdff; +} + +.log-entry { + display: grid; + gap: 10px; +} + +.log-entry__header { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 12px; +} + +.log-account { + margin-top: 4px; + color: var(--muted); + font-size: 13px; +} + +.log-result { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 56px; + min-height: 28px; + padding: 0 10px; + border-radius: 999px; + font-size: 12px; + font-weight: 700; +} + +.log-result--success { + background: rgba(34, 197, 94, 0.12); + color: #15803d; +} + +.log-result--fail { + background: rgba(239, 68, 68, 0.12); + color: #b91c1c; +} + +.log-detail--ua { + word-break: break-all; +} + +.log-detail--fail { + color: #dc2626; + font-weight: 600; +} + +.column-item { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +.add-column-row { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 10px; +} + +.app-dialog { + width: min(760px, calc(100vw - 24px)); + padding: 0; + border: 0; + border-radius: 28px; + background: #fff; + box-shadow: 0 40px 100px rgba(15, 23, 42, 0.28); +} + +.app-dialog::backdrop { + background: rgba(2, 6, 23, 0.58); +} + +.dialog-form { + display: grid; + gap: 22px; + padding: 24px; +} + +.dialog-form header, +.dialog-form footer { + display: flex; + align-items: center; + gap: 14px; +} + +.dialog-form header { + justify-content: space-between; +} + +.dialog-form header h2 { + margin: 0; +} + +.dialog-form header button { + min-width: 42px; + min-height: 42px; + padding: 0; + border-radius: 50%; + background: #eff5fb; + color: #243247; +} + +.dialog-form footer { + justify-content: flex-end; +} + +.field-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 16px; +} + +.field-span-2 { + grid-column: 1 / -1; +} + +.simple-dialog-body, +.tmdb-config, +.log-panel, +.column-manager { + display: grid; + gap: 16px; +} + +/* ===== 登录日志筛选区域 ===== */ +.log-filter { + display: grid; + gap: 12px; + padding: 16px; + background: rgba(99, 102, 241, 0.05); + border-radius: 12px; + border: 1px solid rgba(99, 102, 241, 0.1); +} + +.filter-row { + display: flex; + gap: 12px; + align-items: center; +} + +.filter-input, +.filter-select { + flex: 1; + padding: 10px 14px; + border: 1px solid var(--line); + border-radius: 8px; + font-size: 14px; + background: #fff; + transition: all 0.2s; +} + +.filter-input:focus, +.filter-select:focus { + outline: none; + border-color: #6366f1; + box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1); +} + +.filter-input::placeholder { + color: #9ca3af; +} + +.filter-reset-btn { + padding: 10px 20px; + background: linear-gradient(135deg, #a52a2a, #8b0000); /* 暗红色渐变 */ + color: #fff; + border: none; + border-radius: 8px; + font-weight: 600; + font-size: 14px; + cursor: pointer; + transition: all 0.2s; + white-space: nowrap; +} + +.filter-reset-btn:hover { + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(139, 0, 0, 0.3); /* 暗红色阴影 */ +} + +.filter-reset-btn:active { + transform: translateY(0); +} + +.filter-search-btn { + padding: 10px 24px; + background: linear-gradient(135deg, #6366f1, #8b5cf6); + color: #fff; + border: none; + border-radius: 8px; + font-weight: 600; + font-size: 14px; + cursor: pointer; + transition: all 0.2s; + white-space: nowrap; +} + +.filter-search-btn:hover { + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3); +} + +.filter-search-btn:active { + transform: translateY(0); +} + +/* ===== 登录日志分页区域 ===== */ +.log-pagination { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + padding: 16px; + margin-top: 8px; + background: rgba(99, 102, 241, 0.05); + border-radius: 12px; + border: 1px solid rgba(99, 102, 241, 0.1); +} + +.pagination-info { + font-size: 14px; + color: var(--muted); + font-weight: 500; +} + +.load-more-btn { + padding: 10px 24px; + background: linear-gradient(135deg, #6366f1, #8b5cf6); + color: #fff; + border: none; + border-radius: 8px; + font-weight: 600; + font-size: 14px; + cursor: pointer; + transition: all 0.2s; +} + +.load-more-btn:hover:not(:disabled) { + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3); +} + +.load-more-btn:active:not(:disabled) { + transform: translateY(0); +} + +.load-more-btn:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +.no-more { + font-size: 13px; + color: var(--muted); + text-align: center; + width: 100%; +} + +.tmdb-config__status { + padding: 14px 16px; + border-radius: 14px; + background: rgba(245, 158, 11, 0.12); + color: #b45309; + font-weight: 700; +} + +.tmdb-config__status.ready { + background: rgba(34, 197, 94, 0.12); + color: #15803d; +} + +.log-integrity { + padding: 14px 16px; + border-radius: 14px; + background: rgba(245, 158, 11, 0.12); + color: #b45309; + font-weight: 700; +} + +.log-integrity.ok { + background: rgba(34, 197, 94, 0.12); + color: #15803d; +} + +.icon-btn { + min-height: 34px; + padding: 0 14px; +} + +@media (max-width: 1100px) { + .content-grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 900px) { + .dashboard-topbar, + .search-topbar, + .hero-carousel, + .content-grid, + .poster-showcase, + .insight-row, + .global-notice { + width: min(100%, calc(100% - 24px)); + } + + .dashboard-topbar, + .content-toolbar, + .search-topbar { + flex-direction: column; + align-items: stretch; + } + + .search-topbar__input, + .stats-row, + .insight-row, + .field-grid, + .add-column-row { + grid-template-columns: 1fr; + } + + /* 移动端用户菜单优化 */ + .user-menu__trigger { + padding: 6px 12px; + min-height: 44px; + flex-wrap: nowrap; + } + + .user-menu__avatar { + width: 32px; + height: 32px; + flex-shrink: 0; + } + + .user-menu__name { + max-width: 80px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 14px; + flex-shrink: 1; + } + + .user-menu__arrow { + font-size: 10px; + flex-shrink: 0; + } + + .user-menu__dropdown { + right: 0; + min-width: 260px; + top: calc(100% + 8px); + } + + .poster-card-wrap--manage, + .poster-card-wrap--manage .poster-card { + grid-template-columns: 1fr; + } + + .poster-card-wrap--manage .poster-card-actions { + justify-content: flex-end; + } + + .poster-card-wrap--manage .poster-thumb { + aspect-ratio: 0.74; + } + + .hero-carousel__track { + grid-template-columns: repeat(3, minmax(260px, 1fr)); + } +} + +@media (max-width: 768px) { + /* ===== 全局优化 ===== */ + html { + font-size: 14px; + } + + body { + padding: 0; + } + + .app-wrapper { + padding: 0; + } + + /* ===== 顶部导航栏 ===== */ + .dashboard-topbar { + padding: 12px 16px; + gap: 12px; + } + + .dashboard-topbar__brand h1 { + font-size: 20px; + } + + /* ===== 搜索栏 ===== */ + .search-topbar { + padding: 0 16px 16px; + } + + .search-topbar__input { + grid-template-columns: 1fr auto; + } + + .search-topbar__input input { + min-height: 48px; + font-size: 15px; + } + + .search-topbar__input button { + min-height: 48px; + padding: 0 20px; + } + + /* ===== 视图切换按钮 ===== */ + .view-switch { + width: 100%; + } + + .view-switch__btn { + padding: 8px 12px; + font-size: 14px; + } + + /* ===== 每日推荐海报 ===== */ + .hero-carousel { + padding: 0 16px 16px; + } + + .hero-slide--single { + min-height: 280px; + border-radius: 16px; + } + + .hero-slide__content h2 { + font-size: 22px; + } + + .hero-slide__content p { + font-size: 14px; + } + + /* ===== 内容工具栏 ===== */ + .content-toolbar { + padding: 12px 16px; + flex-direction: column; + gap: 12px; + } + + .content-toolbar h2 { + font-size: 20px; + } + + .content-toolbar p { + font-size: 13px; + } + + .top-actions.content-actions { + width: 100%; + } + + /* ===== 网盘标签页 ===== */ + .drive-tabs { + padding: 0 16px; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + scrollbar-width: none; + } + + .drive-tabs::-webkit-scrollbar { + display: none; + } + + .drive-tab { + min-width: 100px; + padding: 10px 16px; + font-size: 14px; + } + + .drive-tab--add { + min-width: 100px; + } + + /* ===== 文件夹树 ===== */ + .folder-tree-container { + padding: 0 16px; + } + + .folder-tree-actions { + padding: 12px 0; + } + + .folder-tree-actions__btn { + font-size: 14px; + padding: 10px 16px; + } + + .tree-item__header { + padding: 12px; + } + + .tree-item__icon { + font-size: 18px; + } + + .tree-item__title { + font-size: 15px; + } + + .tree-actions { + gap: 6px; + } + + .tree-actions button { + padding: 6px 10px; + font-size: 16px; + } + + /* ===== 重复内容面板 ===== */ + .duplicate-panel { + margin: 0 16px 16px; + border-radius: 16px; + } + + .duplicate-panel header { + padding: 16px; + } + + .duplicate-panel header h2 { + font-size: 18px; + } + + .duplicate-list { + padding: 0 16px 16px; + } + + /* ===== 海报展示 ===== */ + .poster-showcase { + padding: 0 16px 16px; + } + + .poster-list--showcase { + grid-template-columns: repeat(2, 1fr); + gap: 12px; + } + + .poster-card { + border-radius: 12px; + } + + .poster-thumb { + border-radius: 12px 12px 0 0; + } + + .poster-meta h3 { + font-size: 14px; + padding: 0 10px; + } + + .poster-meta p { + font-size: 12px; + padding: 0 10px; + } + + /* ===== 个人中心菜单 ===== */ + .user-menu__trigger { + padding: 6px 12px; + min-height: 44px; + } + + .user-menu__avatar { + width: 32px; + height: 32px; + } + + .user-menu__name { + max-width: 80px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 14px; + } + + .user-menu__dropdown { + right: 0; + min-width: 260px; + top: calc(100% + 8px); + } + + /* ===== 通知提示 ===== */ + .global-notice { + top: 70px; + right: 12px; + left: 12px; + min-width: auto; + max-width: none; + font-size: 13px; + padding: 12px 16px; + } + + /* ===== 搜索聚焦提示 ===== */ + .search-focus-hint { + min-height: 300px; + padding: 30px 20px; + } + + .search-focus-icon { + font-size: 60px; + } + + .search-focus-content h3 { + font-size: 22px; + } + + .search-focus-content p { + font-size: 14px; + } + + /* ===== 空搜索结果 ===== */ + .empty-search-result { + min-height: 300px; + padding: 30px 20px; + } + + .empty-search-icon { + font-size: 60px; + } + + .empty-search-content h3 { + font-size: 22px; + } + + .empty-search-content p { + font-size: 14px; + } + + /* ===== 对话框优化 ===== */ + .simple-dialog { + width: calc(100% - 32px); + max-width: 500px; + border-radius: 16px; + } + + .simple-dialog__header { + padding: 16px; + } + + .simple-dialog__header h2 { + font-size: 18px; + } + + .simple-dialog__body { + padding: 16px; + max-height: 70vh; + } + + .simple-dialog__footer { + padding: 12px 16px; + } + + /* ===== 表单优化 ===== */ + .field-grid { + grid-template-columns: 1fr; + gap: 12px; + } + + .field-grid label { + font-size: 13px; + } + + .field-grid input, + .field-grid select, + .field-grid textarea { + font-size: 15px; + min-height: 44px; + } + + /* ===== 按钮优化 ===== */ + button, + .btn { + min-height: 44px; + padding: 10px 20px; + font-size: 15px; + } + + button.secondary, + .btn.secondary { + min-height: 40px; + padding: 8px 16px; + font-size: 14px; + } + + /* ===== 加载面板 ===== */ + .loading-panel { + padding: 40px 20px; + } + + .loading-card { + padding: 20px; + font-size: 15px; + } + + /* ===== 登录日志 ===== */ + .log-panel { + padding: 0; + } + + /* ===== 登录日志筛选区域 - 移动端适配 ===== */ + .log-filter { + padding: 12px; + } + + .filter-row { + flex-direction: column; + gap: 8px; + } + + .filter-input, + .filter-select { + width: 100%; + } + + .filter-reset-btn { + width: 100%; + padding: 12px; + } + + .filter-search-btn { + width: 100%; + padding: 12px; + } + + /* ===== 登录日志分页区域 - 移动端适配 ===== */ + .log-pagination { + flex-direction: column; + gap: 12px; + padding: 12px; + } + + .pagination-info { + font-size: 13px; + } + + .load-more-btn { + width: 100%; + padding: 12px; + } + + .log-integrity { + padding: 12px 16px; + font-size: 13px; + } + + .log-entry { + padding: 12px 16px; + } + + .log-time { + font-size: 13px; + } + + .log-account { + font-size: 13px; + } + + .log-detail { + font-size: 12px; + } + + /* ===== TMDB 配置 ===== */ + .tmdb-config { + padding: 0; + } + + .tmdb-config label span { + font-size: 14px; + } + + .tmdb-config input { + font-size: 15px; + min-height: 44px; + } + + .tmdb-config__status { + font-size: 13px; + } +} + +@media (max-width: 640px) { + .login-shell { + padding: 10px 12px; + } + + .login-panel { + width: 100%; + padding: 16px 14px 18px; + border-radius: 20px; + } + + .login-panel::before { + height: 88px; + border-radius: 0 0 20px 20px; + } + + .brand-mark { + width: 60px; + height: 60px; + border-radius: 14px; + margin-bottom: 8px; + } + + .login-panel h1 { + font-size: 20px; + } + + .login-panel p { + font-size: 12px; + line-height: 1.35; + } + + .auth-switch { + width: 100%; + max-width: 220px; + margin-top: 10px; + } + + .login-form { + margin-top: 12px; + gap: 8px; + } + + .login-form label { + gap: 4px; + } + + .login-form label span { + font-size: 12px; + } + + .login-form input { + padding: 8px 10px; + } + + /* 小屏幕用户菜单优化 */ + .user-menu__trigger { + padding: 6px 12px; + } + + .user-menu__avatar { + width: 32px; + height: 32px; + } + + .user-menu__dropdown { + right: -20px; + min-width: 240px; + } + + .user-menu__header { + flex-direction: column; + text-align: center; + } + + .user-menu__edit-avatar { + position: static; + transform: none; + margin-top: 8px; + } + + .user-menu__edit-avatar:hover { + transform: scale(1.1); + } + + .captcha-row { + grid-template-columns: 1fr; + } + + canvas { + width: 100%; + max-width: 120px; + height: auto; + aspect-ratio: 3 / 1; + justify-self: start; + } +} + +/* ===== 超小屏幕优化 (iPhone SE 等) ===== */ +@media (max-width: 375px) { + html { + font-size: 13px; + } + + .dashboard-topbar { + padding: 10px 12px; + } + + .dashboard-topbar__brand h1 { + font-size: 18px; + } + + .search-topbar { + padding: 0 12px 12px; + } + + .search-topbar__input input { + min-height: 44px; + font-size: 14px; + } + + .search-topbar__input button { + min-height: 44px; + padding: 0 16px; + font-size: 14px; + } + + .view-switch__btn { + padding: 6px 10px; + font-size: 13px; + } + + .poster-list--showcase { + grid-template-columns: 1fr; + } + + .hero-slide--single { + min-height: 240px; + } + + .hero-slide__content h2 { + font-size: 18px; + } + + .hero-slide__content p { + font-size: 13px; + } + + .drive-tab { + min-width: 90px; + padding: 8px 12px; + font-size: 13px; + } + + /* 超小屏幕用户菜单优化 */ + .user-menu__trigger { + padding: 4px 8px; + gap: 6px; + } + + .user-menu__avatar { + width: 28px; + height: 28px; + } + + .user-menu__name { + max-width: 60px; + font-size: 13px; + } + + .tree-item__header { + padding: 10px; + } + + .tree-item__title { + font-size: 14px; + } + + .content-toolbar { + padding: 10px 12px; + } + + .content-toolbar h2 { + font-size: 18px; + } + + button, + .btn { + min-height: 40px; + padding: 8px 16px; + font-size: 14px; + } + + .simple-dialog { + width: calc(100% - 24px); + } + + .global-notice { + top: 60px; + right: 8px; + left: 8px; + font-size: 12px; + padding: 10px 14px; + } + + .search-focus-hint, + .empty-search-result { + min-height: 260px; + padding: 24px 16px; + } + + .search-focus-icon, + .empty-search-icon { + font-size: 50px; + } + + .search-focus-content h3, + .empty-search-content h3 { + font-size: 20px; + } +} + +@media (max-height: 760px) { + .login-shell { + padding: 8px 12px; + } + + .login-panel { + padding: 14px 20px 16px; + } + + .brand-mark { + width: 56px; + height: 56px; + margin-bottom: 6px; + } + + .login-panel h1 { + font-size: 20px; + } + + .login-panel p { + margin-top: 4px; + font-size: 12px; + } + + .auth-switch, + .login-form { + margin-top: 10px; + } + + .login-form { + gap: 8px; + } + + .login-form label { + gap: 4px; + } + + .login-form label span, + .form-message { + font-size: 12px; + } + + .login-form input { + padding: 8px 10px; + } + + .login-form button[type='submit'] { + min-height: 40px; + } +} + +/* ====== 网盘操作加载遮罩层 ====== */ +/* 覆盖整个管理区域,显示旋转动画和提示文字 */ +.drive-loading-overlay { + position: absolute; /* 相对于 manage-layout 定位 */ + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(255, 255, 255, 0.88); /* 半透明白色背景 */ + display: flex; + align-items: center; + justify-content: center; + z-index: 9999; /* 确保在所有内容之上 */ + border-radius: 8px; +} + +/* 加载动画容器:垂直居中显示spinner和文字 */ +.drive-loading-spinner { + display: flex; + flex-direction: column; + align-items: center; + gap: 16px; +} + +/* 网盘遮罩层spinner尺寸覆盖 */ +.drive-loading-spinner .drive-spinner { + width: 44px; + height: 44px; +} + +/* 加载提示文字样式 */ +.drive-loading-text { + color: #606266; + font-size: 14px; + font-weight: 500; + margin: 0; + letter-spacing: 0.5px; +} + +/* ====== 加载遮罩过渡动画(与用户管理组件保持一致) ====== */ +.loading-fade-enter-active { + transition: opacity 0.3s ease; +} +.loading-fade-leave-active { + transition: opacity 0.2s ease; +} +.loading-fade-enter-from, +.loading-fade-leave-to { + opacity: 0; +} diff --git a/vue/src/utils/captcha.js b/vue/src/utils/captcha.js new file mode 100644 index 0000000..39dbb68 --- /dev/null +++ b/vue/src/utils/captcha.js @@ -0,0 +1,47 @@ +export function generateCaptcha(length = 5) { + const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789' + return Array.from({ length }, () => chars[Math.floor(Math.random() * chars.length)]).join('') +} + +export function drawCaptcha(canvas, code) { + if (!canvas) return + const ctx = canvas.getContext('2d') + if (!ctx) return + + ctx.clearRect(0, 0, canvas.width, canvas.height) + ctx.fillStyle = '#f8fafc' + ctx.fillRect(0, 0, canvas.width, canvas.height) + + for (let i = 0; i < 36; i += 1) { + ctx.fillStyle = `rgba(${60 + Math.random() * 120}, ${80 + Math.random() * 120}, ${90 + Math.random() * 120}, .24)` + ctx.beginPath() + ctx.arc(Math.random() * canvas.width, Math.random() * canvas.height, Math.random() * 2.2 + 0.8, 0, Math.PI * 2) + ctx.fill() + } + + for (let i = 0; i < 4; i += 1) { + ctx.strokeStyle = `rgba(15, 118, 110, ${0.2 + Math.random() * 0.35})` + ctx.lineWidth = 1 + Math.random() * 1.5 + ctx.beginPath() + ctx.moveTo(Math.random() * canvas.width, Math.random() * canvas.height) + ctx.bezierCurveTo( + Math.random() * canvas.width, + Math.random() * canvas.height, + Math.random() * canvas.width, + Math.random() * canvas.height, + Math.random() * canvas.width, + Math.random() * canvas.height, + ) + ctx.stroke() + } + + ;[...code].forEach((char, index) => { + ctx.save() + ctx.translate(20 + index * 23, 30 + (Math.random() - 0.5) * 8) + ctx.rotate((Math.random() - 0.5) * 0.45) + ctx.fillStyle = index % 2 ? '#0f766e' : '#172033' + ctx.font = `${22 + Math.random() * 5}px Arial` + ctx.fillText(char, 0, 0) + ctx.restore() + }) +} diff --git a/vue/src/utils/data.js b/vue/src/utils/data.js new file mode 100644 index 0000000..78f0517 --- /dev/null +++ b/vue/src/utils/data.js @@ -0,0 +1,224 @@ +export function normalizeText(value) { + return String(value ?? '').trim() +} + +export function filterRows(rows, keyword) { + const target = normalizeText(keyword).toLowerCase() + if (!target) return rows + return rows.filter((item) => { + const merged = [ + item.title, + item.subtitle, + item.accountName, + item.owner, + item.sheetName, + ...(item.tags || []), + ] + .join(' ') + .toLowerCase() + return merged.includes(target) + }) +} + +export function attachSheetName(sheets = []) { + return sheets.map((sheet) => ({ + ...sheet, + rows: (sheet.rows || []).map((row) => ({ ...row, sheetName: sheet.name })), + })) +} + +export function flattenRows(sheets = []) { + return attachSheetName(sheets).flatMap((sheet) => sheet.rows || []) +} + +export function buildDuplicates(rows) { + // 构建完整路径需要包含所有数据(文件和文件夹) + const allItems = rows + // 只检测文件类型,排除文件夹 + const fileRows = rows.filter(item => item.type !== 'folder') + + const map = new Map() + + fileRows.forEach((item) => { + // 使用更智能的标题标准化:去除空格、标点符号,统一小写 + const key = normalizeTitleForComparison(item.title) + if (!key) return + if (!map.has(key)) { + map.set(key, []) + } + map.get(key).push(item) + }) + + return [...map.entries()] + .filter(([, list]) => list.length > 1) + .map(([, list], index) => ({ + id: `duplicate-${index + 1}`, + title: list[0].title, + locations: list.map((item, idx) => { + // 构建完整路径:网盘名称 / 父文件夹路径 / 资源库 + // 注意:传入 allItems 而不是 fileRows,因为需要查找文件夹 + const parentPath = buildParentPath(item, allItems) + const location = `${item.sheetName}${parentPath} / ${item.accountName}` + + // 如果同一个位置有多个重复文件,添加序号区分 + const sameLocationCount = list.filter((other, otherIdx) => { + if (otherIdx === idx) return false + const otherParentPath = buildParentPath(other, allItems) + const otherLocation = `${other.sheetName}${otherParentPath} / ${other.accountName}` + return otherLocation === location + }).length + + return sameLocationCount > 0 ? `${location} (副本${sameLocationCount + 1})` : location + }), + })) +} + +// 标准化标题用于比较(去除空格、标点符号等) +function normalizeTitleForComparison(title) { + return normalizeText(title) + .toLowerCase() + .replace(/[\s\-_.]+/g, '') // 去除所有空格、连字符、下划线、点号 + .replace(/[\(\)\[\]【】《》]/g, '') // 去除各种括号 +} + +// 构建父文件夹路径 +function buildParentPath(item, allItems) { + if (!item.parentId) return '' + + const pathParts = [] + let currentId = item.parentId + const visited = new Set() // 防止循环引用 + + // 向上查找所有父文件夹 + while (currentId && !visited.has(currentId)) { + visited.add(currentId) + const parent = allItems.find(i => i.id === currentId && i.type === 'folder') + if (!parent) break + pathParts.unshift(parent.title) + currentId = parent.parentId + } + + return pathParts.length ? ' / ' + pathParts.join(' / ') : '' +} + +export function createLoginLog(device = '未知设备', ip = '127.0.0.1', options = {}) { + const hashSeed = String(options.hashSeed || `${Date.now()}-${Math.random()}`) + const hash = hashSeed + .split('') + .reduce((acc, char) => ((acc << 5) - acc + char.charCodeAt(0)) | 0, 0) + .toString(16) + .replace('-', '') + .slice(0, 8) + + return { + id: options.id ? `log-${options.id}` : `log-${Date.now()}`, + time: options.time || new Date().toLocaleString('zh-CN', { hour12: false }), + device, + ip, + hash, + username: normalizeText(options.username) || '未知账号', + result: normalizeText(options.result) || 'success', + userId: options.userId ?? null, + rawUserAgent: normalizeText(options.rawUserAgent) || device, + failReason: normalizeText(options.failReason) || '', + } +} + +export function createRecord(record = {}, fallbackSheetName = '') { + const normalizedTags = Array.isArray(record.tags) + ? record.tags.map((item) => normalizeText(item)).filter(Boolean) + : normalizeText(record.tags) + .split(/[,,]/) + .map((item) => item.trim()) + .filter(Boolean) + + return { + id: record.id || `record-${Date.now()}`, + title: normalizeText(record.title), + subtitle: normalizeText(record.subtitle), + accountName: normalizeText(record.accountName), + owner: normalizeText(record.owner), + updatedAt: normalizeText(record.updatedAt), + status: normalizeText(record.status) || '正常', + poster: normalizeText(record.poster), + tags: normalizedTags, + score: Number(record.score) || 0, + sheetName: normalizeText(record.sheetName) || fallbackSheetName, + parentId: record.parentId || null, // 父文件夹ID + type: record.type || 'file', // 'folder' 或 'file' + originalName: normalizeText(record.originalName), + description: normalizeText(record.description), + category: normalizeText(record.category), + driveId: record.driveId ?? null, + folderId: record.folderId ?? null, + minioUrl: normalizeText(record.minioUrl), + mimeType: normalizeText(record.mimeType), + extension: normalizeText(record.extension), + fileSize: Number(record.fileSize) || 0, + createdAt: normalizeText(record.createdAt), + } +} + +export function mapMovieToRecord(movie = {}, fallbackSheetName = '') { + return createRecord({ + id: movie.id, + title: movie.title, + subtitle: movie.subtitle || movie.description || '', + accountName: movie.originalName || movie.minioUrl || '', + owner: movie.category || '', + updatedAt: movie.updateTime || movie.createTime || '', + status: '正常', + poster: movie.posterUrl || '', + tags: movie.tags, + score: Number(movie.rating) || 0, + sheetName: fallbackSheetName, + parentId: movie.folderId || null, + type: 'file', + originalName: movie.originalName, + description: movie.description, + category: movie.category, + driveId: movie.driveId, + folderId: movie.folderId, + minioUrl: movie.minioUrl, + mimeType: movie.mimeType, + extension: movie.extension, + fileSize: movie.fileSize, + createdAt: movie.createTime, + }, fallbackSheetName) +} + +// 创建文件夹 +export function createFolder(folder = {}, fallbackSheetName = '') { + return { + id: folder.id || `folder-${Date.now()}`, + title: normalizeText(folder.title), + parentId: folder.parentId || null, + sheetName: normalizeText(folder.sheetName) || fallbackSheetName, + type: 'folder', + children: [], // 子项(文件夹或文件) + createdAt: folder.createdAt || new Date().toLocaleString('zh-CN', { hour12: false }), + } +} + +// 构建树形结构 +export function buildTree(items = []) { + const map = new Map() + const roots = [] + + // 创建映射 + items.forEach((item) => { + map.set(item.id, { ...item, children: [] }) + }) + + // 构建树 + items.forEach((item) => { + const node = map.get(item.id) + if (item.parentId && map.has(item.parentId)) { + map.get(item.parentId).children.push(node) + } else { + roots.push(node) + } + }) + + return roots +} diff --git a/vue/src/utils/scrollLock.js b/vue/src/utils/scrollLock.js new file mode 100644 index 0000000..5030bbc --- /dev/null +++ b/vue/src/utils/scrollLock.js @@ -0,0 +1,25 @@ +/** + * 全局滚动锁工具 + * 使用引用计数,支持多个弹窗同时打开而不冲突 + */ +let lockCount = 0 + +/** + * 锁定背景滚动 + */ +export function lockScroll() { + lockCount++ + if (lockCount === 1) { + document.body.style.overflow = 'hidden' + } +} + +/** + * 解锁背景滚动(仅当所有弹窗都关闭后才恢复) + */ +export function unlockScroll() { + lockCount = Math.max(0, lockCount - 1) + if (lockCount === 0) { + document.body.style.overflow = '' + } +} diff --git a/vue/src/utils/storage.js b/vue/src/utils/storage.js new file mode 100644 index 0000000..951b2f4 --- /dev/null +++ b/vue/src/utils/storage.js @@ -0,0 +1,21 @@ +export const AUTH_STORAGE_KEY = 'wangpan-auth-v1' +export const AUTH_SESSION_STORAGE_KEY = 'wangpan-auth-session-v1' +export const DASHBOARD_STORAGE_KEY = 'wangpan-dashboard-v1' +export const COLUMN_STORAGE_KEY = 'wangpan-columns-v1' + +export function readStorage(key, fallback) { + try { + const raw = localStorage.getItem(key) + return raw ? JSON.parse(raw) : fallback + } catch { + return fallback + } +} + +export function writeStorage(key, value) { + localStorage.setItem(key, JSON.stringify(value)) +} + +export function removeStorage(key) { + localStorage.removeItem(key) +} diff --git a/vue/vite.config.js b/vue/vite.config.js new file mode 100644 index 0000000..afa5c91 --- /dev/null +++ b/vue/vite.config.js @@ -0,0 +1,19 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [vue()], + server: { + host: '0.0.0.0', // 允许局域网访问 + port: 5173, + strictPort: true, // ✅ 强制使用指定端口,如果被占用则报错而不是自动切换 + proxy: { + '/api': { + target: 'http://192.168.1.18:8888', + changeOrigin: true, + secure: false, + }, + }, + }, +})