From bc3f8586b92b87d2e44af4c922e7a3e75703a943 Mon Sep 17 00:00:00 2001 From: HiLleywyn Date: Sat, 9 May 2026 02:30:56 +0000 Subject: [PATCH 1/2] Capacitor mobile shell, Tauri 2 mobile-ready, GitHub builds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit apps/mobile (new) — Capacitor 6 wrapper around the existing Vite bundle. capacitor.config.ts points webDir at apps/web/dist; the package's `build` script runs the web build then `cap sync`. The Android and iOS native folders are gitignored on purpose because CI re-scaffolds them every run (no Android/Xcode toolchain needed for a plain `pnpm install` on the workspace). package.json scripts cover the common flows: open Android Studio / Xcode, assemble debug APK, xcodebuild archive (unsigned). apps/desktop — restructured for Tauri 2 mobile. - Split src/main.rs into a thin desktop bin and a shared lib.rs exposing `pub fn run()` annotated with `#[tauri::mobile_entry_point]`, so the same crate boots on macOS / Windows / Linux / Android / iOS. - keyring is now under a target.cfg block so the iOS/Android builds don't pull in a desktop-only dep. - tauri.conf.json updated to a self-contained icons list pointing at the freshly generated PNGs (32, 128, 256, 512). icon-source.png at 1024 is the regen source for `tauri icon`. macOS minimum bumped to 10.15. - Marked src-tauri as its own [workspace] so the strict workspace Cargo.lock at the repo root doesn't try to manage Tauri's deps. Brand assets — generated a Tempest gradient + "T" stroke icon using pure-stdlib Python (no ImageMagick required) at apps/desktop/src-tauri/icons and apps/mobile/resources, so CI has a source of truth without a binary commit at first launch. Workflows under .github/workflows: - web.yml — typecheck and build on every push / PR. - desktop.yml — Tauri build matrix on macOS arm64, macOS x86_64, Ubuntu 22.04, Windows. Generates icons via `tauri icon` before the build, collects dmg / app.tar.gz / deb / AppImage / msi / exe, uploads as artifacts and attaches to the GitHub release on `v*` tag. - android.yml — Capacitor + Gradle. `cap add android` then `assembleDebug` (or `assembleRelease` when ANDROID_KEYSTORE_BASE64 is set), uploads APKs and attaches to release on tag. - ios.yml — Capacitor + xcodebuild on macOS-14. CocoaPods install, archive Release with CODE_SIGNING_ALLOWED=NO, wrap into Payload.ipa, upload artifact + attach to release on tag. - tauri-mobile.yml — manual-only alternative path that uses the Tauri 2 built-in mobile targets, kept for users who prefer the unified Tauri shell on phones. docs/MOBILE.md walks through running each shell locally, the secrets needed to sign the Android release APK, and how to take the iOS unsigned archive into Xcode for distribution. Top-level package.json scripts gain build:desktop, build:mobile, android:apk, ios:archive shortcuts for local builds. --- .github/workflows/android.yml | 108 + .github/workflows/desktop.yml | 111 + .github/workflows/ios.yml | 88 + .github/workflows/tauri-mobile.yml | 83 + .github/workflows/web.yml | 33 + apps/desktop/src-tauri/Cargo.lock | 4782 ++++++++++++++++++ apps/desktop/src-tauri/Cargo.toml | 10 +- apps/desktop/src-tauri/icons/128x128.png | Bin 0 -> 1342 bytes apps/desktop/src-tauri/icons/128x128@2x.png | Bin 0 -> 3123 bytes apps/desktop/src-tauri/icons/32x32.png | Bin 0 -> 440 bytes apps/desktop/src-tauri/icons/icon-source.png | Bin 0 -> 28513 bytes apps/desktop/src-tauri/icons/icon.png | Bin 0 -> 8644 bytes apps/desktop/src-tauri/src/lib.rs | 26 + apps/desktop/src-tauri/src/main.rs | 12 +- apps/desktop/src-tauri/tauri.conf.json | 13 +- apps/mobile/.gitignore | 7 + apps/mobile/capacitor.config.ts | 44 + apps/mobile/package.json | 32 + apps/mobile/resources/icon-foreground.png | Bin 0 -> 28513 bytes apps/mobile/resources/icon.png | Bin 0 -> 28513 bytes apps/mobile/resources/splash.png | Bin 0 -> 179600 bytes docs/MOBILE.md | 120 + package.json | 6 +- 23 files changed, 5460 insertions(+), 15 deletions(-) create mode 100644 .github/workflows/android.yml create mode 100644 .github/workflows/desktop.yml create mode 100644 .github/workflows/ios.yml create mode 100644 .github/workflows/tauri-mobile.yml create mode 100644 .github/workflows/web.yml create mode 100644 apps/desktop/src-tauri/Cargo.lock create mode 100644 apps/desktop/src-tauri/icons/128x128.png create mode 100644 apps/desktop/src-tauri/icons/128x128@2x.png create mode 100644 apps/desktop/src-tauri/icons/32x32.png create mode 100644 apps/desktop/src-tauri/icons/icon-source.png create mode 100644 apps/desktop/src-tauri/icons/icon.png create mode 100644 apps/desktop/src-tauri/src/lib.rs create mode 100644 apps/mobile/.gitignore create mode 100644 apps/mobile/capacitor.config.ts create mode 100644 apps/mobile/package.json create mode 100644 apps/mobile/resources/icon-foreground.png create mode 100644 apps/mobile/resources/icon.png create mode 100644 apps/mobile/resources/splash.png create mode 100644 docs/MOBILE.md diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml new file mode 100644 index 0000000..edbd303 --- /dev/null +++ b/.github/workflows/android.yml @@ -0,0 +1,108 @@ +name: android + +on: + push: + branches: [main] + tags: ["v*"] + pull_request: + workflow_dispatch: + inputs: + build_type: + description: "Build type (debug or release)" + required: false + default: debug + type: choice + options: [debug, release] + +permissions: + contents: write + +env: + BUILD_TYPE: ${{ github.event.inputs.build_type || 'debug' }} + +jobs: + apk: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + with: + version: 10.18.1 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 21 + + - uses: android-actions/setup-android@v3 + with: + packages: | + platform-tools + platforms;android-34 + build-tools;34.0.0 + + - name: Install JS deps + run: pnpm install --frozen-lockfile + + - name: Build web bundle + run: pnpm --filter tempest-web build + + - name: Add Android platform + # `cap add android` scaffolds apps/mobile/android with the gradle + # project. We don't commit it; CI re-creates it every run so the + # build is always reproducible from the current Capacitor config. + working-directory: apps/mobile + run: | + pnpm exec cap add android + pnpm exec cap sync android + + - name: Generate launcher icons + splash + working-directory: apps/mobile + run: pnpm exec capacitor-assets generate --android || true + + - name: Decode signing keystore + if: env.BUILD_TYPE == 'release' && env.ANDROID_KEYSTORE_BASE64 != '' + env: + ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }} + run: | + mkdir -p apps/mobile/android/app + echo "$ANDROID_KEYSTORE_BASE64" | base64 -d > apps/mobile/android/app/release.keystore + + - name: Assemble APK + working-directory: apps/mobile/android + env: + ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} + ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} + ANDROID_STORE_PASSWORD: ${{ secrets.ANDROID_STORE_PASSWORD }} + run: | + chmod +x ./gradlew + if [ "$BUILD_TYPE" = "release" ]; then + ./gradlew assembleRelease --no-daemon + else + ./gradlew assembleDebug --no-daemon + fi + + - name: Collect APK + run: | + mkdir -p out + find apps/mobile/android/app/build/outputs/apk -name "*.apk" -exec cp -v {} out/ \; + ls -la out + + - uses: actions/upload-artifact@v4 + with: + name: tempest-android-${{ env.BUILD_TYPE }} + path: out/*.apk + if-no-files-found: error + retention-days: 14 + + - name: Attach to release + if: startsWith(github.ref, 'refs/tags/v') + uses: softprops/action-gh-release@v2 + with: + files: out/*.apk diff --git a/.github/workflows/desktop.yml b/.github/workflows/desktop.yml new file mode 100644 index 0000000..bbd0e87 --- /dev/null +++ b/.github/workflows/desktop.yml @@ -0,0 +1,111 @@ +name: desktop + +on: + push: + branches: [main] + tags: ["v*"] + pull_request: + workflow_dispatch: + +permissions: + contents: write + +jobs: + build: + name: tauri ${{ matrix.platform }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - os: macos-14 + platform: macos-arm64 + target: aarch64-apple-darwin + tauri-args: "--target aarch64-apple-darwin" + - os: macos-13 + platform: macos-x86_64 + target: x86_64-apple-darwin + tauri-args: "--target x86_64-apple-darwin" + - os: ubuntu-22.04 + platform: linux-x86_64 + target: "" + tauri-args: "" + - os: windows-latest + platform: windows-x86_64 + target: "" + tauri-args: "" + + steps: + - uses: actions/checkout@v4 + + - name: Install Linux WebKitGTK + build deps + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y \ + libwebkit2gtk-4.1-dev \ + libgtk-3-dev \ + libayatana-appindicator3-dev \ + librsvg2-dev \ + libssl-dev \ + patchelf + + - uses: dtolnay/rust-toolchain@stable + with: + targets: ${{ matrix.target }} + + - uses: Swatinem/rust-cache@v2 + with: + workspaces: apps/desktop/src-tauri -> target + + - uses: pnpm/action-setup@v4 + with: + version: 10.18.1 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - name: Install JS deps + run: pnpm install --frozen-lockfile + + - name: Build web bundle + run: pnpm --filter tempest-web build + + - name: Generate platform icons + working-directory: apps/desktop/src-tauri + run: pnpm dlx @tauri-apps/cli icon icons/icon-source.png + + - name: Build Tauri bundle + working-directory: apps/desktop + # `--ci` makes the CLI fail fast on any prompt and skip codesigning + # if no signing material is configured. + run: pnpm exec tauri build --ci ${{ matrix.tauri-args }} + + - name: Collect bundles + shell: bash + run: | + set -euo pipefail + out=desktop-${{ matrix.platform }} + mkdir -p "$out" + base=apps/desktop/src-tauri/target + if [ -n "${{ matrix.target }}" ]; then base="$base/${{ matrix.target }}"; fi + base="$base/release/bundle" + if [ -d "$base" ]; then + find "$base" -type f \( -name "*.dmg" -o -name "*.app.tar.gz" -o -name "*.deb" -o -name "*.AppImage" -o -name "*.rpm" -o -name "*.msi" -o -name "*.exe" -o -name "*.nsis*" \) -exec cp -v {} "$out/" \; || true + fi + ls -la "$out" || true + + - uses: actions/upload-artifact@v4 + with: + name: tempest-desktop-${{ matrix.platform }} + path: desktop-${{ matrix.platform }}/* + if-no-files-found: warn + retention-days: 14 + + - name: Attach to release + if: startsWith(github.ref, 'refs/tags/v') + uses: softprops/action-gh-release@v2 + with: + files: desktop-${{ matrix.platform }}/* diff --git a/.github/workflows/ios.yml b/.github/workflows/ios.yml new file mode 100644 index 0000000..32a014d --- /dev/null +++ b/.github/workflows/ios.yml @@ -0,0 +1,88 @@ +name: ios + +on: + push: + branches: [main] + tags: ["v*"] + workflow_dispatch: + +permissions: + contents: write + +jobs: + ipa: + runs-on: macos-14 + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + with: + version: 10.18.1 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - name: Select Xcode + run: sudo xcode-select -s /Applications/Xcode_15.4.app + + - name: Install JS deps + run: pnpm install --frozen-lockfile + + - name: Install CocoaPods + run: | + gem install cocoapods --no-document + pod --version + + - name: Build web bundle + run: pnpm --filter tempest-web build + + - name: Add iOS platform + working-directory: apps/mobile + run: | + pnpm exec cap add ios + pnpm exec cap sync ios + + - name: Generate launcher icons + splash + working-directory: apps/mobile + run: pnpm exec capacitor-assets generate --ios || true + + - name: Pod install + working-directory: apps/mobile/ios/App + run: pod install --repo-update + + - name: Build archive (unsigned) + working-directory: apps/mobile + run: | + xcodebuild \ + -workspace ios/App/App.xcworkspace \ + -scheme App \ + -configuration Release \ + -destination 'generic/platform=iOS' \ + -archivePath ios/build/App.xcarchive \ + CODE_SIGNING_ALLOWED=NO \ + CODE_SIGNING_REQUIRED=NO \ + CODE_SIGN_IDENTITY="" \ + archive + + - name: Wrap as Payload.ipa + working-directory: apps/mobile/ios/build + run: | + mkdir -p Payload + cp -R App.xcarchive/Products/Applications/App.app Payload/ + /usr/bin/zip -qry Tempest-unsigned.ipa Payload + ls -la + + - uses: actions/upload-artifact@v4 + with: + name: tempest-ios-unsigned + path: apps/mobile/ios/build/Tempest-unsigned.ipa + if-no-files-found: error + retention-days: 14 + + - name: Attach to release + if: startsWith(github.ref, 'refs/tags/v') + uses: softprops/action-gh-release@v2 + with: + files: apps/mobile/ios/build/Tempest-unsigned.ipa diff --git a/.github/workflows/tauri-mobile.yml b/.github/workflows/tauri-mobile.yml new file mode 100644 index 0000000..682ce6a --- /dev/null +++ b/.github/workflows/tauri-mobile.yml @@ -0,0 +1,83 @@ +name: tauri-mobile + +# Alternative mobile path using Tauri 2's built-in mobile targets. Most +# projects only need the Capacitor pipeline, but this workflow exists for +# folks who want the unified Tauri shell on phones too. It runs only on +# manual trigger because the Tauri CLI mobile targets are still moving. + +on: + workflow_dispatch: + inputs: + target: + description: "android or ios" + required: true + default: android + type: choice + options: [android, ios] + +permissions: + contents: read + +jobs: + android: + if: ${{ github.event.inputs.target == 'android' }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + with: { version: 10.18.1 } + - uses: actions/setup-node@v4 + with: { node-version: 20, cache: pnpm } + - uses: actions/setup-java@v4 + with: { distribution: temurin, java-version: 21 } + - uses: dtolnay/rust-toolchain@stable + with: + targets: aarch64-linux-android,armv7-linux-androideabi,x86_64-linux-android,i686-linux-android + - uses: android-actions/setup-android@v3 + with: + packages: | + platform-tools + platforms;android-34 + build-tools;34.0.0 + ndk;26.1.10909125 + - name: Set NDK env + run: echo "ANDROID_NDK_HOME=$ANDROID_HOME/ndk/26.1.10909125" >> $GITHUB_ENV + - run: pnpm install --frozen-lockfile + - run: pnpm --filter tempest-web build + - name: Tauri android init + build + working-directory: apps/desktop + run: | + pnpm exec tauri android init || true + pnpm exec tauri android build --apk + - uses: actions/upload-artifact@v4 + with: + name: tempest-tauri-android + path: apps/desktop/src-tauri/gen/android/app/build/outputs/apk/**/*.apk + if-no-files-found: warn + retention-days: 14 + + ios: + if: ${{ github.event.inputs.target == 'ios' }} + runs-on: macos-14 + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + with: { version: 10.18.1 } + - uses: actions/setup-node@v4 + with: { node-version: 20, cache: pnpm } + - uses: dtolnay/rust-toolchain@stable + with: + targets: aarch64-apple-ios,aarch64-apple-ios-sim + - run: pnpm install --frozen-lockfile + - run: pnpm --filter tempest-web build + - name: Tauri ios init + build (unsigned) + working-directory: apps/desktop + run: | + pnpm exec tauri ios init || true + pnpm exec tauri ios build --export-method debugging + - uses: actions/upload-artifact@v4 + with: + name: tempest-tauri-ios + path: apps/desktop/src-tauri/gen/apple/build/**/*.ipa + if-no-files-found: warn + retention-days: 14 diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml new file mode 100644 index 0000000..63efe07 --- /dev/null +++ b/.github/workflows/web.yml @@ -0,0 +1,33 @@ +name: web + +on: + push: + branches: [main] + pull_request: + workflow_dispatch: + +permissions: + contents: read + +jobs: + build: + name: typecheck + build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + with: + version: 10.18.1 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - run: pnpm install --frozen-lockfile + - run: pnpm --filter tempest-web typecheck + - run: pnpm --filter tempest-web build + - uses: actions/upload-artifact@v4 + with: + name: tempest-web-dist + path: apps/web/dist + if-no-files-found: error + retention-days: 14 diff --git a/apps/desktop/src-tauri/Cargo.lock b/apps/desktop/src-tauri/Cargo.lock new file mode 100644 index 0000000..6fd1c73 --- /dev/null +++ b/apps/desktop/src-tauri/Cargo.lock @@ -0,0 +1,4782 @@ +# 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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +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.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[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.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +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.11.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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +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.18", +] + +[[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.2.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" +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.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +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.11.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.11.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.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[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.117", +] + +[[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.117", +] + +[[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.117", +] + +[[package]] +name = "dbus" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b942602992bb7acfd1f51c49811c58a610ef9181b6e66f3e519d79b540a3bf73" +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 = [ + "powerfmt", + "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.117", +] + +[[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.11.1", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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.117", +] + +[[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 0.2.0", + "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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31a88c8d26de40ed18fe748c547845aa39de1db3afd958f8cb91579f3644bcb" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 1.1.2+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 = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[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 = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[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.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[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.117", +] + +[[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.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", +] + +[[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.11.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.117", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[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.117", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +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.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" +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 = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[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.0", + "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 = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[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.117", +] + +[[package]] +name = "js-sys" +version = "0.3.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" +dependencies = [ + "cfg-if", + "futures-util", + "once_cell", + "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.11.1", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "keyring" +version = "3.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eebcc3aff044e5944a8fbaf69eb277d11986064cba30c468730e8b9909fb551c" +dependencies = [ + "log", + "zeroize", +] + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[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.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[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.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" +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.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "muda" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae8844f63b5b118e334e205585b8c5c17b984121dbdb179d44aeb087ffad3cb" +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.18", + "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.11.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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" + +[[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.117", +] + +[[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.11.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.11.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.11.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.11.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.11.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.11.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.11.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.11.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.11.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.11.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 = "open" +version = "5.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f3bab717c29a857abf75fcef718d441ec7cb2725f937343c734740a985d37fd" +dependencies = [ + "dunce", + "is-wsl", + "libc", + "pathdiff", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "os_pipe" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[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 = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[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.117", +] + +[[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.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "092791278e026273c1b65bbdcfbba3a300f2994c896bd01ab01da613c29c46f1" +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.11.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 = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + +[[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.11+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.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.39.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +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.11.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.18", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "reqwest" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62e0021ea2c22aed41653bc7e1419abb2c97e038ff2c33d0e1309e49a97deec0" +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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + +[[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.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[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.117", +] + +[[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.11.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 = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +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.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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.117", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05839ce67618e14a09b286535c0d9c94e85ef25469b0e13cb4f844e5593eb19" +dependencies = [ + "base64 0.22.1", + "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.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf2ebbe86054f9b45bc3881e865683ccfaccce97b9b4cb53f3039d67f355a334" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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.117", +] + +[[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 = "shared_child" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e362d9935bc50f019969e2f9ecd66786612daae13e8f277be7bfb66e8bed3f7" +dependencies = [ + "libc", + "sigchld", + "windows-sys 0.60.2", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "sigchld" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47106eded3c154e70176fc83df9737335c94ce22f821c32d17ed1db1f83badb1" +dependencies = [ + "libc", + "os_pipe", + "signal-hook", +] + +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +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.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +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.117", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33f7f9e486ade65fcf1e45c440f9236c904f5c1002cdc7fc6ae582777345ce4" +dependencies = [ + "bitflags 2.11.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.117", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b93bd86d231f0a8138f11a02a584769fe4b703dc36ae133d783228dbc4801405" +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.18", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a318b234cc2dea65f575467bafcfb76286bce228ebc3778e337d61d03213007" +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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bd11644962add2549a60b7e7c6800f17d7020156e02f516021d8103e80cc528" +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.117", + "tauri-utils", + "thiserror 2.0.18", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed9d3742a37a355d2e47c9af924e9fbc112abb76f9835d35d4780e318419502" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eefb2c18e8a605c23edb48fc56bb77381199e1a1e7f6ff0c9b970afe7b3cb8ee" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "walkdir", +] + +[[package]] +name = "tauri-plugin-shell" +version = "2.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8457dbf9e2bab1edd8df22bb2c20857a59a9868e79cb3eac5ed639eec4d0c73b" +dependencies = [ + "encoding_rs", + "log", + "open", + "os_pipe", + "regex", + "schemars 0.8.22", + "serde", + "serde_json", + "shared_child", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "tokio", +] + +[[package]] +name = "tauri-runtime" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fef478ba1d2ac21c2d528740b24d0cb315e1e8b1111aae53fafac34804371fc" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3989df2ae1c476404fe0a2e8ffc4cfbde97e51efd613c2bb5355fbc9ab52cf0" +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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d57200389a2f82b4b0a40ae29ca19b6978116e8f4d4e974c3234ce40c0ffbdec" +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.18", + "toml 1.1.2+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.2+spec-1.1.0", +] + +[[package]] +name = "tempest-desktop" +version = "0.1.0" +dependencies = [ + "anyhow", + "keyring", + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin-shell", +] + +[[package]] +name = "tendril" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4790fc369d5a530f4b544b094e31388b9b3a37c0f4652ade4505945f5660d24" +dependencies = [ + "new_debug_unreachable", + "utf-8", +] + +[[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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[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.117", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +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 = "tokio" +version = "1.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +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.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" +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.2", +] + +[[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.11+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.2", +] + +[[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.2", +] + +[[package]] +name = "toml_writer" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" + +[[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.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68d6fdd9f81c2819c9a8b0e0cd91660e7746a8e6ea2ba7c6b2b057985f6bcb51" +dependencies = [ + "bitflags 2.11.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.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15edbb0d80583e85ee8df283410038e17314df5cba30da2087a54a85216c0773" +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.18", + "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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[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 = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[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.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +dependencies = [ + "getrandom 0.4.2", + "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.3+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +dependencies = [ + "wit-bindgen 0.57.1", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96492d0d3ffba25305a7dc88720d250b1401d7edca02cc3bcd50633b424673b8" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.14.0", + "wasm-encoder", + "wasmparser", +] + +[[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 = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.1", + "hashbrown 0.15.5", + "indexmap 2.14.0", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web_atoms" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7cff6eef815df1834fd250e3a2ff436044d82a9f1bc1980ca1dbdf07effc538" +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.117", +] + +[[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.18", + "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.117", +] + +[[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.117", +] + +[[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.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[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 0.52.6", + "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-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[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_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[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_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[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_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[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_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[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_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[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_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[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_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[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 = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" +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.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap 2.14.0", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.1", + "indexmap 2.14.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.14.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[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.18", + "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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +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.117", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" +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.117", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[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.117", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml index 3caefac..13e4f59 100644 --- a/apps/desktop/src-tauri/Cargo.toml +++ b/apps/desktop/src-tauri/Cargo.toml @@ -1,3 +1,8 @@ +# Excluded from the top-level workspace so that the workspace's strict +# Cargo.lock and shared dep versions don't pin Tauri to incompatible +# versions of its transitive deps. +[workspace] + [package] name = "tempest-desktop" version = "0.1.0" @@ -14,11 +19,14 @@ tauri-build = { version = "2.0", features = [] } [dependencies] tauri = { version = "2.1", features = [] } tauri-plugin-shell = "2.1" -keyring = "3.6" serde = { version = "1", features = ["derive"] } serde_json = "1" anyhow = "1" +# Keyring is desktop-only; gating it keeps the iOS / Android builds clean. +[target.'cfg(any(target_os = "macos", target_os = "linux", target_os = "windows"))'.dependencies] +keyring = "3.6" + [features] default = ["custom-protocol"] custom-protocol = ["tauri/custom-protocol"] diff --git a/apps/desktop/src-tauri/icons/128x128.png b/apps/desktop/src-tauri/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..6289c26c9f3d2b0c8b69c510aac59d16aafd68ba GIT binary patch literal 1342 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 gLD!a^OSlJ0f)|&tN;K2 literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/icon.png b/apps/desktop/src-tauri/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e159d75f5b062aa7326aa0c050252af930915b3c GIT binary patch literal 8644 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 gLD!a^OSlJ0f)|&tN;K2 literal 0 HcmV?d00001 diff --git a/apps/mobile/resources/icon.png b/apps/mobile/resources/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..437eb63f8918a66ef8fca433b865d29072522867 GIT binary patch literal 28513 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 gLD!a^OSlJ0f)|&tN;K2 literal 0 HcmV?d00001 diff --git a/apps/mobile/resources/splash.png b/apps/mobile/resources/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..3bd4ea99639f7db74ffbe9cdbc00a17097b7b57f GIT binary patch literal 179600 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 WH*Y@rhY9pA`PALZpS`_r`+ouc?mp50 literal 0 HcmV?d00001 diff --git a/docs/MOBILE.md b/docs/MOBILE.md new file mode 100644 index 0000000..f7fc754 --- /dev/null +++ b/docs/MOBILE.md @@ -0,0 +1,120 @@ +# Mobile and desktop builds + +Tempest ships three native shells around the same `apps/web` Vite bundle: + +| Target | Tool | Workflow | Output | +| ------------------- | ---------- | --------------------------------- | ------------------------- | +| macOS / Win / Linux | Tauri 2 | `.github/workflows/desktop.yml` | `.dmg / .app / .msi / .deb / .AppImage` | +| Android | Capacitor | `.github/workflows/android.yml` | `.apk` | +| iOS | Capacitor | `.github/workflows/ios.yml` | unsigned `.ipa` | +| Android (alt) | Tauri 2 | `.github/workflows/tauri-mobile.yml` (manual) | `.apk` | +| iOS (alt) | Tauri 2 | `.github/workflows/tauri-mobile.yml` (manual) | unsigned `.ipa` | + +The mobile workflows do **not** commit the generated native source trees +(`apps/mobile/android`, `apps/mobile/ios`, `apps/desktop/src-tauri/gen`) so +the workspace `pnpm install` works on machines without Android Studio or +Xcode. Each CI run regenerates them via `cap add` / `tauri ... init`. + +## Running locally + +### Web (always start here) + +```sh +pnpm install +pnpm --filter tempest-web dev +``` + +### Desktop (Tauri) + +```sh +pnpm --filter tempest-desktop dev # spawns Vite + the desktop shell +pnpm --filter tempest-desktop build # produces a bundle in apps/desktop/src-tauri/target/release/bundle +``` + +### Android (Capacitor) + +You need: + +- Java 21 (Temurin works fine) +- Android Studio with the platform-34 SDK and build-tools 34.0.0 +- `ANDROID_HOME` exported + +```sh +pnpm --filter tempest-mobile build # builds the web bundle and syncs Capacitor +cd apps/mobile && pnpm exec cap add android # one-time, the folder is gitignored +pnpm --filter tempest-mobile open:android # opens Android Studio +# or, headless: +pnpm --filter tempest-mobile android:debug # produces apps/mobile/android/app/build/outputs/apk/debug/app-debug.apk +``` + +### iOS (Capacitor) + +You need a Mac with Xcode 15+ and CocoaPods. + +```sh +pnpm --filter tempest-mobile build +cd apps/mobile && pnpm exec cap add ios +cd ios/App && pod install +pnpm --filter tempest-mobile open:ios # opens Xcode for signing + run on device +``` + +## Signing + +### Android release APK + +The CI workflow expects three repository secrets when `BUILD_TYPE=release`: + +- `ANDROID_KEYSTORE_BASE64` - `base64 < release.keystore` +- `ANDROID_KEY_ALIAS` +- `ANDROID_KEY_PASSWORD` +- `ANDROID_STORE_PASSWORD` + +The `assembleRelease` Gradle task picks them up via env vars after the +keystore is decoded into `apps/mobile/android/app/release.keystore`. Add a +`signingConfigs.release` block to `apps/mobile/android/app/build.gradle` +the first time you wire signing locally: + +```groovy +android { + signingConfigs { + release { + keyAlias System.getenv('ANDROID_KEY_ALIAS') + keyPassword System.getenv('ANDROID_KEY_PASSWORD') + storePassword System.getenv('ANDROID_STORE_PASSWORD') + storeFile file('release.keystore') + } + } + buildTypes { + release { signingConfig signingConfigs.release } + } +} +``` + +### iOS + +The CI archive is intentionally unsigned (`CODE_SIGNING_ALLOWED=NO`). To +distribute, open `apps/mobile/ios/App/App.xcworkspace` in Xcode, set the +team, and use **Product -> Archive**, or wire up a `fastlane match`-style +workflow with provisioning profiles in repo secrets. + +### Desktop + +`tauri.conf.json -> bundle` accepts a per-platform signing block. See the +Tauri 2 docs for `macOS.signingIdentity` and `windows.certificateThumbprint`. + +## Releasing + +Tag a commit `v0.x.y` and push. All four release-attaching workflows +(`desktop`, `android`, `ios`) will upload their artifacts to the GitHub +release for that tag. + +## Troubleshooting + +* **`tauri build` complains about icons.** Run + `pnpm dlx @tauri-apps/cli icon apps/desktop/src-tauri/icons/icon-source.png` + once and commit the generated `icon.icns` / `icon.ico` so future builds + don't need it. +* **Capacitor `cap add android` says the folder exists.** The CI runs in a + clean checkout. Locally, delete `apps/mobile/android` and retry. +* **iOS pod install is slow on first run.** That's the CocoaPods spec + repo; it's cached on subsequent runs. diff --git a/package.json b/package.json index cf35d39..f776783 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,11 @@ "scripts": { "dev:web": "pnpm --filter tempest-web dev", "dev:desktop": "pnpm --filter tempest-desktop dev", - "build:web": "pnpm --filter tempest-web build" + "build:web": "pnpm --filter tempest-web build", + "build:desktop": "pnpm --filter tempest-desktop build", + "build:mobile": "pnpm --filter tempest-mobile build", + "android:apk": "pnpm --filter tempest-mobile android:debug", + "ios:archive": "pnpm --filter tempest-mobile ios:archive" }, "pnpm": { "onlyBuiltDependencies": ["esbuild", "cbor-extract"] From 6e686fac072434f7dd1e21d6f58f6912332dd8c6 Mon Sep 17 00:00:00 2001 From: HiLleywyn Date: Sat, 9 May 2026 02:32:16 +0000 Subject: [PATCH 2/2] iPadOS: build universal iPhone+iPad archive, allow multitasking The iOS workflow now patches the freshly-scaffolded Xcode project so TARGETED_DEVICE_FAMILY stays "1,2" (iPhone + iPad), explicitly registers all four iPad orientations in Info.plist's UISupportedInterfaceOrientations~ipad, and sets UIRequiresFullScreen to NO so iPad split-view and slide-over keep working. xcodebuild gets the same TARGETED_DEVICE_FAMILY override on the command line so the archive itself never falls back to iPhone-only. The same defensive sed patch lands in the Tauri-mobile workflow's iOS job since `tauri ios init` scaffolds its own Xcode project. capacitor config and docs both call out the iPadOS support explicitly so the next person reading the repo doesn't have to guess. --- .github/workflows/ios.yml | 23 ++++++++++++++++++++++- .github/workflows/tauri-mobile.yml | 13 +++++++++++-- apps/mobile/capacitor.config.ts | 6 ++++++ docs/MOBILE.md | 14 +++++++++++--- 4 files changed, 50 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ios.yml b/.github/workflows/ios.yml index 32a014d..53a87c3 100644 --- a/.github/workflows/ios.yml +++ b/.github/workflows/ios.yml @@ -44,6 +44,26 @@ jobs: pnpm exec cap add ios pnpm exec cap sync ios + - name: Force universal iPhone + iPad build + working-directory: apps/mobile/ios/App + run: | + # TARGETED_DEVICE_FAMILY = "1,2" -> iPhone (1) AND iPad (2). + # Capacitor's default template has been universal since v3, but + # we patch defensively so a tooling regression never silently + # ships an iPhone-only app to iPadOS users. + sed -i.bak 's/TARGETED_DEVICE_FAMILY = "1";/TARGETED_DEVICE_FAMILY = "1,2";/g' App.xcodeproj/project.pbxproj || true + # Allow every iPad orientation; the existing layout already + # handles wide / split-screen widths via the >=900px breakpoint. + /usr/libexec/PlistBuddy -c "Delete :UISupportedInterfaceOrientations~ipad" App/Info.plist 2>/dev/null || true + /usr/libexec/PlistBuddy -c "Add :UISupportedInterfaceOrientations~ipad array" App/Info.plist + for o in UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight; do + /usr/libexec/PlistBuddy -c "Add :UISupportedInterfaceOrientations~ipad: string $o" App/Info.plist + done + # Multitasking: iPad split-view + slide-over without forcing + # full screen. + /usr/libexec/PlistBuddy -c "Set :UIRequiresFullScreen NO" App/Info.plist 2>/dev/null \ + || /usr/libexec/PlistBuddy -c "Add :UIRequiresFullScreen bool NO" App/Info.plist + - name: Generate launcher icons + splash working-directory: apps/mobile run: pnpm exec capacitor-assets generate --ios || true @@ -52,7 +72,7 @@ jobs: working-directory: apps/mobile/ios/App run: pod install --repo-update - - name: Build archive (unsigned) + - name: Build archive (unsigned, iPhone + iPad universal) working-directory: apps/mobile run: | xcodebuild \ @@ -61,6 +81,7 @@ jobs: -configuration Release \ -destination 'generic/platform=iOS' \ -archivePath ios/build/App.xcarchive \ + TARGETED_DEVICE_FAMILY="1,2" \ CODE_SIGNING_ALLOWED=NO \ CODE_SIGNING_REQUIRED=NO \ CODE_SIGN_IDENTITY="" \ diff --git a/.github/workflows/tauri-mobile.yml b/.github/workflows/tauri-mobile.yml index 682ce6a..70a8e6b 100644 --- a/.github/workflows/tauri-mobile.yml +++ b/.github/workflows/tauri-mobile.yml @@ -70,11 +70,20 @@ jobs: targets: aarch64-apple-ios,aarch64-apple-ios-sim - run: pnpm install --frozen-lockfile - run: pnpm --filter tempest-web build - - name: Tauri ios init + build (unsigned) + - name: Tauri ios init + force universal device family working-directory: apps/desktop run: | pnpm exec tauri ios init || true - pnpm exec tauri ios build --export-method debugging + # Tauri scaffolds the Xcode project under src-tauri/gen/apple. + # Make sure it targets both iPhone and iPad so the same archive + # runs natively on iPadOS. + proj="src-tauri/gen/apple/$(ls src-tauri/gen/apple | grep -m1 '\.xcodeproj$' || echo)" + if [ -d "$proj" ]; then + sed -i.bak 's/TARGETED_DEVICE_FAMILY = "1";/TARGETED_DEVICE_FAMILY = "1,2";/g' "$proj/project.pbxproj" || true + fi + - name: Tauri ios build (unsigned) + working-directory: apps/desktop + run: pnpm exec tauri ios build --export-method debugging - uses: actions/upload-artifact@v4 with: name: tempest-tauri-ios diff --git a/apps/mobile/capacitor.config.ts b/apps/mobile/capacitor.config.ts index 6dc5680..ce566dd 100644 --- a/apps/mobile/capacitor.config.ts +++ b/apps/mobile/capacitor.config.ts @@ -14,10 +14,16 @@ const config: CapacitorConfig = { captureInput: true, webContentsDebuggingEnabled: false, }, + // iOS settings cover iPadOS too: Capacitor builds a universal app + // (TARGETED_DEVICE_FAMILY = "1,2"). The CI workflow patches the Xcode + // project defensively so this never regresses. ios: { contentInset: "automatic", limitsNavigationsToAppBoundDomains: false, backgroundColor: "#0b0d12", + // Support iPad multitasking (split view, slide over). The web layout + // already adapts to the available width via the >=900px breakpoint. + scheme: "Tempest", }, server: { androidScheme: "https", diff --git a/docs/MOBILE.md b/docs/MOBILE.md index f7fc754..42eadfd 100644 --- a/docs/MOBILE.md +++ b/docs/MOBILE.md @@ -6,7 +6,7 @@ Tempest ships three native shells around the same `apps/web` Vite bundle: | ------------------- | ---------- | --------------------------------- | ------------------------- | | macOS / Win / Linux | Tauri 2 | `.github/workflows/desktop.yml` | `.dmg / .app / .msi / .deb / .AppImage` | | Android | Capacitor | `.github/workflows/android.yml` | `.apk` | -| iOS | Capacitor | `.github/workflows/ios.yml` | unsigned `.ipa` | +| iOS / iPadOS | Capacitor | `.github/workflows/ios.yml` | unsigned `.ipa` (universal) | | Android (alt) | Tauri 2 | `.github/workflows/tauri-mobile.yml` (manual) | `.apk` | | iOS (alt) | Tauri 2 | `.github/workflows/tauri-mobile.yml` (manual) | unsigned `.ipa` | @@ -47,9 +47,13 @@ pnpm --filter tempest-mobile open:android # opens Android Studio pnpm --filter tempest-mobile android:debug # produces apps/mobile/android/app/build/outputs/apk/debug/app-debug.apk ``` -### iOS (Capacitor) +### iOS / iPadOS (Capacitor) -You need a Mac with Xcode 15+ and CocoaPods. +You need a Mac with Xcode 15+ and CocoaPods. The same archive runs +natively on iPhone and iPad (`TARGETED_DEVICE_FAMILY = "1,2"`), and +the web layout already adapts to wider screens at the `>=900px` +breakpoint, so split-view and slide-over on iPad work without an +iPad-specific build. ```sh pnpm --filter tempest-mobile build @@ -58,6 +62,10 @@ cd ios/App && pod install pnpm --filter tempest-mobile open:ios # opens Xcode for signing + run on device ``` +The CI workflow patches the generated Xcode project to keep iPad +support universal even if the Capacitor template ever regresses, and +forces `UIRequiresFullScreen=NO` so iPad multitasking works. + ## Signing ### Android release APK