diff --git a/package.json b/package.json index af898b44..52431454 100644 --- a/package.json +++ b/package.json @@ -35,29 +35,14 @@ "last 1 safari version" ] }, - "pnpm": { - "peerDependencyRules": { - "ignoreMissing": [ - "react-native" - ] - }, - "onlyBuiltDependencies": [ - "@parcel/watcher", - "@swc/core", - "esbuild" - ], - "overrides": { - "mdast-util-to-hast": "13.2.1" - } - }, "dependencies": { "@floating-ui/react": "^0.27.19", "@hookform/resolvers": "^3.10.0", "@react-hook/resize-observer": "^2.0.2", "@stablelib/base64": "^2.0.1", "@stablelib/x25519": "^2.0.1", - "@tanstack/query-core": "^5.100.10", - "@tanstack/react-virtual": "^3.13.24", + "@tanstack/query-core": "^5.100.11", + "@tanstack/react-virtual": "^3.13.25", "@tauri-apps/api": "^2.11.0", "@tauri-apps/plugin-clipboard-manager": "^2.3.2", "@tauri-apps/plugin-deep-link": "^2.4.9", @@ -83,12 +68,12 @@ "file-saver": "^2.0.5", "get-text-width": "^1.0.3", "html-react-parser": "^6.1.1", - "itertools": "^2.6.0", + "itertools": "^2.7.0", "js-base64": "^3.7.8", "lodash-es": "^4.18.1", "merge-refs": "^2.0.0", "millify": "^6.1.0", - "motion": "^12.38.0", + "motion": "^12.40.0", "p-timeout": "^7.0.1", "prop-types": "^15.8.1", "radash": "^12.1.1", @@ -115,25 +100,25 @@ "@biomejs/biome": "^2.4.15", "@hookform/devtools": "^4.4.0", "@svgr/cli": "^8.1.0", - "@tanstack/react-query": "^5.100.10", - "@tanstack/react-query-devtools": "^5.100.10", + "@tanstack/react-query": "^5.100.11", + "@tanstack/react-query-devtools": "^5.100.11", "@tauri-apps/cli": "^2.11.2", "@types/file-saver": "^2.0.7", "@types/lodash-es": "^4.17.12", - "@types/node": "^25.8.0", - "@types/react": "^19.2.14", + "@types/node": "^25.9.1", + "@types/react": "^19.2.15", "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^6.0.2", "@vitejs/plugin-react-swc": "^4.3.1", "autoprefixer": "^10.5.0", "npm-run-all": "^4.1.5", - "postcss": "^8.5.14", + "postcss": "^8.5.15", "prettier": "^3.8.3", "sass": "~1.99.0", "typedoc": "^0.28.19", "typesafe-i18n": "^5.27.1", "typescript": "^5.9.3", - "vite": "^8.0.13" + "vite": "^8.0.14" }, "volta": { "node": "20.5.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bf1eda96..49a8ff7c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,11 +24,11 @@ importers: specifier: ^2.0.1 version: 2.0.1 '@tanstack/query-core': - specifier: ^5.100.10 - version: 5.100.10 + specifier: ^5.100.11 + version: 5.100.11 '@tanstack/react-virtual': - specifier: ^3.13.24 - version: 3.13.24(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + specifier: ^3.13.25 + version: 3.13.25(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tauri-apps/api': specifier: ^2.11.0 version: 2.11.0 @@ -103,10 +103,10 @@ importers: version: 1.0.3 html-react-parser: specifier: ^6.1.1 - version: 6.1.1(@types/react@19.2.14)(react@19.2.6) + version: 6.1.1(@types/react@19.2.15)(react@19.2.6) itertools: - specifier: ^2.6.0 - version: 2.6.0 + specifier: ^2.7.0 + version: 2.7.0 js-base64: specifier: ^3.7.8 version: 3.7.8 @@ -115,13 +115,13 @@ importers: version: 4.18.1 merge-refs: specifier: ^2.0.0 - version: 2.0.0(@types/react@19.2.14) + version: 2.0.0(@types/react@19.2.15) millify: specifier: ^6.1.0 version: 6.1.0 motion: - specifier: ^12.38.0 - version: 12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + specifier: ^12.40.0 + version: 12.40.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) p-timeout: specifier: ^7.0.1 version: 7.0.1 @@ -154,7 +154,7 @@ importers: version: 3.5.0(react@19.2.6) react-markdown: specifier: ^10.1.0 - version: 10.1.0(@types/react@19.2.14)(react@19.2.6) + version: 10.1.0(@types/react@19.2.15)(react@19.2.6) react-qr-code: specifier: ^2.0.21 version: 2.0.21(react@19.2.6) @@ -169,7 +169,7 @@ importers: version: 1.0.26(react-dom@19.2.6(react@19.2.6))(react@19.2.6) recharts: specifier: ^3.8.1 - version: 3.8.1(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react-is@16.13.1)(react@19.2.6)(redux@5.0.1) + version: 3.8.1(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react-is@16.13.1)(react@19.2.6)(redux@5.0.1) rehype-sanitize: specifier: ^6.0.0 version: 6.0.0 @@ -184,23 +184,23 @@ importers: version: 3.25.76 zustand: specifier: ^5.0.13 - version: 5.0.13(@types/react@19.2.14)(immer@11.1.8)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)) + version: 5.0.13(@types/react@19.2.15)(immer@11.1.8)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)) devDependencies: '@biomejs/biome': specifier: ^2.4.15 version: 2.4.15 '@hookform/devtools': specifier: ^4.4.0 - version: 4.4.0(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + version: 4.4.0(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@svgr/cli': specifier: ^8.1.0 version: 8.1.0(typescript@5.9.3) '@tanstack/react-query': - specifier: ^5.100.10 - version: 5.100.10(react@19.2.6) + specifier: ^5.100.11 + version: 5.100.11(react@19.2.6) '@tanstack/react-query-devtools': - specifier: ^5.100.10 - version: 5.100.10(@tanstack/react-query@5.100.10(react@19.2.6))(react@19.2.6) + specifier: ^5.100.11 + version: 5.100.11(@tanstack/react-query@5.100.11(react@19.2.6))(react@19.2.6) '@tauri-apps/cli': specifier: ^2.11.2 version: 2.11.2 @@ -211,29 +211,29 @@ importers: specifier: ^4.17.12 version: 4.17.12 '@types/node': - specifier: ^25.8.0 - version: 25.8.0 + specifier: ^25.9.1 + version: 25.9.1 '@types/react': - specifier: ^19.2.14 - version: 19.2.14 + specifier: ^19.2.15 + version: 19.2.15 '@types/react-dom': specifier: ^19.2.3 - version: 19.2.3(@types/react@19.2.14) + version: 19.2.3(@types/react@19.2.15) '@vitejs/plugin-react': specifier: ^6.0.2 - version: 6.0.2(vite@8.0.13(@types/node@25.8.0)(sass@1.99.0)(yaml@2.9.0)) + version: 6.0.2(vite@8.0.14(@types/node@25.9.1)(sass@1.99.0)(yaml@2.9.0)) '@vitejs/plugin-react-swc': specifier: ^4.3.1 - version: 4.3.1(vite@8.0.13(@types/node@25.8.0)(sass@1.99.0)(yaml@2.9.0)) + version: 4.3.1(vite@8.0.14(@types/node@25.9.1)(sass@1.99.0)(yaml@2.9.0)) autoprefixer: specifier: ^10.5.0 - version: 10.5.0(postcss@8.5.14) + version: 10.5.0(postcss@8.5.15) npm-run-all: specifier: ^4.1.5 version: 4.1.5 postcss: - specifier: ^8.5.14 - version: 8.5.14 + specifier: ^8.5.15 + version: 8.5.15 prettier: specifier: ^3.8.3 version: 3.8.3 @@ -250,8 +250,8 @@ importers: specifier: ^5.9.3 version: 5.9.3 vite: - specifier: ^8.0.13 - version: 8.0.13(@types/node@25.8.0)(sass@1.99.0)(yaml@2.9.0) + specifier: ^8.0.14 + version: 8.0.14(@types/node@25.9.1)(sass@1.99.0)(yaml@2.9.0) packages: @@ -503,8 +503,8 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 - '@oxc-project/types@0.130.0': - resolution: {integrity: sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q==} + '@oxc-project/types@0.132.0': + resolution: {integrity: sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==} '@parcel/watcher-android-arm64@2.5.6': resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} @@ -624,97 +624,97 @@ packages: resolution: {integrity: sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==} engines: {node: '>=14.0.0'} - '@rolldown/binding-android-arm64@1.0.1': - resolution: {integrity: sha512-fJI3I0r3C3Oj/zdBCpaCmBRZYf07xpaq4yCfDDoSFm+beWNzbIl26puW8RraUdugoJw/95zerNOn6jasAhzSmg==} + '@rolldown/binding-android-arm64@1.0.2': + resolution: {integrity: sha512-ZS4D1JPGn/MYQN/SYDWftIE/nVsM8j/AFOYEzAoOE2O3NktQOZru+/vYXGbR/qtdLdIfGCP0lcoJiYVzsEz+iQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.1': - resolution: {integrity: sha512-cKnAhWEsV7TPcA/5EAteDp6KcJZBQ2G+BqE7zayMMi7kMvwRsbv7WT9aOnn0WNl4SKEIf43vjS31iUPu80nzXg==} + '@rolldown/binding-darwin-arm64@1.0.2': + resolution: {integrity: sha512-vdFA9+C/rekyGce7WqHs/xoT0ioZEWaOFyZLIV1mEeNFaFDUQrPIo8Vs2GvJ6eetb3rzDUtUBgzto3ExpXJB3w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.1': - resolution: {integrity: sha512-YKrVwQjIRBPo+5G/u03wGjbdy4q7pyzCe93DK9VJ7zkVmeg8LJ7GbgsiHWdR4xSoe4CAXRD7Bcjgbtr64bkXNg==} + '@rolldown/binding-darwin-x64@1.0.2': + resolution: {integrity: sha512-BewSOwTHazv77DTYiAZXSqqKZ4KP/KonFisDMVU7PImxoWfB2aepnPhd2E4SWz3zDzYgDNbs6jBmTdgNnF02GA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.1': - resolution: {integrity: sha512-z/oBsREo46SsFqBwYtFe0kpJeBijAT48O/WXLI4suiCLBkr03RTtTJMCzSdDd2znlh8VJizL09XVkQgk8IZonw==} + '@rolldown/binding-freebsd-x64@1.0.2': + resolution: {integrity: sha512-m41o7M0YWtUdqk61Tb+jnKb2rN++iRdIASlExkUoKfIAH30DOHCB8fVLzSUpbWHHU8esmEioY62PxzexE8MBuA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.1': - resolution: {integrity: sha512-ik8q7GM11zxvYxFc2PeDcT6TBvhCQMaUxfph/M5l9sKuTs/Sjg3L+Byw0F7w0ZVLBZmx30P+gG0ECzzN+MFcmQ==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.2': + resolution: {integrity: sha512-jcojB9H7W/jS29pMKWAK1N+fU99vXodHDTatS3b3y/XSOCiHo0kkA74pL3jJmkoQtYpOCxDvaKs1fo2Ij/1X5w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.1': - resolution: {integrity: sha512-QoSx2EkyrrdZ6kcyE8stqZ62t0Yra8Fs5ia9lOxJrh6TMQJK7gQKmscdTHf7pOXKREKrVwOtJcQG3qVSfc866A==} + '@rolldown/binding-linux-arm64-gnu@1.0.2': + resolution: {integrity: sha512-1jn6qDU5iiOgFgygDzKUuKP0maTi0/f1+sBLgvij/76C77Nm3ts6ufz9Bjg5q5dduxiUIxtq86JIoBvo1xQ4Ig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.1': - resolution: {integrity: sha512-uwNwFpwKeNiZawfAWBgg0VIztPTV3ihhh1vV334h9ivnNLorxnQMU6Fz8wG1Zb4Qh9LC1/MkcyT3YlDXG3Rsgg==} + '@rolldown/binding-linux-arm64-musl@1.0.2': + resolution: {integrity: sha512-QVLO/czFMdoMFSqlX3bcswcJNm/23r+qoa/jgtmFc/qEp6/jXmIkDjF/XIo8dPfGaiwy1xfQn8o77L79GeXFgw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.1': - resolution: {integrity: sha512-zY1bul7OWr7DFBiJ++wofXvnr8B45ce3QsQUhKrIhXsygAh7bTkwyeM1bi1a2g5C/yC/N8TZyGDEoMfm/l9mpg==} + '@rolldown/binding-linux-ppc64-gnu@1.0.2': + resolution: {integrity: sha512-hgO5Abm0w5UL6FEa2iFnZqo2KlK7TQ5QhV5x09hujBf7t5KzHQ1VmfPuTpqRy/rNlSxua3eWH374xxiVrP+lcA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.1': - resolution: {integrity: sha512-0frlsT/f4Ft6I7SMESTKnF3cZsdicQn1dCMkF/jT9wDLE+gGoiQfv1nmT9e+s7s/fekvvy6tZM2jHvI2tkbJDQ==} + '@rolldown/binding-linux-s390x-gnu@1.0.2': + resolution: {integrity: sha512-fy8rXxuYEu602abC8MUNaPjYLIFzReOaEIEMKMUa0rFEUxNpVXhs15KSSQ4qlqSaM7B6rcj9rDZgADh/IGDzLQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.1': - resolution: {integrity: sha512-XABVmGp9Tg0WspTVvwduTc4fpqy6JnAUrSQe6OuyqD/03nI7r0O9OWUkMIwFrjKAIqolvqoA4ZrJppgwE0Gxmw==} + '@rolldown/binding-linux-x64-gnu@1.0.2': + resolution: {integrity: sha512-0+bOkiQ779+r1WpoHOWHqncvyySci0vKph+myNDYb+im6meJAzHQXay6oEgnkHuUGouM1LKTZwqKpBow6Kj7CQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.1': - resolution: {integrity: sha512-bV4fzswuzVcKD90o/VM6QqKxnxlDq0g2BISDLNVmxrnhpv1DDbyPhCIjYfvzYLV+MvkKKnQt2Q6AO86SEBULUQ==} + '@rolldown/binding-linux-x64-musl@1.0.2': + resolution: {integrity: sha512-mjSkrzZK5Qsl0a9d1JgILOiuZOSDTVdKENcSXBoqbzSrspLR/4/IRVDo5wd2GgZjNss/viBFJdeq+j7qH2nypw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.1': - resolution: {integrity: sha512-/Mh0Zhq3OP7fVs0kcQHZP6lZEthMGTaSf8UBQYSFEZDWGXXlEC+nJ6EqenaK2t4LBXMe3A+K/G2BVXXdtOr4PQ==} + '@rolldown/binding-openharmony-arm64@1.0.2': + resolution: {integrity: sha512-1v5vHasdfQAZoEHakBV72LIFAC9JjnymsiKxp+GEr/ma3+NJCPSaYK+qavInOovJkgwFrs7GccX2d6IgDA3Z5w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.1': - resolution: {integrity: sha512-+1xc9X45l8ufsBAm6Gjvx2qDRIY9lTVt0cgWNcJ+1gdhXvkbxePA60yRTwSTuXL09CMhyJmjpV7E3NoyxbqFQQ==} + '@rolldown/binding-wasm32-wasi@1.0.2': + resolution: {integrity: sha512-mb1VobWn6NheziTk5/WEaR6AKVbrwT5sOi6C7zk3gy/pD1qtJfU1j4PgTo2NJnOtbL9Dl3Aeei8w9jJ7qC2jZQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.1': - resolution: {integrity: sha512-1D+UqZdfnuR+Jy1GgMJwi85bD40H21uNmOPRWQhw4oRSuolZ/B5rixZ45DK2KXOTCvmVCecauWgEhbw8bI7tOw==} + '@rolldown/binding-win32-arm64-msvc@1.0.2': + resolution: {integrity: sha512-SqKonF56vA/L2yHwHYcEp2P34URpOZ7d1fS635cTkpDnUtEGdUbhI6NzsPdqeSWvAAeGDrxjWjNmibDIdFf9/A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.1': - resolution: {integrity: sha512-INAycaWuhlOK3wk4mRHGsdgwYWmd9cChdPdE9bwWmy6rn9VqVNYNFGhOdXrofXUxwHIncSiPNb8tNm8knDVIeQ==} + '@rolldown/binding-win32-x64-msvc@1.0.2': + resolution: {integrity: sha512-v7qRI7gXLRINcOGXt+7YmAZ6iFuyZVMIoXAxhd8oP+DR9dLfL9GfNIx7PLMxmhZdvq8waUJBQiWN9EKNy+TRBQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -945,31 +945,31 @@ packages: '@swc/types@0.1.26': resolution: {integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==} - '@tanstack/query-core@5.100.10': - resolution: {integrity: sha512-8UR0yJR+GiQ40m3lPhUr0xbfAupe6GSQiksSBSa9SM2NjezFyxXCIA69/lz8cSoNKZLrw1/PktIyQBJcVeMi3w==} + '@tanstack/query-core@5.100.11': + resolution: {integrity: sha512-lmE0994apShXPj8CUxgx4ch5yUJhE9k/+tVwihBvPOyerACWdBocfFg24t8+0RhtlTd7tEgchDkhlCxNssvDxw==} - '@tanstack/query-devtools@5.100.10': - resolution: {integrity: sha512-3DmJf25hDPus5IpVvp6ujXv6bKV2zPzI9vpbAmpJigsL/H6DPvPjmf7/Q9yVKEke//8fgeQ45abjgnLuyYxAiw==} + '@tanstack/query-devtools@5.100.11': + resolution: {integrity: sha512-47rVBDuGMW/A4ekt3YQdz+q0JSIwktwGnWCYyQUvSs2/g/Oa+6Fi2/IQk4/Y4vf6u1uwI7hOogHslgMC8f3X/Q==} - '@tanstack/react-query-devtools@5.100.10': - resolution: {integrity: sha512-zes0+o9ef5rAZXJ9f/SeaLs2nufJaeVkZkl/Or9NGrWVF41kL9Od9ED9nCwtQlgiF2VGtrzhEw5AU/igAO+aAg==} + '@tanstack/react-query-devtools@5.100.11': + resolution: {integrity: sha512-75RFlJEG53Ed/Cxe5WLmgIpOElPNpgLZq7h0fLFnM5XwTYxSTk1rX/gC6MqGVXsSdrbP7zn7hPSJx9MinwiUHA==} peerDependencies: - '@tanstack/react-query': ^5.100.10 + '@tanstack/react-query': ^5.100.11 react: ^18 || ^19 - '@tanstack/react-query@5.100.10': - resolution: {integrity: sha512-FLaZf2RCrA/Zgp4aiu5tG3TyasTRO7aZ99skxQpr3Hg/zXOhu6yq5FZCYQ/tRaJtM9ylnoK8tFK7PolXQadv6Q==} + '@tanstack/react-query@5.100.11': + resolution: {integrity: sha512-J0f9s5x3LE1450nNNfYx+e/n0DMa0uOBdFJUy5r0RvmsXd4nB/n0rbHtHI1vYXhikNFan+wf51p6Tmp4c8ucrg==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-virtual@3.13.24': - resolution: {integrity: sha512-aIJvz5OSkhNIhZIpYivrxrPTKYsjW9Uzy+sP/mx0S3sev2HyvPb7xmjbYvokzEpfgYHy/HjzJ2zFAETuUfgCpg==} + '@tanstack/react-virtual@3.13.25': + resolution: {integrity: sha512-bmNoqMu6gcAW9JGrKVB0Q1tN1i5RONZF8r1fW0bbE4Oyf3DwEGnzzQJ2OW+Ozg1P4s8PyugkHg2ULZoFQN+cqw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/virtual-core@3.14.0': - resolution: {integrity: sha512-JLANqGy/D6k4Ujmh8Tr25lGimuOXNiaVyXaCAZS0W+1390sADdGnyUdSWNIfd49gebtIxGMij4IktRVzrdr12Q==} + '@tanstack/virtual-core@3.15.0': + resolution: {integrity: sha512-0AwPGx0I8QxPYjAxShT/+z+ZOe9u8mW5rsXvivCTjRfRmz9a43+3mRyi4wwlyoUqOC56q/jatKa0Bh9M99BEHQ==} '@tauri-apps/api@2.11.0': resolution: {integrity: sha512-7CinYODhky9lmO23xHnUFv0Xt43fbtWMyxZcLcRBlFkcgXKuEirBvHpmtJ89YMhyeGcq20Wuc47Fa4XjyniywA==} @@ -1143,8 +1143,8 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@25.8.0': - resolution: {integrity: sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ==} + '@types/node@25.9.1': + resolution: {integrity: sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -1154,8 +1154,8 @@ packages: peerDependencies: '@types/react': ^19.2.0 - '@types/react@19.2.14': - resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + '@types/react@19.2.15': + resolution: {integrity: sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==} '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -1248,8 +1248,8 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - baseline-browser-mapping@2.10.30: - resolution: {integrity: sha512-xjOFN16Ha1+Rz4nFYKqHU/LSB+gx/Vi3yQLX7r7sAW+Wa+8hhF2h4pvqTrTMc8+WcDBEunnUurr46Jvv0jk3Vg==} + baseline-browser-mapping@2.10.31: + resolution: {integrity: sha512-MujYO3eP72uvmSE0i4wltsodRfIpZATP3jvzRNRGGxgzId7aVocVJJV3nf01qnzzKFGxQVC9bpWxl5cjxTr/7Q==} engines: {node: '>=6.0.0'} hasBin: true @@ -1300,8 +1300,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001792: - resolution: {integrity: sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==} + caniuse-lite@1.0.30001793: + resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1560,8 +1560,8 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - electron-to-chromium@1.5.357: - resolution: {integrity: sha512-NHlTIQDK8fmVwHwuIzmXYEJ1Ewq3D9wDNc0cWXxDGysP6Pb21giwGNkxiTifyKy/4SoPuN5l6GLP1W9Sv7zB2g==} + electron-to-chromium@1.5.360: + resolution: {integrity: sha512-GkcBt6YYAw9SxFWn+xVar4cLVGlXVuswwtRLBozi2zp0GjXs4ZnOrqV4zbXzg35n7w81hCkyJNYicgXlVHAmBA==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1650,8 +1650,8 @@ packages: fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - framer-motion@12.38.0: - resolution: {integrity: sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==} + framer-motion@12.40.0: + resolution: {integrity: sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -1946,8 +1946,9 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - itertools@2.6.0: - resolution: {integrity: sha512-nCqtnZTEGq8Bcs+W3kqdYL77tV6sGuQCA1WvKeA8L5Bx+BUMWcyHfJTCY38yNf51EE0/uB9UQHB84AM1j+djIw==} + itertools@2.7.0: + resolution: {integrity: sha512-lAzdYJo4Yy35HitzvAkaRej8GeWuow2B1mQ8T1KCvFjEIvSan87odXF8L2iAEw5f+jG7PLnwpF9hLqfJirKePw==} + engines: {node: '>=22'} js-base64@3.7.8: resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} @@ -2217,14 +2218,14 @@ packages: resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} engines: {node: '>=10'} - motion-dom@12.38.0: - resolution: {integrity: sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==} + motion-dom@12.40.0: + resolution: {integrity: sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg==} - motion-utils@12.36.0: - resolution: {integrity: sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==} + motion-utils@12.39.0: + resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==} - motion@12.38.0: - resolution: {integrity: sha512-uYfXzeHlgThchzwz5Te47dlv5JOUC7OB4rjJ/7XTUgtBZD8CchMN8qEJ4ZVsUmTyYA44zjV0fBwsiktRuFnn+w==} + motion@12.40.0: + resolution: {integrity: sha512-yjrHUrBFW6kQvjJwRsoiPSAhC5tRwRqNGJWmiJ4CrGnbKp0V88AdzkhBmDoqIsIPfarOe0Uddd37Xq43/gIocA==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -2254,8 +2255,9 @@ packages: node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - node-releases@2.0.44: - resolution: {integrity: sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==} + node-releases@2.0.45: + resolution: {integrity: sha512-iIbHXV9eBB2nB0wa7oTsrrXq+qQt+9SIlx9AX3T96YgobtEQfis5n6TJ6vV+3QP8DwdriEAcGhARaFCu37peBg==} + engines: {node: '>=18'} normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -2348,8 +2350,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.14: - resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} engines: {node: ^10 || ^12 || >=14} prettier@2.8.8: @@ -2531,8 +2533,8 @@ packages: engines: {node: '>= 0.4'} hasBin: true - rolldown@1.0.1: - resolution: {integrity: sha512-X0KQHljNnEkWNqqiz9zJrGunh1B0HgOxLXvnFpCOcadzcy5qohZ3tqMEUg00vncoRovXuK3ZqCT9KnnKzoInFQ==} + rolldown@1.0.2: + resolution: {integrity: sha512-oZx5zVDtVB44AW3eaifgDml1gWRDZGvjcfdxonE4swNPG98PrrXjaO/KrnUjzlMnztCCRVlUueA1kCXhARGk6g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -2823,8 +2825,8 @@ packages: victory-vendor@37.3.6: resolution: {integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==} - vite@8.0.13: - resolution: {integrity: sha512-MFtjBYgzmSxmgA4RAfjIyXWpGe1oALnjgUTzzV7QLx/TKxCzjtMH6Fd9/eVK+5Fg1qNoz5VAwsmMs/NofrmJvw==} + vite@8.0.14: + resolution: {integrity: sha512-s4BJJ+5y1pYL6Otw51FHhVJQhPnuRinKig64g/1+EUNaJsd3gCKdD31IPFvswUgW9/60QT9oFHbZHbQK5imcxw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -3128,7 +3130,7 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.6)': + '@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6)': dependencies: '@babel/runtime': 7.29.2 '@emotion/babel-plugin': 11.13.5 @@ -3140,7 +3142,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 19.2.6 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.15 transitivePeerDependencies: - supports-color @@ -3154,18 +3156,18 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.6))(@types/react@19.2.14)(react@19.2.6)': + '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6)': dependencies: '@babel/runtime': 7.29.2 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 - '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.6) + '@emotion/react': 11.14.0(@types/react@19.2.15)(react@19.2.6) '@emotion/serialize': 1.3.3 '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.6) '@emotion/utils': 1.4.2 react: 19.2.6 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.15 transitivePeerDependencies: - supports-color @@ -3212,10 +3214,10 @@ snapshots: '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 - '@hookform/devtools@4.4.0(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@hookform/devtools@4.4.0(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.6) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.6))(@types/react@19.2.14)(react@19.2.6) + '@emotion/react': 11.14.0(@types/react@19.2.15)(react@19.2.6) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@types/lodash': 4.17.24 little-state-machine: 4.8.1(react@19.2.6) lodash: 4.18.1 @@ -3258,7 +3260,7 @@ snapshots: '@tybys/wasm-util': 0.10.2 optional: true - '@oxc-project/types@0.130.0': {} + '@oxc-project/types@0.132.0': {} '@parcel/watcher-android-arm64@2.5.6': optional: true @@ -3335,7 +3337,7 @@ snapshots: '@react-hook/passive-layout-effect': 1.2.1(react@19.2.6) react: 19.2.6 - '@reduxjs/toolkit@2.12.0(react-redux@9.3.0(@types/react@19.2.14)(react@19.2.6)(redux@5.0.1))(react@19.2.6)': + '@reduxjs/toolkit@2.12.0(react-redux@9.3.0(@types/react@19.2.15)(react@19.2.6)(redux@5.0.1))(react@19.2.6)': dependencies: '@standard-schema/spec': 1.1.0 '@standard-schema/utils': 0.3.0 @@ -3345,57 +3347,57 @@ snapshots: reselect: 5.1.1 optionalDependencies: react: 19.2.6 - react-redux: 9.3.0(@types/react@19.2.14)(react@19.2.6)(redux@5.0.1) + react-redux: 9.3.0(@types/react@19.2.15)(react@19.2.6)(redux@5.0.1) '@remix-run/router@1.23.2': {} - '@rolldown/binding-android-arm64@1.0.1': + '@rolldown/binding-android-arm64@1.0.2': optional: true - '@rolldown/binding-darwin-arm64@1.0.1': + '@rolldown/binding-darwin-arm64@1.0.2': optional: true - '@rolldown/binding-darwin-x64@1.0.1': + '@rolldown/binding-darwin-x64@1.0.2': optional: true - '@rolldown/binding-freebsd-x64@1.0.1': + '@rolldown/binding-freebsd-x64@1.0.2': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.1': + '@rolldown/binding-linux-arm-gnueabihf@1.0.2': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.1': + '@rolldown/binding-linux-arm64-gnu@1.0.2': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.1': + '@rolldown/binding-linux-arm64-musl@1.0.2': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.1': + '@rolldown/binding-linux-ppc64-gnu@1.0.2': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.1': + '@rolldown/binding-linux-s390x-gnu@1.0.2': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.1': + '@rolldown/binding-linux-x64-gnu@1.0.2': optional: true - '@rolldown/binding-linux-x64-musl@1.0.1': + '@rolldown/binding-linux-x64-musl@1.0.2': optional: true - '@rolldown/binding-openharmony-arm64@1.0.1': + '@rolldown/binding-openharmony-arm64@1.0.2': optional: true - '@rolldown/binding-wasm32-wasi@1.0.1': + '@rolldown/binding-wasm32-wasi@1.0.2': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.1': + '@rolldown/binding-win32-arm64-msvc@1.0.2': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.1': + '@rolldown/binding-win32-x64-msvc@1.0.2': optional: true '@rolldown/pluginutils@1.0.1': {} @@ -3612,28 +3614,28 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@tanstack/query-core@5.100.10': {} + '@tanstack/query-core@5.100.11': {} - '@tanstack/query-devtools@5.100.10': {} + '@tanstack/query-devtools@5.100.11': {} - '@tanstack/react-query-devtools@5.100.10(@tanstack/react-query@5.100.10(react@19.2.6))(react@19.2.6)': + '@tanstack/react-query-devtools@5.100.11(@tanstack/react-query@5.100.11(react@19.2.6))(react@19.2.6)': dependencies: - '@tanstack/query-devtools': 5.100.10 - '@tanstack/react-query': 5.100.10(react@19.2.6) + '@tanstack/query-devtools': 5.100.11 + '@tanstack/react-query': 5.100.11(react@19.2.6) react: 19.2.6 - '@tanstack/react-query@5.100.10(react@19.2.6)': + '@tanstack/react-query@5.100.11(react@19.2.6)': dependencies: - '@tanstack/query-core': 5.100.10 + '@tanstack/query-core': 5.100.11 react: 19.2.6 - '@tanstack/react-virtual@3.13.24(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@tanstack/react-virtual@3.13.25(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@tanstack/virtual-core': 3.14.0 + '@tanstack/virtual-core': 3.15.0 react: 19.2.6 react-dom: 19.2.6(react@19.2.6) - '@tanstack/virtual-core@3.14.0': {} + '@tanstack/virtual-core@3.15.0': {} '@tauri-apps/api@2.11.0': {} @@ -3787,17 +3789,17 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@25.8.0': + '@types/node@25.9.1': dependencies: undici-types: 7.24.6 '@types/parse-json@4.0.2': {} - '@types/react-dom@19.2.3(@types/react@19.2.14)': + '@types/react-dom@19.2.3(@types/react@19.2.15)': dependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.15 - '@types/react@19.2.14': + '@types/react@19.2.15': dependencies: csstype: 3.2.3 @@ -3816,18 +3818,18 @@ snapshots: '@use-gesture/core': 10.3.1 react: 19.2.6 - '@vitejs/plugin-react-swc@4.3.1(vite@8.0.13(@types/node@25.8.0)(sass@1.99.0)(yaml@2.9.0))': + '@vitejs/plugin-react-swc@4.3.1(vite@8.0.14(@types/node@25.9.1)(sass@1.99.0)(yaml@2.9.0))': dependencies: '@rolldown/pluginutils': 1.0.1 '@swc/core': 1.15.33 - vite: 8.0.13(@types/node@25.8.0)(sass@1.99.0)(yaml@2.9.0) + vite: 8.0.14(@types/node@25.9.1)(sass@1.99.0)(yaml@2.9.0) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@6.0.2(vite@8.0.13(@types/node@25.8.0)(sass@1.99.0)(yaml@2.9.0))': + '@vitejs/plugin-react@6.0.2(vite@8.0.14(@types/node@25.9.1)(sass@1.99.0)(yaml@2.9.0))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.0.13(@types/node@25.8.0)(sass@1.99.0)(yaml@2.9.0) + vite: 8.0.14(@types/node@25.9.1)(sass@1.99.0)(yaml@2.9.0) ansi-regex@5.0.1: {} @@ -3858,13 +3860,13 @@ snapshots: async-function@1.0.0: {} - autoprefixer@10.5.0(postcss@8.5.14): + autoprefixer@10.5.0(postcss@8.5.15): dependencies: browserslist: 4.28.2 - caniuse-lite: 1.0.30001792 + caniuse-lite: 1.0.30001793 fraction.js: 5.3.4 picocolors: 1.1.1 - postcss: 8.5.14 + postcss: 8.5.15 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -3883,7 +3885,7 @@ snapshots: balanced-match@4.0.4: {} - baseline-browser-mapping@2.10.30: {} + baseline-browser-mapping@2.10.31: {} boolbase@1.0.0: {} @@ -3902,10 +3904,10 @@ snapshots: browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.30 - caniuse-lite: 1.0.30001792 - electron-to-chromium: 1.5.357 - node-releases: 2.0.44 + baseline-browser-mapping: 2.10.31 + caniuse-lite: 1.0.30001793 + electron-to-chromium: 1.5.360 + node-releases: 2.0.45 update-browserslist-db: 1.2.3(browserslist@4.28.2) byte-size@9.0.1: {} @@ -3931,7 +3933,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001792: {} + caniuse-lite@1.0.30001793: {} ccount@2.0.1: {} @@ -4188,7 +4190,7 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - electron-to-chromium@1.5.357: {} + electron-to-chromium@1.5.360: {} emoji-regex@8.0.0: {} @@ -4308,10 +4310,10 @@ snapshots: fraction.js@5.3.4: {} - framer-motion@12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6): + framer-motion@12.40.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: - motion-dom: 12.38.0 - motion-utils: 12.36.0 + motion-dom: 12.40.0 + motion-utils: 12.39.0 tslib: 2.8.1 optionalDependencies: '@emotion/is-prop-valid': 1.4.0 @@ -4450,7 +4452,7 @@ snapshots: domhandler: 6.0.1 htmlparser2: 12.0.0 - html-react-parser@6.1.1(@types/react@19.2.14)(react@19.2.6): + html-react-parser@6.1.1(@types/react@19.2.15)(react@19.2.6): dependencies: domhandler: 6.0.1 html-dom-parser: 7.1.0 @@ -4458,7 +4460,7 @@ snapshots: react-property: 2.0.2 style-to-js: 1.1.21 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.15 html-url-attributes@3.0.1: {} @@ -4626,7 +4628,7 @@ snapshots: isexe@2.0.0: {} - itertools@2.6.0: {} + itertools@2.7.0: {} js-base64@3.7.8: {} @@ -4838,9 +4840,9 @@ snapshots: memorystream@0.3.1: {} - merge-refs@2.0.0(@types/react@19.2.14): + merge-refs@2.0.0(@types/react@19.2.15): optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.15 micromark-core-commonmark@2.0.3: dependencies: @@ -4991,15 +4993,15 @@ snapshots: dependencies: brace-expansion: 2.1.0 - motion-dom@12.38.0: + motion-dom@12.40.0: dependencies: - motion-utils: 12.36.0 + motion-utils: 12.39.0 - motion-utils@12.36.0: {} + motion-utils@12.39.0: {} - motion@12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6): + motion@12.40.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: - framer-motion: 12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + framer-motion: 12.40.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) tslib: 2.8.1 optionalDependencies: '@emotion/is-prop-valid': 1.4.0 @@ -5020,7 +5022,7 @@ snapshots: node-addon-api@7.1.1: optional: true - node-releases@2.0.44: {} + node-releases@2.0.45: {} normalize-package-data@2.5.0: dependencies: @@ -5120,7 +5122,7 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.14: + postcss@8.5.15: dependencies: nanoid: 3.3.12 picocolors: 1.1.1 @@ -5173,11 +5175,11 @@ snapshots: dependencies: react: 19.2.6 - react-markdown@10.1.0(@types/react@19.2.14)(react@19.2.6): + react-markdown@10.1.0(@types/react@19.2.15)(react@19.2.6): dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@types/react': 19.2.14 + '@types/react': 19.2.15 devlop: 1.1.0 hast-util-to-jsx-runtime: 2.3.6 html-url-attributes: 3.0.1 @@ -5199,13 +5201,13 @@ snapshots: qr.js: 0.0.0 react: 19.2.6 - react-redux@9.3.0(@types/react@19.2.14)(react@19.2.6)(redux@5.0.1): + react-redux@9.3.0(@types/react@19.2.15)(react@19.2.6)(redux@5.0.1): dependencies: '@types/use-sync-external-store': 0.0.6 react: 19.2.6 use-sync-external-store: 1.6.0(react@19.2.6) optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.15 redux: 5.0.1 react-router-dom@6.30.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6): @@ -5241,9 +5243,9 @@ snapshots: readdirp@4.1.2: {} - recharts@3.8.1(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react-is@16.13.1)(react@19.2.6)(redux@5.0.1): + recharts@3.8.1(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react-is@16.13.1)(react@19.2.6)(redux@5.0.1): dependencies: - '@reduxjs/toolkit': 2.12.0(react-redux@9.3.0(@types/react@19.2.14)(react@19.2.6)(redux@5.0.1))(react@19.2.6) + '@reduxjs/toolkit': 2.12.0(react-redux@9.3.0(@types/react@19.2.15)(react@19.2.6)(redux@5.0.1))(react@19.2.6) clsx: 2.1.1 decimal.js-light: 2.5.1 es-toolkit: 1.46.1 @@ -5252,7 +5254,7 @@ snapshots: react: 19.2.6 react-dom: 19.2.6(react@19.2.6) react-is: 16.13.1 - react-redux: 9.3.0(@types/react@19.2.14)(react@19.2.6)(redux@5.0.1) + react-redux: 9.3.0(@types/react@19.2.15)(react@19.2.6)(redux@5.0.1) reselect: 5.1.1 tiny-invariant: 1.3.3 use-sync-external-store: 1.6.0(react@19.2.6) @@ -5322,26 +5324,26 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - rolldown@1.0.1: + rolldown@1.0.2: dependencies: - '@oxc-project/types': 0.130.0 + '@oxc-project/types': 0.132.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.1 - '@rolldown/binding-darwin-arm64': 1.0.1 - '@rolldown/binding-darwin-x64': 1.0.1 - '@rolldown/binding-freebsd-x64': 1.0.1 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.1 - '@rolldown/binding-linux-arm64-gnu': 1.0.1 - '@rolldown/binding-linux-arm64-musl': 1.0.1 - '@rolldown/binding-linux-ppc64-gnu': 1.0.1 - '@rolldown/binding-linux-s390x-gnu': 1.0.1 - '@rolldown/binding-linux-x64-gnu': 1.0.1 - '@rolldown/binding-linux-x64-musl': 1.0.1 - '@rolldown/binding-openharmony-arm64': 1.0.1 - '@rolldown/binding-wasm32-wasi': 1.0.1 - '@rolldown/binding-win32-arm64-msvc': 1.0.1 - '@rolldown/binding-win32-x64-msvc': 1.0.1 + '@rolldown/binding-android-arm64': 1.0.2 + '@rolldown/binding-darwin-arm64': 1.0.2 + '@rolldown/binding-darwin-x64': 1.0.2 + '@rolldown/binding-freebsd-x64': 1.0.2 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.2 + '@rolldown/binding-linux-arm64-gnu': 1.0.2 + '@rolldown/binding-linux-arm64-musl': 1.0.2 + '@rolldown/binding-linux-ppc64-gnu': 1.0.2 + '@rolldown/binding-linux-s390x-gnu': 1.0.2 + '@rolldown/binding-linux-x64-gnu': 1.0.2 + '@rolldown/binding-linux-x64-musl': 1.0.2 + '@rolldown/binding-openharmony-arm64': 1.0.2 + '@rolldown/binding-wasm32-wasi': 1.0.2 + '@rolldown/binding-win32-arm64-msvc': 1.0.2 + '@rolldown/binding-win32-x64-msvc': 1.0.2 rxjs@7.8.2: dependencies: @@ -5711,15 +5713,15 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite@8.0.13(@types/node@25.8.0)(sass@1.99.0)(yaml@2.9.0): + vite@8.0.14(@types/node@25.9.1)(sass@1.99.0)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 - postcss: 8.5.14 - rolldown: 1.0.1 + postcss: 8.5.15 + rolldown: 1.0.2 tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 25.8.0 + '@types/node': 25.9.1 fsevents: 2.3.3 sass: 1.99.0 yaml: 2.9.0 @@ -5799,9 +5801,9 @@ snapshots: zod@3.25.76: {} - zustand@5.0.13(@types/react@19.2.14)(immer@11.1.8)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)): + zustand@5.0.13(@types/react@19.2.15)(immer@11.1.8)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)): optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.15 immer: 11.1.8 react: 19.2.6 use-sync-external-store: 1.6.0(react@19.2.6) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 65c830c8..8e865a77 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,3 +2,4 @@ allowBuilds: '@parcel/watcher': true '@swc/core': true esbuild: true + itertools: false diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 087a3b83..c53658b1 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -495,9 +495,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "aws-lc-rs" @@ -642,12 +642,6 @@ dependencies = [ "digest", ] -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - [[package]] name = "block-buffer" version = "0.10.4" @@ -744,9 +738,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.20.2" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "byte-unit" @@ -1034,35 +1028,6 @@ dependencies = [ "cc", ] -[[package]] -name = "cocoa" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad36507aeb7e16159dfe68db81ccc27571c3ccd4b76fb2fb72fc59e7a4b1b64c" -dependencies = [ - "bitflags 2.11.1", - "block", - "cocoa-foundation", - "core-foundation 0.10.1", - "core-graphics 0.24.0", - "foreign-types 0.5.0", - "libc", - "objc", -] - -[[package]] -name = "cocoa-foundation" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81411967c50ee9a1fc11365f8c585f863a22a9697c89239c452292c40ba79b0d" -dependencies = [ - "bitflags 2.11.1", - "block", - "core-foundation 0.10.1", - "core-graphics-types", - "objc", -] - [[package]] name = "colorchoice" version = "1.0.5" @@ -1176,19 +1141,6 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" -[[package]] -name = "core-graphics" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" -dependencies = [ - "bitflags 2.11.1", - "core-foundation 0.10.1", - "core-graphics-types", - "foreign-types 0.5.0", - "libc", -] - [[package]] name = "core-graphics" version = "0.25.0" @@ -1463,7 +1415,6 @@ dependencies = [ "block2 0.6.2", "chrono", "clap", - "cocoa", "common", "dark-light", "defguard_wireguard_rs", @@ -1473,8 +1424,8 @@ dependencies = [ "known-folders", "log", "nix", - "objc", "objc2 0.6.4", + "objc2-app-kit", "objc2-foundation 0.3.2", "objc2-network-extension", "os_info", @@ -3531,15 +3482,6 @@ dependencies = [ "time", ] -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - [[package]] name = "markup5ever" version = "0.38.0" @@ -3925,15 +3867,6 @@ dependencies = [ "libc", ] -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", -] - [[package]] name = "objc-sys" version = "0.3.5" @@ -3968,10 +3901,17 @@ checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ "bitflags 2.11.1", "block2 0.6.2", + "libc", "objc2 0.6.4", + "objc2-cloud-kit", + "objc2-core-data", "objc2-core-foundation", "objc2-core-graphics", + "objc2-core-image", + "objc2-core-text", + "objc2-core-video", "objc2-foundation 0.3.2", + "objc2-quartz-core", ] [[package]] @@ -3991,6 +3931,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" dependencies = [ + "bitflags 2.11.1", "objc2 0.6.4", "objc2-foundation 0.3.2", ] @@ -4051,6 +3992,19 @@ dependencies = [ "objc2-core-graphics", ] +[[package]] +name = "objc2-core-video" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" +dependencies = [ + "bitflags 2.11.1", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-io-surface", +] + [[package]] name = "objc2-encode" version = "4.1.0" @@ -6359,7 +6313,7 @@ dependencies = [ "bitflags 2.11.1", "block2 0.6.2", "core-foundation 0.10.1", - "core-graphics 0.25.0", + "core-graphics", "crossbeam-channel", "dbus", "dispatch2", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 3a347acf..4ab353d8 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -124,12 +124,11 @@ x25519-dalek = { version = "2", features = [ ] } [target.'cfg(target_os = "macos")'.dependencies] -cocoa = "0.26" block2 = "0.6" objc2 = "0.6" +objc2-app-kit = "0.3" objc2-foundation = "0.3" objc2-network-extension = "0.3" -objc = "0.2" [target.'cfg(unix)'.dependencies] nix = { version = "0.31", features = ["user", "fs"] } diff --git a/src-tauri/src/bin/defguard-client.rs b/src-tauri/src/bin/defguard-client.rs index 15c10029..75811dae 100644 --- a/src-tauri/src/bin/defguard-client.rs +++ b/src-tauri/src/bin/defguard-client.rs @@ -261,6 +261,8 @@ fn main() { let _ = app.opener().open_url(REPORT_URL, None::<&str>); } }); + + app.set_dock_visibility(false); } // Register for Linux and debug Windows builds. diff --git a/src-tauri/src/window_manager/macos.rs b/src-tauri/src/window_manager/macos.rs index c1cdd371..42da58de 100644 --- a/src-tauri/src/window_manager/macos.rs +++ b/src-tauri/src/window_manager/macos.rs @@ -1,66 +1,46 @@ #![allow(deprecated)] -use tauri::{AppHandle, LogicalPosition, Manager, Monitor, PhysicalSize, Position, WebviewWindow}; - -#[cfg(target_os = "macos")] -use tauri::Runtime; - -use crate::appstate::AppState; -use crate::window_manager::{WindowManager, NEW_UI_WINDOW_ID, OLD_UI_WINDOW_ID}; - -#[cfg(target_os = "macos")] -use cocoa::{ - appkit::{NSView, NSWindow, NSWindowButton, NSWindowStyleMask, NSWindowTitleVisibility}, - base::id, +use objc2_app_kit::{ + NSClosableWindowMask, NSFullSizeContentViewWindowMask, NSMiniaturizableWindowMask, + NSResizableWindowMask, NSTitledWindowMask, NSWindow, NSWindowButton, +}; +use tauri::{ + AppHandle, LogicalPosition, LogicalSize, Manager, Monitor, Position, Runtime, WebviewWindow, }; -#[cfg(target_os = "macos")] -use objc::{msg_send, sel, sel_impl}; +use crate::{appstate::AppState, window_manager::WINDOW_GAP}; -#[cfg(target_os = "macos")] -pub fn enable_rounded_corners(window: WebviewWindow) -> Result<(), String> { +pub fn enable_rounded_corners(window: &WebviewWindow) -> Result<(), String> { window .with_webview(move |webview| { - unsafe { - let ns_window = webview.ns_window() as id; - - let mut style_mask = ns_window.styleMask(); - - // Add necessary styles for rounded corners - style_mask |= NSWindowStyleMask::NSFullSizeContentViewWindowMask; - style_mask |= NSWindowStyleMask::NSTitledWindowMask; - style_mask |= NSWindowStyleMask::NSClosableWindowMask; - style_mask |= NSWindowStyleMask::NSMiniaturizableWindowMask; - style_mask |= NSWindowStyleMask::NSResizableWindowMask; - - ns_window.setStyleMask_(style_mask); - ns_window.setTitlebarAppearsTransparent_(cocoa::base::YES); - - // Hide the window title - ns_window.setTitleVisibility_(NSWindowTitleVisibility::NSWindowTitleHidden); - - // Hide the standard window buttons (close, minimize, zoom) - let close_button = - ns_window.standardWindowButton_(NSWindowButton::NSWindowCloseButton); - if !close_button.is_null() { - let _: () = msg_send![close_button, setHidden: cocoa::base::YES]; - } - let miniaturize_button = - ns_window.standardWindowButton_(NSWindowButton::NSWindowMiniaturizeButton); - if !miniaturize_button.is_null() { - let _: () = msg_send![miniaturize_button, setHidden: cocoa::base::YES]; - } - let zoom_button = - ns_window.standardWindowButton_(NSWindowButton::NSWindowZoomButton); - if !zoom_button.is_null() { - let _: () = msg_send![zoom_button, setHidden: cocoa::base::YES]; - } - - let content_view = ns_window.contentView(); - content_view.setWantsLayer(cocoa::base::YES); + let ns_window = unsafe { &*webview.ns_window().cast::() }; + let mut style_mask = ns_window.styleMask(); + + // Add necessary styles for rounded corners. + style_mask |= NSFullSizeContentViewWindowMask; + style_mask |= NSTitledWindowMask; + style_mask |= NSClosableWindowMask; + style_mask |= NSMiniaturizableWindowMask; + style_mask |= NSResizableWindowMask; + + ns_window.setStyleMask(style_mask); + ns_window.setTitlebarAppearsTransparent(true); + + // Hide the standard window buttons (close, minimize, zoom) + if let Some(close_button) = ns_window.standardWindowButton(NSWindowButton::CloseButton) + { + close_button.setHidden(true); + } + if let Some(miniaturize_button) = + ns_window.standardWindowButton(NSWindowButton::MiniaturizeButton) + { + miniaturize_button.setHidden(true); + } + if let Some(zoom_button) = ns_window.standardWindowButton(NSWindowButton::ZoomButton) { + zoom_button.setHidden(true); } }) - .map_err(|e| e.to_string()) + .map_err(|err| err.to_string()) } /// Try to get monitor at the given position, with a fall back to primary monitor, and then to the @@ -85,22 +65,22 @@ fn get_monitor_for_position(app: &AppHandle, x: f64, y: f64) -> Option fn get_tray_window_position( app: &AppHandle, - size: PhysicalSize, + window_size: LogicalSize, ) -> Option> { let app_state = app.state::(); - let tray_click_position = app_state.tray_click_position.lock().unwrap().to_owned(); + let mut x; + let mut y; - if let Some(tray_position) = tray_click_position { + if let Some(tray_position) = *app_state.tray_click_position.lock().unwrap() { let monitor = get_monitor_for_position(app, tray_position.x, tray_position.y)?; let scale_factor = monitor.scale_factor(); let monitor_position = monitor.position().to_logical::(scale_factor); let monitor_size = monitor.size().to_logical::(scale_factor); let tray_position = tray_position.to_logical::(scale_factor); - let window_size = size.to_logical::(scale_factor); - let mut x = tray_position.x; - let mut y = tray_position.y; + x = tray_position.x; + y = tray_position.y; x = x.clamp( monitor_position.x, @@ -110,60 +90,25 @@ fn get_tray_window_position( monitor_position.y, monitor_position.y + monitor_size.height - window_size.height, ); - - Some(LogicalPosition::new(x, y)) } else { let monitor = app.primary_monitor().ok().flatten()?; let scale_factor = monitor.scale_factor(); let monitor_position = monitor.position().to_logical::(scale_factor); let monitor_size = monitor.size().to_logical::(scale_factor); - let window_size = size.to_logical::(scale_factor); - - let gap = crate::window_manager::WINDOW_GAP; - let x = monitor_position.x + monitor_size.width - window_size.width - gap; - let y = monitor_position.y + gap; - - Some(LogicalPosition::new(x, y)) + x = monitor_position.x + monitor_size.width - window_size.width - WINDOW_GAP; + y = monitor_position.y + WINDOW_GAP; } + + Some(LogicalPosition::new(x, y)) } -fn position_window_near_tray(app: &AppHandle, window: &WebviewWindow) { +pub(super) fn position_window_near_tray(app: &AppHandle, window: &WebviewWindow) { let size = window.outer_size().unwrap_or_default(); - if let Some(position) = get_tray_window_position(app, size) { + let scale_factor = window.scale_factor().unwrap_or(1.0); + if let Some(position) = get_tray_window_position(app, size.to_logical::(scale_factor)) { if let Err(err) = window.set_position(Position::Logical(position)) { warn!("Failed to position window near tray icon: {err}"); } } } - -impl WindowManager { - pub fn open_tray(app: &AppHandle) -> tauri::Result { - let window = if let Some(window) = app.get_webview_window(NEW_UI_WINDOW_ID) { - let _ = window.unminimize(); - window - } else { - Self::build_tray_window(app)? - }; - position_window_near_tray(app, &window); - #[cfg(target_os = "macos")] - let _ = app.show(); - let _ = window.show(); - let _ = window.set_focus(); - Ok(window) - } - - pub fn open_full_view(app: &AppHandle) -> tauri::Result { - let window = if let Some(window) = app.get_webview_window(OLD_UI_WINDOW_ID) { - let _ = window.unminimize(); - window - } else { - Self::build_full_window(app)? - }; - #[cfg(target_os = "macos")] - let _ = app.show(); - let _ = window.show(); - let _ = window.set_focus(); - Ok(window) - } -} diff --git a/src-tauri/src/window_manager/mod.rs b/src-tauri/src/window_manager/mod.rs index b08ba8f8..780b57a8 100644 --- a/src-tauri/src/window_manager/mod.rs +++ b/src-tauri/src/window_manager/mod.rs @@ -1,4 +1,9 @@ +use std::time::Duration; + +#[cfg(not(target_os = "windows"))] +use tauri::Manager; use tauri::{AppHandle, WebviewUrl, WebviewWindow, WebviewWindowBuilder}; +use tokio::time::sleep; #[cfg(not(target_os = "linux"))] use crate::database::{models::location::Location, DB_POOL}; @@ -18,11 +23,15 @@ pub const NEW_UI_WIDTH: f64 = 380.0; pub const NEW_UI_HEIGHT: f64 = 640.0; pub const OLD_UI_WIDTH: f64 = 1280.0; pub const OLD_UI_HEIGHT: f64 = 920.0; -pub const WINDOW_GAP: f64 = 20.0; +#[cfg(not(target_os = "linux"))] +const WINDOW_GAP: f64 = 20.0; +const WINDOW_TITLE: &str = "Defguard"; +// Sleep briefly to let the IPC handler return. +const UI_SWAP_DELAY: Duration = Duration::from_millis(50); #[must_use] pub fn new_ui_url() -> WebviewUrl { - if cfg!(any(defguard_client_dev, debug_assertions)) { + if cfg!(any(defguard_client_dev)) { WebviewUrl::External("http://localhost:5072".parse().unwrap()) } else { WebviewUrl::App("new-ui/".into()) @@ -31,7 +40,7 @@ pub fn new_ui_url() -> WebviewUrl { #[must_use] pub fn old_ui_url() -> WebviewUrl { - if cfg!(any(defguard_client_dev, debug_assertions)) { + if cfg!(any(defguard_client_dev)) { WebviewUrl::External("http://localhost:5071".parse().unwrap()) } else { WebviewUrl::App("old-ui/index.html".into()) @@ -43,17 +52,20 @@ pub struct WindowManager; impl WindowManager { pub fn build_tray_window(app: &AppHandle) -> tauri::Result { let window = WebviewWindowBuilder::new(app, NEW_UI_WINDOW_ID, new_ui_url()) - .title("Defguard") + .title(WINDOW_TITLE) .inner_size(NEW_UI_WIDTH, NEW_UI_HEIGHT) .resizable(false) .decorations(false) .visible(false) .always_on_top(true) - .skip_taskbar(true) - .build()?; + .skip_taskbar(true); + #[cfg(target_os = "macos")] + let window = window.hidden_title(true); + + let window = window.build()?; #[cfg(target_os = "macos")] - if let Err(err) = macos::enable_rounded_corners(window.clone()) { + if let Err(err) = macos::enable_rounded_corners(&window) { tracing::warn!("Failed to enable rounded corners on tray window: {err}"); } @@ -62,7 +74,7 @@ impl WindowManager { pub fn build_full_window(app: &AppHandle) -> tauri::Result { WebviewWindowBuilder::new(app, OLD_UI_WINDOW_ID, old_ui_url()) - .title("Defguard") + .title(WINDOW_TITLE) .inner_size(OLD_UI_WIDTH, OLD_UI_HEIGHT) .decorations(true) .visible(false) @@ -70,14 +82,49 @@ impl WindowManager { } } -#[cfg(target_os = "windows")] +#[cfg(not(windows))] +impl WindowManager { + pub fn open_tray(app: &AppHandle) -> tauri::Result { + let window = if let Some(window) = app.get_webview_window(NEW_UI_WINDOW_ID) { + let _ = window.unminimize(); + window + } else { + Self::build_tray_window(app)? + }; + #[cfg(target_os = "macos")] + macos::position_window_near_tray(app, &window); + #[cfg(target_os = "macos")] + let _ = app.show(); + let _ = window.show(); + let _ = window.set_focus(); + Ok(window) + } + + pub fn open_full_view(app: &AppHandle) -> tauri::Result { + let window = if let Some(window) = app.get_webview_window(OLD_UI_WINDOW_ID) { + let _ = window.unminimize(); + window + } else { + Self::build_full_window(app)? + }; + #[cfg(target_os = "macos")] + let _ = app.show(); + let _ = window.show(); + let _ = window.set_focus(); + Ok(window) + } +} + +#[cfg(windows)] pub mod windows; -#[cfg(not(target_os = "windows"))] +#[cfg(target_os = "macos")] pub mod macos; // Export tauri commands so they can be registered in main.rs +#[cfg_attr(target_os = "linux", allow(unused_variables))] pub(crate) fn show_new_ui_window(app: &AppHandle) { + #[cfg(not(target_os = "linux"))] let _ = WindowManager::open_tray(app); } @@ -90,24 +137,30 @@ pub fn open_new_ui_window(app: AppHandle) { show_new_ui_window(&app); } +#[cfg_attr(target_os = "linux", allow(unused_variables))] #[tauri::command] pub fn open_old_ui_window(app: AppHandle) { + #[cfg(not(target_os = "linux"))] let _ = WindowManager::open_full_view(&app); } #[tauri::command] pub fn swap_to_old_ui(app: AppHandle) { tracing::info!("swap_to_old_ui called"); + #[cfg(target_os = "macos")] + let _ = app.set_dock_visibility(true); tauri::async_runtime::spawn(async move { - // Sleep briefly to let the IPC handler return - tokio::time::sleep(std::time::Duration::from_millis(50)).await; - if let Some(w) = tauri::Manager::get_webview_window(&app, NEW_UI_WINDOW_ID) { - if let Err(e) = w.hide() { - tracing::error!("swap_to_old_ui task: Failed to hide new-ui window: {:?}", e); + sleep(UI_SWAP_DELAY).await; + if let Some(window) = tauri::Manager::get_webview_window(&app, NEW_UI_WINDOW_ID) { + if let Err(err) = window.hide() { + tracing::error!("swap_to_old_ui task: Failed to hide new-ui window: {err:?}"); } } - if let Err(e) = WindowManager::open_full_view(&app) { - tracing::error!("swap_to_old_ui task: Failed to open full view: {:?}", e); + #[cfg(not(target_os = "linux"))] + { + if let Err(err) = WindowManager::open_full_view(&app) { + tracing::error!("swap_to_old_ui task: Failed to open full view: {err:?}"); + } } }); } @@ -116,14 +169,11 @@ pub fn swap_to_old_ui(app: AppHandle) { pub fn close_tray_window(app: AppHandle) { tracing::info!("close_tray_window called"); tauri::async_runtime::spawn(async move { - tokio::time::sleep(std::time::Duration::from_millis(50)).await; - if let Some(w) = tauri::Manager::get_webview_window(&app, NEW_UI_WINDOW_ID) { + sleep(UI_SWAP_DELAY).await; + if let Some(window) = tauri::Manager::get_webview_window(&app, NEW_UI_WINDOW_ID) { tracing::info!("close_tray_window task: Hiding new-ui window"); - if let Err(e) = w.hide() { - tracing::error!( - "close_tray_window task: Failed to hide new-ui window: {:?}", - e - ); + if let Err(err) = window.hide() { + tracing::error!("close_tray_window task: Failed to hide new-ui window: {err:?}"); } } else { tracing::warn!("close_tray_window task: new-ui window not found"); @@ -134,12 +184,14 @@ pub fn close_tray_window(app: AppHandle) { #[tauri::command] pub fn swap_to_new_ui(app: AppHandle) { tracing::info!("swap_to_new_ui called"); + #[cfg(target_os = "macos")] + let _ = app.set_dock_visibility(false); tauri::async_runtime::spawn(async move { - tokio::time::sleep(std::time::Duration::from_millis(50)).await; + sleep(UI_SWAP_DELAY).await; show_new_ui_window(&app); - if let Some(w) = tauri::Manager::get_webview_window(&app, OLD_UI_WINDOW_ID) { - if let Err(e) = w.hide() { - tracing::error!("swap_to_new_ui task: Failed to hide old-ui window: {:?}", e); + if let Some(window) = tauri::Manager::get_webview_window(&app, OLD_UI_WINDOW_ID) { + if let Err(err) = window.hide() { + tracing::error!("swap_to_new_ui task: Failed to hide old-ui window: {err:?}"); } } }); diff --git a/src-tauri/src/window_manager/windows.rs b/src-tauri/src/window_manager/windows.rs index 56c5dc46..1d0955eb 100644 --- a/src-tauri/src/window_manager/windows.rs +++ b/src-tauri/src/window_manager/windows.rs @@ -266,14 +266,14 @@ impl WindowManager { width: (OLD_UI_WIDTH * primary.scale_factor) as u32, height: (OLD_UI_HEIGHT * primary.scale_factor) as u32, }); - log::info!("open_full_view: outer_size = {:?}", outer_size); + log::info!("open_full_view: outer_size = {outer_size:?}"); log::info!("open_full_view: Querying inner_size"); let inner_size = window.inner_size().unwrap_or(tauri::PhysicalSize { width: (OLD_UI_WIDTH * primary.scale_factor) as u32, height: (OLD_UI_HEIGHT * primary.scale_factor) as u32, }); - log::info!("open_full_view: inner_size = {:?}", inner_size); + log::info!("open_full_view: inner_size = {inner_size:?}"); let physical_width = outer_size.width as i32; let physical_height = outer_size.height as i32; @@ -324,11 +324,7 @@ impl WindowManager { _ => {} } - log::info!( - "open_full_view: Setting position to ({}, {})", - window_x, - window_y - ); + log::info!("open_full_view: Setting position to ({window_x}, {window_y})"); window.set_position(tauri::PhysicalPosition::new(window_x, window_y))?; log::info!("open_full_view: Position set, showing window"); window.show()?;