From e40288e8efa46d81c50968843c0d731472f9e5c0 Mon Sep 17 00:00:00 2001 From: User Date: Fri, 10 Oct 2025 11:43:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=80=E6=9C=89=E9=A1=B5=E9=9D=A2=E7=9A=84?= =?UTF-8?q?=E8=AF=AD=E6=B3=95=E6=94=B9=E5=86=99=E4=B8=BAsetup=E5=BD=A2?= =?UTF-8?q?=E5=BC=8F=EF=BC=9B=20=E4=BF=AE=E6=94=B9=E4=BA=86Header=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E7=9A=84=E6=A0=B7=E5=BC=8F=E3=80=81=E5=B8=83=E5=B1=80?= =?UTF-8?q?=EF=BC=9B=20=E6=9B=B4=E6=96=B0=E4=BA=86IFLOW=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E6=96=87=EF=BC=9B=20=E6=B7=BB=E5=8A=A0=E4=BA=86=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E6=A0=B7=E5=BC=8F=EF=BC=9B=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BA=86pinia=E7=8A=B6=E6=80=81=E7=AE=A1=E7=90=86=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IFLOW.md | 67 ++- android/app/capacitor.build.gradle | 4 +- package-lock.json | 846 +++++++++++++++-------------- package.json | 6 +- src/App.vue | 20 +- src/common/base.css | 532 ++++++++++++++++++ src/components/FolderItem.vue | 128 ++--- src/components/Header.vue | 457 ++++++---------- src/components/Modal.vue | 206 +++++++ src/components/NoteItem.vue | 176 +++--- src/main.js | 2 + src/pages/FolderPage.vue | 152 +++--- src/pages/NoteDetailPage.vue | 125 ++--- src/pages/NoteEditorPage.vue | 227 ++++---- src/pages/NoteListPage.vue | 315 +++++------ src/pages/SettingsPage.vue | 128 ++--- src/stores/useAppStore.js | 139 +++++ src/stores/useAppStore.test.js | 9 + src/utils/AppDataContext.js | 119 ---- vite.config.js | 10 + 20 files changed, 2147 insertions(+), 1521 deletions(-) create mode 100644 src/common/base.css create mode 100644 src/components/Modal.vue create mode 100644 src/stores/useAppStore.js create mode 100644 src/stores/useAppStore.test.js delete mode 100644 src/utils/AppDataContext.js diff --git a/IFLOW.md b/IFLOW.md index 462c892..f31f41e 100644 --- a/IFLOW.md +++ b/IFLOW.md @@ -9,7 +9,7 @@ * **核心框架**: Vue 3 (Composition API) * **构建工具**: Vite * **路由管理**: vue-router -* **状态管理**: Vue 3 响应式系统 (`reactive`, `provide`, `inject`) +* **状态管理**: Pinia (Vue 3 状态管理库) * **UI 库**: 原生 CSS,使用了锤子便签的经典配色方案(定义在 `index.html` 的 CSS 变量中) * **移动端支持**: Capacitor (用于构建 Android/iOS 应用) * **代码语言**: JavaScript (ES6+) @@ -17,18 +17,21 @@ ## 项目结构 ``` -J:\git\SmartisanNote.vue +. ├── android/ # Capacitor Android 项目文件 ├── dist/ # 构建后的生产文件 ├── node_modules/ # 项目依赖 +├── public/ # 静态资源目录 ├── src/ +│ ├── common/ # 全局样式和通用工具 │ ├── components/ # 可复用的 Vue 组件 (Header, NoteItem, FolderItem) │ ├── pages/ # 页面级别的 Vue 组件 (NoteList, NoteDetail, NoteEditor, Folder, Settings) -│ ├── utils/ # 工具函数和数据上下文管理 -│ │ ├── AppDataContext.js # 全局状态管理(provide/inject)和数据操作函数 +│ ├── stores/ # Pinia 状态管理 stores +│ │ └── useAppStore.js # 全局状态管理 store +│ ├── utils/ # 工具函数 │ │ └── storage.js # localStorage 封装,负责数据的读写 -│ ├── App.vue # 根组件,包裹 AppDataProvider -│ └── main.js # 应用入口,初始化路由和挂载 +│ ├── App.vue # 根组件 +│ └── main.js # 应用入口,初始化路由、Pinia 和挂载 ├── index.html # HTML 模板,包含 CSS 变量定义 ├── package.json # 项目元数据和脚本命令 ├── vite.config.js # Vite 构建配置 @@ -49,11 +52,57 @@ J:\git\SmartisanNote.vue * **测试**: `npm run test` * 当前脚本未定义具体测试命令。 -## 开发规范与约定 +## 代码规范与开发约定 -* **状态管理**: 使用 `AppDataContext.js` 中的 `provide`/`inject` 模式进行全局状态管理,避免使用 Vuex 或 Pinia。 +* **状态管理**: 使用 Pinia 进行全局状态管理,通过 `useAppStore` composable 函数访问状态。 * **数据持久化**: 所有数据(便签、文件夹、设置)均通过 `src/utils/storage.js` 与 `localStorage` 进行交互。 * **路由**: 使用 `vue-router` 和 `createWebHashHistory` 进行前端路由管理。 * **UI 风格**: 颜色方案严格遵循 `index.html` 中定义的 CSS 变量,以保持锤子便签的视觉风格。 * **组件组织**: 页面组件 (`pages/`) 和可复用组件 (`components/`) 分离,结构清晰。 -* **代码风格**: 采用标准的 Vue 3 Composition API 写法,使用 ES6 模块系统 (`import`/`export`)。 \ No newline at end of file +* **代码风格**: 采用标准的 Vue 3 Composition API 写法,使用 ES6 模块系统 (`import`/`export`)。 + +## 样式 + +* 全局样式文件是位于 `common/` 目录下的 `base.css`。 +* `common.css` 提供了codefun原子类样式,用于快速布局。 +* 样式规范应遵循项目中已有的风格。 + +## JavaScript + +* 严格遵循ES6规范。 +* 遵循JavaScript函数式编程范式。 +* 方法类函数应该使用 `function` 进行定义。 +* 避免出现超过4个以上的 `ref`,超过4个则使用 `reactive`。 +* 全局变量都集中放置于代码顶部。 +* 变量名使用小驼峰命名法。 +* 常量名使用全大写。 +* 状态类变量命名参考 `isLogin`、`isOpen`。 +* 事件类方法命名参考 `onClick`、`onSelect`。 +* 变量都应该写有注释说明、类型说明。 +* `Promise` 方法使用 `async` `await` 写法,并进行容错处理。 +* 字符串拼接使用ES6的模板语法。 +* JavaScript规范应遵循项目中已有的风格。 + +## 组件 + +* 项目集成了 `ionic framework` 组件库。 +* 全局组件放在 `components/` 目录下。 +* 页面独立组件放在页面根目录下的 `components/`。 +* 每个组件应该附带 `README.MD` 文档。 +* 组件编写应遵循项目中已有的风格。 + +## 页面 + +* 页面使用 Composition API (setup语法糖) 编写。 +* 注释、结构规范应遵循项目中已有的风格。 + +## 状态管理 (Pinia) + +项目现在使用 Pinia 作为状态管理解决方案,主要特点包括: + +* **Store 定义**: 在 `src/stores/useAppStore.js` 中定义了全局状态 store +* **状态结构**: 包含 notes、folders 和 settings 三个主要状态 +* **Getters**: 提供了计算属性如 starredNotesCount 和 allNotesCount +* **Actions**: 包含所有状态变更操作,如 addNote、updateNote、deleteNote 等 +* **数据持久化**: 通过 storage.js 工具函数与 localStorage 进行数据交互 +* **使用方式**: 在组件中通过 `const store = useAppStore()` 来访问状态和方法 \ No newline at end of file diff --git a/android/app/capacitor.build.gradle b/android/app/capacitor.build.gradle index bbfb44f..fdb4970 100644 --- a/android/app/capacitor.build.gradle +++ b/android/app/capacitor.build.gradle @@ -2,8 +2,8 @@ android { compileOptions { - sourceCompatibility JavaVersion.VERSION_21 - targetCompatibility JavaVersion.VERSION_21 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } } diff --git a/package-lock.json b/package-lock.json index 96ba7bc..b50ab1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,18 +9,20 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@capacitor/android": "^7.4.3", - "@capacitor/cli": "^7.4.3", - "@capacitor/core": "^7.4.3", - "@capacitor/ios": "^7.4.3", + "@capacitor/android": "^5.7.2", + "@capacitor/cli": "^5.7.2", + "@capacitor/core": "^5.7.2", + "@capacitor/ios": "^5.7.2", "@vue/cli-service": "^5.0.9", "@vue/compiler-sfc": "^3.5.22", "ionicons": "^7.4.0", + "pinia": "^3.0.3", "vue": "^3.5.22", "vue-router": "^4.5.1" }, "devDependencies": { "@vitejs/plugin-vue": "^5.1.4", + "less": "^4.4.2", "vite": "^5.4.8" } }, @@ -133,130 +135,119 @@ } }, "node_modules/@capacitor/android": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-7.4.3.tgz", - "integrity": "sha512-VpjvnOcmYGPLgvXRhe3CGLs62Cg7sxOyp77NddCr+Y06qqgnoaj6OGeBVTc2DZlqZ6bSmh15JvFu82pkvmdgfQ==", + "version": "5.7.8", + "resolved": "https://registry.npmmirror.com/@capacitor/android/-/android-5.7.8.tgz", + "integrity": "sha512-ooWclwcuW0dy3YfqgoozkHkjatX8H2fb2/RwRsJa3cew1P1lUXIXri3Dquuy4LdqFAJA7UHcJ19Bl/6UKdsZYA==", "license": "MIT", "peerDependencies": { - "@capacitor/core": "^7.4.0" + "@capacitor/core": "^5.7.0" } }, "node_modules/@capacitor/cli": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-7.4.3.tgz", - "integrity": "sha512-SWozpdDgrbQ/ry1nIapugDFvE9z+l22BmU/+fpgL2Zv5487hGdXvCX5+1SluuFBP3IPpx6b4LjsKnBigyJoUWg==", + "version": "5.7.8", + "resolved": "https://registry.npmmirror.com/@capacitor/cli/-/cli-5.7.8.tgz", + "integrity": "sha512-qN8LDlREMhrYhOvVXahoJVNkP8LP55/YPRJrzTAFrMqlNJC18L3CzgWYIblFPnuwfbH/RxbfoZT/ydkwgVpMrw==", "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", + "@ionic/cli-framework-output": "^2.2.5", + "@ionic/utils-fs": "^3.1.6", + "@ionic/utils-subprocess": "^2.1.11", + "@ionic/utils-terminal": "^2.3.3", + "commander": "^9.3.0", + "debug": "^4.3.4", "env-paths": "^2.2.0", - "fs-extra": "^11.2.0", - "kleur": "^4.1.5", - "native-run": "^2.0.1", + "kleur": "^4.1.4", + "native-run": "^2.0.0", "open": "^8.4.0", - "plist": "^3.1.0", + "plist": "^3.0.5", "prompts": "^2.4.2", - "rimraf": "^6.0.1", - "semver": "^7.6.3", + "rimraf": "^4.4.1", + "semver": "^7.3.7", "tar": "^6.1.11", - "tslib": "^2.8.1", - "xml2js": "^0.6.2" + "tslib": "^2.4.0", + "xml2js": "^0.5.0" }, "bin": { "cap": "bin/capacitor", "capacitor": "bin/capacitor" }, "engines": { - "node": ">=20.0.0" + "node": ">=16.0.0" + } + }, + "node_modules/@capacitor/cli/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, "node_modules/@capacitor/cli/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "version": "9.5.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "license": "MIT", "engines": { - "node": ">=18" - } - }, - "node_modules/@capacitor/cli/node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" + "node": "^12.20.0 || >=14" } }, "node_modules/@capacitor/cli/node_modules/glob": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", - "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "version": "9.3.5", + "resolved": "https://registry.npmmirror.com/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", "license": "ISC", "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.0.3", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" }, "engines": { - "node": "20 || >=22" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@capacitor/cli/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "version": "8.0.4", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", "license": "ISC", "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "20 || >=22" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@capacitor/cli/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "4.2.8", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "license": "ISC", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8" } }, "node_modules/@capacitor/cli/node_modules/rimraf": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", - "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", "license": "ISC", "dependencies": { - "glob": "^11.0.0", - "package-json-from-dist": "^1.0.0" + "glob": "^9.2.0" }, "bin": { - "rimraf": "dist/esm/bin.mjs" + "rimraf": "dist/cjs/src/bin.js" }, "engines": { - "node": "20 || >=22" + "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -275,21 +266,21 @@ } }, "node_modules/@capacitor/core": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-7.4.3.tgz", - "integrity": "sha512-wCWr8fQ9Wxn0466vPg7nMn0tivbNVjNy1yL4GvDSIZuZx7UpU2HeVGNe9QjN/quEd+YLRFeKEBLBw619VqUiNg==", + "version": "5.7.8", + "resolved": "https://registry.npmmirror.com/@capacitor/core/-/core-5.7.8.tgz", + "integrity": "sha512-rrZcm/2vJM0WdWRQup1TUidbjQV9PfIadSkV4rAGLD7R6PuzZSMPGT0gmoZzCRlXkqrazrWWDkurei3ozU02FA==", "license": "MIT", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@capacitor/ios": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-7.4.3.tgz", - "integrity": "sha512-VNm7cHODgh3KK/4ZC2rXU9gBlvHii/mYFLI+XMXwq24nhB679QxHhz+pUuI7PatYoM2q4MAL0NR/dRgehKCaSA==", + "version": "5.7.8", + "resolved": "https://registry.npmmirror.com/@capacitor/ios/-/ios-5.7.8.tgz", + "integrity": "sha512-XhGrziBnlRmCJ97LdPXOJquHPpYTwSJZIxYSXuPl7SDDuAEve8vs2wY76gLdaaFH2Z6ctdugUX+jR6VNu+ds+w==", "license": "MIT", "peerDependencies": { - "@capacitor/core": "^7.4.0" + "@capacitor/core": "^5.7.0" } }, "node_modules/@discoveryjs/json-ext": { @@ -723,7 +714,7 @@ }, "node_modules/@ionic/utils-array": { "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.6.tgz", + "resolved": "https://registry.npmmirror.com/@ionic/utils-array/-/utils-array-2.1.6.tgz", "integrity": "sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==", "license": "MIT", "dependencies": { @@ -751,7 +742,7 @@ }, "node_modules/@ionic/utils-object": { "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.6.tgz", + "resolved": "https://registry.npmmirror.com/@ionic/utils-object/-/utils-object-2.1.6.tgz", "integrity": "sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==", "license": "MIT", "dependencies": { @@ -763,13 +754,13 @@ } }, "node_modules/@ionic/utils-process": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.12.tgz", - "integrity": "sha512-Jqkgyq7zBs/v/J3YvKtQQiIcxfJyplPgECMWgdO0E1fKrrH8EF0QGHNJ9mJCn6PYe2UtHNS8JJf5G21e09DfYg==", + "version": "2.1.11", + "resolved": "https://registry.npmmirror.com/@ionic/utils-process/-/utils-process-2.1.11.tgz", + "integrity": "sha512-Uavxn+x8j3rDlZEk1X7YnaN6wCgbCwYQOeIjv/m94i1dzslqWhqIHEqxEyeE8HsT5Negboagg7GtQiABy+BLbA==", "license": "MIT", "dependencies": { "@ionic/utils-object": "2.1.6", - "@ionic/utils-terminal": "2.3.5", + "@ionic/utils-terminal": "2.3.4", "debug": "^4.0.0", "signal-exit": "^3.0.3", "tree-kill": "^1.2.2", @@ -779,10 +770,30 @@ "node": ">=16.0.0" } }, + "node_modules/@ionic/utils-process/node_modules/@ionic/utils-terminal": { + "version": "2.3.4", + "resolved": "https://registry.npmmirror.com/@ionic/utils-terminal/-/utils-terminal-2.3.4.tgz", + "integrity": "sha512-cEiMFl3jklE0sW60r8JHH3ijFTwh/jkdEKWbylSyExQwZ8pPuwoXz7gpkWoJRLuoRHHSvg+wzNYyPJazIHfoJA==", + "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/@ionic/utils-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.7.tgz", - "integrity": "sha512-eSELBE7NWNFIHTbTC2jiMvh1ABKGIpGdUIvARsNPMNQhxJB3wpwdiVnoBoTYp+5a6UUIww4Kpg7v6S7iTctH1w==", + "version": "3.1.6", + "resolved": "https://registry.npmmirror.com/@ionic/utils-stream/-/utils-stream-3.1.6.tgz", + "integrity": "sha512-4+Kitey1lTA1yGtnigeYNhV/0tggI3lWBMjC7tBs1K9GXa/q7q4CtOISppdh8QgtOhrhAXS2Igp8rbko/Cj+lA==", "license": "MIT", "dependencies": { "debug": "^4.0.0", @@ -793,16 +804,16 @@ } }, "node_modules/@ionic/utils-subprocess": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-3.0.1.tgz", - "integrity": "sha512-cT4te3AQQPeIM9WCwIg8ohroJ8TjsYaMb2G4ZEgv9YzeDqHZ4JpeIKqG2SoaA3GmVQ3sOfhPM6Ox9sxphV/d1A==", + "version": "2.1.14", + "resolved": "https://registry.npmmirror.com/@ionic/utils-subprocess/-/utils-subprocess-2.1.14.tgz", + "integrity": "sha512-nGYvyGVjU0kjPUcSRFr4ROTraT3w/7r502f5QJEsMRKTqa4eEzCshtwRk+/mpASm0kgBN5rrjYA5A/OZg8ahqg==", "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", + "@ionic/utils-process": "2.1.11", + "@ionic/utils-stream": "3.1.6", + "@ionic/utils-terminal": "2.3.4", "cross-spawn": "^7.0.3", "debug": "^4.0.0", "tslib": "^2.0.1" @@ -811,9 +822,29 @@ "node": ">=16.0.0" } }, + "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-terminal": { + "version": "2.3.4", + "resolved": "https://registry.npmmirror.com/@ionic/utils-terminal/-/utils-terminal-2.3.4.tgz", + "integrity": "sha512-cEiMFl3jklE0sW60r8JHH3ijFTwh/jkdEKWbylSyExQwZ8pPuwoXz7gpkWoJRLuoRHHSvg+wzNYyPJazIHfoJA==", + "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/@ionic/utils-subprocess/node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { @@ -827,7 +858,7 @@ }, "node_modules/@ionic/utils-subprocess/node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", "engines": { @@ -836,7 +867,7 @@ }, "node_modules/@ionic/utils-subprocess/node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", "dependencies": { @@ -848,7 +879,7 @@ }, "node_modules/@ionic/utils-subprocess/node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", "engines": { @@ -857,7 +888,7 @@ }, "node_modules/@ionic/utils-subprocess/node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { @@ -890,123 +921,6 @@ "node": ">=16.0.0" } }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -2073,6 +1987,30 @@ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", "license": "MIT" }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.7", + "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz", + "integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.7", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.7", + "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz", + "integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, "node_modules/@vue/reactivity": { "version": "3.5.22", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.22.tgz", @@ -2693,6 +2631,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/birpc": { + "version": "2.6.1", + "resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.6.1.tgz", + "integrity": "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -3305,6 +3252,21 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "license": "MIT" }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/copy-webpack-plugin": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz", @@ -4041,12 +4003,6 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "license": "MIT" }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, "node_modules/easy-stack": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz", @@ -4147,6 +4103,20 @@ "node": ">=6" } }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, "node_modules/error-ex": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", @@ -4610,93 +4580,6 @@ } } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/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/foreground-child/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/foreground-child/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/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/foreground-child/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/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/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -5003,6 +4886,12 @@ "node": "*" } }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -5282,6 +5171,20 @@ "node": ">= 4" } }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -5492,6 +5395,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -5525,21 +5440,6 @@ "node": ">=0.10.0" } }, - "node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/javascript-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", @@ -5691,6 +5591,53 @@ "launch-editor": "^2.11.1" } }, + "node_modules/less": { + "version": "4.4.2", + "resolved": "https://registry.npmmirror.com/less/-/less-4.4.2.tgz", + "integrity": "sha512-j1n1IuTX1VQjIy3tT7cyGbX7nvQOsFLoIqobZv4ttI5axP923gA44zUj6miiA6R5Aoms4sEGVIIcucXUbRI14g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less/node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/less/node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true, + "license": "MIT" + }, "node_modules/lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", @@ -5950,6 +5897,32 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -6220,6 +6193,12 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -6320,6 +6299,46 @@ "node": ">=16.0.0" } }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/needle/node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "license": "ISC", + "optional": true + }, "node_modules/negotiator": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", @@ -6656,12 +6675,6 @@ "node": ">=6" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/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/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -6702,6 +6715,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/parse5": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", @@ -6776,33 +6799,30 @@ "license": "MIT" }, "node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "version": "1.11.1", + "resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": "20 || >=22" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", - "license": "ISC", - "engines": { - "node": "20 || >=22" - } + "version": "10.4.3", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" }, "node_modules/path-scurry/node_modules/minipass": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "license": "ISC", "engines": { @@ -6830,6 +6850,12 @@ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "license": "MIT" }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -6848,6 +6874,47 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinia": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/pinia/-/pinia-3.0.3.tgz", + "integrity": "sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^7.7.2" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.4.4", + "vue": "^2.7.0 || ^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/@vue/devtools-api": { + "version": "7.7.7", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.7.tgz", + "integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.7" + } + }, "node_modules/plist": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", @@ -7601,6 +7668,14 @@ "node": ">= 0.10" } }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -7868,6 +7943,12 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -8565,6 +8646,15 @@ "wbuf": "^1.7.3" } }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", @@ -8631,21 +8721,6 @@ "node": ">=8" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/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.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -8658,19 +8733,6 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/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/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -8705,6 +8767,18 @@ "postcss": "^8.2.15" } }, + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "license": "MIT", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9038,7 +9112,7 @@ }, "node_modules/tree-kill": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "resolved": "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz", "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "license": "MIT", "bin": { @@ -9867,24 +9941,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/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/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -9913,9 +9969,9 @@ } }, "node_modules/xml2js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", "license": "MIT", "dependencies": { "sax": ">=0.6.0", @@ -9927,7 +9983,7 @@ }, "node_modules/xml2js/node_modules/xmlbuilder": { "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "license": "MIT", "engines": { diff --git a/package.json b/package.json index 6a5b019..9ea0c6a 100644 --- a/package.json +++ b/package.json @@ -5,10 +5,8 @@ "main": "index.js", "scripts": { "android": "npx cap run android", - "dev": "vite", "build": "vite build && npx cap sync", - "preview": "vite preview", - "test": "echo \"Error: no test specified\" && exit 1" + "dev":"vite" }, "keywords": [], "author": "", @@ -22,11 +20,13 @@ "@vue/cli-service": "^5.0.9", "@vue/compiler-sfc": "^3.5.22", "ionicons": "^7.4.0", + "pinia": "^3.0.3", "vue": "^3.5.22", "vue-router": "^4.5.1" }, "devDependencies": { "@vitejs/plugin-vue": "^5.1.4", + "less": "^4.4.2", "vite": "^5.4.8" } } diff --git a/src/App.vue b/src/App.vue index 58f2706..f6ac6bc 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,18 +1,10 @@ - \ No newline at end of file diff --git a/src/common/base.css b/src/common/base.css new file mode 100644 index 0000000..3527254 --- /dev/null +++ b/src/common/base.css @@ -0,0 +1,532 @@ +/************************************************************ +** 请将全局样式拷贝到项目的全局 CSS 文件或者当前页面的顶部 ** +** 否则页面将无法正常显示 ** +************************************************************/ + +html { + font-size: 16px; + user-select: none; + -webkit-user-drag: none; + -webkit-tap-highlight-color: transparent; +} + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 'Microsoft Yahei', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +view, +image, +text { + box-sizing: border-box; + flex-shrink: 0; +} + +#app { + width: 100vw; + height: 100vh; +} + +.code-fun-flex-row { + display: flex; + flex-direction: row; +} + +.code-fun-flex-col { + display: flex; + flex-direction: column; +} + +.code-fun-justify-start { + justify-content: flex-start; +} + +.code-fun-justify-end { + justify-content: flex-end; +} + +.code-fun-justify-center { + justify-content: center; +} + +.code-fun-justify-between { + justify-content: space-between; +} + +.code-fun-justify-around { + justify-content: space-around; +} + +.code-fun-justify-evenly { + justify-content: space-evenly; +} + +.code-fun-items-start { + align-items: flex-start; +} + +.code-fun-items-end { + align-items: flex-end; +} + +.code-fun-items-center { + align-items: center; +} + +.code-fun-items-baseline { + align-items: baseline; +} + +.code-fun-items-stretch { + align-items: stretch; +} + +.code-fun-self-start { + align-self: flex-start; +} + +.code-fun-self-end { + align-self: flex-end; +} + +.code-fun-self-center { + align-self: center; +} + +.code-fun-self-baseline { + align-self: baseline; +} + +.code-fun-self-stretch { + align-self: stretch; +} + +.code-fun-flex-1 { + flex: 1 1 0%; +} + +.code-fun-flex-auto { + flex: 1 1 auto; +} + +.code-fun-grow { + flex-grow: 1; +} + +.code-fun-grow-0 { + flex-grow: 0; +} + +.code-fun-shrink { + flex-shrink: 1; +} + +.code-fun-shrink-0 { + flex-shrink: 0; +} + +.code-fun-relative { + position: relative; +} + +.code-fun-ml-2 { + margin-left: 0.13rem; +} + +.code-fun-mt-2 { + margin-top: 0.13rem; +} + +.code-fun-ml-4 { + margin-left: 0.25rem; +} + +.code-fun-mt-4 { + margin-top: 0.25rem; +} + +.code-fun-ml-6 { + margin-left: 0.38rem; +} + +.code-fun-mt-6 { + margin-top: 0.38rem; +} + +.code-fun-ml-8 { + margin-left: 0.5rem; +} + +.code-fun-mt-8 { + margin-top: 0.5rem; +} + +.code-fun-ml-10 { + margin-left: 0.63rem; +} + +.code-fun-mt-10 { + margin-top: 0.63rem; +} + +.code-fun-ml-12 { + margin-left: 0.75rem; +} + +.code-fun-mt-12 { + margin-top: 0.75rem; +} + +.code-fun-ml-14 { + margin-left: 0.88rem; +} + +.code-fun-mt-14 { + margin-top: 0.88rem; +} + +.code-fun-ml-16 { + margin-left: 1rem; +} + +.code-fun-mt-16 { + margin-top: 1rem; +} + +.code-fun-ml-18 { + margin-left: 1.13rem; +} + +.code-fun-mt-18 { + margin-top: 1.13rem; +} + +.code-fun-ml-20 { + margin-left: 1.25rem; +} + +.code-fun-mt-20 { + margin-top: 1.25rem; +} + +.code-fun-ml-22 { + margin-left: 1.38rem; +} + +.code-fun-mt-22 { + margin-top: 1.38rem; +} + +.code-fun-ml-24 { + margin-left: 1.5rem; +} + +.code-fun-mt-24 { + margin-top: 1.5rem; +} + +.code-fun-ml-26 { + margin-left: 1.63rem; +} + +.code-fun-mt-26 { + margin-top: 1.63rem; +} + +.code-fun-ml-28 { + margin-left: 1.75rem; +} + +.code-fun-mt-28 { + margin-top: 1.75rem; +} + +.code-fun-ml-30 { + margin-left: 1.88rem; +} + +.code-fun-mt-30 { + margin-top: 1.88rem; +} + +.code-fun-ml-32 { + margin-left: 2rem; +} + +.code-fun-mt-32 { + margin-top: 2rem; +} + +.code-fun-ml-34 { + margin-left: 2.13rem; +} + +.code-fun-mt-34 { + margin-top: 2.13rem; +} + +.code-fun-ml-36 { + margin-left: 2.25rem; +} + +.code-fun-mt-36 { + margin-top: 2.25rem; +} + +.code-fun-ml-38 { + margin-left: 2.38rem; +} + +.code-fun-mt-38 { + margin-top: 2.38rem; +} + +.code-fun-ml-40 { + margin-left: 2.5rem; +} + +.code-fun-mt-40 { + margin-top: 2.5rem; +} + +.code-fun-ml-42 { + margin-left: 2.63rem; +} + +.code-fun-mt-42 { + margin-top: 2.63rem; +} + +.code-fun-ml-44 { + margin-left: 2.75rem; +} + +.code-fun-mt-44 { + margin-top: 2.75rem; +} + +.code-fun-ml-46 { + margin-left: 2.88rem; +} + +.code-fun-mt-46 { + margin-top: 2.88rem; +} + +.code-fun-ml-48 { + margin-left: 3rem; +} + +.code-fun-mt-48 { + margin-top: 3rem; +} + +.code-fun-ml-50 { + margin-left: 3.13rem; +} + +.code-fun-mt-50 { + margin-top: 3.13rem; +} + +.code-fun-ml-52 { + margin-left: 3.25rem; +} + +.code-fun-mt-52 { + margin-top: 3.25rem; +} + +.code-fun-ml-54 { + margin-left: 3.38rem; +} + +.code-fun-mt-54 { + margin-top: 3.38rem; +} + +.code-fun-ml-56 { + margin-left: 3.5rem; +} + +.code-fun-mt-56 { + margin-top: 3.5rem; +} + +.code-fun-ml-58 { + margin-left: 3.63rem; +} + +.code-fun-mt-58 { + margin-top: 3.63rem; +} + +.code-fun-ml-60 { + margin-left: 3.75rem; +} + +.code-fun-mt-60 { + margin-top: 3.75rem; +} + +.code-fun-ml-62 { + margin-left: 3.88rem; +} + +.code-fun-mt-62 { + margin-top: 3.88rem; +} + +.code-fun-ml-64 { + margin-left: 4rem; +} + +.code-fun-mt-64 { + margin-top: 4rem; +} + +.code-fun-ml-66 { + margin-left: 4.13rem; +} + +.code-fun-mt-66 { + margin-top: 4.13rem; +} + +.code-fun-ml-68 { + margin-left: 4.25rem; +} + +.code-fun-mt-68 { + margin-top: 4.25rem; +} + +.code-fun-ml-70 { + margin-left: 4.38rem; +} + +.code-fun-mt-70 { + margin-top: 4.38rem; +} + +.code-fun-ml-72 { + margin-left: 4.5rem; +} + +.code-fun-mt-72 { + margin-top: 4.5rem; +} + +.code-fun-ml-74 { + margin-left: 4.63rem; +} + +.code-fun-mt-74 { + margin-top: 4.63rem; +} + +.code-fun-ml-76 { + margin-left: 4.75rem; +} + +.code-fun-mt-76 { + margin-top: 4.75rem; +} + +.code-fun-ml-78 { + margin-left: 4.88rem; +} + +.code-fun-mt-78 { + margin-top: 4.88rem; +} + +.code-fun-ml-80 { + margin-left: 5rem; +} + +.code-fun-mt-80 { + margin-top: 5rem; +} + +.code-fun-ml-82 { + margin-left: 5.13rem; +} + +.code-fun-mt-82 { + margin-top: 5.13rem; +} + +.code-fun-ml-84 { + margin-left: 5.25rem; +} + +.code-fun-mt-84 { + margin-top: 5.25rem; +} + +.code-fun-ml-86 { + margin-left: 5.38rem; +} + +.code-fun-mt-86 { + margin-top: 5.38rem; +} + +.code-fun-ml-88 { + margin-left: 5.5rem; +} + +.code-fun-mt-88 { + margin-top: 5.5rem; +} + +.code-fun-ml-90 { + margin-left: 5.63rem; +} + +.code-fun-mt-90 { + margin-top: 5.63rem; +} + +.code-fun-ml-92 { + margin-left: 5.75rem; +} + +.code-fun-mt-92 { + margin-top: 5.75rem; +} + +.code-fun-ml-94 { + margin-left: 5.88rem; +} + +.code-fun-mt-94 { + margin-top: 5.88rem; +} + +.code-fun-ml-96 { + margin-left: 6rem; +} + +.code-fun-mt-96 { + margin-top: 6rem; +} + +.code-fun-ml-98 { + margin-left: 6.13rem; +} + +.code-fun-mt-98 { + margin-top: 6.13rem; +} + +.code-fun-ml-100 { + margin-left: 6.25rem; +} + +.code-fun-mt-100 { + margin-top: 6.25rem; +} diff --git a/src/components/FolderItem.vue b/src/components/FolderItem.vue index bc927c5..78b75e7 100644 --- a/src/components/FolderItem.vue +++ b/src/components/FolderItem.vue @@ -57,80 +57,72 @@ - \ No newline at end of file + diff --git a/src/components/Modal.vue b/src/components/Modal.vue new file mode 100644 index 0000000..bd6d6e5 --- /dev/null +++ b/src/components/Modal.vue @@ -0,0 +1,206 @@ + + + + + diff --git a/src/components/NoteItem.vue b/src/components/NoteItem.vue index bd3e604..ca193c8 100644 --- a/src/components/NoteItem.vue +++ b/src/components/NoteItem.vue @@ -1,20 +1,16 @@ - \ No newline at end of file + diff --git a/src/main.js b/src/main.js index 7adc316..d633bb0 100644 --- a/src/main.js +++ b/src/main.js @@ -1,5 +1,6 @@ import { createApp } from 'vue' import { createRouter, createWebHashHistory } from 'vue-router' +import { createPinia } from 'pinia' import App from './App.vue' // Pages @@ -27,5 +28,6 @@ const router = createRouter({ // App const app = createApp(App) +app.use(createPinia()) app.use(router) app.mount('#app') \ No newline at end of file diff --git a/src/pages/FolderPage.vue b/src/pages/FolderPage.vue index 93df455..a4f837f 100644 --- a/src/pages/FolderPage.vue +++ b/src/pages/FolderPage.vue @@ -38,95 +38,79 @@ - \ No newline at end of file diff --git a/src/pages/NoteDetailPage.vue b/src/pages/NoteDetailPage.vue index 7e68b10..4fa20fe 100644 --- a/src/pages/NoteDetailPage.vue +++ b/src/pages/NoteDetailPage.vue @@ -59,81 +59,62 @@ - \ No newline at end of file diff --git a/src/pages/NoteEditorPage.vue b/src/pages/NoteEditorPage.vue index 0724b87..3299c13 100644 --- a/src/pages/NoteEditorPage.vue +++ b/src/pages/NoteEditorPage.vue @@ -62,136 +62,113 @@ - \ No newline at end of file diff --git a/src/pages/NoteListPage.vue b/src/pages/NoteListPage.vue index 931c26c..5622415 100644 --- a/src/pages/NoteListPage.vue +++ b/src/pages/NoteListPage.vue @@ -4,7 +4,7 @@ :title="headerTitle" :onAction="handleAddNote" actionIcon="create" - leftIcon="settings" + leftType="settings" :onLeftAction="handleSettingsPress" :onFolderToggle="handleFolderToggle" :isFolderExpanded="isFolderExpanded" @@ -123,185 +123,154 @@ - \ No newline at end of file diff --git a/src/pages/SettingsPage.vue b/src/pages/SettingsPage.vue index c782cf0..db78478 100644 --- a/src/pages/SettingsPage.vue +++ b/src/pages/SettingsPage.vue @@ -79,78 +79,64 @@ - \ No newline at end of file diff --git a/src/stores/useAppStore.js b/src/stores/useAppStore.js new file mode 100644 index 0000000..838e679 --- /dev/null +++ b/src/stores/useAppStore.js @@ -0,0 +1,139 @@ +import { defineStore } from 'pinia'; +import * as storage from '../utils/storage'; + +export const useAppStore = defineStore('app', { + state: () => ({ + notes: [], + folders: [], + settings: { cloudSync: false, darkMode: false } + }), + + getters: { + starredNotesCount: (state) => { + return state.notes.filter(note => note.isStarred).length; + }, + + allNotesCount: (state) => { + return state.notes.length; + } + }, + + actions: { + // 初始化数据 + async loadData() { + try { + const loadedNotes = await storage.getNotes(); + const loadedFolders = await storage.getFolders(); + const loadedSettings = await storage.getSettings(); + + this.notes = loadedNotes; + this.folders = loadedFolders; + this.settings = loadedSettings; + } catch (error) { + console.error('Error loading data:', error); + } + }, + + // 保存notes到localStorage + async saveNotes() { + try { + await storage.saveNotes(this.notes); + } catch (error) { + console.error('Error saving notes:', error); + } + }, + + // 保存folders到localStorage + async saveFolders() { + try { + await storage.saveFolders(this.folders); + } catch (error) { + console.error('Error saving folders:', error); + } + }, + + // 保存settings到localStorage + async saveSettings() { + try { + await storage.saveSettings(this.settings); + } catch (error) { + console.error('Error saving settings:', error); + } + }, + + // Note functions + async addNote(note) { + try { + const newNote = await storage.addNote(note); + this.notes.push(newNote); + return newNote; + } catch (error) { + console.error('Error adding note:', error); + throw error; + } + }, + + async updateNote(id, updates) { + try { + const updatedNote = await storage.updateNote(id, updates); + if (updatedNote) { + const index = this.notes.findIndex(note => note.id === id); + if (index !== -1) { + this.notes[index] = updatedNote; + } + } + return updatedNote; + } catch (error) { + console.error('Error updating note:', error); + throw error; + } + }, + + async deleteNote(id) { + try { + const result = await storage.deleteNote(id); + if (result) { + this.notes = this.notes.filter(note => note.id !== id); + } + return result; + } catch (error) { + console.error('Error deleting note:', error); + throw error; + } + }, + + // Folder functions + async addFolder(folder) { + try { + const newFolder = await storage.addFolder(folder); + this.folders.push(newFolder); + return newFolder; + } catch (error) { + console.error('Error adding folder:', error); + throw error; + } + }, + + // Settings functions + async updateSettings(newSettings) { + try { + const updatedSettings = { ...this.settings, ...newSettings }; + this.settings = updatedSettings; + await storage.saveSettings(updatedSettings); + } catch (error) { + console.error('Error updating settings:', error); + throw error; + } + }, + + // 切换云同步设置 + async toggleCloudSync() { + await this.updateSettings({ cloudSync: !this.settings.cloudSync }); + }, + + // 切换深色模式设置 + async toggleDarkMode() { + await this.updateSettings({ darkMode: !this.settings.darkMode }); + } + } +}); \ No newline at end of file diff --git a/src/stores/useAppStore.test.js b/src/stores/useAppStore.test.js new file mode 100644 index 0000000..d39d571 --- /dev/null +++ b/src/stores/useAppStore.test.js @@ -0,0 +1,9 @@ +import { useAppStore } from './useAppStore'; + +// 测试store是否能正常工作 +describe('AppStore', () => { + it('should initialize with default state', () => { + // 这里可以添加测试代码 + expect(true).toBe(true); + }); +}); \ No newline at end of file diff --git a/src/utils/AppDataContext.js b/src/utils/AppDataContext.js deleted file mode 100644 index 56e638f..0000000 --- a/src/utils/AppDataContext.js +++ /dev/null @@ -1,119 +0,0 @@ -import { reactive, provide, inject, watch } from 'vue'; -import * as storage from './storage'; - -// Define the context key -const AppDataContextKey = Symbol('AppDataContext'); - -// Create the provider component -export const AppDataProvider = { - setup(props, { slots }) { - // Initialize reactive state - const state = reactive({ - notes: [], - folders: [], - settings: { cloudSync: false, darkMode: false } - }); - - // Load data on app start - const loadData = async () => { - const loadedNotes = await storage.getNotes(); - const loadedFolders = await storage.getFolders(); - const loadedSettings = await storage.getSettings(); - - state.notes = loadedNotes; - state.folders = loadedFolders; - state.settings = loadedSettings; - }; - - // Save notes when they change - watch( - () => state.notes, - (newNotes) => { - storage.saveNotes(newNotes); - }, - { deep: true } - ); - - // Save folders when they change - watch( - () => state.folders, - (newFolders) => { - storage.saveFolders(newFolders); - }, - { deep: true } - ); - - // Save settings when they change - watch( - () => state.settings, - (newSettings) => { - storage.saveSettings(newSettings); - }, - { deep: true } - ); - - // Note functions - const addNote = async (note) => { - const newNote = await storage.addNote(note); - state.notes.push(newNote); - return newNote; - }; - - const updateNote = async (id, updates) => { - const updatedNote = await storage.updateNote(id, updates); - if (updatedNote) { - const index = state.notes.findIndex(note => note.id === id); - if (index !== -1) { - state.notes[index] = updatedNote; - } - } - return updatedNote; - }; - - const deleteNote = async (id) => { - const result = await storage.deleteNote(id); - if (result) { - state.notes = state.notes.filter(note => note.id !== id); - } - return result; - }; - - // Folder functions - const addFolder = async (folder) => { - const newFolder = await storage.addFolder(folder); - state.folders.push(newFolder); - return newFolder; - }; - - // Settings functions - const updateSettings = async (newSettings) => { - const updatedSettings = { ...state.settings, ...newSettings }; - state.settings = updatedSettings; - await storage.saveSettings(updatedSettings); - }; - - // Load initial data - loadData(); - - // Provide the context - provide(AppDataContextKey, { - state, - addNote, - updateNote, - deleteNote, - addFolder, - updateSettings - }); - - return () => slots.default?.(); - } -}; - -// Hook to use the context -export const useAppData = () => { - const context = inject(AppDataContextKey); - if (!context) { - throw new Error('useAppData must be used within an AppDataProvider'); - } - return context; -}; \ No newline at end of file diff --git a/vite.config.js b/vite.config.js index 0b15da1..76f2ac1 100644 --- a/vite.config.js +++ b/vite.config.js @@ -11,5 +11,15 @@ export default defineConfig({ }, server: { port: 3000 + }, + build: { + rollupOptions: { + output: { + // 为CSS和JS文件添加哈希后缀 + entryFileNames: 'assets/[name].[hash].js', + chunkFileNames: 'assets/[name].[hash].js', + assetFileNames: 'assets/[name].[hash].[ext]' + } + } } }) \ No newline at end of file