From a23a1107588db38048b74ed79196c97f8af1f722 Mon Sep 17 00:00:00 2001 From: yanweidong Date: Wed, 22 Jul 2026 18:34:20 +0800 Subject: [PATCH] feat(mini): add dockable compact client --- apps/mini/README.md | 13 + apps/mini/index.html | 13 + apps/mini/package-lock.json | 2047 ++++++++++ apps/mini/package.json | 32 + apps/mini/public/senlinai-icon.svg | 10 + apps/mini/scripts/visual-check.mjs | 111 + apps/mini/src-tauri/Cargo.lock | 4394 ++++++++++++++++++++++ apps/mini/src-tauri/Cargo.toml | 18 + apps/mini/src-tauri/build.rs | 3 + apps/mini/src-tauri/icons/128x128.png | Bin 0 -> 3377 bytes apps/mini/src-tauri/icons/128x128@2x.png | Bin 0 -> 6933 bytes apps/mini/src-tauri/icons/32x32.png | Bin 0 -> 926 bytes apps/mini/src-tauri/icons/icon.icns | Bin 0 -> 82438 bytes apps/mini/src-tauri/icons/icon.ico | Bin 0 -> 13686 bytes apps/mini/src-tauri/src/lib.rs | 33 + apps/mini/src-tauri/src/main.rs | 3 + apps/mini/src-tauri/tauri.conf.json | 41 + apps/mini/src/App.tsx | 384 ++ apps/mini/src/api.ts | 200 + apps/mini/src/main.tsx | 14 + apps/mini/src/styles.css | 243 ++ apps/mini/src/vite-env.d.ts | 1 + apps/mini/tsconfig.app.json | 21 + apps/mini/tsconfig.json | 7 + apps/mini/tsconfig.node.json | 15 + apps/mini/vite.config.ts | 12 + 26 files changed, 7615 insertions(+) create mode 100644 apps/mini/README.md create mode 100644 apps/mini/index.html create mode 100644 apps/mini/package-lock.json create mode 100644 apps/mini/package.json create mode 100644 apps/mini/public/senlinai-icon.svg create mode 100644 apps/mini/scripts/visual-check.mjs create mode 100644 apps/mini/src-tauri/Cargo.lock create mode 100644 apps/mini/src-tauri/Cargo.toml create mode 100644 apps/mini/src-tauri/build.rs create mode 100644 apps/mini/src-tauri/icons/128x128.png create mode 100644 apps/mini/src-tauri/icons/128x128@2x.png create mode 100644 apps/mini/src-tauri/icons/32x32.png create mode 100644 apps/mini/src-tauri/icons/icon.icns create mode 100644 apps/mini/src-tauri/icons/icon.ico create mode 100644 apps/mini/src-tauri/src/lib.rs create mode 100644 apps/mini/src-tauri/src/main.rs create mode 100644 apps/mini/src-tauri/tauri.conf.json create mode 100644 apps/mini/src/App.tsx create mode 100644 apps/mini/src/api.ts create mode 100644 apps/mini/src/main.tsx create mode 100644 apps/mini/src/styles.css create mode 100644 apps/mini/src/vite-env.d.ts create mode 100644 apps/mini/tsconfig.app.json create mode 100644 apps/mini/tsconfig.json create mode 100644 apps/mini/tsconfig.node.json create mode 100644 apps/mini/vite.config.ts diff --git a/apps/mini/README.md b/apps/mini/README.md new file mode 100644 index 0000000..857f583 --- /dev/null +++ b/apps/mini/README.md @@ -0,0 +1,13 @@ +# 森林AI Mini + +面向屏幕左右侧停靠场景的窄屏客户端。它使用与 `web_v1` 相同的后端 API,采用顶部导航和单列内容布局。 + +```bash +npm install +npm run dev +npm run desktop:dev +``` + +- Web 开发端口:`5180` +- 桌面窗口默认尺寸:`420 × 820` +- 左右停靠状态保存在本地;在 Tauri 桌面环境中会移动实际窗口。 diff --git a/apps/mini/index.html b/apps/mini/index.html new file mode 100644 index 0000000..62a672e --- /dev/null +++ b/apps/mini/index.html @@ -0,0 +1,13 @@ + + + + + + + 森林AI Mini + + +
+ + + diff --git a/apps/mini/package-lock.json b/apps/mini/package-lock.json new file mode 100644 index 0000000..bd124e1 --- /dev/null +++ b/apps/mini/package-lock.json @@ -0,0 +1,2047 @@ +{ + "name": "senlinai-mini", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "senlinai-mini", + "version": "1.0.0", + "dependencies": { + "@arco-design/web-react": "^2.66.16", + "@tauri-apps/api": "^2.9.0", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@tauri-apps/cli": "^2.9.3", + "@types/node": "^24.13.2", + "@types/react": "^18.3.23", + "@types/react-dom": "^18.3.7", + "@vitejs/plugin-react": "^6.0.3", + "oxlint": "^1.71.0", + "playwright": "^1.61.1", + "typescript": "~6.0.2", + "vite": "^8.1.1" + } + }, + "node_modules/@arco-design/color": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@arco-design/color/-/color-0.4.0.tgz", + "integrity": "sha512-s7p9MSwJgHeL8DwcATaXvWT3m2SigKpxx4JA1BGPHL4gfvaQsmQfrLBDpjOJFJuJ2jG2dMt3R3P8Pm9E65q18g==", + "license": "MIT", + "dependencies": { + "color": "^3.1.3" + } + }, + "node_modules/@arco-design/web-react": { + "version": "2.66.16", + "resolved": "https://registry.npmjs.org/@arco-design/web-react/-/web-react-2.66.16.tgz", + "integrity": "sha512-Ke6Do2GWPqWfbB7eounEdIjxocCSxxZT/TplQPtEZeeuavFWjdPDNyvHeBX6OGb7ZgZPl7NlcJbrTyTlhl56qQ==", + "license": "MIT", + "dependencies": { + "@arco-design/color": "^0.4.0", + "@babel/runtime": "^7.5.5", + "b-tween": "^0.3.3", + "b-validate": "^1.4.2", + "compute-scroll-into-view": "^1.0.17", + "dayjs": "^1.10.5", + "lodash": "^4.17.21", + "number-precision": "^1.3.1", + "react-focus-lock": "^2.13.2", + "react-is": "^18.2.0", + "react-transition-group": "^4.3.0", + "resize-observer-polyfill": "^1.5.1", + "scroll-into-view-if-needed": "^2.2.20", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", + "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.74.0.tgz", + "integrity": "sha512-+gHd12muVI9ZLBaWLPkHt3Fj7jihFjgQ1MGtBaRL8vWrWrI0P7dLUty/cHrHS0oqPYIRgQUJsPu2CExQuMcwNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.74.0.tgz", + "integrity": "sha512-xjKdoMB+H+RCOByv/7l7nfIGW9mlOisqYdcyC75UqYuQecLpReAeEYUf2CNeDEI3KtmUgxpRw/+c63y4AeF/Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.74.0.tgz", + "integrity": "sha512-iUK7wvc6sejMKsC+Pt67mntoF5weFcyEunhZfLJceU6gL419mexz5wBkSx/EnkFBExMLNtOi9fnDSc5xfK0IzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.74.0.tgz", + "integrity": "sha512-ggKc/tn5SJ1u2yG2izC6VKODfYKV8MQ2AicJlNzOjuyrC29udvOef6/JzK2r32xqCnBDLFouR1VCkjzEI0/N9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.74.0.tgz", + "integrity": "sha512-u++dH/43jy9hTLbneaWlS0gla/Bp1JdwJ2zgevCl8nDFUh6qRCGMxcL0f0lb7By3A9p/LfFr+7cG4HU1hG856g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.74.0.tgz", + "integrity": "sha512-Sj1zmtFDVTPeIbIz4ZfcXAbFHqCmKCXdCUlAJzvTF7I20NTH1RDpoF2PhkqNODutJzVhJYmm3oz0GwgY+tvE2g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.74.0.tgz", + "integrity": "sha512-//PKyQb/tQXcHArx2f7z+oVI/eMS2Jpv+edNuAtOrgIhWdGcpHxogveAxzmF2rpH1AIHp4Hq04RF/rgJdiICnQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.74.0.tgz", + "integrity": "sha512-/k1Me+aX2tjuH10K62mLS0y8cLkJBHX6Ce0xPK+eWeel4bSdEGZ8dv4+hYMzg0GrSmjwy4yAYsDPeEeKBft/2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.74.0.tgz", + "integrity": "sha512-3tFSjBxc5D8/zvjEuLvOqcA8ZXKD0+6NuaVO/edeamNc49MoAsbfaC9s1UiwODwgF6slGaF8yJA2TPkukd77tg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.74.0.tgz", + "integrity": "sha512-9QggtPkSPXOCTu8Szis7auOK/sC7KdQaN+/TujP7YVVhzCAOhgdRfgv8uEz0r2tk5xdgus5rLYUrCDoZNtiRUw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.74.0.tgz", + "integrity": "sha512-VM5VPUJ4DJIWiK+AZn8FScUqMr6OFrCAYybMYjEEi7W13ParI64MByiXTkKMqZpBmvQ9zxl9Ebq2VUOiZRJYUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.74.0.tgz", + "integrity": "sha512-SaDY1gh9rOA592J54g+gu5hkOFFQBZsMmIYHs+NRHG+Uq0OxtuuCXMWQ3vu1830Eugv5uMXyjG+bv2Z9y4IXjw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.74.0.tgz", + "integrity": "sha512-ZATQeHZCyr6MbDveg0obD5sxLHFOghtOdC5jwVwYlvFWqtFOxctgFEG6Ef/64hYvZrWyhyCckB10AelqLopeDA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.74.0.tgz", + "integrity": "sha512-+aIvJyrdeD7LwCQ2WYLMUWNmnbeDRSPb40aBYtPjD9+PTqUwgJnk+HK5yLfSMeqXrMrDhE9uTmtt2y50tvjhHw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.74.0.tgz", + "integrity": "sha512-XyktaR8lhK2qWiCK0Tk8oYD+/cgn+oHA6ddRnxSSXUKkkojkV78CmShZUxQF+yrBFs0SuW+JBOPG6hecyc/iZg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.74.0.tgz", + "integrity": "sha512-mzbjrPl4neaVUiJ1fUiEUxTGaSZBoiKtaoB6jmIpz9S+VOA2vDYmJpihQ82w6178V5jxziclTg8Cgj5yF6tTDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.74.0.tgz", + "integrity": "sha512-vUAe9okpS2Oa5+lX67lqHMuNUvfkleRKwrUDJ/WJBsgmddvZ1mrsh2HVmuFDRzqFELhaJhFaCNOuR6a7L3rtIA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.74.0.tgz", + "integrity": "sha512-yyXXJyYYSXL4I8K8jAWjJs+J3fa9gH2JmEbo4f5adm+1tNC9itseicBNuwK7BDHvqQ5J534s+yDULu89vYL2ZQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.74.0.tgz", + "integrity": "sha512-VTC9IYTIMrVUk/i6Ms1ohzzDKZFkWn0KU2OBbPBzgmVZ2V30165T/zK4LztTr0Xgp9fZ1qQZ1rsZAu/rEmySlA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", + "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", + "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", + "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", + "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", + "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", + "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", + "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "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/@tauri-apps/api": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.11.1.tgz", + "integrity": "sha512-M2FPuYND2m+wh5hfW9ZpSdxMPdEJovPBWwoHJmwUpysTYNHaOkVFN419m/K0LIgjb/7KU2vBgsUepJWugQCvAA==", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/cli": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.11.4.tgz", + "integrity": "sha512-R8xGtMpwyetawSqm9kYOuMmEqkhUbvcUy8n0aNXIxollKBLESUu5f4Fx+64hgASYm1H+jSWq6jCW6zqTnH6hqQ==", + "dev": true, + "license": "Apache-2.0 OR MIT", + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "2.11.4", + "@tauri-apps/cli-darwin-x64": "2.11.4", + "@tauri-apps/cli-linux-arm-gnueabihf": "2.11.4", + "@tauri-apps/cli-linux-arm64-gnu": "2.11.4", + "@tauri-apps/cli-linux-arm64-musl": "2.11.4", + "@tauri-apps/cli-linux-riscv64-gnu": "2.11.4", + "@tauri-apps/cli-linux-x64-gnu": "2.11.4", + "@tauri-apps/cli-linux-x64-musl": "2.11.4", + "@tauri-apps/cli-win32-arm64-msvc": "2.11.4", + "@tauri-apps/cli-win32-ia32-msvc": "2.11.4", + "@tauri-apps/cli-win32-x64-msvc": "2.11.4" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.11.4.tgz", + "integrity": "sha512-1ryOF3ZhpZ/nemHV5zVwBQBz9jDGKmKPvWPADOhc83ig0P4bMc2iER4NbC6r9sjeIZ6RVQ4g3RZIYvezhcl4TQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-darwin-x64": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.11.4.tgz", + "integrity": "sha512-uFsGQAAfuyz1k/yGLmkWfkBlgKAqZfxqlHmLWx81QU27RJWfmbNHCIq8T8w1e+VClleIuZUjpHWfoE4E3DLo3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.11.4.tgz", + "integrity": "sha512-IaHZn5CdBL21oUmjiVOS1ctw6Ip1O0pjp70FwOWmYz1myWe0SY96ZIj2FYf7pT0m8bI2h/hrs5ZbEXXh44/MkQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-gnu": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.11.4.tgz", + "integrity": "sha512-N41/ukTRVe6XSuUTESuFdGeOW2i7k62tK+6gHK5Kd5/q5RPvvi19GaWAVPPb9u95HSGmTChSolBfzynUsssFaA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-musl": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.11.4.tgz", + "integrity": "sha512-v277UnT/fB64xAfSroL5N3Km3tLmvATWqJJw/wRI+g6o+HkeD0slyE7gOhNs1MbjE41R7bQOTxMVoL3aomUJmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-riscv64-gnu": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.11.4.tgz", + "integrity": "sha512-qqgNkQ2u1yZHxjhxsZaxUtRDW8dIqIYm33rx/mzwQv0SfY9x1B+iraj8vWeFiXjjSVVhEMepXSOts1TqPzvXNQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.11.4.tgz", + "integrity": "sha512-2VRNWl84FOH0m2giiDkO2h0QXlcMJeX+zJDpI5kDIQAx6s+geF3v48F4DXfJez4GS/FdoDGnPnw1C2iYGbQ7bQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.11.4.tgz", + "integrity": "sha512-o9GyhYor/nc7xarmwDE3ka2szuW3uuZzXjHWh64Q8YX5AtSgxdQkFWzrY4O8KiGtVNvFBI14H3Q49Qj5TOIP/A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-arm64-msvc": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.11.4.tgz", + "integrity": "sha512-ld5Ehb598m0VkYyylRPNeCFsBe/km0jxis6KgMpl3IGY6I/i1RwQXO05I1AsXUXO2WC6AvB/Lw4qTf/asiuEiQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-ia32-msvc": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.11.4.tgz", + "integrity": "sha512-12Hxi0XX/H5VFxO/bGgHkFWhml9VMgEOu9CidjeCeTNQ1l6fpUlbiGgSP7CLI3PFtW9/FfbeHieZ+kyWK5H7CA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-x64-msvc": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.11.4.tgz", + "integrity": "sha512-+vDiqBIU5dMISg/wNvX3sF+ZHfgJGJ5T0AcO+EHNXV9GGAG+P5fzodlDXD3QdKCRgZxMoCm5PPvj3BqLNjBthw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/node": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.31", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", + "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.3.tgz", + "integrity": "sha512-vmFvco5/QuC2f9Oj+wTk0+9XeDFkHxSamwZKYc7MxYwKICfvUvlMhqKI0VuICPltGqh1neqBKDvO4kes1ya8vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/b-tween": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/b-tween/-/b-tween-0.3.3.tgz", + "integrity": "sha512-oEHegcRpA7fAuc9KC4nktucuZn2aS8htymCPcP3qkEGPqiBH+GfqtqoG2l7LxHngg6O0HFM7hOeOYExl1Oz4ZA==", + "license": "MIT" + }, + "node_modules/b-validate": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/b-validate/-/b-validate-1.5.3.tgz", + "integrity": "sha512-iCvCkGFskbaYtfQ0a3GmcQCHl/Sv1GufXFGuUQ+FE+WJa7A/espLOuFIn09B944V8/ImPj71T4+rTASxO2PAuA==", + "license": "MIT" + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==", + "license": "MIT" + }, + "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/dayjs": { + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz", + "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "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/focus-lock": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-1.3.6.tgz", + "integrity": "sha512-Ik/6OCk9RQQ0T5Xw+hKNLWrjSMtv51dD4GRmJjbD5a58TIEpI5a5iXagKVl3Z5UuyslMCA8Xwnu76jQob62Yhg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "dev": true, + "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/number-precision": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/number-precision/-/number-precision-1.6.0.tgz", + "integrity": "sha512-05OLPgbgmnixJw+VvEh18yNPUo3iyp4BEWJcrLu4X9W05KmMifN7Mu5exYvQXqxxeNWhvIF+j3Rij+HmddM/hQ==", + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oxlint": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.74.0.tgz", + "integrity": "sha512-odGl2s2x5IOJoj3A0v1k0PGBXVFBZeZ2+AK/+K2MJur7Ghi3bkyX5NuLUWHKqa4js1wjep3hJeuTQJOlr+4+dA==", + "dev": true, + "license": "MIT", + "bin": { + "oxlint": "bin/oxlint" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.74.0", + "@oxlint/binding-android-arm64": "1.74.0", + "@oxlint/binding-darwin-arm64": "1.74.0", + "@oxlint/binding-darwin-x64": "1.74.0", + "@oxlint/binding-freebsd-x64": "1.74.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.74.0", + "@oxlint/binding-linux-arm-musleabihf": "1.74.0", + "@oxlint/binding-linux-arm64-gnu": "1.74.0", + "@oxlint/binding-linux-arm64-musl": "1.74.0", + "@oxlint/binding-linux-ppc64-gnu": "1.74.0", + "@oxlint/binding-linux-riscv64-gnu": "1.74.0", + "@oxlint/binding-linux-riscv64-musl": "1.74.0", + "@oxlint/binding-linux-s390x-gnu": "1.74.0", + "@oxlint/binding-linux-x64-gnu": "1.74.0", + "@oxlint/binding-linux-x64-musl": "1.74.0", + "@oxlint/binding-openharmony-arm64": "1.74.0", + "@oxlint/binding-win32-arm64-msvc": "1.74.0", + "@oxlint/binding-win32-ia32-msvc": "1.74.0", + "@oxlint/binding-win32-x64-msvc": "1.74.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=0.24.0", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/playwright": { + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz", + "integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.61.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz", + "integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/postcss": { + "version": "8.5.20", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.20.tgz", + "integrity": "sha512-lW616l85ucIQL+FocMmL7pQFPqBmwejrCMg+iPxyImlrANNJG9NHq/RkyCZopDhd8C3LA03PHRJDjkbGu8vvug==", + "dev": true, + "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.16", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-clientside-effect": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.8.tgz", + "integrity": "sha512-ma2FePH0z3px2+WOu6h+YycZcEvFmmxIlAb62cF52bG86eMySciO/EQZeQMXd07kPCYB0a1dWDT5J+KE9mCDUw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-focus-lock": { + "version": "2.13.7", + "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.13.7.tgz", + "integrity": "sha512-20lpZHEQrXPb+pp1tzd4ULL6DyO5D2KnR0G69tTDdydrmNhU7pdFmbQUYVyHUgp+xN29IuFR0PVuhOmvaZL9Og==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^1.3.6", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.7", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, + "node_modules/rolldown": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", + "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.139.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.1.5", + "@rolldown/binding-darwin-arm64": "1.1.5", + "@rolldown/binding-darwin-x64": "1.1.5", + "@rolldown/binding-freebsd-x64": "1.1.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", + "@rolldown/binding-linux-arm64-gnu": "1.1.5", + "@rolldown/binding-linux-arm64-musl": "1.1.5", + "@rolldown/binding-linux-ppc64-gnu": "1.1.5", + "@rolldown/binding-linux-s390x-gnu": "1.1.5", + "@rolldown/binding-linux-x64-gnu": "1.1.5", + "@rolldown/binding-linux-x64-musl": "1.1.5", + "@rolldown/binding-openharmony-arm64": "1.1.5", + "@rolldown/binding-wasm32-wasi": "1.1.5", + "@rolldown/binding-win32-arm64-msvc": "1.1.5", + "@rolldown/binding-win32-x64-msvc": "1.1.5" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/scroll-into-view-if-needed": { + "version": "2.2.31", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", + "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^1.0.20" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/vite": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz", + "integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.17", + "rolldown": "~1.1.5", + "tinyglobby": "^0.2.17" + }, + "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", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.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 + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "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/vite/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" + } + } + } +} diff --git a/apps/mini/package.json b/apps/mini/package.json new file mode 100644 index 0000000..f985546 --- /dev/null +++ b/apps/mini/package.json @@ -0,0 +1,32 @@ +{ + "name": "senlinai-mini", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "oxlint", + "visual-check": "node scripts/visual-check.mjs", + "tauri": "tauri", + "desktop:dev": "tauri dev", + "desktop:build": "tauri build --no-bundle" + }, + "dependencies": { + "@arco-design/web-react": "^2.66.16", + "@tauri-apps/api": "^2.9.0", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@tauri-apps/cli": "^2.9.3", + "@types/node": "^24.13.2", + "@types/react": "^18.3.23", + "@types/react-dom": "^18.3.7", + "@vitejs/plugin-react": "^6.0.3", + "oxlint": "^1.71.0", + "playwright": "^1.61.1", + "typescript": "~6.0.2", + "vite": "^8.1.1" + } +} diff --git a/apps/mini/public/senlinai-icon.svg b/apps/mini/public/senlinai-icon.svg new file mode 100644 index 0000000..dc3662b --- /dev/null +++ b/apps/mini/public/senlinai-icon.svg @@ -0,0 +1,10 @@ + + 森林AI 图标 + + + + + + + + diff --git a/apps/mini/scripts/visual-check.mjs b/apps/mini/scripts/visual-check.mjs new file mode 100644 index 0000000..da345f7 --- /dev/null +++ b/apps/mini/scripts/visual-check.mjs @@ -0,0 +1,111 @@ +import { createServer } from 'vite' +import { chromium } from 'playwright' + +const port = Number(process.env.MINI_VISUAL_PORT ?? 4180) +const server = await createServer({ root: process.cwd(), server: { host: '127.0.0.1', port, strictPort: true } }) +await server.listen() + +const browser = await chromium.launch({ headless: true }) +const page = await browser.newPage({ viewport: { width: 420, height: 820 }, deviceScaleFactor: 1 }) +const errors = [] +page.on('console', (message) => { if (message.type() === 'error') errors.push(message.text()) }) + +const projectId = '019b0000-0000-7000-8000-000000000101' +const expert = { + id: '019b0000-0000-7000-8000-000000000102', slug: 'product-manager', category: 'product', categoryName: '产品', + name: '产品经理', description: '负责需求分析、路线规划和产品交付。', emoji: '🧭', color: '#165DFF', +} +const workspace = { + project: { id: projectId, name: '森林项目', identifier: 'forest', icon: 'folder', background: '#165DFF', description: '让项目计划、资料和 AI 协作保持在同一条线上。', initials: '森林', unreadCount: 0 }, + channels: [], + tags: [{ id: 'tag-product', name: '产品' }, { id: 'tag-design', name: '设计' }], + recentSessions: [], + inbox: [], + tasks: [ + { id: 'task-1', projectId, title: '整理产品路线', summary: '确认下一阶段交付范围。', completed: false, owner: '张明', due: null, createdAt: '今天 09:00', completedAt: null, tagId: 'tag-product', tag: '产品' }, + { id: 'task-2', projectId, title: '检查迷你布局', summary: '验证窄屏下的导航和滚动。', completed: false, owner: '张明', due: null, createdAt: '今天 10:00', completedAt: null, tagId: 'tag-design', tag: '设计' }, + ], + aiSessions: [{ id: 'old-session', projectId, title: '梳理版本计划', summary: '项目会话', updatedAt: '今天', references: [] }], + notesSources: [ + { id: 'note-1', projectId, kind: 'note', title: '版本规划', updatedAt: '今天', tag: '产品', source: '项目笔记' }, + { id: 'source-1', projectId, kind: 'file', title: '需求说明.pdf', updatedAt: '昨天', tag: '资料', source: '上传文件' }, + ], + cronPlans: [{ id: 'cron-1', projectId, title: '每周复盘', schedule: '0 17 * * 5', nextRun: null, enabled: true, lastResult: '', owner: '张明' }], +} + +await page.route('http://localhost:9150/api/v1/**', async (route) => { + const request = route.request() + const path = new URL(request.url()).pathname + if (path === '/api/v1/auth/login') return route.fulfill({ json: { token: 'mini-token' } }) + if (path === '/api/v1/projects') { + if (request.method() === 'POST') return route.fulfill({ status: 201, json: workspace.project }) + return route.fulfill({ json: [workspace.project] }) + } + if (path === `/api/v1/projects/${projectId}/workspace`) return route.fulfill({ json: workspace }) + if (path === '/api/v1/ai-experts') return route.fulfill({ json: [expert, { ...expert, id: 'expert-2', name: 'UI 设计师', category: 'design', categoryName: '设计', emoji: '🎨', color: '#722ED1' }] }) + if (path === `/api/v1/projects/${projectId}/ai-sessions`) { + if (request.method() === 'POST') { + const input = request.postDataJSON() + return route.fulfill({ status: 201, json: { id: 'session-new', projectId, title: input.title, context: input.context, status: 'ready', expert, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() } }) + } + return route.fulfill({ json: [{ id: 'session-1', projectId, title: '梳理版本计划', context: '下一步怎么安排', status: 'ready', expert, createdAt: '2026-07-22T10:00:00Z', updatedAt: '2026-07-22T10:00:00Z' }] }) + } + if (path.includes('/tasks/') && request.method() === 'PATCH') return route.fulfill({ json: {} }) + if (path.endsWith('/tasks') && request.method() === 'POST') return route.fulfill({ status: 201, json: {} }) + if (path.endsWith('/cron-plans') && request.method() === 'POST') return route.fulfill({ status: 201, json: {} }) + return route.fulfill({ status: 404, json: { error: { code: 'not_found', message: '未配置的视觉检查接口' } } }) +}) + +await page.goto(`http://127.0.0.1:${port}/`, { waitUntil: 'networkidle' }) +await page.screenshot({ path: 'test-results/mini-login.png', fullPage: true }) +await page.locator('.login-note input').nth(1).fill('demo@senlin.ai') +await page.locator('.login-note input').nth(2).fill('password123') +await page.getByRole('button', { name: '连接工作台' }).click() +await page.waitForSelector('.mini-shell') +await page.waitForTimeout(400) +await page.screenshot({ path: 'test-results/mini-home-right.png', fullPage: true }) + +const home = await page.evaluate(() => ({ + width: document.querySelector('.mini-shell')?.getBoundingClientRect().width, + navCount: document.querySelectorAll('.mini-nav button').length, + dock: document.documentElement.dataset.dock, + overflowX: document.documentElement.scrollWidth > document.documentElement.clientWidth, + title: document.querySelector('.page-intro h4')?.textContent ?? '', +})) + +await page.getByRole('button', { name: '停靠左侧' }).click() +const leftDock = await page.evaluate(() => document.documentElement.dataset.dock) + +await page.getByRole('button', { name: '计划', exact: true }).click() +await page.getByRole('button', { name: '设计', exact: true }).click() +const tasks = await page.evaluate(() => ({ + count: document.querySelectorAll('.task-note').length, + title: document.querySelector('.task-note strong')?.textContent ?? '', +})) +await page.screenshot({ path: 'test-results/mini-tasks.png', fullPage: true }) + +await page.getByRole('button', { name: '资料', exact: true }).click() +const notes = await page.locator('.source-note').count() + +await page.getByRole('button', { name: 'AI', exact: true }).click() +await page.getByRole('button', { name: /产品经理/ }).click() +await page.locator('.mini-composer textarea').fill('请给出下一步计划') +const sendEnabled = await page.getByRole('button', { name: '开始会话' }).isEnabled() +await page.screenshot({ path: 'test-results/mini-ai.png', fullPage: true }) + +await browser.close() +await server.close() + +const failures = [] +if (errors.length) failures.push(`console errors: ${errors.join('; ')}`) +if (home.width !== 420) failures.push(`expected 420px shell, got ${home.width}`) +if (home.navCount !== 5) failures.push(`expected five top navigation items, got ${home.navCount}`) +if (home.dock !== 'right' || leftDock !== 'left') failures.push(`dock state failed: right=${home.dock}, left=${leftDock}`) +if (home.overflowX) failures.push('mini client has horizontal overflow') +if (home.title !== '森林项目') failures.push(`project overview missing, got ${home.title}`) +if (tasks.count !== 1 || tasks.title !== '检查迷你布局') failures.push(`task tag filtering failed: ${JSON.stringify(tasks)}`) +if (notes !== 2) failures.push(`expected two note cards, got ${notes}`) +if (!sendEnabled) failures.push('AI composer must enable after selecting an expert and entering a prompt') + +console.log(JSON.stringify({ home, leftDock, tasks, notes, sendEnabled, errors }, null, 2)) +if (failures.length) throw new Error(failures.join('\n')) diff --git a/apps/mini/src-tauri/Cargo.lock b/apps/mini/src-tauri/Cargo.lock new file mode 100644 index 0000000..a266227 --- /dev/null +++ b/apps/mini/src-tauri/Cargo.lock @@ -0,0 +1,4394 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +dependencies = [ + "serde_core", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "brotli" +version = "8.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.13.1", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f2d30e4173c4026932d51d31d6b0613b1fd3014bf3f9f8943d4ba139c437ba0" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.19", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89588d05638b5b4594a3348a2d6c20277e43a7f5c5202b05cc56888475a47b8" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link 0.2.1", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +dependencies = [ + "bitflags 2.13.1", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.13.1", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ctor" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "352d39c2f7bef1d6ad73db6f5160efcaed66d94ef8c6c573a8410c00bf909a98" +dependencies = [ + "ctor-proc-macro", + "dtor", +] + +[[package]] +name = "ctor-proc-macro" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1" + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.119", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "dbus" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab69f03cc8c4340c9c8e315114e1658e6775a9b16a04357973aa21cec22b32e" +dependencies = [ + "libc", + "libdbus-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "serde_core", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.119", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.13.1", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "dom_query" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" +dependencies = [ + "bit-set", + "cssparser", + "foldhash", + "html5ever", + "precomputed-hash", + "selectors", + "tendril", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dtor" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1057d6c64987086ff8ed0fd3fbf377a6b7d205cc7715868cd401705f715cbe4" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "embed-resource" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbfdaacccebec3b28e4866b8973543c7647797db5ada1bdab552e48fe665fbbd" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 1.1.3+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" + +[[package]] +name = "futures-executor" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" + +[[package]] +name = "futures-macro" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "futures-sink" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" + +[[package]] +name = "futures-task" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" + +[[package]] +name = "futures-util" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.13.1", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +dependencies = [ + "log", + "markup5ever", +] + +[[package]] +name = "http" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" +dependencies = [ + "byteorder", + "png 0.17.16", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "js-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.13.1", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libdbus-sys" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043" +dependencies = [ + "pkg-config", +] + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libredox" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" +dependencies = [ + "libc", +] + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "markup5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +dependencies = [ + "log", + "tendril", + "web_atoms", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "muda" +version = "0.19.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd04e60bc0b07438a6771710ee1698f98f6ebbc7f89b61264af1563b8aeb878" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.19", + "windows-sys 0.61.2", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.13.1", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.13.1", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.13.1", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.13.1", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.13.1", + "block2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.13.1", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.13.1", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros", + "phf_shared", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plist" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da1d65da6dd5d1e44199ac0f58712d241c0f439f80adea8924d832384087f85" +dependencies = [ + "base64 0.22.1", + "indexmap 2.14.0", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.13.1", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.13+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.1", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.19", +] + +[[package]] +name = "ref-cast" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "reqwest" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.119", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "selectors" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" +dependencies = [ + "bitflags 2.13.1", + "cssparser", + "derive_more", + "log", + "new_debug_unreachable", + "phf", + "phf_codegen", + "precomputed-hash", + "rustc-hash", + "servo_arc", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "senlinai-mini" +version = "1.0.0" +dependencies = [ + "serde", + "serde_json", + "tauri", + "tauri-build", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_with" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" +dependencies = [ + "base64 0.22.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "servo_arc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1c93047acf68669466a34690ac58cca7010bd1b201e1ec86f1fd0a75d3dd4a9" +dependencies = [ + "bitflags 2.13.1", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dbus", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "once_cell", + "parking_lot", + "percent-encoding", + "raw-window-handle", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "667b20e2726d572dea2de7370da16e188eb06008faf9a92fab7cdc46791190b5" +dependencies = [ + "anyhow", + "bytes", + "cookie", + "dirs", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.19", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc9ce40b16101cb6ea63d3e221567affd1c3a9205f95d7bc574941a10636b632" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08279169ff42f8fc45a1dbc9dcae888893ba95288142e5880c59b93a26d2cfc5" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png 0.17.16", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.119", + "tauri-utils", + "thiserror 2.0.19", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8b394794f399a421811d06966343e7933fcae92d59f5180b9388d1174497a45" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-runtime" +version = "2.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0b4bc95aed361b0019067d189a1174a603d460d0f6c72606512d59fc9c12ec8" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.19", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e6fac707727b7a2f48e4ded90976324267371073edbb415ffb73bb0458d203f" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e176a18e67764923c4f1ce66f25ae4abe5f688384d5eb1a0fa6c77f3d90f887" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dom_query", + "dunce", + "glob", + "http", + "infer", + "json-patch", + "log", + "memchr", + "phf", + "plist", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.19", + "toml 1.1.3+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc65d45c68858bfe420dd29e834b5d15dbecf8a07a8a16cf4d532c7b1f69d4b6" +dependencies = [ + "dunce", + "embed-resource", + "toml 1.1.3+spec-1.1.0", +] + +[[package]] +name = "tendril" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fed54709c5b3a53d09bb1c113ea4f5ceafd1e772ddcb0030a82e1d56c087b08" +dependencies = [ + "new_debug_unreachable", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +dependencies = [ + "thiserror-impl 2.0.19", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "time" +version = "0.3.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-util" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c96ecdfa941c8fc4fcaed14f99ada8ebed502eef533015095a07e3301d4c3c" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.4", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.14.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.25.13+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.4", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow 1.0.4", +] + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.13.1", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tray-icon" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65ba1e5f6b9ef9fd87e21b9c6f351554dbd717960089168fcfdef854686961dc" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.19", + "windows-sys 0.61.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web_atoms" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "075474b12bcb3d2e3d4546580e9de478eeeead668a1761e2a8860c836b7ef297" +dependencies = [ + "phf", + "phf_codegen", + "string_cache", + "string_cache_codegen", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webview2-com" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "webview2-com-sys" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +dependencies = [ + "thiserror 2.0.19", + "windows", + "windows-core 0.61.2", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "window-vibrancy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "wry" +version = "0.55.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186f9871daa55fd9c016578b810d149de58367113db7fb72b462d2323ce19514" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs", + "dom_query", + "dpi", + "dunce", + "gdkx11", + "gtk", + "http", + "javascriptcore-rs", + "jni", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.19", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/apps/mini/src-tauri/Cargo.toml b/apps/mini/src-tauri/Cargo.toml new file mode 100644 index 0000000..e8f72e1 --- /dev/null +++ b/apps/mini/src-tauri/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "senlinai-mini" +version = "1.0.0" +description = "森林AI 迷你停靠客户端" +authors = ["森林AI"] +edition = "2021" + +[lib] +name = "senlinai_mini_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[dependencies] +tauri = { version = "2", features = [] } +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/apps/mini/src-tauri/build.rs b/apps/mini/src-tauri/build.rs new file mode 100644 index 0000000..d860e1e --- /dev/null +++ b/apps/mini/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/apps/mini/src-tauri/icons/128x128.png b/apps/mini/src-tauri/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..e54c249b276fae4bc738ebebee8840eba41b62da GIT binary patch literal 3377 zcmV-14bJk3P))C{n(mWjYLJMcBvF*T zj*98eh$K-T$4%sm03O>)ghn&J%j76H2bWMF8uR)=VJUqZUZ6#)eB{v|@$1eo6>Z;;aTny~5a z`wVi3p1Yio4tYj^1)Jp8n2m1{aCk@rqSj0MrRQ8Fz=X;_!Bl>OfPf1YB$-KAW5pzd ztb}wo($p=$=SUb9zy#PhssV6=u@qbR!qMZ_L97bX8Z-F=$&A_u%Y?JXzjHVvM9Ynu z1H&c&HeZ1618cxAQv5SJeE^o#YZW%%Up|3?nH?qoaXzK!Z857plrTM7Do-E@yIZxP`8-XCbOqydyZGb2TBV}U`mEc!laZ^$rA`!v6SepI-*(C>~+2R{}#?;*R9#_yZ9e=T~S|m z^$-n>5S{5~uX_U$5im^IABPM%f%7-XgMQTj0DE173U*_?J>S{cqmtriQYD37ox#id zr8y-DFtOp&?WZTh>fU%SyH+v+EOPcW3A-?fdQmpHFaqTp+@W zfAoPykaDrji2@|fGk?wZ6MgWK_ux+@0>*@~@xDn^Itq|zG0A+Y`&XLmbL^bZN-zuS zmJ@AFaB3ESZ7B`FWA6U}HmUDy=NEjvV2l_m#?0g1K-o2cZp*gEiT3_PU15HTN-$=O zokVY-b%Dy~$<~{dC)YAE%ur2&AV7tIuXhk3ypn)R0ziH8XhVZYf(VZ*KS<#7PJ$3` zHZurnzi8rUr654T@W~HebJ-fMnXhm*#7o!&)n6%sXXPcV4e>G|Q}^eCELv7mIDr$Y z-%Y0v`})|^AG)Ew)T|fQ1*U2M&zwNS!*+s? zGA&G`+pB5!U)1~VK5WgrKnr-88}Lj6*k$`sqlao7qt4XK8LIOIC-2U>3<>dftVTG8 znzKk+L1?dWF!%o0yu;|G7MQ95JRtx)VC4JDl@|{fTk*B?RGV$JXcQ|Oz65*<5Mua- z{To?7dfh&Mg?lG(oed`qY;9w;cpb%8IvgzAtK1L{T0*P;0~y*ToWVjwK)(N@UN!4y zW=@WDSBMEH*ZC_2K34kn$DPf#fe1SesJ;gk=~4Lo^Tx)3?`w!xfChm2F9(<%e<%z- zY&w9qJJ){VT#CB-(sc3qgsq=VwC0X5?Q9NFoP~lDe$$GZS}nX+^R`hQ6FFe z%$h-#Qmt8CHp_ZQj$NQra|S8e&Q{DVbLh#1OX;z%#wZA4WsZE~1DG`dO43F1`lsC_ z`Js0y{q@r%&l${wTK^rS=RfVDhdzFnhQ@E&HrCqN&b-$tGZ~1Y&>Y*}k=bC8*B;LT zJ}2g8M0g^3oXqSYboFFkdTCs2d}`J#36uEMFavU@Rdz$|7Xe>Sg15dnub2Y>+S!{8 ztWn#lL@RY+x^+>S(&5spUvmI$(LD14OaQYX4#Fqo-7m&282-%9PxsQ+w_|0ec|n${ z^AT#iXPjovEDU~pRmApsLD3qfBMh=^U;Aj#@Mr#4J!qR<8yl18>q*d`zG~VWxP1&A_a*?&*l%91Cu#M076}yp6_lErHMDJ2j2fS^?o8ox z+Gjx^Wc0L(AQ0h>d#@V)E|>z|{Q<5CfI>@T0+p40jFsN5eXk%1>Z@z$Pv5+sW<{Lw zL$r#Z!(*d{KL;%!d;tAw?lm5U{cu+Xd_`_fBk6AsQs~r*EISYXVArx0^!IxnWZ+NZ zZi3Agcy#s#SOc8xHwHecXbPROHS^ywdgFUB&pK=o>KR?x0~e>$-h_HKvC(btv;6_q z07e`fq<;&64~Gt0tzNcQo3ZKdAHPl2X0NKLXC9qER|x=Mt%fkH7*zi^&VOJ`RL8CKT7l}u|mQSJ_)ehk{iRpU~XgnAo}4BvfK z^-7$NP*3v-v{dl0G?#uQo8Rj{S_yptnB0>uslE4(5^dsa|H<YV+FiTEwZ+dIRyGP>tmjKX?tiejG?xVFerM0LmLNT=Awa z(9={fChe7G>yutASwseYKuWXAg#gq4a1^dm9l;n2)V-Bz;H->ir4RsQH5%w<8&akwo0Jx>WbW=@xfQ)2TB-0bu$w{XuC>b-AYHQvymY%y9@EbA!38p4 zqe|Zy3~gfNp71$~an(zLErxrQj04Nbmib{y?jMWN8y1 zQ()_IjFez|U8e1*$Obe(Buwo=eSYNUivf&(^GgojlEO`RH z2R#JZ(dCsD@OCge2RR{vrhu9M0+>pL zJ`i*>P+58E05c?2gj+i_DuYLtfvjpf%NY{iG2*&E4z|wq8 zAebZe2K=4-FShzi5&+C$-eZfHO5b|^EyY&9p{n4^3F#2)DBmrn(`T!nVFv6>pAb?o zEZihxkKk@GwZ4!~*g+5tw)O>7hiSF&2Yh1p8CGO>V+d>s+f3LXLPNeoK44VJ?py8* z8c0aVs*unGysms;1B}W#CCrFKo8+32l(M-Xd;(5vKGeRMm0uPCG+D4&Ze?eR#l`%4 z>+N6KC$)Ie9ID(nOpgka;8B4moBMLWFIxj-nS`{GFlrGyh|W8D?7ywZ@L5s$ju1c) z!GFLzLIAzYZ<04iDQaR>#;XMxtb?vpXR%@qBUwGJ2%wkRCb?le#fTtLl#u}$swgWt zTPzUHY1-&hO1D|{E($o!hIHH#KnRK6Kp}zvLIeSX@FxEUc~9dBu;L)p00000NkvXX Hu0mjfo}5^7 literal 0 HcmV?d00001 diff --git a/apps/mini/src-tauri/icons/128x128@2x.png b/apps/mini/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2d620ac96e70b88e8b7aae70ce232196f14b2ae7 GIT binary patch literal 6933 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 literal 0 HcmV?d00001 diff --git a/apps/mini/src-tauri/icons/32x32.png b/apps/mini/src-tauri/icons/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..c843a553778e0dd860a2f1d9fdae3bec1551be14 GIT binary patch literal 926 zcmV;P17ZA$P)5dQA232wNpSh>*_38igR_EtnjQ1)P}*$=b`f<6TWY7h~TAlXwGX;36YD+obg zv6K*~;Zvb6nHFmHP^LjEhCh`SwR@YnclZ9db@$%QpMkS`?)jOSGxN>NIVo6XN|`^f zsa$l;Mo>lF5{THfAW{UpqTisyhQ<%g!jyhWL+&!MJObRHu4|DFJY@sUeQpt&;}nPr z4=jb*Nr{S>5`tp(Fy1fX$>S{Hup^t@VdF3Id9_vHP6x0%M{eA=NUo?%1%yY<3au;x z4ihvztMzkZ6F@sb?dB6;X4aGvEVEW}!P+uWOtkvsUf}Yn#HVH9S04baFA{4o-XaJo zW>l>zrdDL$HPy$2%_gYRw^H0NOpHCg+>yBQadsz1UwheOg zQmZ(muH(Io3nNSzT7a2peLnCJD6I!h-vUNSaHS8pe;znaCuI;dkjZ^l|m8anYtb#7<2h)4Zlc)dW+OFMjZg0hBr7-7Ls0j-caLU!0WiKgn6 z@HkU->v~2a=pK;+$zMQ)#AjE+RLjGX0()}x->u(XLp=Bfh5ajV*Het?sZj4UsE*D2{ssT-?@0fVDgjTjz_1ODGy#Q2LKt#|5D8}? z*X~ZP94mkuRr~FP_@SpekhU4fcW0o!HX|+}jZFyXT@{l0!;uiy{d6m9w7g6!z@Ym| zEuEP3koo-EGYHZ96{Z}1pT5vPHBY7t&Kz5oB>Z_-7TVqcO=o2uMqy~^0#2tKMm2tQ z>>-T>I@MF9r;(7kn6KSbE8MuWj}+Ug@<=)i1JCqv%;9veQ_gUA&gcsg$3Cy;1jV3> zp`XW$FG~rE5ewtoo(x?G7+ZjgQNmi#8a269;yq?6qNy@_2FNMW8>90rjaE5D=t#nrCG< zCzt$-|Mgf2Di)v@O9Kr|FPYs*mLxN#fOJ0>h($07*qoM6N<$g4#>2 AeE|B~dbqxH6`} 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 literal 0 HcmV?d00001 diff --git a/apps/mini/src-tauri/icons/icon.ico b/apps/mini/src-tauri/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..2a5bb4bd97e77356681d414a4bf68cc7e77766bb GIT binary patch literal 13686 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 brV3#EU&FC(iEO|Lv|d}H=7az5pJM+DMZ~`A literal 0 HcmV?d00001 diff --git a/apps/mini/src-tauri/src/lib.rs b/apps/mini/src-tauri/src/lib.rs new file mode 100644 index 0000000..1788b35 --- /dev/null +++ b/apps/mini/src-tauri/src/lib.rs @@ -0,0 +1,33 @@ +use tauri::{PhysicalPosition, Window}; + +#[tauri::command] +fn dock_window(window: Window, side: String) -> Result<(), String> { + let monitor = window + .current_monitor() + .map_err(|error| error.to_string())? + .ok_or_else(|| "无法识别当前屏幕".to_string())?; + let window_size = window.outer_size().map_err(|error| error.to_string())?; + let monitor_position = monitor.position(); + let monitor_size = monitor.size(); + let x = if side == "left" { + monitor_position.x + } else { + monitor_position.x + monitor_size.width as i32 - window_size.width as i32 + }; + + window + .set_position(PhysicalPosition::new(x, monitor_position.y)) + .map_err(|error| error.to_string())?; + window + .set_always_on_top(true) + .map_err(|error| error.to_string())?; + Ok(()) +} + +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() { + tauri::Builder::default() + .invoke_handler(tauri::generate_handler![dock_window]) + .run(tauri::generate_context!()) + .expect("failed to run 森林AI Mini"); +} diff --git a/apps/mini/src-tauri/src/main.rs b/apps/mini/src-tauri/src/main.rs new file mode 100644 index 0000000..b1774f5 --- /dev/null +++ b/apps/mini/src-tauri/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + senlinai_mini_lib::run(); +} diff --git a/apps/mini/src-tauri/tauri.conf.json b/apps/mini/src-tauri/tauri.conf.json new file mode 100644 index 0000000..d718810 --- /dev/null +++ b/apps/mini/src-tauri/tauri.conf.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "森林AI Mini", + "version": "1.0.0", + "identifier": "ai.senlin.mini", + "build": { + "frontendDist": "../dist", + "devUrl": "http://localhost:5180", + "beforeDevCommand": "npm run dev", + "beforeBuildCommand": "npm run build" + }, + "app": { + "windows": [ + { + "label": "main", + "title": "森林AI Mini", + "width": 420, + "height": 820, + "minWidth": 360, + "minHeight": 640, + "resizable": true, + "alwaysOnTop": true, + "center": false + } + ], + "security": { + "csp": "default-src 'self'; img-src 'self' asset: https: data:; style-src 'self' 'unsafe-inline'; connect-src http://* https://*" + } + }, + "bundle": { + "active": true, + "targets": "all", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ] + } +} diff --git a/apps/mini/src/App.tsx b/apps/mini/src/App.tsx new file mode 100644 index 0000000..10c7db5 --- /dev/null +++ b/apps/mini/src/App.tsx @@ -0,0 +1,384 @@ +import { useEffect, useRef, useState } from 'react' +import { Alert, Avatar, Button, Empty, Input, Message, Modal, Select, Spin, Tag, Typography } from '@arco-design/web-react' +import { + IconApps, IconArrowLeft, IconArrowRight, IconCheckCircle, IconClockCircle, + IconFile, IconFolder, IconPlus, IconRefresh, IconRobot, IconSearch, IconSettings, +} from '@arco-design/web-react/icon' +import { + ApiError, createAISession, createCron, createProject, createTask, fetchAISessions, fetchExperts, + fetchProjects, fetchWorkspace, login, updateTask, uploadSource, + type AISession, type ApiSession, type Expert, type Project, type Workspace, +} from './api' + +const { Text, Title } = Typography +type View = 'home' | 'tasks' | 'notes' | 'ai' | 'more' +type DockSide = 'left' | 'right' +type Action = 'project' | 'task' | 'cron' | null + +const navItems: Array<{ id: View; label: string; icon: React.ReactNode }> = [ + { id: 'home', label: '项目', icon: }, + { id: 'tasks', label: '计划', icon: }, + { id: 'notes', label: '资料', icon: }, + { id: 'ai', label: 'AI', icon: }, + { id: 'more', label: '更多', icon: }, +] + +export function App() { + const [session, setSession] = useState(() => readStoredSession()) + const [projects, setProjects] = useState([]) + const [projectId, setProjectId] = useState('') + const [workspace, setWorkspace] = useState(null) + const [experts, setExperts] = useState([]) + const [aiSessions, setAISessions] = useState([]) + const [view, setView] = useState('home') + const [dockSide, setDockSide] = useState(() => localStorage.getItem('senlin-mini-dock') === 'left' ? 'left' : 'right') + const [loading, setLoading] = useState(Boolean(session)) + const [error, setError] = useState('') + const [action, setAction] = useState(null) + const refreshGeneration = useRef(0) + + useEffect(() => { + document.documentElement.dataset.dock = dockSide + localStorage.setItem('senlin-mini-dock', dockSide) + void moveDesktopWindow(dockSide) + }, [dockSide]) + + useEffect(() => { + if (!session) return + let cancelled = false + setLoading(true) + void fetchProjects(session) + .then((items) => { + if (cancelled) return + setProjects(items) + setProjectId((current) => items.some((item) => item.id === current) ? current : items[0]?.id ?? '') + }) + .catch((requestError) => !cancelled && setError(errorMessage(requestError))) + .finally(() => !cancelled && setLoading(false)) + return () => { cancelled = true } + }, [session]) + + useEffect(() => { + if (!session || !projectId) return + void refreshProject(session, projectId) + }, [projectId, session]) + + async function refreshProject(activeSession = session, activeProject = projectId) { + if (!activeSession || !activeProject) return + const generation = ++refreshGeneration.current + setLoading(true) + setError('') + try { + const [nextWorkspace, nextExperts, nextSessions] = await Promise.all([ + fetchWorkspace(activeSession, activeProject), + experts.length ? Promise.resolve(experts) : fetchExperts(activeSession), + fetchAISessions(activeSession, activeProject), + ]) + if (generation !== refreshGeneration.current) return + setWorkspace(nextWorkspace) + setExperts(nextExperts) + setAISessions(nextSessions) + } catch (requestError) { + if (generation === refreshGeneration.current) setError(errorMessage(requestError)) + } finally { + if (generation === refreshGeneration.current) setLoading(false) + } + } + + async function dock(side: DockSide) { + setDockSide(side) + } + + if (!session) return { localStorage.setItem('senlin-mini-session', JSON.stringify(next)); setSession(next) }} /> + + const activeProject = projects.find((project) => project.id === projectId) ?? projects[0] + const content = !workspace || !activeProject + ? + : renderView(view, { + session, workspace, experts, aiSessions, + refresh: () => refreshProject(), + openAction: setAction, + }) + + return ( +
+
+
+ + 森林AI + Mini 1.0 +
+
+
+
+ +
+ +
+ + + + {error ? setError('')} /> : null} +
{content}
+ +
+ 服务已连接 + +
+ + setAction(null)} + onProject={async (name) => { + const project = await createProject(session, name) + const next = await fetchProjects(session) + setProjects(next) + setProjectId(project.id) + }} + onTask={async (title, tag) => { + if (!projectId) return + await createTask(session, projectId, title, tag) + await refreshProject() + }} + onCron={async (title, schedule) => { + if (!projectId) return + await createCron(session, projectId, title, schedule) + await refreshProject() + }} + /> +
+ ) +} + +function renderView(view: View, props: ViewProps) { + if (view === 'tasks') return + if (view === 'notes') return + if (view === 'ai') return + if (view === 'more') return + return +} + +type ViewProps = { + session: ApiSession + workspace: Workspace + experts: Expert[] + aiSessions: AISession[] + refresh: () => void | Promise + openAction: (action: Action) => void +} + +function HomeView({ workspace, openAction }: ViewProps) { + const pending = workspace.tasks.filter((task) => !task.completed) + return ( +
+
+ 当前项目 + {workspace.project.name} +

{workspace.project.description || '把计划、资料与 AI 会话放进同一个项目上下文。'}

+
+
+ + + + +
+
快速操作
+
+ + +
+
接下来{pending.length}
+
+ {pending.slice(0, 4).map((task) =>
{task.title}{task.tag || '未分类'}
)} + {!pending.length && } +
+
+ ) +} + +function Metric({ value, label, color }: { value: number; label: string; color: string }) { + return
{value}{label}
+} + +function TasksView({ session, workspace, refresh, openAction }: ViewProps) { + const [tag, setTag] = useState('全部') + const tags = workspace.tags.filter((item) => item.name !== '全部' && item.name !== 'all') + const tasks = tag === '全部' ? workspace.tasks : workspace.tasks.filter((task) => task.tag === tag) + return ( +
+
工作计划轻点圆圈即可更新状态
+
+ {['全部', ...tags.map((item) => item.name)].map((item) => )} +
+
+ {tasks.map((task) => ( +
+ +
{task.title}

{task.summary || '暂无说明'}

{task.tag || '未分类'} · {task.createdAt}
+
+ ))} + {!tasks.length && } +
+
+ ) +} + +function NotesView({ session, workspace, refresh }: ViewProps) { + const fileInput = useRef(null) + return ( +
+
笔记资料项目资料随手可取
+ { const file = event.target.files?.[0]; if (!file) return; await uploadSource(session, workspace.project.id, file); await refresh(); event.target.value = '' }} /> +
+ {workspace.notesSources.map((note, index) =>
{note.title}

{note.source || note.kind}

{note.tag || '资料'} · {note.updatedAt}
)} + {!workspace.notesSources.length && } +
+
+ ) +} + +function AIView({ session, workspace, experts, aiSessions, refresh }: ViewProps) { + const [query, setQuery] = useState('') + const [category, setCategory] = useState('全部') + const [expertId, setExpertId] = useState('') + const [prompt, setPrompt] = useState('') + const [sending, setSending] = useState(false) + const categories = [...new Set(experts.map((expert) => expert.categoryName))] + const visible = experts.filter((expert) => (category === '全部' || expert.categoryName === category) && `${expert.name}${expert.description}`.toLowerCase().includes(query.toLowerCase())) + const selected = experts.find((expert) => expert.id === expertId) + return ( +
+
AI 会话先选择专家,再开始会话
{experts.length} 位
+ } value={query} onChange={setQuery} allowClear placeholder="搜索专家" /> +
+ {['全部', ...categories].map((item) => )} +
+
+ {visible.slice(0, 30).map((expert) => )} +
+
+
{selected ? <>{selected.emoji}{selected.name}{selected.description} : 选择一位专家进行会话}
+ + +
+
最近会话
+
{aiSessions.slice(0, 5).map((item) =>
{item.expert?.emoji || '🤖'}{item.title}{item.expert?.name || '森林AI'}
)}
+
+ ) +} + +function MoreView({ workspace, openAction }: ViewProps) { + return ( +
+
更多项目周期安排与客户端信息
+
计划任务{workspace.cronPlans.map((plan) =>
{plan.title}{plan.schedule} · {plan.enabled ? '已启用' : '已停用'}
)}{!workspace.cronPlans.length && 暂无周期计划}
+
停靠说明

顶部箭头可将桌面窗口停靠至当前屏幕左侧或右侧。Web 模式会记住布局偏好,桌面模式会同时移动实际窗口。

+
森林AI Miniv1.0 完整版 · 窄屏停靠客户端
+
+ ) +} + +function Login({ onLogin }: { onLogin: (session: ApiSession) => void }) { + const [server, setServer] = useState('http://localhost:9150') + const [email, setEmail] = useState('') + const [password, setPassword] = useState('') + const [loading, setLoading] = useState(false) + const [error, setError] = useState('') + return ( +
+
+ + 森林AI Mini + 停靠在屏幕一侧,随时记录与推进项目 + + + + {error ? : null} + + v1.0 完整版 +
+
+ ) +} + +function ActionModal({ action, workspace, onClose, onProject, onTask, onCron }: { + action: Action + workspace: Workspace | null + onClose: () => void + onProject: (name: string) => Promise + onTask: (title: string, tag: string) => Promise + onCron: (title: string, schedule: string) => Promise +}) { + const [title, setTitle] = useState('') + const [tag, setTag] = useState('') + const [schedule, setSchedule] = useState('0 9 * * 1-5') + const [loading, setLoading] = useState(false) + useEffect(() => { if (action) { setTitle(''); setTag(''); setSchedule('0 9 * * 1-5') } }, [action]) + const labels = action === 'project' ? ['新建项目', '项目名称'] : action === 'task' ? ['新建计划', '计划标题'] : ['新建计划任务', '任务名称'] + return ( + +
+ + {action === 'task' ? : null} + {action === 'cron' ? : null} + +
+
+ ) +} + +function readStoredSession(): ApiSession | null { + try { + const value = JSON.parse(localStorage.getItem('senlin-mini-session') || 'null') as ApiSession | null + return value?.baseUrl && value?.token ? value : null + } catch { + return null + } +} + +function projectMark(project?: Project) { + if (!project) return + if (project.icon && !['folder', 'project'].includes(project.icon)) return project.icon + const chars = Array.from(project.name.trim()) + const chinese = chars.some((char) => /[\u3400-\u9fff]/.test(char)) + return chars.slice(0, chinese ? 2 : 4).join('').toUpperCase() +} + +function errorMessage(error: unknown) { + if (error instanceof ApiError || error instanceof Error) return error.message + return '操作失败,请稍后重试' +} + +async function moveDesktopWindow(side: DockSide) { + if (!('__TAURI_INTERNALS__' in window)) return + try { + const { invoke } = await import('@tauri-apps/api/core') + await invoke('dock_window', { side }) + } catch (requestError) { + Message.warning(errorMessage(requestError)) + } +} diff --git a/apps/mini/src/api.ts b/apps/mini/src/api.ts new file mode 100644 index 0000000..0a9f471 --- /dev/null +++ b/apps/mini/src/api.ts @@ -0,0 +1,200 @@ +export type ApiSession = { baseUrl: string; token: string } + +export type Project = { + id: string + name: string + identifier: string + icon: string + background: string + description: string +} + +export type WorkspaceTask = { + id: string + projectId: string + title: string + summary: string + completed: boolean + owner: string + due: string | null + createdAt: string + completedAt: string | null + tagId: string | null + tag: string +} + +export type NoteSource = { + id: string + projectId: string + kind: string + title: string + updatedAt: string + tag: string + source: string +} + +export type CronPlan = { + id: string + projectId: string + title: string + schedule: string + nextRun: string | null + enabled: boolean + lastResult: string + owner: string +} + +export type Workspace = { + project: Project & { initials: string; unreadCount: number } + tags: Array<{ id: string; name: string }> + tasks: WorkspaceTask[] + notesSources: NoteSource[] + aiSessions: Array<{ id: string; projectId: string; title: string; summary: string; updatedAt: string; references: string[] }> + cronPlans: CronPlan[] +} + +export type Expert = { + id: string + slug: string + category: string + categoryName: string + name: string + description: string + emoji: string + color: string +} + +export type AISession = { + id: string + projectId: string + title: string + context: string + status: string + expert: Expert | null + createdAt: string + updatedAt: string +} + +export class ApiError extends Error { + constructor(public status: number, public code: string, message: string) { + super(message) + this.name = 'ApiError' + } +} + +let baseUrl = normalizeBaseUrl(import.meta.env.VITE_API_BASE_URL ?? 'http://localhost:9150') + +export function configureApi(value: string) { + baseUrl = normalizeBaseUrl(value) +} + +export async function login(server: string, email: string, password: string): Promise { + configureApi(server) + const response = await request<{ token: string }>('/api/v1/auth/login', { method: 'POST', body: { email, password } }) + return { baseUrl, token: response.token } +} + +export async function fetchProjects(session: ApiSession) { + useSessionBase(session) + return request('/api/v1/projects', { token: session.token }) +} + +export async function fetchWorkspace(session: ApiSession, projectId: string) { + useSessionBase(session) + return request(`/api/v1/projects/${projectId}/workspace`, { token: session.token }) +} + +export async function createProject(session: ApiSession, name: string) { + useSessionBase(session) + const identifier = `${slugify(name) || 'project'}-${Date.now().toString(36)}` + return request('/api/v1/projects', { + method: 'POST', token: session.token, + body: { name, identifier, icon: 'folder', background: '#165DFF', description: '' }, + }) +} + +export async function createTask(session: ApiSession, projectId: string, title: string, tag?: string) { + useSessionBase(session) + return request(`/api/v1/projects/${projectId}/tasks`, { + method: 'POST', token: session.token, body: { title, description: '', status: 'open', tag }, + }) +} + +export async function updateTask(session: ApiSession, projectId: string, task: WorkspaceTask) { + useSessionBase(session) + return request(`/api/v1/projects/${projectId}/tasks/${task.id}`, { + method: 'PATCH', token: session.token, + body: { title: task.title, description: task.summary, completed: !task.completed, tag: task.tag }, + }) +} + +export async function uploadSource(session: ApiSession, projectId: string, file: File) { + useSessionBase(session) + const body = new FormData() + body.append('file', file) + body.append('title', file.name) + return request(`/api/v1/projects/${projectId}/sources`, { method: 'POST', token: session.token, body }) +} + +export async function createCron(session: ApiSession, projectId: string, title: string, schedule: string) { + useSessionBase(session) + return request(`/api/v1/projects/${projectId}/cron-plans`, { + method: 'POST', token: session.token, body: { title, schedule, enabled: true }, + }) +} + +export async function fetchExperts(session: ApiSession) { + useSessionBase(session) + return request('/api/v1/ai-experts', { token: session.token }) +} + +export async function fetchAISessions(session: ApiSession, projectId: string) { + useSessionBase(session) + return request(`/api/v1/projects/${projectId}/ai-sessions`, { token: session.token }) +} + +export async function createAISession(session: ApiSession, projectId: string, expertId: string, context: string) { + useSessionBase(session) + return request(`/api/v1/projects/${projectId}/ai-sessions`, { + method: 'POST', token: session.token, + body: { title: Array.from(context).slice(0, 36).join(''), context, expertId }, + }) +} + +type RequestOptions = { method?: string; token?: string; body?: unknown; signal?: AbortSignal } + +async function request(path: string, options: RequestOptions = {}): Promise { + const isForm = options.body instanceof FormData + let response: Response + try { + response = await fetch(`${baseUrl}${path}`, { + method: options.method ?? 'GET', + headers: { + ...(!isForm && options.body !== undefined ? { 'Content-Type': 'application/json' } : {}), + ...(options.token ? { Authorization: `Bearer ${options.token}` } : {}), + }, + body: options.body === undefined ? undefined : isForm ? options.body as FormData : JSON.stringify(options.body), + signal: options.signal, + }) + } catch { + throw new ApiError(0, 'network_error', '无法连接服务器,请检查地址和网络') + } + if (!response.ok) { + const payload = await response.json().catch(() => null) as { error?: { code?: string; message?: string } } | null + throw new ApiError(response.status, payload?.error?.code ?? 'request_failed', payload?.error?.message ?? '请求失败,请稍后重试') + } + if (response.status === 204) return undefined as T + return response.json() as Promise +} + +function useSessionBase(session: ApiSession) { + baseUrl = normalizeBaseUrl(session.baseUrl) +} + +function normalizeBaseUrl(value: string) { + return value.trim().replace(/\/+$/, '') +} + +function slugify(value: string) { + return value.toLowerCase().trim().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, '-').replace(/^-|-$/g, '') +} diff --git a/apps/mini/src/main.tsx b/apps/mini/src/main.tsx new file mode 100644 index 0000000..7fbba9d --- /dev/null +++ b/apps/mini/src/main.tsx @@ -0,0 +1,14 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import { ConfigProvider } from '@arco-design/web-react' +import '@arco-design/web-react/dist/css/arco.css' +import { App } from './App' +import './styles.css' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + + + , +) diff --git a/apps/mini/src/styles.css b/apps/mini/src/styles.css new file mode 100644 index 0000000..9a7c7d1 --- /dev/null +++ b/apps/mini/src/styles.css @@ -0,0 +1,243 @@ +:root { + font-family: Inter, "PingFang SC", "Microsoft YaHei", system-ui, sans-serif; + color: #1d2129; + background: #e8edf4; + font-synthesis: none; + --blue: #165dff; + --line: #e5e8ef; + --muted: #86909c; + --panel: #fff; + --canvas: #f5f7fa; +} + +* { box-sizing: border-box; } +html, body, #root { width: 100%; min-width: 320px; height: 100%; margin: 0; } +body { overflow: hidden; background: #e8edf4; } +button, input, textarea { font: inherit; } +button { color: inherit; } + +.mini-shell { + width: min(100%, 440px); + height: 100vh; + display: grid; + grid-template-rows: 44px 50px 58px minmax(0, 1fr) 28px; + overflow: hidden; + background: var(--canvas); + border: 1px solid rgba(78, 89, 105, 0.18); + box-shadow: 0 20px 60px rgba(29, 33, 41, 0.18); +} + +html[data-dock="right"] .mini-shell { margin-left: auto; } +html[data-dock="left"] .mini-shell { margin-right: auto; } + +.mini-header, +.project-switcher, +.mini-nav, +.mini-footer { + background: rgba(255, 255, 255, 0.96); +} + +.mini-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 10px 0 12px; + border-bottom: 1px solid var(--line); + user-select: none; +} + +.mini-brand, +.window-actions, +.project-trigger, +.mini-footer, +.section-title, +.page-title, +.selected-expert, +.session-list > div, +.settings-card > div, +.version-card { + display: flex; + align-items: center; +} + +.mini-brand { gap: 7px; font-weight: 800; } +.mini-brand img { width: 25px; height: 25px; } +.mini-brand .arco-tag { margin-left: 2px; } +.window-actions { gap: 2px; } +.window-actions .arco-btn { color: #6b778c; } +.window-actions .active { color: var(--blue); background: #edf3ff; } + +.project-switcher { + display: grid; + grid-template-columns: minmax(0, 1fr) 32px 32px; + align-items: center; + gap: 4px; + padding: 6px 8px; + border-bottom: 1px solid var(--line); +} + +.project-switcher > .arco-select { width: 100%; } +.project-trigger { + width: 100%; + min-width: 0; + height: 36px; + gap: 8px; + border: 0; + border-radius: 9px; + background: transparent; + padding: 3px 6px; + text-align: left; + cursor: pointer; +} +.project-trigger:hover { background: #f2f5fa; } +.project-trigger > span:nth-of-type(1) { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 700; } +.project-trigger small { margin-left: auto; color: var(--muted); font-size: 10px; } + +.mini-nav { + display: grid; + grid-template-columns: repeat(5, minmax(0, 1fr)); + border-bottom: 1px solid var(--line); +} +.mini-nav button { + position: relative; + display: grid; + place-items: center; + align-content: center; + gap: 2px; + border: 0; + background: transparent; + color: #6b778c; + cursor: pointer; + font-size: 11px; +} +.mini-nav button::after { content: ""; position: absolute; left: 22%; right: 22%; bottom: 0; height: 2px; border-radius: 99px; background: transparent; } +.mini-nav svg { font-size: 18px; } +.mini-nav button:hover, +.mini-nav button.active { color: var(--blue); background: linear-gradient(180deg, transparent, #f3f7ff); } +.mini-nav button.active::after { background: var(--blue); } + +.mini-alert { position: fixed; z-index: 30; top: 102px; left: 50%; width: min(388px, calc(100% - 24px)); transform: translateX(-50%); } +.mini-content { min-height: 0; overflow: hidden; } +.mini-content > .arco-spin { width: 100%; height: 100%; } +.mini-content > .arco-spin > .arco-spin-children { height: 100%; } +.mini-page { height: 100%; overflow-x: hidden; overflow-y: auto; padding: 14px 14px 24px; scrollbar-width: thin; scrollbar-color: #c9cdd4 transparent; } + +.mini-footer { justify-content: space-between; padding: 0 10px; border-top: 1px solid var(--line); color: var(--muted); font-size: 10px; } +.mini-footer span { display: inline-flex; align-items: center; gap: 5px; } +.mini-footer i { width: 6px; height: 6px; border-radius: 50%; background: #00b42a; box-shadow: 0 0 0 2px #e8ffea; } +.mini-footer button { border: 0; background: transparent; color: var(--muted); cursor: pointer; font-size: 10px; } + +.page-intro { + position: relative; + overflow: hidden; + border-radius: 16px; + background: linear-gradient(135deg, #165dff, #6aa1ff); + color: white; + padding: 18px; + box-shadow: 0 12px 28px rgba(22, 93, 255, 0.2); +} +.page-intro::after { content: ""; position: absolute; width: 130px; height: 130px; right: -45px; top: -52px; border: 24px solid rgba(255,255,255,.1); border-radius: 50%; } +.page-intro .arco-typography { color: rgba(255,255,255,.78); } +.page-intro h4 { margin: 4px 0 5px; color: white; } +.page-intro p { position: relative; z-index: 1; margin: 0; color: rgba(255,255,255,.86); font-size: 12px; line-height: 1.6; } + +.metric-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 9px; margin-top: 12px; } +.metric { display: grid; gap: 2px; border: 1px solid var(--line); border-radius: 12px; background: white; padding: 12px; } +.metric strong { font-size: 22px; } +.metric span { color: var(--muted); font-size: 11px; } +.metric.blue strong { color: #165dff; }.metric.green strong { color: #00b42a; }.metric.purple strong { color: #722ed1; }.metric.orange strong { color: #ff7d00; } + +.section-title { justify-content: space-between; gap: 8px; margin: 18px 2px 9px; font-size: 13px; } +.quick-actions { display: grid; grid-template-columns: repeat(2, 1fr); gap: 9px; } +.quick-actions button { display: flex; align-items: center; gap: 10px; border: 1px solid var(--line); border-radius: 12px; background: white; padding: 12px; text-align: left; cursor: pointer; } +.quick-actions button:hover { border-color: #94bfff; box-shadow: 0 5px 16px rgba(22,93,255,.1); } +.quick-actions svg { color: var(--blue); font-size: 20px; } +.quick-actions span, .compact-list span, .session-list span, .settings-card span { min-width: 0; display: grid; gap: 2px; } +.quick-actions small, .compact-list small, .session-list small, .settings-card small { overflow: hidden; color: var(--muted); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; } + +.compact-list { overflow: hidden; border: 1px solid var(--line); border-radius: 12px; background: white; } +.compact-list > div { display: grid; grid-template-columns: 18px minmax(0,1fr); gap: 9px; align-items: center; padding: 10px 12px; border-bottom: 1px solid #f0f1f4; } +.compact-list > div:last-child { border-bottom: 0; } +.compact-list svg { color: var(--blue); } + +.page-title { justify-content: space-between; gap: 10px; margin-bottom: 13px; } +.page-title h5 { margin: 0 0 2px; } +.page-title .arco-typography { font-size: 11px; } +.filter-strip { display: flex; gap: 6px; overflow-x: auto; margin: 10px 0 12px; padding-bottom: 2px; scrollbar-width: none; } +.filter-strip button { flex: 0 0 auto; border: 1px solid var(--line); border-radius: 999px; background: white; color: var(--muted); padding: 4px 10px; cursor: pointer; font-size: 11px; } +.filter-strip button.active { border-color: #8eb7ff; background: #edf3ff; color: var(--blue); } + +.sticky-list, .note-grid { display: grid; gap: 9px; } +.task-note { display: grid; grid-template-columns: 28px minmax(0,1fr); gap: 9px; border: 1px solid #eadfac; border-radius: 4px 13px 13px 13px; background: #fffbea; padding: 13px 12px 12px 9px; box-shadow: 0 4px 14px rgba(78, 89, 105, .08); } +.task-note:nth-child(3n+2) { border-color: #cde5d7; background: #f0fff5; } +.task-note:nth-child(3n+3) { border-color: #d7def4; background: #f2f5ff; } +.task-note.completed { opacity: .64; } +.task-note.completed strong { text-decoration: line-through; } +.task-check { width: 27px; height: 27px; display: grid; place-items: center; border: 0; border-radius: 50%; background: rgba(255,255,255,.8); color: #8b9aab; cursor: pointer; } +.task-note:not(.completed) .task-check:hover, .task-note.completed .task-check { color: #00b42a; } +.task-note strong { font-size: 13px; } +.task-note p { margin: 5px 0; color: #4e5969; font-size: 11px; line-height: 1.5; } +.task-note span { color: var(--muted); font-size: 10px; } + +.hidden-file { display: none; } +.note-grid { grid-template-columns: repeat(2, minmax(0,1fr)); } +.source-note { min-height: 135px; display: flex; flex-direction: column; border: 1px solid #eadfac; border-radius: 4px 14px 14px 14px; background: #fff9d8; padding: 13px; } +.source-note.tone-1 { background: #eaf8ff; border-color: #c7e6f5; }.source-note.tone-2 { background: #f3edff; border-color: #ded0f7; }.source-note.tone-3 { background: #edfff3; border-color: #caead4; } +.source-note svg { color: #ff9a2e; font-size: 18px; } +.source-note strong { margin-top: 9px; font-size: 12px; } +.source-note p { flex: 1; margin: 5px 0; color: #4e5969; font-size: 10px; } +.source-note span { color: var(--muted); font-size: 9px; } + +.ai-view > .arco-input-wrapper { border-radius: 10px; } +.expert-strip { max-height: 210px; display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: 7px; overflow-y: auto; padding: 1px; } +.expert-strip button { min-width: 0; display: grid; grid-template-columns: 34px minmax(0,1fr); align-items: center; gap: 8px; border: 1px solid var(--line); border-radius: 10px; background: white; padding: 8px; text-align: left; cursor: pointer; } +.expert-strip button.active { border-color: #75a8ff; background: #f2f6ff; box-shadow: 0 0 0 1px #c8dcff; } +.expert-strip i, .selected-expert i, .session-list i { display: grid; place-items: center; border-radius: 9px; color: white; font-style: normal; } +.expert-strip i { width: 34px; height: 34px; font-size: 17px; } +.expert-strip span { min-width: 0; display: grid; } +.expert-strip b { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 11px; } +.expert-strip small { color: var(--muted); font-size: 9px; } + +.mini-composer { display: grid; gap: 8px; margin-top: 12px; border: 1px solid var(--line); border-radius: 14px; background: white; padding: 11px; box-shadow: 0 7px 22px rgba(29,33,41,.08); } +.selected-expert { min-height: 38px; gap: 9px; } +.selected-expert i { width: 36px; height: 36px; flex: 0 0 36px; } +.selected-expert span { min-width: 0; display: grid; } +.selected-expert b { font-size: 12px; } +.selected-expert small { overflow: hidden; color: var(--muted); font-size: 9px; text-overflow: ellipsis; white-space: nowrap; } +.mini-composer .arco-textarea-wrapper { border-radius: 9px; background: #f6f7f9; } +.session-list { display: grid; gap: 7px; } +.session-list > div { gap: 9px; border: 1px solid var(--line); border-radius: 10px; background: white; padding: 9px; } +.session-list i { width: 31px; height: 31px; } + +.settings-card { display: grid; gap: 10px; margin-bottom: 10px; border: 1px solid var(--line); border-radius: 13px; background: white; padding: 13px; } +.settings-card > strong { font-size: 13px; } +.settings-card > div { gap: 9px; border-top: 1px solid #f0f1f4; padding-top: 9px; } +.settings-card svg { color: var(--blue); } +.settings-card p { margin: 0; color: #4e5969; font-size: 11px; line-height: 1.65; } +.version-card { grid-template-columns: 34px minmax(0,1fr); } +.version-card img { width: 34px; } + +.mini-login { width: 100%; height: 100%; display: grid; place-items: center; overflow: auto; padding: 22px; background: linear-gradient(160deg, #edf4ff 0%, #e6ebf2 52%, #dce4ef 100%); } +.login-note { width: min(360px, 100%); display: grid; justify-items: stretch; gap: 13px; border: 1px solid rgba(255,255,255,.85); border-radius: 4px 22px 22px 22px; background: #fffbea; padding: 26px 22px 20px; box-shadow: 0 24px 60px rgba(29,33,41,.16); } +.login-note > img { width: 52px; } +.login-note h3 { margin: 0; } +.login-note label, .mini-form label { display: grid; gap: 5px; color: #4e5969; font-size: 11px; } +.login-note .arco-input-wrapper, .mini-form .arco-input-wrapper { border-radius: 9px; background: rgba(255,255,255,.82); } +.login-note > small { color: var(--muted); text-align: center; } + +.mini-modal .arco-modal { width: min(380px, calc(100vw - 24px)); } +.mini-modal .arco-modal-content { border-radius: 15px; } +.mini-form { display: grid; gap: 13px; } +.mini-form .arco-select { width: 100%; } + +@media (min-width: 700px) { + body { display: flex; } + html[data-dock="right"] body { justify-content: flex-end; } + html[data-dock="left"] body { justify-content: flex-start; } +} + +@media (max-width: 359px) { + .mini-shell { border: 0; } + .mini-brand .arco-tag { display: none; } + .note-grid, .expert-strip { grid-template-columns: 1fr; } +} diff --git a/apps/mini/src/vite-env.d.ts b/apps/mini/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/apps/mini/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/apps/mini/tsconfig.app.json b/apps/mini/tsconfig.app.json new file mode 100644 index 0000000..7a7a882 --- /dev/null +++ b/apps/mini/tsconfig.app.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": ["src"] +} diff --git a/apps/mini/tsconfig.json b/apps/mini/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/apps/mini/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/apps/mini/tsconfig.node.json b/apps/mini/tsconfig.node.json new file mode 100644 index 0000000..9f4e609 --- /dev/null +++ b/apps/mini/tsconfig.node.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true + }, + "include": ["vite.config.ts"] +} diff --git a/apps/mini/vite.config.ts b/apps/mini/vite.config.ts new file mode 100644 index 0000000..1f63368 --- /dev/null +++ b/apps/mini/vite.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +export default defineConfig({ + plugins: [react()], + clearScreen: false, + server: { + host: '127.0.0.1', + port: 5180, + strictPort: true, + }, +})