diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index cf4289b..1cedd6f 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -1,54 +1,162 @@
-name: "build"
+name: build
-# This will trigger the action on each push to the `release` branch.
on:
push:
branches:
- "*"
+ pull_request:
+
+env:
+ LITHO_REPO: https://github.com/girish946/litho.git
+ LITHO_BRANCH: master
jobs:
- publish-tauri:
+ build-tauri-linux:
permissions:
contents: write
- strategy:
- fail-fast: false
- matrix:
- # platform: [macos-latest, ubuntu-20.04, windows-latest]
- platform: [ubuntu-20.04]
-
- runs-on: ${{ matrix.platform }}
+ runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
+ # liblitho is a path dependency at ../../litho (sibling of this repo).
+ - name: Checkout litho
+ run: git clone --depth 1 --branch "${{ env.LITHO_BRANCH }}" "${{ env.LITHO_REPO }}" ../litho
+
+ - name: install dependencies (ubuntu only)
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
+
- name: setup node
uses: actions/setup-node@v4
with:
- node-version: 20
+ node-version: lts/*
- name: install Rust stable
uses: dtolnay/rust-toolchain@stable
- - name: install dependencies (ubuntu only)
- if: matrix.platform == 'ubuntu-20.04'
- run: |
- sudo apt-get update
- sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev librsvg2-dev patchelf
+ - name: Rust cache
+ uses: swatinem/rust-cache@v2
+ with:
+ workspaces: |
+ ./src-tauri -> target
+ ../litho -> target
- name: install frontend dependencies
- run: yarn install # change this to npm or pnpm depending on which one you use
+ run: npm install
+
+ - name: vendor frontend assets
+ run: npm run vendor-assets
+
+ - name: generate app icons
+ run: npm run generate-icons
+ # Omit tagName and releaseId to build only (no GitHub release upload).
- uses: tauri-apps/tauri-action@v0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- #with:
- # tagName: app-v__VERSION__ # the action automatically replaces \_\_VERSION\_\_ with the app version
- # releaseName: "App v__VERSION__"
- # releaseBody: "See the assets to download this version and install."
- # releaseDraft: true
- # prerelease: false
+ with:
+ tauriScript: bash scripts/tauri-build.sh
+
- uses: actions/upload-artifact@v4
with:
- name: builds
+ name: linux-builds
path: |
src-tauri/target/release/bundle/deb/*.deb
src-tauri/target/release/bundle/appimage/*.AppImage
+ src-tauri/target/release/bundle/rpm/*.rpm
+
+ build-tauri-windows:
+ permissions:
+ contents: write
+ runs-on: windows-latest
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Checkout litho
+ shell: bash
+ run: git clone --depth 1 --branch "${{ env.LITHO_BRANCH }}" "${{ env.LITHO_REPO }}" ../litho
+
+ # windows-latest ships OpenSSL at C:\Program Files\OpenSSL (see actions/runner-images Install-OpenSSL.ps1).
+ # openssl-sys needs OPENSSL_* pointing at the MSVC import libs (lib\VC\x64\MD\), not lib\ alone.
+ - name: Configure pre-installed OpenSSL for openssl-sys
+ shell: pwsh
+ run: |
+ $opensslDir = 'C:\Program Files\OpenSSL'
+ if (-not (Test-Path $opensslDir)) {
+ Write-Error "Pre-installed OpenSSL not found at $opensslDir"
+ exit 1
+ }
+
+ $libMatch = Get-ChildItem -Path $opensslDir -Recurse -Filter 'libcrypto.lib' -ErrorAction SilentlyContinue | Select-Object -First 1
+ if (-not $libMatch) {
+ Write-Error "libcrypto.lib not found under $opensslDir"
+ exit 1
+ }
+ $libDir = $libMatch.DirectoryName
+
+ $includeDir = Join-Path $opensslDir 'include'
+ if (-not (Test-Path $includeDir)) {
+ Write-Error "OpenSSL include dir not found at $includeDir"
+ exit 1
+ }
+
+ Write-Host "OPENSSL_DIR=$opensslDir"
+ Write-Host "OPENSSL_LIB_DIR=$libDir"
+ Write-Host "OPENSSL_INCLUDE_DIR=$includeDir"
+ Add-Content -Path $env:GITHUB_ENV -Value "OPENSSL_DIR=$opensslDir"
+ Add-Content -Path $env:GITHUB_ENV -Value "OPENSSL_LIB_DIR=$libDir"
+ Add-Content -Path $env:GITHUB_ENV -Value "OPENSSL_INCLUDE_DIR=$includeDir"
+
+ # windows-latest ships vcpkg at C:\vcpkg (VCPKG_INSTALLATION_ROOT). rust-lzma needs VCPKG_ROOT
+ # and the liblzma port installed (find_package does not auto-install).
+ - name: Configure pre-installed vcpkg for rust-lzma
+ shell: pwsh
+ run: |
+ $vcpkgRoot = 'C:\vcpkg'
+ $vcpkgExe = Join-Path $vcpkgRoot 'vcpkg.exe'
+ if (-not (Test-Path $vcpkgExe)) {
+ Write-Error "Pre-installed vcpkg not found at $vcpkgExe"
+ exit 1
+ }
+ Write-Host "Installing static liblzma via $vcpkgExe ..."
+ & $vcpkgExe install liblzma:x64-windows-static-md
+ if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
+ Add-Content -Path $env:GITHUB_ENV -Value "VCPKG_ROOT=$vcpkgRoot"
+
+ - name: setup node
+ uses: actions/setup-node@v4
+ with:
+ node-version: lts/*
+
+ - name: install Rust stable
+ uses: dtolnay/rust-toolchain@stable
+
+ - name: Rust cache
+ uses: swatinem/rust-cache@v2
+ with:
+ workspaces: |
+ ./src-tauri -> target
+ ../litho -> target
+
+ - name: install frontend dependencies
+ run: npm install
+
+ - name: vendor frontend assets
+ run: npm run vendor-assets
+
+ - name: generate app icons
+ run: npm run generate-icons
+
+ - uses: tauri-apps/tauri-action@v0
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ tauriScript: powershell -ExecutionPolicy Bypass -File scripts/tauri-build.ps1
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: windows-builds
+ path: |
+ src-tauri/target/release/bundle/msi/*.msi
+ src-tauri/target/release/bundle/nsis/*.exe
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index a547bf3..a960357 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,9 @@ dist-ssr
*.njsproj
*.sln
*.sw?
+
+# frontend framework files and fonts
+src/vendor/*
+
+# sidecar files
+src-tauri/binaries/*
\ No newline at end of file
diff --git a/README.md b/README.md
index 8145cad..2f4ab4e 100644
--- a/README.md
+++ b/README.md
@@ -1,28 +1,148 @@
# Lithographer
-GUI for [litho](https://github.com/girish946/litho) written in Rust using [tauri](https://tauri.studio/).
-
-
-
+
-## Build
+Desktop app for flashing disk images and cloning block devices. Built with [Tauri 2](https://tauri.app/) on top of the [litho](https://github.com/girish946/litho) engine.
+
+Lithographer runs as a **normal user app**. Listing devices and checking safety rules happen in-process; actual flash/clone is done by a bundled **`litho` helper** after you approve elevation (polkit / UAC).
+
+---
+
+## What you can do
+
+- **Flash** an image (`.img` / `.iso` / `.img.xz`) onto a USB drive or disk
+- **Clone** a whole disk to an image file
+- Pick devices and files with a simple UI
+- Optional **checksum verify** after flash
+- **Cancel** a running operation
+- **Light / dark** theme (preference is saved)
+
+---
-### Prerequisites
+## Platforms
-As of now lithographer only supports building for Linux. You need to have the [Prerequisites for tauri](https://tauri.app/v1/guides/getting-started/prerequisites/) installed on the system.
+| OS | Status |
+|----|--------|
+| **Linux** | Full support (AppImage, `.deb`, `.rpm`) |
+| **Windows** | Full support (MSI / NSIS) |
+| **macOS** | Not fully supported yet |
+---
+
+## Install & run
+
+### From a release build (Linux)
```bash
-$ git clone https://github.com/girish946/lithographer.git
-$ cd lithographer
-$ cargo tauri build -b appimage
+./lithographer_*_amd64.AppImage
+# or install the .deb / .rpm from the release assets
```
-## Usage
+On some Wayland setups the **AppImage** includes a compatibility hook. If WebKit misbehaves, try the **`.deb`** package (system WebKitGTK).
+
+### From a release build (Windows)
+
+Run the **MSI** or **NSIS** installer from the release, then start Lithographer from the Start menu.
+
+### From source
+
+You need:
+
+- [Tauri 2 prerequisites](https://tauri.app/start/prerequisites/)
+- A checkout of **litho** next to **lithographer** (same parent directory)
+- Linux: `pkexec` (polkit) for elevation
+- Windows: WebView2 + ability to approve UAC
+
+```bash
+# Sibling layout:
+# …/litho
+# …/lithographer
+
+cd lithographer
+npm install
+npm run tauri:build
+```
+
+Development (hot reload):
+
```bash
-$ ./src-tauri/target/release/bundle/appimage/lithographer_0.0.1_amd64.AppImage
+npm run tauri:dev
```
-
+---
+
+## How to use
+
+1. Choose **Flash** or **Clone**.
+2. Select a **storage device** (removable drives are listed first).
+3. Choose the **image file** (flash) or **output path** (clone).
+4. Optionally enable **verify** for flash.
+5. Press **Start** and approve the elevation prompt if asked.
+6. Watch progress; use **Cancel** if you need to stop.
+
+
+
+
+
+### Elevation (what you’ll see)
+
+| Platform | What happens |
+|----------|----------------|
+| **Linux** | System password dialog (`pkexec` / polkit) when flash or clone starts |
+| **Windows** | UAC prompt; the app restarts elevated so progress still shows correctly |
+
+You can also start the whole app elevated (`sudo` on Linux, “Run as administrator” on Windows) so per-operation prompts are not needed.
+
+**Linux only — optional elevation backends** (advanced):
+
+```bash
+# Default: polkit / pkexec
+./lithographer_*.AppImage
+
+# Fallback if polkit is broken: sudo askpass
+LITHOGRAPHER_ELEVATION=sudo ./lithographer_*.AppImage
+```
+
+---
+
+## Safety
+
+- **Wrong device = permanent data loss.** Read the device name carefully.
+- Prefer **USB / removable** media as flash targets.
+- Fixed (internal) disks require an extra confirmation.
+- Litho refuses the system disk and will unmount/dismount volumes on the target only after you confirm.
+
+---
+
+## Troubleshooting (users)
+
+| Issue | What to try |
+|-------|-------------|
+| No devices listed | Re-plug the USB drive; refresh; on Linux ensure the kernel sees the disk (`lsblk`) |
+| Elevation cancelled | Approve the password/UAC dialog, or run the app elevated |
+| Flash fails mid-way | Close File Explorer / other disk tools; unmount the drive; retry |
+| AppImage blank/broken on Wayland | Try the `.deb` package or an X11 session |
+| Progress stuck after cancel | Wait for the current block to finish; cancel is cooperative |
+
+Logs for the `litho` helper and TUI-related cache live under:
+
+- Linux: `~/.cache/litho/`
+- Windows: `%LOCALAPPDATA%\litho\`
+
+---
+
+## For developers
+
+Build system, architecture, sidecar preparation, CI, and protocol details:
+
+→ **[docs/developer-docs.md](docs/developer-docs.md)**
+
+Core engine and CLI:
+
+→ **[litho](https://github.com/girish946/litho)** (see also [litho developer docs](https://github.com/girish946/litho/blob/main/docs/developer-docs.md))
+
+## License
+
+See `src-tauri/Cargo.toml`.
diff --git a/docs/developer-docs.md b/docs/developer-docs.md
new file mode 100644
index 0000000..2f0d797
--- /dev/null
+++ b/docs/developer-docs.md
@@ -0,0 +1,187 @@
+# Lithographer — developer documentation
+
+User-facing overview: [README.md](../README.md).
+
+This document covers architecture, build scripts, elevation internals, cancel protocol, CI, and packaging.
+
+---
+
+## Features (detailed)
+
+| Feature | Notes |
+|---------|-------|
+| Flash / clone | Real block I/O via `litho` sidecar (`real-io`) |
+| Device picker | `liblitho` in-process enumeration; removable first |
+| Native file dialogs | `rfd` open (flash) / save (clone) |
+| Optimal block size | From device capacity via `liblitho` |
+| Optional SHA-256 verify | Passed as `--verify` to litho |
+| Cooperative cancel | `--cancel-file` across pkexec / UAC |
+| Privilege diagnostics | Badge + `get_startup_diagnostics` |
+| Themes | Light / dark, persisted |
+| Linux packages | AppImage, deb, rpm; Wayland AppImage patch |
+| Windows packages | MSI, NSIS; elevated self-relaunch for pipe capture |
+
+---
+
+## Architecture
+
+```
+Lithographer (user session)
+ ├─ liblitho in-process → device list, validation, optimal block size
+ └─ litho sidecar → elevated or direct
+ └─ litho -o gui flash|clone … --cancel-file [--verify] [--yes]
+```
+
+| Concern | Where |
+|---------|--------|
+| UI | `src/` (HTML/JS/CSS) |
+| Tauri commands / sidecar spawn | `src-tauri/src/` |
+| Device enum / validation | path dependency on `../litho` (`liblitho`) |
+| Destructive I/O | external `litho` binary with `-o gui` |
+
+### Linux elevation
+
+- Default: `pkexec litho …`
+- AppImage: `litho` is copied to `$TMPDIR/lithographer-litho-` first (`pkexec` cannot execute from FUSE mounts); staged copy removed on exit
+- Env override: `LITHOGRAPHER_ELEVATION=sudo` (askpass), `run0` where available
+- Whole-app `sudo` runs litho without per-op `pkexec`
+
+### Windows elevation
+
+- Lithographer relaunches **itself** via UAC with `--auto-run …`
+- Elevated GUI process spawns `litho.exe` as a **hidden piped child** (elevating litho alone would break stdout capture)
+
+### Cancel across elevation
+
+- stdin/signals do not reliably reach `pkexec` children
+- Create `~/.cache/litho/cancel--.flag` (Windows: under `%LOCALAPPDATA%\litho\`)
+- Pass `--cancel-file` to litho; write `cancel` into the file on user cancel
+- Litho polls ~50 ms
+
+GUI protocol details: [litho developer docs](https://github.com/girish946/litho/blob/main/docs/developer-docs.md#gui-protocol--o-gui).
+
+---
+
+## Repository layout
+
+```
+…/litho/ # sibling crate + CLI
+…/lithographer/
+ package.json
+ src/ # frontend
+ src-tauri/
+ src/ # Rust host
+ binaries/ # prepared litho sidecar
+ scripts/ # prepare-litho-sidecar, AppImage patch
+ tauri*.conf.json
+ docs/
+```
+
+Clone both repos as siblings:
+
+```bash
+git clone https://github.com/girish946/lithographer.git
+git clone https://github.com/girish946/litho.git
+# Adjust branch if CI uses a non-default litho branch
+```
+
+---
+
+## Build
+
+### Prerequisites
+
+**Linux:** [Tauri 2 prerequisites](https://tauri.app/start/prerequisites/) (`webkit2gtk-4.1`, etc.), `pkexec`
+
+**Windows:** Tauri prerequisites (WebView2, VS Build Tools), OpenSSL for release litho builds as required by CI
+
+### Commands
+
+```bash
+cd lithographer
+npm install
+npm run tauri:build
+```
+
+| Script | Description |
+|--------|-------------|
+| `npm run tauri:dev` | Prepare sidecar + `tauri dev` |
+| `npm run tauri:build` | Prepare sidecar + `tauri build` + AppImage Wayland post-patch |
+| `npm run prepare-sidecar` | Build `litho` with `real-io` into `src-tauri/binaries/` |
+| `npm run vendor-assets` | Vendor frontend fonts/CSS |
+| `npm run generate-icons` | Regenerate icons |
+
+Sidecar build (conceptually):
+
+```bash
+cargo build --release --no-default-features --features real-io --bin litho
+# then copy/rename into src-tauri/binaries/
+```
+
+See `src-tauri/scripts/prepare-litho-sidecar.sh` / `.ps1`.
+
+### Outputs
+
+| Platform | Artifacts |
+|----------|-----------|
+| Linux | `src-tauri/target/release/bundle/appimage/*_amd64.AppImage` |
+| Linux | `…/deb/*.deb`, `…/rpm/*.rpm` |
+| Windows | `…/msi/*.msi`, `…/nsis/*.exe` |
+
+### Development loop
+
+```bash
+npm run prepare-sidecar # after litho CLI/protocol changes
+npm run tauri:dev
+```
+
+### Startup diagnostics
+
+`get_startup_diagnostics` / privilege badge report:
+
+- elevated vs unprivileged
+- elevation backend (`pkexec`, `sudo -A`, `run0`, `uac`)
+- polkit agent presence (or GNOME built-in polkit)
+- preview of the litho spawn command
+
+---
+
+## CI
+
+`.github/workflows/build.yaml` (names may vary):
+
+- **ubuntu** — AppImage, deb, rpm
+- **windows-latest** — MSI, NSIS (OpenSSL + vcpkg `liblzma` for litho)
+
+Jobs clone the **litho** sibling repository (branch configured in the workflow).
+
+---
+
+## Packaging notes
+
+### AppImage Wayland
+
+Post-build hook: `src-tauri/scripts/patch-appimage-wayland.sh` injects `src-tauri/appimage/apprun-wayland-compat.sh` for compositors such as Hyprland.
+
+### Frontend assets
+
+`npm run vendor-assets` embeds fonts/CSS for offline packaging.
+
+---
+
+## Safety (developer)
+
+- Never skip device validation paths when changing spawn args.
+- Keep `--cancel-file` when elevating; do not rely on SIGINT alone.
+- Rebuild the sidecar after any litho CLI protocol change before testing the GUI.
+
+---
+
+## Related
+
+- [litho](https://github.com/girish946/litho) — CLI, library, TUI
+- [litho developer docs](https://github.com/girish946/litho/blob/main/docs/developer-docs.md)
+
+## License
+
+See `src-tauri/Cargo.toml`.
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..792251a
--- /dev/null
+++ b/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "lithographer",
+ "private": true,
+ "version": "0.2.0",
+ "type": "module",
+ "scripts": {
+ "tauri": "tauri",
+ "tauri:dev": "node scripts/run-platform.mjs prepare-sidecar && tauri dev",
+ "tauri:build": "node scripts/run-platform.mjs prepare-sidecar && tauri build && node scripts/post-tauri-build.mjs",
+ "prepare-sidecar": "node scripts/run-platform.mjs prepare-sidecar",
+ "generate-icons": "node scripts/run-platform.mjs generate-icons",
+ "vendor-assets": "node scripts/run-platform.mjs vendor-assets",
+ "tauri-build": "node scripts/run-platform.mjs tauri-build"
+ },
+ "devDependencies": {
+ "@tauri-apps/cli": "^2"
+ }
+}
diff --git a/scripts/generate-app-icons.ps1 b/scripts/generate-app-icons.ps1
new file mode 100644
index 0000000..a6bce68
--- /dev/null
+++ b/scripts/generate-app-icons.ps1
@@ -0,0 +1,23 @@
+# Regenerate src-tauri/icons/* from the same logo assets used in the HTML UI.
+$ErrorActionPreference = 'Stop'
+
+$RepoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..')).Path
+$Source = Join-Path $RepoRoot 'src\assets\dark-logo.jpg'
+$OutDir = Join-Path $RepoRoot 'src-tauri\icons'
+
+if (-not (Test-Path -LiteralPath $Source)) {
+ Write-Error "Icon source not found: $Source"
+}
+
+Push-Location $RepoRoot
+try {
+ Write-Host "Generating Tauri icons from $Source ..."
+ npm exec -- tauri icon $Source -o src-tauri/icons
+ if ($LASTEXITCODE -ne 0) {
+ exit $LASTEXITCODE
+ }
+} finally {
+ Pop-Location
+}
+
+Write-Host "Icons written to $OutDir"
\ No newline at end of file
diff --git a/scripts/generate-app-icons.sh b/scripts/generate-app-icons.sh
new file mode 100644
index 0000000..b10c450
--- /dev/null
+++ b/scripts/generate-app-icons.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
+source="${repo_root}/src/assets/dark-logo.jpg"
+out_dir="${repo_root}/src-tauri/icons"
+
+if [[ ! -f "${source}" ]]; then
+ echo "error: icon source not found: ${source}" >&2
+ exit 1
+fi
+
+echo "Generating Tauri icons from ${source} ..."
+(
+ cd "${repo_root}"
+ npm exec -- tauri icon "${source}" -o src-tauri/icons
+)
+
+echo "Icons written to ${out_dir}"
\ No newline at end of file
diff --git a/scripts/post-tauri-build.mjs b/scripts/post-tauri-build.mjs
new file mode 100644
index 0000000..5894661
--- /dev/null
+++ b/scripts/post-tauri-build.mjs
@@ -0,0 +1,13 @@
+import { spawnSync } from 'node:child_process';
+import { fileURLToPath } from 'node:url';
+import path from 'node:path';
+
+if (process.platform !== 'linux') {
+ process.exit(0);
+}
+
+const root = path.join(path.dirname(fileURLToPath(import.meta.url)), '..');
+const patchScript = path.join(root, 'src-tauri/scripts/patch-appimage-wayland.sh');
+
+const result = spawnSync('bash', [patchScript], { stdio: 'inherit', cwd: root, shell: false });
+process.exit(result.status ?? 1);
\ No newline at end of file
diff --git a/scripts/run-platform.mjs b/scripts/run-platform.mjs
new file mode 100644
index 0000000..68adfc8
--- /dev/null
+++ b/scripts/run-platform.mjs
@@ -0,0 +1,43 @@
+import { spawnSync } from 'node:child_process';
+import { fileURLToPath } from 'node:url';
+import path from 'node:path';
+
+const root = path.join(path.dirname(fileURLToPath(import.meta.url)), '..');
+const script = process.argv[2];
+const extraArgs = process.argv.slice(3);
+const isWin = process.platform === 'win32';
+
+const scripts = {
+ 'prepare-sidecar': {
+ win: path.join(root, 'src-tauri/scripts/prepare-litho-sidecar.ps1'),
+ unix: path.join(root, 'src-tauri/scripts/prepare-litho-sidecar.sh'),
+ },
+ 'vendor-assets': {
+ win: path.join(root, 'scripts/vendor-frontend-assets.ps1'),
+ unix: path.join(root, 'scripts/vendor-frontend-assets.sh'),
+ },
+ 'tauri-build': {
+ win: path.join(root, 'scripts/tauri-build.ps1'),
+ unix: path.join(root, 'scripts/tauri-build.sh'),
+ },
+ 'generate-icons': {
+ win: path.join(root, 'scripts/generate-app-icons.ps1'),
+ unix: path.join(root, 'scripts/generate-app-icons.sh'),
+ },
+};
+
+const entry = scripts[script];
+if (!entry) {
+ console.error(`Unknown script: ${script ?? '(none)'}`);
+ process.exit(1);
+}
+
+const result = isWin
+ ? spawnSync(
+ 'powershell',
+ ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', entry.win, ...extraArgs],
+ { stdio: 'inherit', cwd: root, shell: false },
+ )
+ : spawnSync('bash', [entry.unix, ...extraArgs], { stdio: 'inherit', cwd: root, shell: false });
+
+process.exit(result.status ?? 1);
\ No newline at end of file
diff --git a/scripts/tauri-build.ps1 b/scripts/tauri-build.ps1
new file mode 100644
index 0000000..28f73af
--- /dev/null
+++ b/scripts/tauri-build.ps1
@@ -0,0 +1,27 @@
+# Prepare litho sidecar, run Tauri CLI, then Linux-only post-steps (none on Windows).
+param(
+ [Parameter(ValueFromRemainingArguments = $true)]
+ [string[]]$TauriArgs
+)
+
+$ErrorActionPreference = 'Stop'
+
+$RepoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..')).Path
+$PrepareScript = Join-Path $RepoRoot 'src-tauri\scripts\prepare-litho-sidecar.ps1'
+
+& $PrepareScript
+if ($LASTEXITCODE -ne 0) {
+ exit $LASTEXITCODE
+}
+
+Push-Location $RepoRoot
+try {
+ if ($TauriArgs.Count -eq 0) {
+ npm exec tauri
+ } else {
+ npm exec -- tauri @TauriArgs
+ }
+ exit $LASTEXITCODE
+} finally {
+ Pop-Location
+}
\ No newline at end of file
diff --git a/scripts/tauri-build.sh b/scripts/tauri-build.sh
new file mode 100755
index 0000000..7cbcb73
--- /dev/null
+++ b/scripts/tauri-build.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
+cd "$repo_root"
+
+bash src-tauri/scripts/prepare-litho-sidecar.sh
+npm exec tauri "$@"
+bash src-tauri/scripts/patch-appimage-wayland.sh
\ No newline at end of file
diff --git a/scripts/vendor-frontend-assets.ps1 b/scripts/vendor-frontend-assets.ps1
new file mode 100644
index 0000000..b4d754c
--- /dev/null
+++ b/scripts/vendor-frontend-assets.ps1
@@ -0,0 +1,98 @@
+# Download third-party frontend assets used by src/index.html for offline bundling.
+$ErrorActionPreference = 'Stop'
+
+$Root = (Resolve-Path (Join-Path $PSScriptRoot '..')).Path
+$Vendor = Join-Path $Root 'src\vendor'
+$FaBase = 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0'
+$TailwindVersion = '3.4.17'
+
+$dirs = @(
+ (Join-Path $Vendor 'fontawesome\css'),
+ (Join-Path $Vendor 'fontawesome\webfonts'),
+ (Join-Path $Vendor 'fonts')
+)
+foreach ($dir in $dirs) {
+ New-Item -ItemType Directory -Force -Path $dir | Out-Null
+}
+
+function Download-File {
+ param(
+ [Parameter(Mandatory = $true)][string]$Uri,
+ [Parameter(Mandatory = $true)][string]$OutFile
+ )
+ Invoke-WebRequest -Uri $Uri -OutFile $OutFile -UseBasicParsing
+}
+
+Write-Host "Downloading Tailwind CSS browser build v$TailwindVersion..."
+Download-File `
+ -Uri "https://cdn.tailwindcss.com/$TailwindVersion" `
+ -OutFile (Join-Path $Vendor "tailwindcss-$TailwindVersion.js")
+
+Write-Host 'Downloading Font Awesome 6.6.0...'
+Download-File `
+ -Uri "$FaBase/css/all.min.css" `
+ -OutFile (Join-Path $Vendor 'fontawesome\css\all.min.css')
+
+foreach ($font in @('fa-solid-900', 'fa-regular-400', 'fa-brands-400')) {
+ Download-File `
+ -Uri "$FaBase/webfonts/$font.woff2" `
+ -OutFile (Join-Path $Vendor "fontawesome\webfonts\$font.woff2")
+}
+
+Write-Host 'Downloading Inter and Space Grotesk (latin subsets)...'
+Download-File `
+ -Uri 'https://fonts.gstatic.com/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2' `
+ -OutFile (Join-Path $Vendor 'fonts\inter-latin.woff2')
+Download-File `
+ -Uri 'https://fonts.gstatic.com/s/spacegrotesk/v22/V8mDoQDjQSkFtoMM3T6r8E7mPbF4Cw.woff2' `
+ -OutFile (Join-Path $Vendor 'fonts\space-grotesk-latin.woff2')
+
+$fontsCss = @'
+/* Bundled locally from Google Fonts (latin subsets). */
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./inter-latin.woff2') format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url('./inter-latin.woff2') format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: url('./inter-latin.woff2') format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Space Grotesk';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url('./space-grotesk-latin.woff2') format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Space Grotesk';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: url('./space-grotesk-latin.woff2') format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+'@
+
+$fontsCssPath = Join-Path $Vendor 'fonts\fonts.css'
+[System.IO.File]::WriteAllText($fontsCssPath, $fontsCss, [System.Text.UTF8Encoding]::new($false))
+
+Write-Host 'Vendor assets ready under src/vendor/'
+Get-ChildItem -LiteralPath $Vendor -Recurse -File | ForEach-Object { $_.FullName }
\ No newline at end of file
diff --git a/scripts/vendor-frontend-assets.sh b/scripts/vendor-frontend-assets.sh
new file mode 100755
index 0000000..ce0e008
--- /dev/null
+++ b/scripts/vendor-frontend-assets.sh
@@ -0,0 +1,83 @@
+#!/usr/bin/env bash
+# Download third-party frontend assets used by src/index.html for offline bundling.
+set -euo pipefail
+
+ROOT="$(cd "$(dirname "$0")/.." && pwd)"
+VENDOR="$ROOT/src/vendor"
+FA_BASE="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0"
+TAILWIND_VERSION="3.4.17"
+
+mkdir -p \
+ "$VENDOR/fontawesome/css" \
+ "$VENDOR/fontawesome/webfonts" \
+ "$VENDOR/fonts"
+
+echo "Downloading Tailwind CSS browser build v${TAILWIND_VERSION}..."
+curl -fsSL "https://cdn.tailwindcss.com/${TAILWIND_VERSION}" \
+ -o "$VENDOR/tailwindcss-${TAILWIND_VERSION}.js"
+
+echo "Downloading Font Awesome ${FA_BASE##*/}..."
+curl -fsSL "${FA_BASE}/css/all.min.css" -o "$VENDOR/fontawesome/css/all.min.css"
+for font in fa-solid-900 fa-regular-400 fa-brands-400; do
+ curl -fsSL "${FA_BASE}/webfonts/${font}.woff2" \
+ -o "$VENDOR/fontawesome/webfonts/${font}.woff2"
+done
+
+echo "Downloading Inter and Space Grotesk (latin subsets)..."
+curl -fsSL \
+ "https://fonts.gstatic.com/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2" \
+ -o "$VENDOR/fonts/inter-latin.woff2"
+curl -fsSL \
+ "https://fonts.gstatic.com/s/spacegrotesk/v22/V8mDoQDjQSkFtoMM3T6r8E7mPbF4Cw.woff2" \
+ -o "$VENDOR/fonts/space-grotesk-latin.woff2"
+
+cat > "$VENDOR/fonts/fonts.css" <<'EOF'
+/* Bundled locally from Google Fonts (latin subsets). */
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url('./inter-latin.woff2') format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url('./inter-latin.woff2') format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Inter';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: url('./inter-latin.woff2') format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Space Grotesk';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url('./space-grotesk-latin.woff2') format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Space Grotesk';
+ font-style: normal;
+ font-weight: 600;
+ font-display: swap;
+ src: url('./space-grotesk-latin.woff2') format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+EOF
+
+echo "Vendor assets ready under src/vendor/"
+ls -lh "$VENDOR/tailwindcss-${TAILWIND_VERSION}.js" \
+ "$VENDOR/fontawesome/css/all.min.css" \
+ "$VENDOR/fontawesome/webfonts/"*.woff2 \
+ "$VENDOR/fonts/"*.woff2 \
+ "$VENDOR/fonts/fonts.css"
\ No newline at end of file
diff --git a/src-tauri/.gitignore b/src-tauri/.gitignore
index f4dfb82..b21bd68 100644
--- a/src-tauri/.gitignore
+++ b/src-tauri/.gitignore
@@ -2,3 +2,6 @@
# will have compiled files and executables
/target/
+# Generated by Tauri
+# will have schema files for capabilities auto-completion
+/gen/schemas
diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock
index 270ec88..d9f2000 100644
--- a/src-tauri/Cargo.lock
+++ b/src-tauri/Cargo.lock
@@ -1,27 +1,18 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
-version = 3
+version = 4
[[package]]
-name = "addr2line"
-version = "0.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
-dependencies = [
- "gimli",
-]
-
-[[package]]
-name = "adler"
-version = "1.0.2"
+name = "adler2"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
[[package]]
name = "aho-corasick"
-version = "1.1.2"
+version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
+checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
dependencies = [
"memchr",
]
@@ -34,18 +25,18 @@ checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3"
[[package]]
name = "alloc-stdlib"
-version = "0.2.2"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece"
+checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195"
dependencies = [
"alloc-no-stdlib",
]
[[package]]
-name = "android-tzdata"
-version = "0.1.1"
+name = "allocator-api2"
+version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
[[package]]
name = "android_system_properties"
@@ -58,143 +49,311 @@ dependencies = [
[[package]]
name = "anstream"
-version = "0.6.11"
+version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5"
+checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
dependencies = [
"anstyle",
"anstyle-parse",
"anstyle-query",
"anstyle-wincon",
"colorchoice",
+ "is_terminal_polyfill",
"utf8parse",
]
[[package]]
name = "anstyle"
-version = "1.0.4"
+version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87"
+checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"
[[package]]
name = "anstyle-parse"
-version = "0.2.3"
+version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c"
+checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
-version = "1.0.2"
+version = "1.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648"
+checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
dependencies = [
- "windows-sys 0.52.0",
+ "windows-sys 0.61.2",
]
[[package]]
name = "anstyle-wincon"
-version = "3.0.2"
+version = "3.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7"
+checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
dependencies = [
"anstyle",
- "windows-sys 0.52.0",
+ "once_cell_polyfill",
+ "windows-sys 0.61.2",
]
[[package]]
name = "anyhow"
-version = "1.0.79"
+version = "1.0.102"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
+
+[[package]]
+name = "ashpd"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2f3f79755c74fd155000314eb349864caa787c6592eace6c6882dad873d9c39"
+dependencies = [
+ "async-fs",
+ "async-net",
+ "enumflags2",
+ "futures-channel",
+ "futures-util",
+ "rand",
+ "raw-window-handle",
+ "serde",
+ "serde_repr",
+ "url",
+ "wayland-backend",
+ "wayland-client",
+ "wayland-protocols",
+ "zbus",
+]
+
+[[package]]
+name = "async-broadcast"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532"
+dependencies = [
+ "event-listener",
+ "event-listener-strategy",
+ "futures-core",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "async-channel"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2"
+dependencies = [
+ "concurrent-queue",
+ "event-listener-strategy",
+ "futures-core",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "async-executor"
+version = "1.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a"
+dependencies = [
+ "async-task",
+ "concurrent-queue",
+ "fastrand",
+ "futures-lite",
+ "pin-project-lite",
+ "slab",
+]
+
+[[package]]
+name = "async-fs"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5"
+dependencies = [
+ "async-lock",
+ "blocking",
+ "futures-lite",
+]
+
+[[package]]
+name = "async-io"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "concurrent-queue",
+ "futures-io",
+ "futures-lite",
+ "parking",
+ "polling",
+ "rustix 1.1.4",
+ "slab",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "async-lock"
+version = "3.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311"
+dependencies = [
+ "event-listener",
+ "event-listener-strategy",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "async-net"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7"
+dependencies = [
+ "async-io",
+ "blocking",
+ "futures-lite",
+]
+
+[[package]]
+name = "async-process"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75"
+dependencies = [
+ "async-channel",
+ "async-io",
+ "async-lock",
+ "async-signal",
+ "async-task",
+ "blocking",
+ "cfg-if",
+ "event-listener",
+ "futures-lite",
+ "rustix 1.1.4",
+]
+
+[[package]]
+name = "async-recursion"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.118",
+]
+
+[[package]]
+name = "async-signal"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485"
+dependencies = [
+ "async-io",
+ "async-lock",
+ "atomic-waker",
+ "cfg-if",
+ "futures-core",
+ "futures-io",
+ "rustix 1.1.4",
+ "signal-hook-registry",
+ "slab",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "async-task"
+version = "4.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca"
+checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"
+
+[[package]]
+name = "async-trait"
+version = "0.1.89"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.118",
+]
[[package]]
name = "atk"
-version = "0.15.1"
+version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd"
+checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b"
dependencies = [
"atk-sys",
- "bitflags 1.3.2",
"glib",
"libc",
]
[[package]]
name = "atk-sys"
-version = "0.15.1"
+version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6"
+checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086"
dependencies = [
"glib-sys",
"gobject-sys",
"libc",
- "system-deps 6.2.0",
+ "system-deps",
]
[[package]]
-name = "atty"
-version = "0.2.14"
+name = "atomic-waker"
+version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
-dependencies = [
- "hermit-abi 0.1.19",
- "libc",
- "winapi",
-]
+checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
[[package]]
name = "autocfg"
-version = "1.1.0"
+version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
[[package]]
-name = "backtrace"
-version = "0.3.69"
+name = "base64"
+version = "0.21.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
-dependencies = [
- "addr2line",
- "cc",
- "cfg-if",
- "libc",
- "miniz_oxide",
- "object",
- "rustc-demangle",
-]
+checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
[[package]]
name = "base64"
-version = "0.13.1"
+version = "0.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
+checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
[[package]]
-name = "base64"
-version = "0.21.7"
+name = "bit-set"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
+checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3"
+dependencies = [
+ "bit-vec",
+]
[[package]]
-name = "bitflags"
-version = "1.3.2"
+name = "bit-vec"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
[[package]]
name = "bitflags"
-version = "2.4.2"
+version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
-name = "block"
-version = "0.1.6"
+name = "bitflags"
+version = "2.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
+checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"
+dependencies = [
+ "serde_core",
+]
[[package]]
name = "block-buffer"
@@ -205,11 +364,42 @@ dependencies = [
"generic-array",
]
+[[package]]
+name = "block2"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f"
+dependencies = [
+ "objc2 0.5.2",
+]
+
+[[package]]
+name = "block2"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5"
+dependencies = [
+ "objc2 0.6.4",
+]
+
+[[package]]
+name = "blocking"
+version = "1.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21"
+dependencies = [
+ "async-channel",
+ "async-task",
+ "futures-io",
+ "futures-lite",
+ "piper",
+]
+
[[package]]
name = "brotli"
-version = "3.4.0"
+version = "8.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f"
+checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3"
dependencies = [
"alloc-no-stdlib",
"alloc-stdlib",
@@ -218,35 +408,34 @@ dependencies = [
[[package]]
name = "brotli-decompressor"
-version = "2.5.1"
+version = "5.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f"
+checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583"
dependencies = [
"alloc-no-stdlib",
"alloc-stdlib",
]
[[package]]
-name = "bstr"
-version = "1.9.0"
+name = "bs58"
+version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc"
+checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4"
dependencies = [
- "memchr",
- "serde",
+ "tinyvec",
]
[[package]]
name = "bumpalo"
-version = "3.14.0"
+version = "3.20.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
+checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
[[package]]
name = "bytemuck"
-version = "1.14.1"
+version = "1.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed2490600f404f2b94c167e31d3ed1d5f3c225a0f3b80230053b3e0b7b962bd9"
+checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec"
[[package]]
name = "byteorder"
@@ -256,51 +445,128 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
name = "bytes"
-version = "1.5.0"
+version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
+checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593"
+dependencies = [
+ "serde",
+]
[[package]]
name = "cairo-rs"
-version = "0.15.12"
+version = "0.18.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc"
+checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2"
dependencies = [
- "bitflags 1.3.2",
+ "bitflags 2.13.0",
"cairo-sys-rs",
"glib",
"libc",
- "thiserror",
+ "once_cell",
+ "thiserror 1.0.69",
]
[[package]]
name = "cairo-sys-rs"
-version = "0.15.1"
+version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8"
+checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51"
dependencies = [
"glib-sys",
"libc",
- "system-deps 6.2.0",
+ "system-deps",
+]
+
+[[package]]
+name = "calloop"
+version = "0.14.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7"
+dependencies = [
+ "bitflags 2.13.0",
+ "polling",
+ "rustix 1.1.4",
+ "slab",
+ "tracing",
+]
+
+[[package]]
+name = "calloop-wayland-source"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa"
+dependencies = [
+ "calloop",
+ "rustix 1.1.4",
+ "wayland-backend",
+ "wayland-client",
+]
+
+[[package]]
+name = "camino"
+version = "1.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4ce8d3bd5823c7504d3f579f13e7b2f3da252fcb938c594d5680ee508bf846f"
+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.15.3"
+version = "0.22.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838"
+checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77"
dependencies = [
"serde",
- "toml 0.7.8",
+ "toml 0.9.12+spec-1.1.0",
+]
+
+[[package]]
+name = "cassowary"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
+
+[[package]]
+name = "castaway"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a"
+dependencies = [
+ "rustversion",
]
[[package]]
name = "cc"
-version = "1.0.83"
+version = "1.2.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
+checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96"
dependencies = [
- "libc",
+ "find-msvc-tools",
+ "shlex",
]
[[package]]
@@ -322,18 +588,9 @@ dependencies = [
[[package]]
name = "cfg-expr"
-version = "0.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7"
-dependencies = [
- "smallvec",
-]
-
-[[package]]
-name = "cfg-expr"
-version = "0.15.6"
+version = "0.15.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6100bc57b6209840798d95cb2775684849d332f7bd788db2a8c8caf7ef82a41a"
+checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02"
dependencies = [
"smallvec",
"target-lexicon",
@@ -341,43 +598,27 @@ dependencies = [
[[package]]
name = "cfg-if"
-version = "1.0.0"
+version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "chrono"
-version = "0.4.33"
+version = "0.4.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb"
+checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327"
dependencies = [
- "android-tzdata",
"iana-time-zone",
"num-traits",
"serde",
- "windows-targets 0.52.0",
-]
-
-[[package]]
-name = "clap"
-version = "3.2.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123"
-dependencies = [
- "atty",
- "bitflags 1.3.2",
- "clap_lex 0.2.4",
- "indexmap 1.9.3",
- "strsim",
- "termcolor",
- "textwrap",
+ "windows-link 0.2.1",
]
[[package]]
name = "clap"
-version = "4.4.18"
+version = "4.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c"
+checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51"
dependencies = [
"clap_builder",
"clap_derive",
@@ -385,106 +626,111 @@ dependencies = [
[[package]]
name = "clap_builder"
-version = "4.4.18"
+version = "4.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7"
+checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f"
dependencies = [
"anstream",
"anstyle",
- "clap_lex 0.6.0",
+ "clap_lex",
"strsim",
]
[[package]]
name = "clap_derive"
-version = "4.4.7"
+version = "4.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442"
+checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9"
dependencies = [
- "heck 0.4.1",
+ "heck 0.5.0",
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.118",
]
[[package]]
name = "clap_lex"
-version = "0.2.4"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
+
+[[package]]
+name = "clipboard-win"
+version = "5.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5"
+checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4"
dependencies = [
- "os_str_bytes",
+ "error-code",
]
[[package]]
-name = "clap_lex"
-version = "0.6.0"
+name = "colorchoice"
+version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1"
+checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
[[package]]
-name = "cocoa"
-version = "0.24.1"
+name = "combine"
+version = "4.6.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a"
+checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd"
dependencies = [
- "bitflags 1.3.2",
- "block",
- "cocoa-foundation",
- "core-foundation",
- "core-graphics",
- "foreign-types",
- "libc",
- "objc",
+ "bytes",
+ "memchr",
]
[[package]]
-name = "cocoa-foundation"
-version = "0.1.2"
+name = "compact_str"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7"
+checksum = "7fd622ebbb56a5b2ccb651b32b911cdeb2a9b4b11776b2473bf26a26a286244e"
dependencies = [
- "bitflags 1.3.2",
- "block",
- "core-foundation",
- "core-graphics-types",
- "libc",
- "objc",
+ "castaway",
+ "cfg-if",
+ "itoa",
+ "rustversion",
+ "ryu",
+ "static_assertions",
]
[[package]]
-name = "color_quant"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
-
-[[package]]
-name = "colorchoice"
-version = "1.0.0"
+name = "concurrent-queue"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
+checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
+dependencies = [
+ "crossbeam-utils",
+]
[[package]]
-name = "combine"
-version = "4.6.6"
+name = "cookie"
+version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4"
+checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747"
dependencies = [
- "bytes",
- "memchr",
+ "time",
+ "version_check",
]
[[package]]
-name = "convert_case"
-version = "0.4.0"
+name = "copypasta"
+version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
+checksum = "3e6811e17f81fe246ef2bc553f76b6ee6ab41a694845df1d37e52a92b7bbd38a"
+dependencies = [
+ "clipboard-win",
+ "objc2 0.5.2",
+ "objc2-app-kit 0.2.2",
+ "objc2-foundation 0.2.2",
+ "smithay-clipboard",
+ "x11-clipboard",
+]
[[package]]
name = "core-foundation"
-version = "0.9.4"
+version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
+checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"
dependencies = [
"core-foundation-sys",
"libc",
@@ -492,17 +738,17 @@ dependencies = [
[[package]]
name = "core-foundation-sys"
-version = "0.8.6"
+version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]]
name = "core-graphics"
-version = "0.22.3"
+version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb"
+checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97"
dependencies = [
- "bitflags 1.3.2",
+ "bitflags 2.13.0",
"core-foundation",
"core-graphics-types",
"foreign-types",
@@ -511,72 +757,78 @@ dependencies = [
[[package]]
name = "core-graphics-types"
-version = "0.1.3"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf"
+checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb"
dependencies = [
- "bitflags 1.3.2",
+ "bitflags 2.13.0",
"core-foundation",
"libc",
]
[[package]]
name = "cpufeatures"
-version = "0.2.12"
+version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504"
+checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
dependencies = [
"libc",
]
[[package]]
name = "crc32fast"
-version = "1.3.2"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
dependencies = [
"cfg-if",
]
[[package]]
name = "crossbeam-channel"
-version = "0.5.11"
+version = "0.5.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b"
+checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
dependencies = [
"crossbeam-utils",
]
[[package]]
-name = "crossbeam-deque"
-version = "0.8.5"
+name = "crossbeam-utils"
+version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
-dependencies = [
- "crossbeam-epoch",
- "crossbeam-utils",
-]
+checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]]
-name = "crossbeam-epoch"
-version = "0.9.18"
+name = "crossterm"
+version = "0.28.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
+checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6"
dependencies = [
- "crossbeam-utils",
+ "bitflags 2.13.0",
+ "crossterm_winapi",
+ "mio",
+ "parking_lot",
+ "rustix 0.38.44",
+ "signal-hook",
+ "signal-hook-mio",
+ "winapi",
]
[[package]]
-name = "crossbeam-utils"
-version = "0.8.19"
+name = "crossterm_winapi"
+version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345"
+checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
+dependencies = [
+ "winapi",
+]
[[package]]
name = "crypto-common"
-version = "0.1.6"
+version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
dependencies = [
"generic-array",
"typenum",
@@ -584,19 +836,15 @@ dependencies = [
[[package]]
name = "cssparser"
-version = "0.27.2"
+version = "0.36.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a"
+checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2"
dependencies = [
"cssparser-macros",
"dtoa-short",
- "itoa 0.4.8",
- "matches",
- "phf 0.8.0",
- "proc-macro2",
- "quote",
+ "itoa",
+ "phf",
"smallvec",
- "syn 1.0.109",
]
[[package]]
@@ -606,24 +854,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
dependencies = [
"quote",
- "syn 2.0.48",
+ "syn 2.0.118",
]
[[package]]
name = "ctor"
-version = "0.2.6"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30d2b3721e861707777e3195b0158f950ae6dc4a27e4d02ff9f67e3eb3de199e"
+checksum = "352d39c2f7bef1d6ad73db6f5160efcaed66d94ef8c6c573a8410c00bf909a98"
dependencies = [
- "quote",
- "syn 2.0.48",
+ "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 = "cursor-icon"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f"
+
[[package]]
name = "darling"
-version = "0.20.3"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e"
+checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d"
dependencies = [
"darling_core",
"darling_macro",
@@ -631,361 +891,654 @@ dependencies = [
[[package]]
name = "darling_core"
-version = "0.20.3"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621"
+checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0"
dependencies = [
- "fnv",
"ident_case",
"proc-macro2",
"quote",
"strsim",
- "syn 2.0.48",
+ "syn 2.0.118",
]
[[package]]
name = "darling_macro"
-version = "0.20.3"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5"
+checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d"
dependencies = [
"darling_core",
"quote",
- "syn 2.0.48",
+ "syn 2.0.118",
]
[[package]]
-name = "deranged"
-version = "0.3.11"
+name = "dbus"
+version = "0.9.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
+checksum = "b942602992bb7acfd1f51c49811c58a610ef9181b6e66f3e519d79b540a3bf73"
dependencies = [
- "powerfmt",
- "serde",
+ "libc",
+ "libdbus-sys",
+ "windows-sys 0.61.2",
]
[[package]]
-name = "derive_more"
-version = "0.99.17"
+name = "defmt"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
+checksum = "a6e524506490a1953d237cb87b1cfc1e46f88c18f10a22dfe0f507dc6bfc7f7f"
dependencies = [
- "convert_case",
- "proc-macro2",
- "quote",
- "rustc_version",
- "syn 1.0.109",
+ "bitflags 1.3.2",
+ "defmt-macros",
]
[[package]]
-name = "digest"
-version = "0.10.7"
+name = "defmt-macros"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+checksum = "f0a27770e9c8f719a79d8b638281f4d828f77d8fd61e0bd94451b9b85e576a0b"
dependencies = [
- "block-buffer",
- "crypto-common",
+ "defmt-parser",
+ "proc-macro-error2",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.118",
]
[[package]]
-name = "dirs-next"
-version = "2.0.0"
+name = "defmt-parser"
+version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1"
+checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e"
dependencies = [
- "cfg-if",
- "dirs-sys-next",
+ "thiserror 2.0.18",
]
[[package]]
-name = "dirs-sys-next"
-version = "0.1.2"
+name = "deranged"
+version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d"
+checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"
dependencies = [
- "libc",
- "redox_users",
- "winapi",
+ "serde_core",
]
[[package]]
-name = "dispatch"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
-
-[[package]]
-name = "dtoa"
-version = "1.0.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653"
-
-[[package]]
-name = "dtoa-short"
-version = "0.3.4"
+name = "derivative"
+version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74"
+checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b"
dependencies = [
- "dtoa",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
]
[[package]]
-name = "dunce"
-version = "1.0.4"
+name = "derive_more"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b"
+checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134"
+dependencies = [
+ "derive_more-impl",
+]
[[package]]
-name = "embed-resource"
-version = "2.4.1"
+name = "derive_more-impl"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3bde55e389bea6a966bd467ad1ad7da0ae14546a5bc794d16d1e55e7fca44881"
+checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb"
dependencies = [
- "cc",
- "memchr",
+ "proc-macro2",
+ "quote",
"rustc_version",
- "toml 0.8.8",
- "vswhom",
- "winreg",
+ "syn 2.0.118",
]
[[package]]
-name = "embed_plist"
-version = "1.2.2"
+name = "digest"
+version = "0.10.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+]
[[package]]
-name = "encoding_rs"
-version = "0.8.33"
+name = "dirs"
+version = "6.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"
+checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e"
dependencies = [
- "cfg-if",
+ "dirs-sys",
]
[[package]]
-name = "equivalent"
-version = "1.0.1"
+name = "dirs-sys"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab"
+dependencies = [
+ "libc",
+ "option-ext",
+ "redox_users",
+ "windows-sys 0.61.2",
+]
[[package]]
-name = "errno"
-version = "0.3.8"
+name = "dispatch2"
+version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
+checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38"
dependencies = [
+ "bitflags 2.13.0",
+ "block2 0.6.2",
"libc",
- "windows-sys 0.52.0",
+ "objc2 0.6.4",
]
[[package]]
-name = "fastrand"
-version = "2.0.1"
+name = "displaydoc"
+version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
+checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.118",
+]
[[package]]
-name = "fdeflate"
-version = "0.3.4"
+name = "dlib"
+version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645"
+checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a"
dependencies = [
- "simd-adler32",
+ "libloading",
]
[[package]]
-name = "field-offset"
-version = "0.3.6"
+name = "dlopen2"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f"
+checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4"
dependencies = [
- "memoffset",
- "rustc_version",
+ "dlopen2_derive",
+ "libc",
+ "once_cell",
+ "winapi",
]
[[package]]
-name = "filetime"
-version = "0.2.23"
+name = "dlopen2_derive"
+version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd"
+checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f"
dependencies = [
- "cfg-if",
- "libc",
- "redox_syscall",
- "windows-sys 0.52.0",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.118",
]
[[package]]
-name = "flate2"
-version = "1.0.28"
+name = "dom_query"
+version = "0.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e"
+checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89"
dependencies = [
- "crc32fast",
- "miniz_oxide",
+ "bit-set",
+ "cssparser",
+ "foldhash 0.2.0",
+ "html5ever",
+ "precomputed-hash",
+ "selectors",
+ "tendril",
]
[[package]]
-name = "fnv"
-version = "1.0.7"
+name = "downcast-rs"
+version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"
[[package]]
-name = "foreign-types"
-version = "0.3.2"
+name = "dpi"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76"
dependencies = [
- "foreign-types-shared",
+ "serde",
]
[[package]]
-name = "foreign-types-shared"
-version = "0.1.1"
+name = "dtoa"
+version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590"
[[package]]
-name = "form_urlencoded"
-version = "1.2.1"
+name = "dtoa-short"
+version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
+checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87"
dependencies = [
- "percent-encoding",
+ "dtoa",
]
[[package]]
-name = "futf"
-version = "0.1.5"
+name = "dtor"
+version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843"
+checksum = "f1057d6c64987086ff8ed0fd3fbf377a6b7d205cc7715868cd401705f715cbe4"
dependencies = [
- "mac",
- "new_debug_unreachable",
+ "dtor-proc-macro",
]
[[package]]
-name = "futures-channel"
-version = "0.3.30"
+name = "dtor-proc-macro"
+version = "0.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
-dependencies = [
- "futures-core",
-]
+checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5"
[[package]]
-name = "futures-core"
-version = "0.3.30"
+name = "dunce"
+version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
+checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
[[package]]
-name = "futures-executor"
-version = "0.3.30"
+name = "dyn-clone"
+version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d"
-dependencies = [
- "futures-core",
- "futures-task",
- "futures-util",
-]
+checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555"
[[package]]
-name = "futures-io"
-version = "0.3.30"
+name = "either"
+version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
+checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e"
[[package]]
-name = "futures-macro"
-version = "0.3.30"
+name = "embed-resource"
+version = "3.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
+checksum = "c31a88c8d26de40ed18fe748c547845aa39de1db3afd958f8cb91579f3644bcb"
dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.48",
+ "cc",
+ "memchr",
+ "rustc_version",
+ "toml 1.1.2+spec-1.1.0",
+ "vswhom",
+ "winreg",
]
[[package]]
-name = "futures-task"
-version = "0.3.30"
+name = "embed_plist"
+version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
+checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7"
[[package]]
-name = "futures-util"
-version = "0.3.30"
+name = "endi"
+version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
-dependencies = [
- "futures-core",
- "futures-macro",
- "futures-task",
- "pin-project-lite",
- "pin-utils",
- "slab",
-]
+checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099"
[[package]]
-name = "fxhash"
-version = "0.2.1"
+name = "enumflags2"
+version = "0.7.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
+checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef"
dependencies = [
- "byteorder",
+ "enumflags2_derive",
+ "serde",
]
[[package]]
-name = "gdk"
-version = "0.15.4"
+name = "enumflags2_derive"
+version = "0.7.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8"
+checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827"
dependencies = [
- "bitflags 1.3.2",
- "cairo-rs",
- "gdk-pixbuf",
- "gdk-sys",
- "gio",
- "glib",
- "libc",
- "pango",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.118",
+]
+
+[[package]]
+name = "env_filter"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef"
+dependencies = [
+ "log",
+ "regex",
+]
+
+[[package]]
+name = "env_logger"
+version = "0.11.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "env_filter",
+ "jiff",
+ "log",
+]
+
+[[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 = "error-code"
+version = "3.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59"
+
+[[package]]
+name = "event-listener"
+version = "5.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab"
+dependencies = [
+ "concurrent-queue",
+ "parking",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "event-listener-strategy"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93"
+dependencies = [
+ "event-listener",
+ "pin-project-lite",
+]
+
+[[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.118",
+]
+
+[[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 = "fpicker"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "27020bcb22e9a54a1228fdf0318c3315972a1245e34f8c32a065b826c9c44e93"
+dependencies = [
+ "copypasta",
+ "crossterm",
+ "derivative",
+ "ratatui",
+]
+
+[[package]]
+name = "futures"
+version = "0.3.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[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-lite"
+version = "2.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad"
+dependencies = [
+ "fastrand",
+ "futures-core",
+ "futures-io",
+ "parking",
+ "pin-project-lite",
+]
+
+[[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.118",
+]
+
+[[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-channel",
+ "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.15.11"
+version = "0.18.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a"
+checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec"
dependencies = [
- "bitflags 1.3.2",
"gdk-pixbuf-sys",
"gio",
"glib",
"libc",
+ "once_cell",
]
[[package]]
name = "gdk-pixbuf-sys"
-version = "0.15.10"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7"
+checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7"
dependencies = [
"gio-sys",
"glib-sys",
"gobject-sys",
"libc",
- "system-deps 6.2.0",
+ "system-deps",
]
[[package]]
name = "gdk-sys"
-version = "0.15.1"
+version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88"
+checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7"
dependencies = [
"cairo-sys-rs",
"gdk-pixbuf-sys",
@@ -995,47 +1548,48 @@ dependencies = [
"libc",
"pango-sys",
"pkg-config",
- "system-deps 6.2.0",
+ "system-deps",
]
[[package]]
name = "gdkwayland-sys"
-version = "0.15.3"
+version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cca49a59ad8cfdf36ef7330fe7bdfbe1d34323220cc16a0de2679ee773aee2c2"
+checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69"
dependencies = [
"gdk-sys",
"glib-sys",
"gobject-sys",
"libc",
"pkg-config",
- "system-deps 6.2.0",
+ "system-deps",
]
[[package]]
-name = "gdkx11-sys"
-version = "0.15.1"
+name = "gdkx11"
+version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178"
+checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe"
dependencies = [
- "gdk-sys",
- "glib-sys",
+ "gdk",
+ "gdkx11-sys",
+ "gio",
+ "glib",
"libc",
- "system-deps 6.2.0",
"x11",
]
[[package]]
-name = "generator"
-version = "0.7.5"
+name = "gdkx11-sys"
+version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e"
+checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d"
dependencies = [
- "cc",
+ "gdk-sys",
+ "glib-sys",
"libc",
- "log",
- "rustversion",
- "windows 0.48.0",
+ "system-deps",
+ "x11",
]
[[package]]
@@ -1048,147 +1602,153 @@ dependencies = [
"version_check",
]
+[[package]]
+name = "gethostname"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8"
+dependencies = [
+ "rustix 1.1.4",
+ "windows-link 0.2.1",
+]
+
[[package]]
name = "getrandom"
-version = "0.1.16"
+version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
+checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
dependencies = [
"cfg-if",
"libc",
- "wasi 0.9.0+wasi-snapshot-preview1",
+ "wasi",
]
[[package]]
name = "getrandom"
-version = "0.2.12"
+version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"
+checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
dependencies = [
"cfg-if",
"libc",
- "wasi 0.11.0+wasi-snapshot-preview1",
+ "r-efi 5.3.0",
+ "wasip2",
]
[[package]]
-name = "gimli"
-version = "0.28.1"
+name = "getrandom"
+version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
+checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "r-efi 6.0.0",
+]
[[package]]
name = "gio"
-version = "0.15.12"
+version = "0.18.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b"
+checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73"
dependencies = [
- "bitflags 1.3.2",
"futures-channel",
"futures-core",
"futures-io",
+ "futures-util",
"gio-sys",
"glib",
"libc",
"once_cell",
- "thiserror",
+ "pin-project-lite",
+ "smallvec",
+ "thiserror 1.0.69",
]
[[package]]
name = "gio-sys"
-version = "0.15.10"
+version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d"
+checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2"
dependencies = [
"glib-sys",
"gobject-sys",
"libc",
- "system-deps 6.2.0",
+ "system-deps",
"winapi",
]
[[package]]
name = "glib"
-version = "0.15.12"
+version = "0.18.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d"
+checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5"
dependencies = [
- "bitflags 1.3.2",
+ "bitflags 2.13.0",
"futures-channel",
"futures-core",
"futures-executor",
"futures-task",
+ "futures-util",
+ "gio-sys",
"glib-macros",
"glib-sys",
"gobject-sys",
"libc",
+ "memchr",
"once_cell",
"smallvec",
- "thiserror",
+ "thiserror 1.0.69",
]
[[package]]
name = "glib-macros"
-version = "0.15.13"
+version = "0.18.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a"
+checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc"
dependencies = [
- "anyhow",
"heck 0.4.1",
- "proc-macro-crate",
+ "proc-macro-crate 2.0.2",
"proc-macro-error",
"proc-macro2",
"quote",
- "syn 1.0.109",
+ "syn 2.0.118",
]
[[package]]
name = "glib-sys"
-version = "0.15.10"
+version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4"
+checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898"
dependencies = [
"libc",
- "system-deps 6.2.0",
+ "system-deps",
]
[[package]]
name = "glob"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
-
-[[package]]
-name = "globset"
-version = "0.4.14"
+version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1"
-dependencies = [
- "aho-corasick",
- "bstr",
- "log",
- "regex-automata 0.4.5",
- "regex-syntax 0.8.2",
-]
+checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
[[package]]
name = "gobject-sys"
-version = "0.15.10"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a"
+checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44"
dependencies = [
"glib-sys",
"libc",
- "system-deps 6.2.0",
+ "system-deps",
]
[[package]]
name = "gtk"
-version = "0.15.5"
+version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0"
+checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a"
dependencies = [
"atk",
- "bitflags 1.3.2",
"cairo-rs",
"field-offset",
"futures-channel",
@@ -1199,16 +1759,15 @@ dependencies = [
"gtk-sys",
"gtk3-macros",
"libc",
- "once_cell",
"pango",
"pkg-config",
]
[[package]]
name = "gtk-sys"
-version = "0.15.3"
+version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84"
+checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414"
dependencies = [
"atk-sys",
"cairo-sys-rs",
@@ -1219,668 +1778,1162 @@ dependencies = [
"gobject-sys",
"libc",
"pango-sys",
- "system-deps 6.2.0",
+ "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.118",
+]
+
+[[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 = [
+ "allocator-api2",
+ "equivalent",
+ "foldhash 0.1.5",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.17.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
+
+[[package]]
+name = "heck"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+
+[[package]]
+name = "heck"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+
+[[package]]
+name = "hermit-abi"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "html5ever"
+version = "0.38.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2"
+dependencies = [
+ "log",
+ "markup5ever",
+]
+
+[[package]]
+name = "http"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425"
+dependencies = [
+ "bytes",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "1.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.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498"
+dependencies = [
+ "atomic-waker",
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "http",
+ "http-body",
+ "httparse",
+ "itoa",
+ "pin-project-lite",
+ "smallvec",
+ "tokio",
+ "want",
+]
+
+[[package]]
+name = "hyper-util"
+version = "0.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0"
+dependencies = [
+ "base64 0.22.1",
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "http",
+ "http-body",
+ "hyper",
+ "ipnet",
+ "libc",
+ "percent-encoding",
+ "pin-project-lite",
+ "socket2",
+ "tokio",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.65"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "log",
+ "wasm-bindgen",
+ "windows-core 0.62.2",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "ico"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371"
+dependencies = [
+ "byteorder",
+ "png 0.17.16",
+]
+
+[[package]]
+name = "icu_collections"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c"
+dependencies = [
+ "displaydoc",
+ "potential_utf",
+ "utf8_iter",
+ "yoke",
+ "zerofrom",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_locale_core"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29"
+dependencies = [
+ "displaydoc",
+ "litemap",
+ "tinystr",
+ "writeable",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_normalizer"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4"
+dependencies = [
+ "icu_collections",
+ "icu_normalizer_data",
+ "icu_properties",
+ "icu_provider",
+ "smallvec",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_normalizer_data"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38"
+
+[[package]]
+name = "icu_properties"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de"
+dependencies = [
+ "icu_collections",
+ "icu_locale_core",
+ "icu_properties_data",
+ "icu_provider",
+ "zerotrie",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_properties_data"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14"
+
+[[package]]
+name = "icu_provider"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421"
+dependencies = [
+ "displaydoc",
+ "icu_locale_core",
+ "writeable",
+ "yoke",
+ "zerofrom",
+ "zerotrie",
+ "zerovec",
+]
+
+[[package]]
+name = "ident_case"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+
+[[package]]
+name = "idna"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
+dependencies = [
+ "idna_adapter",
+ "smallvec",
+ "utf8_iter",
+]
+
+[[package]]
+name = "idna_adapter"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714"
+dependencies = [
+ "icu_normalizer",
+ "icu_properties",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+dependencies = [
+ "autocfg",
+ "hashbrown 0.12.3",
+ "serde",
+]
+
+[[package]]
+name = "indexmap"
+version = "2.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
+dependencies = [
+ "equivalent",
+ "hashbrown 0.17.1",
+ "serde",
+ "serde_core",
+]
+
+[[package]]
+name = "indoc"
+version = "2.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
+dependencies = [
+ "rustversion",
+]
+
+[[package]]
+name = "infer"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7"
+dependencies = [
+ "cfb",
]
[[package]]
-name = "gtk3-macros"
-version = "0.15.6"
+name = "instability"
+version = "0.3.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d"
+checksum = "5eb2d60ef19920a3a9193c3e371f726ec1dafc045dac788d0fb3704272458971"
dependencies = [
- "anyhow",
- "proc-macro-crate",
- "proc-macro-error",
+ "darling",
+ "indoc",
"proc-macro2",
"quote",
- "syn 1.0.109",
+ "syn 2.0.118",
]
[[package]]
-name = "hashbrown"
-version = "0.12.3"
+name = "ipnet"
+version = "2.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2"
[[package]]
-name = "hashbrown"
-version = "0.14.3"
+name = "is-docker"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
+checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3"
+dependencies = [
+ "once_cell",
+]
[[package]]
-name = "heck"
-version = "0.3.3"
+name = "is-wsl"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
+checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5"
dependencies = [
- "unicode-segmentation",
+ "is-docker",
+ "once_cell",
]
[[package]]
-name = "heck"
-version = "0.4.1"
+name = "is_terminal_polyfill"
+version = "1.70.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
[[package]]
-name = "hermit-abi"
-version = "0.1.19"
+name = "itertools"
+version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
dependencies = [
- "libc",
+ "either",
]
[[package]]
-name = "hermit-abi"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f"
-
-[[package]]
-name = "hex"
-version = "0.4.3"
+name = "itoa"
+version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
[[package]]
-name = "html5ever"
-version = "0.26.0"
+name = "javascriptcore-rs"
+version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7"
+checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc"
dependencies = [
- "log",
- "mac",
- "markup5ever",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
+ "bitflags 1.3.2",
+ "glib",
+ "javascriptcore-rs-sys",
]
[[package]]
-name = "http"
-version = "0.2.11"
+name = "javascriptcore-rs-sys"
+version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb"
+checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124"
dependencies = [
- "bytes",
- "fnv",
- "itoa 1.0.10",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps",
]
[[package]]
-name = "http-range"
-version = "0.1.5"
+name = "jiff"
+version = "0.2.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573"
+checksum = "34f877a98676d2fb664698d74cc6a51ce6c484ce8c770f05d0108ec9090aeb46"
+dependencies = [
+ "defmt",
+ "jiff-static",
+ "log",
+ "portable-atomic",
+ "portable-atomic-util",
+ "serde_core",
+]
[[package]]
-name = "iana-time-zone"
-version = "0.1.59"
+name = "jiff-static"
+version = "0.2.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539"
+checksum = "0666b5ab5ecaca213fc2a85b8c0083d9004e84ee2d5f9a7e0017aaf50986f25f"
dependencies = [
- "android_system_properties",
- "core-foundation-sys",
- "iana-time-zone-haiku",
- "js-sys",
- "wasm-bindgen",
- "windows-core",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.118",
]
[[package]]
-name = "iana-time-zone-haiku"
-version = "0.1.2"
+name = "jni"
+version = "0.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97"
dependencies = [
- "cc",
+ "cesu8",
+ "cfg-if",
+ "combine",
+ "jni-sys 0.3.1",
+ "log",
+ "thiserror 1.0.69",
+ "walkdir",
+ "windows-sys 0.45.0",
]
[[package]]
-name = "ico"
-version = "0.3.0"
+name = "jni-sys"
+version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3804960be0bb5e4edb1e1ad67afd321a9ecfd875c3e65c099468fd2717d7cae"
+checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258"
dependencies = [
- "byteorder",
- "png",
+ "jni-sys 0.4.1",
]
[[package]]
-name = "ident_case"
-version = "1.0.1"
+name = "jni-sys"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2"
+dependencies = [
+ "jni-sys-macros",
+]
[[package]]
-name = "idna"
-version = "0.5.0"
+name = "jni-sys-macros"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
+checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264"
dependencies = [
- "unicode-bidi",
- "unicode-normalization",
+ "quote",
+ "syn 2.0.118",
]
[[package]]
-name = "ignore"
-version = "0.4.22"
+name = "js-sys"
+version = "0.3.102"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1"
+checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31"
dependencies = [
- "crossbeam-deque",
- "globset",
- "log",
- "memchr",
- "regex-automata 0.4.5",
- "same-file",
- "walkdir",
- "winapi-util",
+ "cfg-if",
+ "futures-util",
+ "wasm-bindgen",
]
[[package]]
-name = "image"
-version = "0.24.8"
+name = "json-patch"
+version = "3.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "034bbe799d1909622a74d1193aa50147769440040ff36cb2baa947609b0a4e23"
+checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08"
dependencies = [
- "bytemuck",
- "byteorder",
- "color_quant",
- "num-traits",
+ "jsonptr",
+ "serde",
+ "serde_json",
+ "thiserror 1.0.69",
]
[[package]]
-name = "indexmap"
-version = "1.9.3"
+name = "jsonptr"
+version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70"
dependencies = [
- "autocfg",
- "hashbrown 0.12.3",
"serde",
+ "serde_json",
]
[[package]]
-name = "indexmap"
-version = "2.1.0"
+name = "keyboard-types"
+version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f"
+checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a"
dependencies = [
- "equivalent",
- "hashbrown 0.14.3",
+ "bitflags 2.13.0",
"serde",
+ "unicode-segmentation",
]
[[package]]
-name = "infer"
-version = "0.13.0"
+name = "libappindicator"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f551f8c3a39f68f986517db0d1759de85881894fdc7db798bd2a9df9cb04b7fc"
+checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a"
dependencies = [
- "cfb",
+ "glib",
+ "gtk",
+ "gtk-sys",
+ "libappindicator-sys",
+ "log",
]
[[package]]
-name = "instant"
-version = "0.1.12"
+name = "libappindicator-sys"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf"
dependencies = [
- "cfg-if",
+ "gtk-sys",
+ "libloading",
+ "once_cell",
]
[[package]]
-name = "itoa"
-version = "0.4.8"
+name = "libc"
+version = "0.2.186"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
+checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
[[package]]
-name = "itoa"
-version = "1.0.10"
+name = "libdbus-sys"
+version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
+checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043"
+dependencies = [
+ "pkg-config",
+]
[[package]]
-name = "javascriptcore-rs"
-version = "0.16.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c"
+name = "liblitho"
+version = "0.2.0"
dependencies = [
- "bitflags 1.3.2",
- "glib",
- "javascriptcore-rs-sys",
+ "anyhow",
+ "clap",
+ "crossterm",
+ "env_logger",
+ "fpicker",
+ "libc",
+ "log",
+ "ratatui",
+ "rust-lzma",
+ "serde",
+ "serde_json",
+ "sha2",
+ "thiserror 2.0.18",
+ "winapi",
+ "wmi",
]
[[package]]
-name = "javascriptcore-rs-sys"
-version = "0.4.0"
+name = "libloading"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c"
+checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
dependencies = [
- "glib-sys",
- "gobject-sys",
- "libc",
- "system-deps 5.0.0",
+ "cfg-if",
+ "winapi",
]
[[package]]
-name = "jni"
-version = "0.20.0"
+name = "libredox"
+version = "0.1.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c"
+checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3"
dependencies = [
- "cesu8",
- "combine",
- "jni-sys",
- "log",
- "thiserror",
- "walkdir",
+ "libc",
]
[[package]]
-name = "jni-sys"
-version = "0.3.0"
+name = "linux-raw-sys"
+version = "0.4.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
+checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
[[package]]
-name = "js-sys"
-version = "0.3.67"
+name = "linux-raw-sys"
+version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1"
-dependencies = [
- "wasm-bindgen",
-]
+checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
[[package]]
-name = "json-patch"
-version = "1.2.0"
+name = "litemap"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "55ff1e1486799e3f64129f8ccad108b38290df9cd7015cd31bed17239f0789d6"
+checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0"
+
+[[package]]
+name = "lithographer"
+version = "0.2.0"
dependencies = [
+ "liblitho",
+ "rfd",
"serde",
"serde_json",
- "thiserror",
- "treediff",
+ "tauri",
+ "tauri-build",
+ "tauri-plugin-opener",
+ "webkit2gtk",
+ "winapi",
]
[[package]]
-name = "kuchikiki"
-version = "0.8.2"
+name = "lock_api"
+version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8"
+checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
dependencies = [
- "cssparser",
- "html5ever",
- "indexmap 1.9.3",
- "matches",
- "selectors",
+ "scopeguard",
]
[[package]]
-name = "lazy_static"
-version = "1.4.0"
+name = "log"
+version = "0.4.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"
[[package]]
-name = "libc"
-version = "0.2.152"
+name = "lru"
+version = "0.12.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7"
+checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38"
+dependencies = [
+ "hashbrown 0.15.5",
+]
[[package]]
-name = "libredox"
-version = "0.0.1"
+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.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4"
+
+[[package]]
+name = "memmap2"
+version = "0.9.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8"
+checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3"
dependencies = [
- "bitflags 2.4.2",
"libc",
- "redox_syscall",
]
[[package]]
-name = "line-wrap"
-version = "0.1.1"
+name = "memoffset"
+version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9"
+checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
dependencies = [
- "safemem",
+ "autocfg",
]
[[package]]
-name = "linux-raw-sys"
-version = "0.4.13"
+name = "mime"
+version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
[[package]]
-name = "litho"
-version = "0.1.0"
-source = "git+https://github.com/girish946/litho#170bb94bc2f8da41c9070a99cecedb296e85fbd5"
+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.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda"
dependencies = [
- "clap 4.4.18",
"libc",
+ "log",
+ "wasi",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "muda"
+version = "0.19.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1dd04e60bc0b07438a6771710ee1698f98f6ebbc7f89b61264af1563b8aeb878"
+dependencies = [
+ "crossbeam-channel",
+ "dpi",
+ "gtk",
+ "keyboard-types",
+ "objc2 0.6.4",
+ "objc2-app-kit 0.3.2",
+ "objc2-core-foundation",
+ "objc2-foundation 0.3.2",
+ "once_cell",
+ "png 0.18.1",
"serde",
- "serde_json",
- "sha2",
- "tokio",
+ "thiserror 2.0.18",
+ "windows-sys 0.61.2",
]
[[package]]
-name = "lithographer"
-version = "0.0.0"
+name = "ndk"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4"
+dependencies = [
+ "bitflags 2.13.0",
+ "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 = [
- "litho",
- "mio",
- "nix",
- "serde",
- "serde_json",
- "tauri",
- "tauri-build",
+ "jni-sys 0.3.1",
]
[[package]]
-name = "lock_api"
-version = "0.4.11"
+name = "new_debug_unreachable"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
+
+[[package]]
+name = "num-conv"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441"
+
+[[package]]
+name = "num-traits"
+version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
- "scopeguard",
]
[[package]]
-name = "log"
-version = "0.4.20"
+name = "num_enum"
+version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
+checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26"
+dependencies = [
+ "num_enum_derive",
+ "rustversion",
+]
[[package]]
-name = "loom"
-version = "0.5.6"
+name = "num_enum_derive"
+version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5"
+checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8"
dependencies = [
- "cfg-if",
- "generator",
- "scoped-tls",
- "serde",
- "serde_json",
- "tracing",
- "tracing-subscriber",
+ "proc-macro-crate 3.5.0",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.118",
]
[[package]]
-name = "mac"
-version = "0.1.1"
+name = "objc-sys"
+version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
+checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310"
[[package]]
-name = "malloc_buf"
-version = "0.0.6"
+name = "objc2"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
+checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804"
dependencies = [
- "libc",
+ "objc-sys",
+ "objc2-encode",
]
[[package]]
-name = "markup5ever"
-version = "0.11.0"
+name = "objc2"
+version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016"
+checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f"
dependencies = [
- "log",
- "phf 0.10.1",
- "phf_codegen 0.10.0",
- "string_cache",
- "string_cache_codegen",
- "tendril",
+ "objc2-encode",
+ "objc2-exception-helper",
]
[[package]]
-name = "matchers"
-version = "0.1.0"
+name = "objc2-app-kit"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
+checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff"
dependencies = [
- "regex-automata 0.1.10",
+ "bitflags 2.13.0",
+ "block2 0.5.1",
+ "libc",
+ "objc2 0.5.2",
+ "objc2-core-data 0.2.2",
+ "objc2-core-image 0.2.2",
+ "objc2-foundation 0.2.2",
+ "objc2-quartz-core 0.2.2",
]
[[package]]
-name = "matches"
-version = "0.1.10"
+name = "objc2-app-kit"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
+checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c"
+dependencies = [
+ "bitflags 2.13.0",
+ "block2 0.6.2",
+ "objc2 0.6.4",
+ "objc2-core-foundation",
+ "objc2-foundation 0.3.2",
+]
[[package]]
-name = "memchr"
-version = "2.7.1"
+name = "objc2-cloud-kit"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
+checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c"
+dependencies = [
+ "bitflags 2.13.0",
+ "objc2 0.6.4",
+ "objc2-foundation 0.3.2",
+]
[[package]]
-name = "memoffset"
-version = "0.9.0"
+name = "objc2-core-data"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef"
dependencies = [
- "autocfg",
+ "bitflags 2.13.0",
+ "block2 0.5.1",
+ "objc2 0.5.2",
+ "objc2-foundation 0.2.2",
]
[[package]]
-name = "miniz_oxide"
-version = "0.7.1"
+name = "objc2-core-data"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa"
dependencies = [
- "adler",
- "simd-adler32",
+ "objc2 0.6.4",
+ "objc2-foundation 0.3.2",
]
[[package]]
-name = "mio"
-version = "0.8.11"
+name = "objc2-core-foundation"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
+checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
dependencies = [
- "libc",
- "log",
- "wasi 0.11.0+wasi-snapshot-preview1",
- "windows-sys 0.48.0",
+ "bitflags 2.13.0",
+ "dispatch2",
+ "objc2 0.6.4",
]
[[package]]
-name = "ndk"
-version = "0.6.0"
+name = "objc2-core-graphics"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4"
+checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807"
dependencies = [
- "bitflags 1.3.2",
- "jni-sys",
- "ndk-sys",
- "num_enum",
- "thiserror",
+ "bitflags 2.13.0",
+ "dispatch2",
+ "objc2 0.6.4",
+ "objc2-core-foundation",
+ "objc2-io-surface",
]
[[package]]
-name = "ndk-context"
-version = "0.1.1"
+name = "objc2-core-image"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"
+checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80"
+dependencies = [
+ "block2 0.5.1",
+ "objc2 0.5.2",
+ "objc2-foundation 0.2.2",
+ "objc2-metal",
+]
[[package]]
-name = "ndk-sys"
-version = "0.3.0"
+name = "objc2-core-image"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97"
+checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006"
dependencies = [
- "jni-sys",
+ "objc2 0.6.4",
+ "objc2-foundation 0.3.2",
]
[[package]]
-name = "new_debug_unreachable"
-version = "1.0.4"
+name = "objc2-core-location"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
+checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009"
+dependencies = [
+ "objc2 0.6.4",
+ "objc2-foundation 0.3.2",
+]
[[package]]
-name = "nix"
-version = "0.27.1"
+name = "objc2-core-text"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
+checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d"
dependencies = [
- "bitflags 2.4.2",
- "cfg-if",
- "libc",
+ "bitflags 2.13.0",
+ "objc2 0.6.4",
+ "objc2-core-foundation",
+ "objc2-core-graphics",
]
[[package]]
-name = "nodrop"
-version = "0.1.14"
+name = "objc2-encode"
+version = "4.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
+checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"
[[package]]
-name = "nu-ansi-term"
-version = "0.46.0"
+name = "objc2-exception-helper"
+version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
+checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a"
dependencies = [
- "overload",
- "winapi",
+ "cc",
]
[[package]]
-name = "num-traits"
-version = "0.2.17"
+name = "objc2-foundation"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"
+checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8"
dependencies = [
- "autocfg",
+ "bitflags 2.13.0",
+ "block2 0.5.1",
+ "libc",
+ "objc2 0.5.2",
]
[[package]]
-name = "num_cpus"
-version = "1.16.0"
+name = "objc2-foundation"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
+checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272"
dependencies = [
- "hermit-abi 0.3.4",
- "libc",
+ "bitflags 2.13.0",
+ "block2 0.6.2",
+ "objc2 0.6.4",
+ "objc2-core-foundation",
]
[[package]]
-name = "num_enum"
-version = "0.5.11"
+name = "objc2-io-surface"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9"
+checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d"
dependencies = [
- "num_enum_derive",
+ "bitflags 2.13.0",
+ "objc2 0.6.4",
+ "objc2-core-foundation",
]
[[package]]
-name = "num_enum_derive"
-version = "0.5.11"
+name = "objc2-metal"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799"
+checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6"
dependencies = [
- "proc-macro-crate",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
+ "bitflags 2.13.0",
+ "block2 0.5.1",
+ "objc2 0.5.2",
+ "objc2-foundation 0.2.2",
]
[[package]]
-name = "objc"
-version = "0.2.7"
+name = "objc2-quartz-core"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
+checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a"
dependencies = [
- "malloc_buf",
- "objc_exception",
+ "bitflags 2.13.0",
+ "block2 0.5.1",
+ "objc2 0.5.2",
+ "objc2-foundation 0.2.2",
+ "objc2-metal",
]
[[package]]
-name = "objc-foundation"
-version = "0.1.1"
+name = "objc2-quartz-core"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9"
+checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f"
dependencies = [
- "block",
- "objc",
- "objc_id",
+ "bitflags 2.13.0",
+ "objc2 0.6.4",
+ "objc2-core-foundation",
+ "objc2-foundation 0.3.2",
]
[[package]]
-name = "objc_exception"
-version = "0.1.2"
+name = "objc2-ui-kit"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4"
+checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22"
dependencies = [
- "cc",
+ "bitflags 2.13.0",
+ "block2 0.6.2",
+ "objc2 0.6.4",
+ "objc2-cloud-kit",
+ "objc2-core-data 0.3.2",
+ "objc2-core-foundation",
+ "objc2-core-graphics",
+ "objc2-core-image 0.3.2",
+ "objc2-core-location",
+ "objc2-core-text",
+ "objc2-foundation 0.3.2",
+ "objc2-quartz-core 0.3.2",
+ "objc2-user-notifications",
]
[[package]]
-name = "objc_id"
-version = "0.1.1"
+name = "objc2-user-notifications"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b"
+checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e"
dependencies = [
- "objc",
+ "objc2 0.6.4",
+ "objc2-foundation 0.3.2",
]
[[package]]
-name = "object"
-version = "0.32.2"
+name = "objc2-web-kit"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
+checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f"
dependencies = [
- "memchr",
+ "bitflags 2.13.0",
+ "block2 0.6.2",
+ "objc2 0.6.4",
+ "objc2-app-kit 0.3.2",
+ "objc2-core-foundation",
+ "objc2-foundation 0.3.2",
]
[[package]]
name = "once_cell"
-version = "1.19.0"
+version = "1.21.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
+checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
[[package]]
-name = "os_pipe"
-version = "1.1.5"
+name = "once_cell_polyfill"
+version = "1.70.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
+
+[[package]]
+name = "open"
+version = "5.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57119c3b893986491ec9aa85056780d3a0f3cf4da7cc09dd3650dbd6c6738fb9"
+checksum = "2fbaa89d2ddc8473c78a3adf69eea8cffa28c483b8e02a971ef31527cd0fc92c"
dependencies = [
+ "dunce",
+ "is-wsl",
"libc",
- "windows-sys 0.52.0",
+ "pathdiff",
]
[[package]]
-name = "os_str_bytes"
-version = "6.6.1"
+name = "option-ext"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1"
+checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
[[package]]
-name = "overload"
-version = "0.1.1"
+name = "ordered-stream"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
+checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50"
+dependencies = [
+ "futures-core",
+ "pin-project-lite",
+]
[[package]]
name = "pango"
-version = "0.15.10"
+version = "0.18.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f"
+checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4"
dependencies = [
- "bitflags 1.3.2",
+ "gio",
"glib",
"libc",
"once_cell",
@@ -1889,21 +2942,27 @@ dependencies = [
[[package]]
name = "pango-sys"
-version = "0.15.10"
+version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa"
+checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5"
dependencies = [
"glib-sys",
"gobject-sys",
"libc",
- "system-deps 6.2.0",
+ "system-deps",
]
+[[package]]
+name = "parking"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"
+
[[package]]
name = "parking_lot"
-version = "0.12.1"
+version = "0.12.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
dependencies = [
"lock_api",
"parking_lot_core",
@@ -1911,200 +2970,192 @@ dependencies = [
[[package]]
name = "parking_lot_core"
-version = "0.9.9"
+version = "0.9.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
+checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
"smallvec",
- "windows-targets 0.48.5",
+ "windows-link 0.2.1",
]
[[package]]
-name = "percent-encoding"
-version = "2.3.1"
+name = "paste"
+version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
[[package]]
-name = "phf"
-version = "0.8.0"
+name = "pathdiff"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
-dependencies = [
- "phf_macros 0.8.0",
- "phf_shared 0.8.0",
- "proc-macro-hack",
-]
+checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3"
[[package]]
-name = "phf"
-version = "0.10.1"
+name = "percent-encoding"
+version = "2.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259"
-dependencies = [
- "phf_shared 0.10.0",
-]
+checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
[[package]]
name = "phf"
-version = "0.11.2"
+version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc"
+checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf"
dependencies = [
- "phf_macros 0.11.2",
- "phf_shared 0.11.2",
+ "phf_macros",
+ "phf_shared",
+ "serde",
]
[[package]]
name = "phf_codegen"
-version = "0.8.0"
+version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815"
+checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1"
dependencies = [
- "phf_generator 0.8.0",
- "phf_shared 0.8.0",
+ "phf_generator",
+ "phf_shared",
]
[[package]]
-name = "phf_codegen"
-version = "0.10.0"
+name = "phf_generator"
+version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd"
+checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737"
dependencies = [
- "phf_generator 0.10.0",
- "phf_shared 0.10.0",
+ "fastrand",
+ "phf_shared",
]
[[package]]
-name = "phf_generator"
-version = "0.8.0"
+name = "phf_macros"
+version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526"
+checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef"
dependencies = [
- "phf_shared 0.8.0",
- "rand 0.7.3",
+ "phf_generator",
+ "phf_shared",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.118",
]
[[package]]
-name = "phf_generator"
-version = "0.10.0"
+name = "phf_shared"
+version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6"
+checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266"
dependencies = [
- "phf_shared 0.10.0",
- "rand 0.8.5",
+ "siphasher",
]
[[package]]
-name = "phf_generator"
-version = "0.11.2"
+name = "pin-project-lite"
+version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0"
-dependencies = [
- "phf_shared 0.11.2",
- "rand 0.8.5",
-]
+checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
[[package]]
-name = "phf_macros"
-version = "0.8.0"
+name = "piper"
+version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c"
+checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1"
dependencies = [
- "phf_generator 0.8.0",
- "phf_shared 0.8.0",
- "proc-macro-hack",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
+ "atomic-waker",
+ "fastrand",
+ "futures-io",
]
[[package]]
-name = "phf_macros"
-version = "0.11.2"
+name = "pkg-config"
+version = "0.3.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b"
-dependencies = [
- "phf_generator 0.11.2",
- "phf_shared 0.11.2",
- "proc-macro2",
- "quote",
- "syn 2.0.48",
-]
+checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e"
[[package]]
-name = "phf_shared"
-version = "0.8.0"
+name = "plist"
+version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7"
+checksum = "092791278e026273c1b65bbdcfbba3a300f2994c896bd01ab01da613c29c46f1"
dependencies = [
- "siphasher",
+ "base64 0.22.1",
+ "indexmap 2.14.0",
+ "quick-xml",
+ "serde",
+ "time",
]
[[package]]
-name = "phf_shared"
-version = "0.10.0"
+name = "png"
+version = "0.17.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096"
+checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526"
dependencies = [
- "siphasher",
+ "bitflags 1.3.2",
+ "crc32fast",
+ "fdeflate",
+ "flate2",
+ "miniz_oxide",
]
[[package]]
-name = "phf_shared"
-version = "0.11.2"
+name = "png"
+version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b"
+checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61"
dependencies = [
- "siphasher",
+ "bitflags 2.13.0",
+ "crc32fast",
+ "fdeflate",
+ "flate2",
+ "miniz_oxide",
]
[[package]]
-name = "pin-project-lite"
-version = "0.2.13"
+name = "polling"
+version = "3.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
+checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218"
+dependencies = [
+ "cfg-if",
+ "concurrent-queue",
+ "hermit-abi",
+ "pin-project-lite",
+ "rustix 1.1.4",
+ "windows-sys 0.61.2",
+]
[[package]]
-name = "pin-utils"
-version = "0.1.0"
+name = "pollster"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3"
[[package]]
-name = "pkg-config"
-version = "0.3.29"
+name = "portable-atomic"
+version = "1.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb"
+checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
[[package]]
-name = "plist"
-version = "1.6.0"
+name = "portable-atomic-util"
+version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5699cc8a63d1aa2b1ee8e12b9ad70ac790d65788cd36101fa37f87ea46c4cef"
+checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618"
dependencies = [
- "base64 0.21.7",
- "indexmap 2.1.0",
- "line-wrap",
- "quick-xml",
- "serde",
- "time",
+ "portable-atomic",
]
[[package]]
-name = "png"
-version = "0.17.11"
+name = "potential_utf"
+version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f6c3c3e617595665b8ea2ff95a86066be38fb121ff920a9c0eb282abcd1da5a"
+checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564"
dependencies = [
- "bitflags 1.3.2",
- "crc32fast",
- "fdeflate",
- "flate2",
- "miniz_oxide",
+ "zerovec",
]
[[package]]
@@ -2115,9 +3166,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]]
name = "ppv-lite86"
-version = "0.2.17"
+version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
+dependencies = [
+ "zerocopy",
+]
[[package]]
name = "precomputed-hash"
@@ -2135,283 +3189,355 @@ dependencies = [
"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.12+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-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",
- "syn 1.0.109",
"version_check",
]
[[package]]
-name = "proc-macro-error-attr"
-version = "1.0.4"
+name = "proc-macro-error-attr2"
+version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
+checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5"
dependencies = [
"proc-macro2",
"quote",
- "version_check",
]
[[package]]
-name = "proc-macro-hack"
-version = "0.5.20+deprecated"
+name = "proc-macro-error2"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
+checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802"
+dependencies = [
+ "proc-macro-error-attr2",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.118",
+]
[[package]]
name = "proc-macro2"
-version = "1.0.78"
+version = "1.0.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
+checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quick-xml"
-version = "0.31.0"
+version = "0.39.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33"
+checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e"
dependencies = [
"memchr",
]
[[package]]
name = "quote"
-version = "1.0.35"
+version = "1.0.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
+checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
dependencies = [
"proc-macro2",
]
[[package]]
-name = "rand"
-version = "0.7.3"
+name = "r-efi"
+version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
-dependencies = [
- "getrandom 0.1.16",
- "libc",
- "rand_chacha 0.2.2",
- "rand_core 0.5.1",
- "rand_hc",
- "rand_pcg",
-]
+checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
-name = "rand"
-version = "0.8.5"
+name = "r-efi"
+version = "6.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
-dependencies = [
- "libc",
- "rand_chacha 0.3.1",
- "rand_core 0.6.4",
-]
+checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
[[package]]
-name = "rand_chacha"
-version = "0.2.2"
+name = "rand"
+version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea"
dependencies = [
- "ppv-lite86",
- "rand_core 0.5.1",
+ "rand_chacha",
+ "rand_core",
]
[[package]]
name = "rand_chacha"
-version = "0.3.1"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
dependencies = [
"ppv-lite86",
- "rand_core 0.6.4",
+ "rand_core",
]
[[package]]
name = "rand_core"
-version = "0.5.1"
+version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
dependencies = [
- "getrandom 0.1.16",
+ "getrandom 0.3.4",
]
[[package]]
-name = "rand_core"
-version = "0.6.4"
+name = "ratatui"
+version = "0.28.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
-dependencies = [
- "getrandom 0.2.12",
+checksum = "fdef7f9be5c0122f890d58bdf4d964349ba6a6161f705907526d891efabba57d"
+dependencies = [
+ "bitflags 2.13.0",
+ "cassowary",
+ "compact_str",
+ "crossterm",
+ "instability",
+ "itertools",
+ "lru",
+ "paste",
+ "strum",
+ "strum_macros",
+ "unicode-segmentation",
+ "unicode-truncate",
+ "unicode-width",
]
[[package]]
-name = "rand_hc"
-version = "0.2.0"
+name = "raw-window-handle"
+version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
-dependencies = [
- "rand_core 0.5.1",
-]
+checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539"
[[package]]
-name = "rand_pcg"
-version = "0.2.1"
+name = "redox_syscall"
+version = "0.5.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429"
+checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
dependencies = [
- "rand_core 0.5.1",
+ "bitflags 2.13.0",
]
[[package]]
-name = "raw-window-handle"
+name = "redox_users"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9"
+checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac"
+dependencies = [
+ "getrandom 0.2.17",
+ "libredox",
+ "thiserror 2.0.18",
+]
[[package]]
-name = "redox_syscall"
-version = "0.4.1"
+name = "ref-cast"
+version = "1.0.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
+checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d"
dependencies = [
- "bitflags 1.3.2",
+ "ref-cast-impl",
]
[[package]]
-name = "redox_users"
-version = "0.4.4"
+name = "ref-cast-impl"
+version = "1.0.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4"
+checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
dependencies = [
- "getrandom 0.2.12",
- "libredox",
- "thiserror",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.118",
]
[[package]]
name = "regex"
-version = "1.10.3"
+version = "1.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15"
+checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba"
dependencies = [
"aho-corasick",
"memchr",
- "regex-automata 0.4.5",
- "regex-syntax 0.8.2",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
-dependencies = [
- "regex-syntax 0.6.29",
+ "regex-automata",
+ "regex-syntax",
]
[[package]]
name = "regex-automata"
-version = "0.4.5"
+version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd"
+checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
dependencies = [
"aho-corasick",
"memchr",
- "regex-syntax 0.8.2",
+ "regex-syntax",
]
[[package]]
name = "regex-syntax"
-version = "0.6.29"
+version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
+checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
[[package]]
-name = "regex-syntax"
-version = "0.8.2"
+name = "reqwest"
+version = "0.13.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
+checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3"
+dependencies = [
+ "base64 0.22.1",
+ "bytes",
+ "futures-core",
+ "futures-util",
+ "http",
+ "http-body",
+ "http-body-util",
+ "hyper",
+ "hyper-util",
+ "js-sys",
+ "log",
+ "percent-encoding",
+ "pin-project-lite",
+ "serde",
+ "serde_json",
+ "sync_wrapper",
+ "tokio",
+ "tokio-util",
+ "tower",
+ "tower-http",
+ "tower-service",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "wasm-streams",
+ "web-sys",
+]
[[package]]
name = "rfd"
-version = "0.10.0"
+version = "0.15.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea"
+checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed"
dependencies = [
- "block",
- "dispatch",
- "glib-sys",
- "gobject-sys",
- "gtk-sys",
+ "ashpd",
+ "block2 0.6.2",
+ "dispatch2",
"js-sys",
- "lazy_static",
"log",
- "objc",
- "objc-foundation",
- "objc_id",
+ "objc2 0.6.4",
+ "objc2-app-kit 0.3.2",
+ "objc2-core-foundation",
+ "objc2-foundation 0.3.2",
+ "pollster",
"raw-window-handle",
+ "urlencoding",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
- "windows 0.37.0",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "rust-lzma"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d62915608f6cee1d7f2fc00f28b4f058ff79d6e4ec3c2fe0006b09b52437c84"
+dependencies = [
+ "pkg-config",
+ "vcpkg",
]
[[package]]
-name = "rustc-demangle"
-version = "0.1.23"
+name = "rustc-hash"
+version = "2.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe"
[[package]]
name = "rustc_version"
-version = "0.4.0"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
+checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
dependencies = [
"semver",
]
[[package]]
name = "rustix"
-version = "0.38.30"
+version = "0.38.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca"
+checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.13.0",
"errno",
"libc",
- "linux-raw-sys",
- "windows-sys 0.52.0",
+ "linux-raw-sys 0.4.15",
+ "windows-sys 0.59.0",
]
[[package]]
-name = "rustversion"
-version = "1.0.14"
+name = "rustix"
+version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
+checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190"
+dependencies = [
+ "bitflags 2.13.0",
+ "errno",
+ "libc",
+ "linux-raw-sys 0.12.1",
+ "windows-sys 0.61.2",
+]
[[package]]
-name = "ryu"
-version = "1.0.16"
+name = "rustversion"
+version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c"
+checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
[[package]]
-name = "safemem"
-version = "0.3.3"
+name = "ryu"
+version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072"
+checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
[[package]]
name = "same-file"
@@ -2422,6 +3548,57 @@ 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.118",
+]
+
[[package]]
name = "scoped-tls"
version = "1.0.1"
@@ -2436,96 +3613,143 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "selectors"
-version = "0.22.0"
+version = "0.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe"
+checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c"
dependencies = [
- "bitflags 1.3.2",
+ "bitflags 2.13.0",
"cssparser",
"derive_more",
- "fxhash",
"log",
- "matches",
- "phf 0.8.0",
- "phf_codegen 0.8.0",
+ "new_debug_unreachable",
+ "phf",
+ "phf_codegen",
"precomputed-hash",
+ "rustc-hash",
"servo_arc",
"smallvec",
- "thin-slice",
]
[[package]]
name = "semver"
-version = "1.0.21"
+version = "1.0.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0"
+checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
dependencies = [
"serde",
+ "serde_core",
]
[[package]]
name = "serde"
-version = "1.0.196"
+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 = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32"
+checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.196"
+version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67"
+checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.118",
+]
+
+[[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.118",
]
[[package]]
name = "serde_json"
-version = "1.0.112"
+version = "1.0.150"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d1bd37ce2324cf3bf85e5a25f96eb4baf0d5aa6eba43e7ae8958870c4ec48ed"
+checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9"
dependencies = [
- "itoa 1.0.10",
- "ryu",
+ "itoa",
+ "memchr",
"serde",
+ "serde_core",
+ "zmij",
]
[[package]]
name = "serde_repr"
-version = "0.1.18"
+version = "0.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb"
+checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.118",
]
[[package]]
name = "serde_spanned"
-version = "0.6.5"
+version = "0.6.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1"
+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.5.1"
+version = "3.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f5c9fdb6b00a489875b22efd4b78fe2b363b72265cc5f6eb2e2b9ee270e6140c"
+checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c"
dependencies = [
- "base64 0.21.7",
+ "base64 0.22.1",
+ "bs58",
"chrono",
"hex",
"indexmap 1.9.3",
- "indexmap 2.1.0",
- "serde",
+ "indexmap 2.14.0",
+ "schemars 0.9.0",
+ "schemars 1.2.1",
+ "serde_core",
"serde_json",
"serde_with_macros",
"time",
@@ -2533,21 +3757,21 @@ dependencies = [
[[package]]
name = "serde_with_macros"
-version = "3.5.1"
+version = "3.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbff351eb4b33600a2e138dfa0b10b65a238ea8ff8fb2387c422c5022a3e8298"
+checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660"
dependencies = [
"darling",
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.118",
]
[[package]]
name = "serialize-to-javascript"
-version = "0.1.1"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb"
+checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5"
dependencies = [
"serde",
"serde_json",
@@ -2556,30 +3780,29 @@ dependencies = [
[[package]]
name = "serialize-to-javascript-impl"
-version = "0.1.1"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763"
+checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d"
dependencies = [
"proc-macro2",
"quote",
- "syn 1.0.109",
+ "syn 2.0.118",
]
[[package]]
name = "servo_arc"
-version = "0.1.1"
+version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432"
+checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930"
dependencies = [
- "nodrop",
"stable_deref_trait",
]
[[package]]
name = "sha2"
-version = "0.10.8"
+version = "0.10.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
+checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
dependencies = [
"cfg-if",
"cpufeatures",
@@ -2587,144 +3810,236 @@ dependencies = [
]
[[package]]
-name = "sharded-slab"
-version = "0.1.7"
+name = "shlex"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
+
+[[package]]
+name = "signal-hook"
+version = "0.3.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
+checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2"
dependencies = [
- "lazy_static",
+ "libc",
+ "signal-hook-registry",
]
[[package]]
-name = "shared_child"
-version = "1.0.0"
+name = "signal-hook-mio"
+version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0d94659ad3c2137fef23ae75b03d5241d633f8acded53d672decfa0e6e0caef"
+checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc"
dependencies = [
"libc",
- "winapi",
+ "mio",
+ "signal-hook",
]
[[package]]
name = "signal-hook-registry"
-version = "1.4.1"
+version = "1.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
+checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
dependencies = [
+ "errno",
"libc",
]
[[package]]
name = "simd-adler32"
-version = "0.3.7"
+version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
+checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214"
[[package]]
name = "siphasher"
-version = "0.3.11"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
+checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649"
[[package]]
name = "slab"
-version = "0.4.9"
+version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
-dependencies = [
- "autocfg",
-]
+checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
[[package]]
name = "smallvec"
-version = "1.13.1"
+version = "1.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
+
+[[package]]
+name = "smithay-client-toolkit"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0"
+dependencies = [
+ "bitflags 2.13.0",
+ "calloop",
+ "calloop-wayland-source",
+ "cursor-icon",
+ "libc",
+ "log",
+ "memmap2",
+ "rustix 1.1.4",
+ "thiserror 2.0.18",
+ "wayland-backend",
+ "wayland-client",
+ "wayland-csd-frame",
+ "wayland-cursor",
+ "wayland-protocols",
+ "wayland-protocols-experimental",
+ "wayland-protocols-misc",
+ "wayland-protocols-wlr",
+ "wayland-scanner",
+ "xkeysym",
+]
+
+[[package]]
+name = "smithay-clipboard"
+version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"
+checksum = "71704c03f739f7745053bde45fa203a46c58d25bc5c4efba1d9a60e9dba81226"
+dependencies = [
+ "libc",
+ "smithay-client-toolkit",
+ "wayland-backend",
+]
[[package]]
name = "socket2"
-version = "0.5.5"
+version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9"
+checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51"
dependencies = [
"libc",
- "windows-sys 0.48.0",
+ "windows-sys 0.61.2",
]
[[package]]
-name = "soup2"
-version = "0.2.1"
+name = "softbuffer"
+version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0"
+checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3"
dependencies = [
- "bitflags 1.3.2",
+ "bytemuck",
+ "js-sys",
+ "ndk",
+ "objc2 0.6.4",
+ "objc2-core-foundation",
+ "objc2-core-graphics",
+ "objc2-foundation 0.3.2",
+ "objc2-quartz-core 0.3.2",
+ "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",
- "once_cell",
- "soup2-sys",
+ "soup3-sys",
]
[[package]]
-name = "soup2-sys"
-version = "0.2.0"
+name = "soup3-sys"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf"
+checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27"
dependencies = [
- "bitflags 1.3.2",
"gio-sys",
"glib-sys",
"gobject-sys",
"libc",
- "system-deps 5.0.0",
+ "system-deps",
]
[[package]]
name = "stable_deref_trait"
-version = "1.2.0"
+version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
+checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
[[package]]
-name = "state"
-version = "0.5.3"
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
+[[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 = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b"
-dependencies = [
- "loom",
-]
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
-name = "string_cache"
-version = "0.8.7"
+name = "strum"
+version = "0.26.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b"
+checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06"
dependencies = [
- "new_debug_unreachable",
- "once_cell",
- "parking_lot",
- "phf_shared 0.10.0",
- "precomputed-hash",
- "serde",
+ "strum_macros",
]
[[package]]
-name = "string_cache_codegen"
-version = "0.5.2"
+name = "strum_macros"
+version = "0.26.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988"
+checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be"
dependencies = [
- "phf_generator 0.10.0",
- "phf_shared 0.10.0",
+ "heck 0.5.0",
"proc-macro2",
"quote",
+ "rustversion",
+ "syn 2.0.118",
]
[[package]]
-name = "strsim"
-version = "0.10.0"
+name = "swift-rs"
+version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7"
+dependencies = [
+ "base64 0.21.7",
+ "serde",
+ "serde_json",
+]
[[package]]
name = "syn"
@@ -2739,9 +4054,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.48"
+version = "2.0.118"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
+checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422"
dependencies = [
"proc-macro2",
"quote",
@@ -2749,167 +4064,159 @@ dependencies = [
]
[[package]]
-name = "system-deps"
-version = "5.0.0"
+name = "sync_wrapper"
+version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e"
+checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
dependencies = [
- "cfg-expr 0.9.1",
- "heck 0.3.3",
- "pkg-config",
- "toml 0.5.11",
- "version-compare 0.0.11",
+ "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.118",
]
[[package]]
name = "system-deps"
-version = "6.2.0"
+version = "6.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a2d580ff6a20c55dfb86be5f9c238f67835d0e81cbdea8bf5680e0897320331"
+checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349"
dependencies = [
- "cfg-expr 0.15.6",
- "heck 0.4.1",
+ "cfg-expr",
+ "heck 0.5.0",
"pkg-config",
- "toml 0.8.8",
- "version-compare 0.1.1",
+ "toml 0.8.2",
+ "version-compare",
]
[[package]]
name = "tao"
-version = "0.16.7"
+version = "0.35.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d22205b267a679ca1c590b9f178488d50981fc3e48a1b91641ae31593db875ce"
+checksum = "d1c93047acf68669466a34690ac58cca7010bd1b201e1ec86f1fd0a75d3dd4a9"
dependencies = [
- "bitflags 1.3.2",
- "cairo-rs",
- "cc",
- "cocoa",
+ "bitflags 2.13.0",
+ "block2 0.6.2",
"core-foundation",
"core-graphics",
"crossbeam-channel",
- "dispatch",
- "gdk",
- "gdk-pixbuf",
- "gdk-sys",
+ "dbus",
+ "dispatch2",
+ "dlopen2",
+ "dpi",
"gdkwayland-sys",
"gdkx11-sys",
- "gio",
- "glib",
- "glib-sys",
"gtk",
- "image",
- "instant",
"jni",
- "lazy_static",
"libc",
"log",
"ndk",
- "ndk-context",
"ndk-sys",
- "objc",
+ "objc2 0.6.4",
+ "objc2-app-kit 0.3.2",
+ "objc2-foundation 0.3.2",
+ "objc2-ui-kit",
"once_cell",
"parking_lot",
- "png",
+ "percent-encoding",
"raw-window-handle",
- "scopeguard",
- "serde",
"tao-macros",
"unicode-segmentation",
- "uuid",
- "windows 0.39.0",
- "windows-implement",
+ "url",
+ "windows 0.61.3",
+ "windows-core 0.61.2",
+ "windows-version",
"x11-dl",
]
[[package]]
name = "tao-macros"
-version = "0.1.2"
+version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec114582505d158b669b136e6851f85840c109819d77c42bb7c0709f727d18c2"
+checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd"
dependencies = [
"proc-macro2",
"quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "tar"
-version = "0.4.40"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb"
-dependencies = [
- "filetime",
- "libc",
- "xattr",
+ "syn 2.0.118",
]
[[package]]
name = "target-lexicon"
-version = "0.12.13"
+version = "0.12.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69758bda2e78f098e4ccb393021a0963bb3442eac05f135c30f61b7370bbafae"
+checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
[[package]]
name = "tauri"
-version = "1.5.4"
+version = "2.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd27c04b9543776a972c86ccf70660b517ecabbeced9fb58d8b961a13ad129af"
+checksum = "c2616f96cb644bf2c5c456d9de4d5d5100e592d7424c74d8b55c5cb96e359e93"
dependencies = [
"anyhow",
- "clap 3.2.25",
- "cocoa",
- "dirs-next",
+ "bytes",
+ "cookie",
+ "dirs",
+ "dunce",
"embed_plist",
- "encoding_rs",
- "flate2",
- "futures-util",
- "glib",
+ "getrandom 0.3.4",
"glob",
"gtk",
- "heck 0.4.1",
+ "heck 0.5.0",
"http",
- "ignore",
- "objc",
- "once_cell",
- "os_pipe",
+ "jni",
+ "libc",
+ "log",
+ "mime",
+ "muda",
+ "objc2 0.6.4",
+ "objc2-app-kit 0.3.2",
+ "objc2-foundation 0.3.2",
+ "objc2-ui-kit",
+ "objc2-web-kit",
"percent-encoding",
- "rand 0.8.5",
+ "plist",
"raw-window-handle",
- "regex",
- "rfd",
- "semver",
+ "reqwest",
"serde",
"serde_json",
"serde_repr",
"serialize-to-javascript",
- "shared_child",
- "state",
- "tar",
+ "swift-rs",
+ "tauri-build",
"tauri-macros",
"tauri-runtime",
"tauri-runtime-wry",
"tauri-utils",
- "tempfile",
- "thiserror",
+ "thiserror 2.0.18",
"tokio",
+ "tray-icon",
"url",
- "uuid",
"webkit2gtk",
"webview2-com",
- "windows 0.39.0",
+ "window-vibrancy",
+ "windows 0.61.3",
]
[[package]]
name = "tauri-build"
-version = "1.5.1"
+version = "2.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e9914a4715e0b75d9f387a285c7e26b5bbfeb1249ad9f842675a82481565c532"
+checksum = "bc9ce40b16101cb6ea63d3e221567affd1c3a9205f95d7bc574941a10636b632"
dependencies = [
"anyhow",
"cargo_toml",
- "dirs-next",
- "heck 0.4.1",
+ "dirs",
+ "glob",
+ "heck 0.5.0",
"json-patch",
+ "schemars 0.8.22",
"semver",
"serde",
"serde_json",
@@ -2920,234 +4227,291 @@ dependencies = [
[[package]]
name = "tauri-codegen"
-version = "1.4.2"
+version = "2.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1554c5857f65dbc377cefb6b97c8ac77b1cb2a90d30d3448114d5d6b48a77fc"
+checksum = "08279169ff42f8fc45a1dbc9dcae888893ba95288142e5880c59b93a26d2cfc5"
dependencies = [
- "base64 0.21.7",
+ "base64 0.22.1",
"brotli",
"ico",
"json-patch",
"plist",
- "png",
+ "png 0.17.16",
"proc-macro2",
"quote",
- "regex",
"semver",
"serde",
"serde_json",
"sha2",
+ "syn 2.0.118",
"tauri-utils",
- "thiserror",
+ "thiserror 2.0.18",
"time",
+ "url",
"uuid",
"walkdir",
]
[[package]]
name = "tauri-macros"
-version = "1.4.3"
+version = "2.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "277abf361a3a6993ec16bcbb179de0d6518009b851090a01adfea12ac89fa875"
+checksum = "e8b394794f399a421811d06966343e7933fcae92d59f5180b9388d1174497a45"
dependencies = [
- "heck 0.4.1",
+ "heck 0.5.0",
"proc-macro2",
"quote",
- "syn 1.0.109",
+ "syn 2.0.118",
"tauri-codegen",
"tauri-utils",
]
+[[package]]
+name = "tauri-plugin"
+version = "2.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "74be5dd4bed9afbd145e5716b5fa2ec28cbc29c34ffa61c258c9273d896c8020"
+dependencies = [
+ "anyhow",
+ "glob",
+ "plist",
+ "schemars 0.8.22",
+ "serde",
+ "serde_json",
+ "tauri-utils",
+ "walkdir",
+]
+
+[[package]]
+name = "tauri-plugin-opener"
+version = "2.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17e1bea14edce6b793a04e2417e3fd924b9bc4faae83cdee7d714156cceeed29"
+dependencies = [
+ "dunce",
+ "glob",
+ "objc2-app-kit 0.3.2",
+ "objc2-foundation 0.3.2",
+ "open",
+ "schemars 0.8.22",
+ "serde",
+ "serde_json",
+ "tauri",
+ "tauri-plugin",
+ "thiserror 2.0.18",
+ "url",
+ "windows 0.61.3",
+ "zbus",
+]
+
[[package]]
name = "tauri-runtime"
-version = "0.14.2"
+version = "2.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf2d0652aa2891ff3e9caa2401405257ea29ab8372cce01f186a5825f1bd0e76"
+checksum = "b0b4bc95aed361b0019067d189a1174a603d460d0f6c72606512d59fc9c12ec8"
dependencies = [
+ "cookie",
+ "dpi",
"gtk",
"http",
- "http-range",
- "rand 0.8.5",
+ "jni",
+ "objc2 0.6.4",
+ "objc2-ui-kit",
+ "objc2-web-kit",
"raw-window-handle",
"serde",
"serde_json",
"tauri-utils",
- "thiserror",
+ "thiserror 2.0.18",
"url",
- "uuid",
+ "webkit2gtk",
"webview2-com",
- "windows 0.39.0",
+ "windows 0.61.3",
]
[[package]]
name = "tauri-runtime-wry"
-version = "0.14.3"
+version = "2.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6cae61fbc731f690a4899681c9052dde6d05b159b44563ace8186fc1bfb7d158"
+checksum = "fe41e015bf8fc4d6477ff4926a0ef769dc64ff34c7b0038b6f7cacae892acb5c"
dependencies = [
- "cocoa",
"gtk",
+ "http",
+ "jni",
+ "log",
+ "objc2 0.6.4",
+ "objc2-app-kit 0.3.2",
+ "once_cell",
"percent-encoding",
- "rand 0.8.5",
"raw-window-handle",
+ "softbuffer",
+ "tao",
"tauri-runtime",
"tauri-utils",
- "uuid",
+ "url",
"webkit2gtk",
"webview2-com",
- "windows 0.39.0",
+ "windows 0.61.3",
"wry",
]
[[package]]
name = "tauri-utils"
-version = "1.5.2"
+version = "2.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ece74810b1d3d44f29f732a7ae09a63183d63949bbdd59c61f8ed2a1b70150db"
+checksum = "3e176a18e67764923c4f1ce66f25ae4abe5f688384d5eb1a0fa6c77f3d90f887"
dependencies = [
+ "anyhow",
"brotli",
+ "cargo_metadata",
"ctor",
+ "dom_query",
"dunce",
"glob",
- "heck 0.4.1",
- "html5ever",
+ "http",
"infer",
"json-patch",
- "kuchikiki",
"log",
"memchr",
- "phf 0.11.2",
+ "phf",
+ "plist",
"proc-macro2",
"quote",
+ "regex",
+ "schemars 0.8.22",
"semver",
"serde",
+ "serde-untagged",
"serde_json",
"serde_with",
- "thiserror",
+ "swift-rs",
+ "thiserror 2.0.18",
+ "toml 1.1.2+spec-1.1.0",
"url",
+ "urlpattern",
+ "uuid",
"walkdir",
- "windows-version",
]
[[package]]
name = "tauri-winres"
-version = "0.1.1"
+version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb"
+checksum = "cc65d45c68858bfe420dd29e834b5d15dbecf8a07a8a16cf4d532c7b1f69d4b6"
dependencies = [
+ "dunce",
"embed-resource",
- "toml 0.7.8",
+ "toml 1.1.2+spec-1.1.0",
]
[[package]]
name = "tempfile"
-version = "3.9.0"
+version = "3.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa"
+checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
dependencies = [
- "cfg-if",
"fastrand",
- "redox_syscall",
- "rustix",
- "windows-sys 0.52.0",
+ "getrandom 0.4.3",
+ "once_cell",
+ "rustix 1.1.4",
+ "windows-sys 0.61.2",
]
[[package]]
name = "tendril"
-version = "0.4.3"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0"
+checksum = "c4790fc369d5a530f4b544b094e31388b9b3a37c0f4652ade4505945f5660d24"
dependencies = [
- "futf",
- "mac",
+ "new_debug_unreachable",
"utf-8",
]
[[package]]
-name = "termcolor"
-version = "1.4.1"
+name = "thiserror"
+version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755"
+checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
dependencies = [
- "winapi-util",
+ "thiserror-impl 1.0.69",
]
-[[package]]
-name = "textwrap"
-version = "0.16.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d"
-
-[[package]]
-name = "thin-slice"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c"
-
[[package]]
name = "thiserror"
-version = "1.0.56"
+version = "2.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad"
+checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
dependencies = [
- "thiserror-impl",
+ "thiserror-impl 2.0.18",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.56"
+version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471"
+checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.118",
]
[[package]]
-name = "thread_local"
-version = "1.1.7"
+name = "thiserror-impl"
+version = "2.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
+checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
dependencies = [
- "cfg-if",
- "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.118",
]
[[package]]
name = "time"
-version = "0.3.31"
+version = "0.3.49"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e"
+checksum = "711a53c2d47bbd818258c498c8dbfe186a2526c631495cfe7e078567f86b8469"
dependencies = [
"deranged",
- "itoa 1.0.10",
+ "num-conv",
"powerfmt",
- "serde",
+ "serde_core",
"time-core",
"time-macros",
]
[[package]]
name = "time-core"
-version = "0.1.2"
+version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
+checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109"
[[package]]
name = "time-macros"
-version = "0.2.16"
+version = "0.2.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f"
+checksum = "71c652a3727a9cbb9a02f707f530b618ce00d0ccd762009c8c23bd191df3c17d"
dependencies = [
+ "num-conv",
"time-core",
]
+[[package]]
+name = "tinystr"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d"
+dependencies = [
+ "displaydoc",
+ "zerovec",
+]
+
[[package]]
name = "tinyvec"
-version = "1.6.0"
+version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3"
dependencies = [
"tinyvec_macros",
]
@@ -3160,109 +4524,203 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.35.1"
+version = "1.52.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104"
+checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe"
dependencies = [
- "backtrace",
"bytes",
"libc",
"mio",
- "num_cpus",
- "parking_lot",
"pin-project-lite",
- "signal-hook-registry",
"socket2",
- "tokio-macros",
- "tracing",
- "windows-sys 0.48.0",
+ "windows-sys 0.61.2",
]
[[package]]
-name = "tokio-macros"
-version = "2.2.0"
+name = "tokio-util"
+version = "0.7.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
+checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098"
dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.48",
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
]
[[package]]
name = "toml"
-version = "0.5.11"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
+checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d"
dependencies = [
"serde",
+ "serde_spanned 0.6.9",
+ "toml_datetime 0.6.3",
+ "toml_edit 0.20.2",
]
[[package]]
name = "toml"
-version = "0.7.8"
+version = "0.9.12+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257"
+checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863"
dependencies = [
- "serde",
- "serde_spanned",
- "toml_datetime",
- "toml_edit 0.19.15",
+ "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 = "0.8.8"
+version = "1.1.2+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35"
+checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee"
dependencies = [
- "serde",
- "serde_spanned",
- "toml_datetime",
- "toml_edit 0.21.0",
+ "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.3",
]
[[package]]
name = "toml_datetime"
-version = "0.6.5"
+version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
+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.1.0",
- "serde",
- "serde_spanned",
- "toml_datetime",
- "winnow",
+ "indexmap 2.14.0",
+ "toml_datetime 0.6.3",
+ "winnow 0.5.40",
]
[[package]]
name = "toml_edit"
-version = "0.21.0"
+version = "0.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03"
+checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338"
dependencies = [
- "indexmap 2.1.0",
+ "indexmap 2.14.0",
"serde",
- "serde_spanned",
- "toml_datetime",
- "winnow",
+ "serde_spanned 0.6.9",
+ "toml_datetime 0.6.3",
+ "winnow 0.5.40",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.25.12+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7"
+dependencies = [
+ "indexmap 2.14.0",
+ "toml_datetime 1.1.1+spec-1.1.0",
+ "toml_parser",
+ "winnow 1.0.3",
+]
+
+[[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.3",
+]
+
+[[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.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840"
+dependencies = [
+ "bitflags 2.13.0",
+ "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.40"
+version = "0.1.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
+checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
dependencies = [
+ "log",
"pin-project-lite",
"tracing-attributes",
"tracing-core",
@@ -3270,106 +4728,174 @@ dependencies = [
[[package]]
name = "tracing-attributes"
-version = "0.1.27"
+version = "0.1.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
+checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.118",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "tray-icon"
+version = "0.24.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "65ba1e5f6b9ef9fd87e21b9c6f351554dbd717960089168fcfdef854686961dc"
+dependencies = [
+ "crossbeam-channel",
+ "dirs",
+ "libappindicator",
+ "muda",
+ "objc2 0.6.4",
+ "objc2-app-kit 0.3.2",
+ "objc2-core-foundation",
+ "objc2-core-graphics",
+ "objc2-foundation 0.3.2",
+ "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.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"
+
+[[package]]
+name = "uds_windows"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e"
+dependencies = [
+ "memoffset",
+ "tempfile",
+ "windows-sys 0.61.2",
]
[[package]]
-name = "tracing-core"
-version = "0.1.32"
+name = "unic-char-property"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
+checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221"
dependencies = [
- "once_cell",
- "valuable",
+ "unic-char-range",
]
[[package]]
-name = "tracing-log"
-version = "0.2.0"
+name = "unic-char-range"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
-dependencies = [
- "log",
- "once_cell",
- "tracing-core",
-]
+checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc"
[[package]]
-name = "tracing-subscriber"
-version = "0.3.18"
+name = "unic-common"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
-dependencies = [
- "matchers",
- "nu-ansi-term",
- "once_cell",
- "regex",
- "sharded-slab",
- "smallvec",
- "thread_local",
- "tracing",
- "tracing-core",
- "tracing-log",
-]
+checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc"
[[package]]
-name = "treediff"
-version = "4.0.2"
+name = "unic-ucd-ident"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52984d277bdf2a751072b5df30ec0377febdb02f7696d64c2d7d54630bac4303"
+checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987"
dependencies = [
- "serde_json",
+ "unic-char-property",
+ "unic-char-range",
+ "unic-ucd-version",
]
[[package]]
-name = "typenum"
-version = "1.17.0"
+name = "unic-ucd-version"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
+checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4"
+dependencies = [
+ "unic-common",
+]
[[package]]
-name = "unicode-bidi"
-version = "0.3.15"
+name = "unicode-ident"
+version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
+checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
[[package]]
-name = "unicode-ident"
-version = "1.0.12"
+name = "unicode-segmentation"
+version = "1.13.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8"
[[package]]
-name = "unicode-normalization"
-version = "0.1.22"
+name = "unicode-truncate"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf"
dependencies = [
- "tinyvec",
+ "itertools",
+ "unicode-segmentation",
+ "unicode-width",
]
[[package]]
-name = "unicode-segmentation"
-version = "1.10.1"
+name = "unicode-width"
+version = "0.1.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
+checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
[[package]]
name = "url"
-version = "2.5.0"
+version = "2.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
+checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
dependencies = [
"form_urlencoded",
"idna",
"percent-encoding",
"serde",
+ "serde_derive",
+]
+
+[[package]]
+name = "urlencoding"
+version = "2.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
+
+[[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]]
@@ -3378,44 +4904,47 @@ 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 = "utf8parse"
-version = "0.2.1"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
+checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "uuid"
-version = "1.7.0"
+version = "1.23.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a"
+checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7"
dependencies = [
- "getrandom 0.2.12",
+ "getrandom 0.4.3",
+ "js-sys",
+ "serde_core",
+ "wasm-bindgen",
]
[[package]]
-name = "valuable"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
-
-[[package]]
-name = "version-compare"
-version = "0.0.11"
+name = "vcpkg"
+version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]]
name = "version-compare"
-version = "0.1.1"
+version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29"
+checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e"
[[package]]
name = "version_check"
-version = "0.9.4"
+version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "vswhom"
@@ -3429,9 +4958,9 @@ dependencies = [
[[package]]
name = "vswhom-sys"
-version = "0.1.2"
+version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18"
+checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150"
dependencies = [
"cc",
"libc",
@@ -3439,68 +4968,66 @@ dependencies = [
[[package]]
name = "walkdir"
-version = "2.4.0"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee"
+checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
dependencies = [
"same-file",
"winapi-util",
]
[[package]]
-name = "wasi"
-version = "0.9.0+wasi-snapshot-preview1"
+name = "want"
+version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
+dependencies = [
+ "try-lock",
+]
[[package]]
name = "wasi"
-version = "0.11.0+wasi-snapshot-preview1"
+version = "0.11.1+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
[[package]]
-name = "wasm-bindgen"
-version = "0.2.90"
+name = "wasip2"
+version = "1.0.4+wasi-0.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406"
+checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
dependencies = [
- "cfg-if",
- "wasm-bindgen-macro",
+ "wit-bindgen",
]
[[package]]
-name = "wasm-bindgen-backend"
-version = "0.2.90"
+name = "wasm-bindgen"
+version = "0.2.125"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd"
+checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a"
dependencies = [
- "bumpalo",
- "log",
+ "cfg-if",
"once_cell",
- "proc-macro2",
- "quote",
- "syn 2.0.48",
+ "rustversion",
+ "wasm-bindgen-macro",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.40"
+version = "0.4.75"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bde2032aeb86bdfaecc8b261eef3cba735cc426c1f3a3416d1e0791be95fc461"
+checksum = "503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280"
dependencies = [
- "cfg-if",
"js-sys",
"wasm-bindgen",
- "web-sys",
]
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.90"
+version = "0.2.125"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999"
+checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -3508,38 +5035,188 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.90"
+version = "0.2.125"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7"
+checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd"
dependencies = [
+ "bumpalo",
"proc-macro2",
"quote",
- "syn 2.0.48",
- "wasm-bindgen-backend",
+ "syn 2.0.118",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.90"
+version = "0.2.125"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "wasm-streams"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb"
+dependencies = [
+ "futures-util",
+ "js-sys",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+]
+
+[[package]]
+name = "wayland-backend"
+version = "0.3.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2857dd20b54e916ec7253b3d6b4d5c4d7d4ca2c33c2e11c6c76a99bd8744755d"
+dependencies = [
+ "cc",
+ "downcast-rs",
+ "rustix 1.1.4",
+ "scoped-tls",
+ "smallvec",
+ "wayland-sys",
+]
+
+[[package]]
+name = "wayland-client"
+version = "0.31.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "645c7c96bb74690c3189b5c9cb4ca1627062bb23693a4fad9d8c3de958260144"
+dependencies = [
+ "bitflags 2.13.0",
+ "rustix 1.1.4",
+ "wayland-backend",
+ "wayland-scanner",
+]
+
+[[package]]
+name = "wayland-csd-frame"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e"
+dependencies = [
+ "bitflags 2.13.0",
+ "cursor-icon",
+ "wayland-backend",
+]
+
+[[package]]
+name = "wayland-cursor"
+version = "0.31.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4a52d18780be9b1314328a3de5f930b73d2200112e3849ca6cb11822793fb34d"
+dependencies = [
+ "rustix 1.1.4",
+ "wayland-client",
+ "xcursor",
+]
+
+[[package]]
+name = "wayland-protocols"
+version = "0.32.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23d0c813de3daa2ed6520af85a3bd49b0e722a3078506899aa9686fea58dc4b6"
+dependencies = [
+ "bitflags 2.13.0",
+ "wayland-backend",
+ "wayland-client",
+ "wayland-scanner",
+]
+
+[[package]]
+name = "wayland-protocols-experimental"
+version = "20250721.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1"
+dependencies = [
+ "bitflags 2.13.0",
+ "wayland-backend",
+ "wayland-client",
+ "wayland-protocols",
+ "wayland-scanner",
+]
+
+[[package]]
+name = "wayland-protocols-misc"
+version = "0.3.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e9567599ef23e09b8dad6e429e5738d4509dfc46b3b21f32841a304d16b29c8"
+dependencies = [
+ "bitflags 2.13.0",
+ "wayland-backend",
+ "wayland-client",
+ "wayland-protocols",
+ "wayland-scanner",
+]
+
+[[package]]
+name = "wayland-protocols-wlr"
+version = "0.3.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234"
+dependencies = [
+ "bitflags 2.13.0",
+ "wayland-backend",
+ "wayland-client",
+ "wayland-protocols",
+ "wayland-scanner",
+]
+
+[[package]]
+name = "wayland-scanner"
+version = "0.31.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c324a910fd86ebdc364a3e61ec1f11737d3b1d6c273c0239ee8ff4bc0d24b4a"
+dependencies = [
+ "proc-macro2",
+ "quick-xml",
+ "quote",
+]
+
+[[package]]
+name = "wayland-sys"
+version = "0.31.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b"
+checksum = "d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be"
+dependencies = [
+ "dlib",
+ "log",
+ "once_cell",
+ "pkg-config",
+]
[[package]]
name = "web-sys"
-version = "0.3.67"
+version = "0.3.102"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed"
+checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d"
dependencies = [
"js-sys",
"wasm-bindgen",
]
+[[package]]
+name = "web_atoms"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "075474b12bcb3d2e3d4546580e9de478eeeead668a1761e2a8860c836b7ef297"
+dependencies = [
+ "phf",
+ "phf_codegen",
+ "string_cache",
+ "string_cache_codegen",
+]
+
[[package]]
name = "webkit2gtk"
-version = "0.18.2"
+version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370"
+checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793"
dependencies = [
"bitflags 1.3.2",
"cairo-rs",
@@ -3555,20 +5232,18 @@ dependencies = [
"javascriptcore-rs",
"libc",
"once_cell",
- "soup2",
+ "soup3",
"webkit2gtk-sys",
]
[[package]]
name = "webkit2gtk-sys"
-version = "0.18.0"
+version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3"
+checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5"
dependencies = [
- "atk-sys",
"bitflags 1.3.2",
"cairo-sys-rs",
- "gdk-pixbuf-sys",
"gdk-sys",
"gio-sys",
"glib-sys",
@@ -3576,414 +5251,552 @@ dependencies = [
"gtk-sys",
"javascriptcore-rs-sys",
"libc",
- "pango-sys",
"pkg-config",
- "soup2-sys",
- "system-deps 6.2.0",
+ "soup3-sys",
+ "system-deps",
]
[[package]]
name = "webview2-com"
-version = "0.19.1"
+version = "0.38.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178"
+checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a"
dependencies = [
"webview2-com-macros",
"webview2-com-sys",
- "windows 0.39.0",
+ "windows 0.61.3",
+ "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.118",
+]
+
+[[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 0.61.3",
+ "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 0.6.4",
+ "objc2-app-kit 0.3.2",
+ "objc2-core-foundation",
+ "objc2-foundation 0.3.2",
+ "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 0.2.0",
+ "windows-core 0.61.2",
+ "windows-future 0.2.1",
+ "windows-link 0.1.3",
+ "windows-numerics 0.2.0",
+]
+
+[[package]]
+name = "windows"
+version = "0.62.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580"
+dependencies = [
+ "windows-collections 0.3.2",
+ "windows-core 0.62.2",
+ "windows-future 0.3.2",
+ "windows-numerics 0.3.1",
+]
+
+[[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-collections"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610"
+dependencies = [
+ "windows-core 0.62.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 = "webview2-com-macros"
-version = "0.6.0"
+name = "windows-core"
+version = "0.62.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac"
+checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
+ "windows-implement",
+ "windows-interface",
+ "windows-link 0.2.1",
+ "windows-result 0.4.1",
+ "windows-strings 0.5.1",
]
[[package]]
-name = "webview2-com-sys"
-version = "0.19.0"
+name = "windows-future"
+version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7"
+checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e"
dependencies = [
- "regex",
- "serde",
- "serde_json",
- "thiserror",
- "windows 0.39.0",
- "windows-bindgen",
- "windows-metadata",
+ "windows-core 0.61.2",
+ "windows-link 0.1.3",
+ "windows-threading 0.1.0",
]
[[package]]
-name = "winapi"
-version = "0.3.9"
+name = "windows-future"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb"
dependencies = [
- "winapi-i686-pc-windows-gnu",
- "winapi-x86_64-pc-windows-gnu",
+ "windows-core 0.62.2",
+ "windows-link 0.2.1",
+ "windows-threading 0.2.1",
]
[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
+name = "windows-implement"
+version = "0.60.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.118",
+]
[[package]]
-name = "winapi-util"
-version = "0.1.6"
+name = "windows-interface"
+version = "0.59.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
+checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
dependencies = [
- "winapi",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.118",
]
[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
+name = "windows-link"
+version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
[[package]]
-name = "windows"
-version = "0.37.0"
+name = "windows-link"
+version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647"
-dependencies = [
- "windows_aarch64_msvc 0.37.0",
- "windows_i686_gnu 0.37.0",
- "windows_i686_msvc 0.37.0",
- "windows_x86_64_gnu 0.37.0",
- "windows_x86_64_msvc 0.37.0",
-]
+checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
[[package]]
-name = "windows"
-version = "0.39.0"
+name = "windows-numerics"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a"
+checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1"
dependencies = [
- "windows-implement",
- "windows_aarch64_msvc 0.39.0",
- "windows_i686_gnu 0.39.0",
- "windows_i686_msvc 0.39.0",
- "windows_x86_64_gnu 0.39.0",
- "windows_x86_64_msvc 0.39.0",
+ "windows-core 0.61.2",
+ "windows-link 0.1.3",
]
[[package]]
-name = "windows"
-version = "0.48.0"
+name = "windows-numerics"
+version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
+checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26"
dependencies = [
- "windows-targets 0.48.5",
+ "windows-core 0.62.2",
+ "windows-link 0.2.1",
]
[[package]]
-name = "windows-bindgen"
-version = "0.39.0"
+name = "windows-result"
+version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41"
+checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6"
dependencies = [
- "windows-metadata",
- "windows-tokens",
+ "windows-link 0.1.3",
]
[[package]]
-name = "windows-core"
-version = "0.52.0"
+name = "windows-result"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
dependencies = [
- "windows-targets 0.52.0",
+ "windows-link 0.2.1",
]
[[package]]
-name = "windows-implement"
-version = "0.39.0"
+name = "windows-strings"
+version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7"
+checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
dependencies = [
- "syn 1.0.109",
- "windows-tokens",
+ "windows-link 0.1.3",
]
[[package]]
-name = "windows-metadata"
-version = "0.39.0"
+name = "windows-strings"
+version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278"
+checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
+dependencies = [
+ "windows-link 0.2.1",
+]
[[package]]
name = "windows-sys"
-version = "0.48.0"
+version = "0.45.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
dependencies = [
- "windows-targets 0.48.5",
+ "windows-targets 0.42.2",
]
[[package]]
name = "windows-sys"
-version = "0.52.0"
+version = "0.59.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
dependencies = [
- "windows-targets 0.52.0",
+ "windows-targets 0.52.6",
]
[[package]]
-name = "windows-targets"
-version = "0.48.5"
+name = "windows-sys"
+version = "0.61.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
dependencies = [
- "windows_aarch64_gnullvm 0.48.5",
- "windows_aarch64_msvc 0.48.5",
- "windows_i686_gnu 0.48.5",
- "windows_i686_msvc 0.48.5",
- "windows_x86_64_gnu 0.48.5",
- "windows_x86_64_gnullvm 0.48.5",
- "windows_x86_64_msvc 0.48.5",
+ "windows-link 0.2.1",
]
[[package]]
name = "windows-targets"
-version = "0.52.0"
+version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
+checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
dependencies = [
- "windows_aarch64_gnullvm 0.52.0",
- "windows_aarch64_msvc 0.52.0",
- "windows_i686_gnu 0.52.0",
- "windows_i686_msvc 0.52.0",
- "windows_x86_64_gnu 0.52.0",
- "windows_x86_64_gnullvm 0.52.0",
- "windows_x86_64_msvc 0.52.0",
+ "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-tokens"
-version = "0.39.0"
+name = "windows-targets"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm 0.52.6",
+ "windows_aarch64_msvc 0.52.6",
+ "windows_i686_gnu 0.52.6",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc 0.52.6",
+ "windows_x86_64_gnu 0.52.6",
+ "windows_x86_64_gnullvm 0.52.6",
+ "windows_x86_64_msvc 0.52.6",
+]
[[package]]
-name = "windows-version"
+name = "windows-threading"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75aa004c988e080ad34aff5739c39d0312f4684699d6d71fc8a198d057b8b9b4"
+checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6"
dependencies = [
- "windows-targets 0.52.0",
+ "windows-link 0.1.3",
]
[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.48.5"
+name = "windows-threading"
+version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37"
+dependencies = [
+ "windows-link 0.2.1",
+]
[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.52.0"
+name = "windows-version"
+version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
+checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631"
+dependencies = [
+ "windows-link 0.2.1",
+]
[[package]]
-name = "windows_aarch64_msvc"
-version = "0.37.0"
+name = "windows_aarch64_gnullvm"
+version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a"
+checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
[[package]]
-name = "windows_aarch64_msvc"
-version = "0.39.0"
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]]
name = "windows_aarch64_msvc"
-version = "0.48.5"
+version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
[[package]]
name = "windows_aarch64_msvc"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.37.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.39.0"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]]
name = "windows_i686_gnu"
-version = "0.48.5"
+version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
[[package]]
name = "windows_i686_gnu"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.37.0"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
[[package]]
-name = "windows_i686_msvc"
-version = "0.39.0"
+name = "windows_i686_gnullvm"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]]
name = "windows_i686_msvc"
-version = "0.48.5"
+version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
[[package]]
name = "windows_i686_msvc"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.37.0"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]]
name = "windows_x86_64_gnu"
-version = "0.39.0"
+version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65"
+checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
[[package]]
name = "windows_x86_64_gnu"
-version = "0.48.5"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]]
name = "windows_x86_64_gnullvm"
-version = "0.48.5"
+version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
[[package]]
name = "windows_x86_64_gnullvm"
-version = "0.52.0"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]]
name = "windows_x86_64_msvc"
-version = "0.37.0"
+version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d"
+checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
[[package]]
name = "windows_x86_64_msvc"
-version = "0.39.0"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
-name = "windows_x86_64_msvc"
-version = "0.48.5"
+name = "winnow"
+version = "0.5.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
+dependencies = [
+ "memchr",
+]
[[package]]
-name = "windows_x86_64_msvc"
-version = "0.52.0"
+name = "winnow"
+version = "0.7.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
+checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945"
[[package]]
name = "winnow"
-version = "0.5.35"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1931d78a9c73861da0134f453bb1f790ce49b2e30eba8410b4b79bac72b46a2d"
+checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1"
dependencies = [
"memchr",
]
[[package]]
name = "winreg"
-version = "0.51.0"
+version = "0.55.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "937f3df7948156640f46aacef17a70db0de5917bda9c92b0f751f3a955b588fc"
+checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97"
dependencies = [
"cfg-if",
- "windows-sys 0.48.0",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "wit-bindgen"
+version = "0.57.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
+
+[[package]]
+name = "wmi"
+version = "0.17.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "120d8c2b6a7c96c27bf4a7947fd7f02d73ca7f5958b8bd72a696e46cb5521ee6"
+dependencies = [
+ "chrono",
+ "futures",
+ "log",
+ "serde",
+ "thiserror 2.0.18",
+ "windows 0.62.2",
+ "windows-core 0.62.2",
]
+[[package]]
+name = "writeable"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
+
[[package]]
name = "wry"
-version = "0.24.7"
+version = "0.55.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ad85d0e067359e409fcb88903c3eac817c392e5d638258abfb3da5ad8ba6fc4"
+checksum = "186f9871daa55fd9c016578b810d149de58367113db7fb72b462d2323ce19514"
dependencies = [
- "base64 0.13.1",
- "block",
- "cocoa",
- "core-graphics",
+ "base64 0.22.1",
+ "block2 0.6.2",
+ "cookie",
"crossbeam-channel",
+ "dirs",
+ "dom_query",
+ "dpi",
"dunce",
- "gdk",
- "gio",
- "glib",
+ "gdkx11",
"gtk",
- "html5ever",
"http",
- "kuchikiki",
+ "javascriptcore-rs",
+ "jni",
"libc",
- "log",
- "objc",
- "objc_id",
+ "ndk",
+ "objc2 0.6.4",
+ "objc2-app-kit 0.3.2",
+ "objc2-core-foundation",
+ "objc2-foundation 0.3.2",
+ "objc2-ui-kit",
+ "objc2-web-kit",
"once_cell",
- "serde",
- "serde_json",
+ "percent-encoding",
+ "raw-window-handle",
"sha2",
- "soup2",
- "tao",
- "thiserror",
+ "soup3",
+ "tao-macros",
+ "thiserror 2.0.18",
"url",
"webkit2gtk",
"webkit2gtk-sys",
"webview2-com",
- "windows 0.39.0",
- "windows-implement",
+ "windows 0.61.3",
+ "windows-core 0.61.2",
+ "windows-version",
+ "x11-dl",
]
[[package]]
@@ -3996,6 +5809,16 @@ dependencies = [
"pkg-config",
]
+[[package]]
+name = "x11-clipboard"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "662d74b3d77e396b8e5beb00b9cad6a9eccf40b2ef68cc858784b14c41d535a3"
+dependencies = [
+ "libc",
+ "x11rb",
+]
+
[[package]]
name = "x11-dl"
version = "2.21.0"
@@ -4008,12 +5831,235 @@ dependencies = [
]
[[package]]
-name = "xattr"
-version = "1.3.1"
+name = "x11rb"
+version = "0.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414"
+dependencies = [
+ "gethostname",
+ "rustix 1.1.4",
+ "x11rb-protocol",
+]
+
+[[package]]
+name = "x11rb-protocol"
+version = "0.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd"
+
+[[package]]
+name = "xcursor"
+version = "0.3.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b"
+
+[[package]]
+name = "xkeysym"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56"
+
+[[package]]
+name = "yoke"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5"
+dependencies = [
+ "stable_deref_trait",
+ "yoke-derive",
+ "zerofrom",
+]
+
+[[package]]
+name = "yoke-derive"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f"
+checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e"
dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.118",
+ "synstructure",
+]
+
+[[package]]
+name = "zbus"
+version = "5.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eee682d202a77e4a9f3b2c2bdf48a7b28af5c08c34ddf66f98c93e5e39464285"
+dependencies = [
+ "async-broadcast",
+ "async-executor",
+ "async-io",
+ "async-lock",
+ "async-process",
+ "async-recursion",
+ "async-task",
+ "async-trait",
+ "blocking",
+ "enumflags2",
+ "event-listener",
+ "futures-core",
+ "futures-lite",
+ "hex",
"libc",
- "linux-raw-sys",
- "rustix",
+ "ordered-stream",
+ "rustix 1.1.4",
+ "serde",
+ "serde_repr",
+ "tracing",
+ "uds_windows",
+ "uuid",
+ "windows-sys 0.61.2",
+ "winnow 1.0.3",
+ "zbus_macros",
+ "zbus_names",
+ "zvariant",
+]
+
+[[package]]
+name = "zbus_macros"
+version = "5.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "adf1bd45a81a103745b1757754762a26e8cd01e4532e4d6c8ec431624b80d1d6"
+dependencies = [
+ "proc-macro-crate 3.5.0",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.118",
+ "zbus_names",
+ "zvariant",
+ "zvariant_utils",
+]
+
+[[package]]
+name = "zbus_names"
+version = "4.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7074f3e50b894eac91750142016d30d0a89be8e67dbfd9704fb875825760e52d"
+dependencies = [
+ "serde",
+ "winnow 1.0.3",
+ "zvariant",
+]
+
+[[package]]
+name = "zerocopy"
+version = "0.8.52"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f"
+dependencies = [
+ "zerocopy-derive",
+]
+
+[[package]]
+name = "zerocopy-derive"
+version = "0.8.52"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.118",
+]
+
+[[package]]
+name = "zerofrom"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272"
+dependencies = [
+ "zerofrom-derive",
+]
+
+[[package]]
+name = "zerofrom-derive"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.118",
+ "synstructure",
+]
+
+[[package]]
+name = "zerotrie"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf"
+dependencies = [
+ "displaydoc",
+ "yoke",
+ "zerofrom",
+]
+
+[[package]]
+name = "zerovec"
+version = "0.11.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239"
+dependencies = [
+ "yoke",
+ "zerofrom",
+ "zerovec-derive",
+]
+
+[[package]]
+name = "zerovec-derive"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.118",
+]
+
+[[package]]
+name = "zmij"
+version = "1.0.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
+
+[[package]]
+name = "zvariant"
+version = "5.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a192a0bde63360d77a7523c833d4b4ce6070a927e2c53246e4c540b1a3e27be0"
+dependencies = [
+ "endi",
+ "enumflags2",
+ "serde",
+ "url",
+ "winnow 1.0.3",
+ "zvariant_derive",
+ "zvariant_utils",
+]
+
+[[package]]
+name = "zvariant_derive"
+version = "5.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90bc6cde9c01c511074be97f7ccb6c19d0da89e3f8662e812e999dcfd4638737"
+dependencies = [
+ "proc-macro-crate 3.5.0",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.118",
+ "zvariant_utils",
+]
+
+[[package]]
+name = "zvariant_utils"
+version = "3.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e8535915cfa75547e559d8c68e8139909a4aeee076831e4ef7fc59d8172c4d6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "serde",
+ "syn 2.0.118",
+ "winnow 1.0.3",
]
diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml
index 2e092ef..23e5330 100644
--- a/src-tauri/Cargo.toml
+++ b/src-tauri/Cargo.toml
@@ -1,31 +1,57 @@
[package]
name = "lithographer"
-version = "0.0.0"
-description = "A Tauri App"
-authors = ["you"]
-license = ""
-repository = ""
+version = "0.2.0"
+description = "A Tauri App to create bootable usb devices"
+authors = ["Girish Joshi"]
+license = "MIT"
+repository = "https://github.com/girish946/lithographer"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[lib]
+# The `_lib` suffix may seem redundant but it is necessary
+# to make the lib name unique and wouldn't conflict with the bin name.
+# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519
+name = "lithographer_lib"
+crate-type = ["staticlib", "cdylib", "rlib"]
+
[build-dependencies]
-tauri-build = { version = "1.5", features = [] }
+tauri-build = { version = "2", features = [] }
[dependencies]
-tauri = { version = "1.5", features = [
- "cli",
- "dialog-save",
- "dialog-open",
- "shell-execute",
+tauri = { version = "2", features = [] }
+tauri-plugin-opener = "2"
+serde = { version = "1", features = ["derive"] }
+serde_json = "1"
+rfd = "0.15"
+
+# Depend on the litho package (liblitho) to use its Rust APIs directly
+# (e.g. get_storage_devices for device enumeration).
+# We are NOT bundling the separate `litho` binary for now.
+liblitho = { path = "../../litho" }
+
+[target.'cfg(windows)'.dependencies]
+winapi = { version = "0.3.9", features = [
+ "consoleapi",
+ "errhandlingapi",
+ "fileapi",
+ "handleapi",
+ "processenv",
+ "processthreadsapi",
+ "sysinfoapi",
+ "securitybaseapi",
+ "shellapi",
+ "synchapi",
+ "winbase",
+ "wincon",
+ "winnt",
+ "winuser",
] }
-serde = { version = "1.0", features = ["derive"] }
-serde_json = "1.0"
-litho = { git = "https://github.com/girish946/litho" }
-nix = { version = "0.27.1", features = ["user"] }
-mio = "0.8.11"
-
-[features]
-# this feature is used for production builds or when `devPath` points to the filesystem
-# DO NOT REMOVE!!
-custom-protocol = ["tauri/custom-protocol"]
+
+[target.'cfg(target_os = "linux")'.dependencies]
+# Pin webkit2gtk for Linux Tauri builds (WebKitGTK). Windows uses WebView2 via Tauri.
+# Compatible with WebKitGTK 4.0 / javascriptcoregtk-4.0 on Ubuntu 22.04 Docker images.
+# Stops Cargo from selecting a resolution that demands the 4.1 .pc files.
+webkit2gtk = "2.0.2"
diff --git a/src-tauri/appimage/apprun-wayland-compat.sh b/src-tauri/appimage/apprun-wayland-compat.sh
new file mode 100755
index 0000000..8068686
--- /dev/null
+++ b/src-tauri/appimage/apprun-wayland-compat.sh
@@ -0,0 +1,21 @@
+#! /usr/bin/env bash
+
+# AppImage launcher workaround for Wayland compositors (e.g. Hyprland on Arch).
+# Bundled WebKitGTK can fail to create an EGL display unless the host
+# libwayland-client is preloaded and desktop integration is disabled.
+
+export DESKTOPINTEGRATION=1
+
+if [ -z "${LD_PRELOAD:-}" ]; then
+ for lib in \
+ /usr/lib/libwayland-client.so \
+ /usr/lib64/libwayland-client.so \
+ /usr/lib/x86_64-linux-gnu/libwayland-client.so \
+ /usr/lib/aarch64-linux-gnu/libwayland-client.so \
+ /usr/lib/arm-linux-gnueabihf/libwayland-client.so; do
+ if [ -f "$lib" ]; then
+ export LD_PRELOAD="$lib"
+ break
+ fi
+ done
+fi
\ No newline at end of file
diff --git a/src-tauri/binaries/.keepme b/src-tauri/binaries/.keepme
new file mode 100644
index 0000000..e69de29
diff --git a/src-tauri/build.rs b/src-tauri/build.rs
index d860e1e..b1ec059 100644
--- a/src-tauri/build.rs
+++ b/src-tauri/build.rs
@@ -1,3 +1,16 @@
fn main() {
+ let target = std::env::var("TARGET").unwrap_or_else(|_| {
+ String::from_utf8_lossy(
+ &std::process::Command::new("rustc")
+ .arg("--print")
+ .arg("host-tuple")
+ .output()
+ .expect("failed to run rustc --print host-tuple")
+ .stdout,
+ )
+ .trim()
+ .to_string()
+ });
+ println!("cargo:rustc-env=LITHO_TARGET_TRIPLE={target}");
tauri_build::build()
}
diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json
new file mode 100644
index 0000000..4cdbf49
--- /dev/null
+++ b/src-tauri/capabilities/default.json
@@ -0,0 +1,10 @@
+{
+ "$schema": "../gen/schemas/desktop-schema.json",
+ "identifier": "default",
+ "description": "Capability for the main window",
+ "windows": ["main"],
+ "permissions": [
+ "core:default",
+ "opener:default"
+ ]
+}
diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png
index 6be5e50..6868caf 100644
Binary files a/src-tauri/icons/128x128.png and b/src-tauri/icons/128x128.png differ
diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png
index e81bece..8261d7a 100644
Binary files a/src-tauri/icons/128x128@2x.png and b/src-tauri/icons/128x128@2x.png differ
diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png
index a437dd5..9b43235 100644
Binary files a/src-tauri/icons/32x32.png and b/src-tauri/icons/32x32.png differ
diff --git a/src-tauri/icons/64x64.png b/src-tauri/icons/64x64.png
new file mode 100644
index 0000000..0e8d563
Binary files /dev/null and b/src-tauri/icons/64x64.png differ
diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png
index 0ca4f27..daecb42 100644
Binary files a/src-tauri/icons/Square107x107Logo.png and b/src-tauri/icons/Square107x107Logo.png differ
diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png
index b81f820..f866bfa 100644
Binary files a/src-tauri/icons/Square142x142Logo.png and b/src-tauri/icons/Square142x142Logo.png differ
diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png
index 624c7bf..81d62c3 100644
Binary files a/src-tauri/icons/Square150x150Logo.png and b/src-tauri/icons/Square150x150Logo.png differ
diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png
index c021d2b..dddf4d3 100644
Binary files a/src-tauri/icons/Square284x284Logo.png and b/src-tauri/icons/Square284x284Logo.png differ
diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png
index 6219700..b1ad2e9 100644
Binary files a/src-tauri/icons/Square30x30Logo.png and b/src-tauri/icons/Square30x30Logo.png differ
diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png
index f9bc048..3870959 100644
Binary files a/src-tauri/icons/Square310x310Logo.png and b/src-tauri/icons/Square310x310Logo.png differ
diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png
index d5fbfb2..d0b41cf 100644
Binary files a/src-tauri/icons/Square44x44Logo.png and b/src-tauri/icons/Square44x44Logo.png differ
diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png
index 63440d7..a0b459b 100644
Binary files a/src-tauri/icons/Square71x71Logo.png and b/src-tauri/icons/Square71x71Logo.png differ
diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png
index f3f705a..7dc02a2 100644
Binary files a/src-tauri/icons/Square89x89Logo.png and b/src-tauri/icons/Square89x89Logo.png differ
diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png
index 4556388..b3539da 100644
Binary files a/src-tauri/icons/StoreLogo.png and b/src-tauri/icons/StoreLogo.png differ
diff --git a/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml b/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..2ffbf24
--- /dev/null
+++ b/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..f65dfdb
Binary files /dev/null and b/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png differ
diff --git a/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..59db112
Binary files /dev/null and b/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..3b6e789
Binary files /dev/null and b/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..aba5613
Binary files /dev/null and b/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png differ
diff --git a/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..aa3d9a2
Binary files /dev/null and b/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..76e22a9
Binary files /dev/null and b/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..d3adb51
Binary files /dev/null and b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png differ
diff --git a/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..a04069d
Binary files /dev/null and b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..d53da4f
Binary files /dev/null and b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..7f6df01
Binary files /dev/null and b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..f251535
Binary files /dev/null and b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..12a78a0
Binary files /dev/null and b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..d97cae9
Binary files /dev/null and b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..1ae2c80
Binary files /dev/null and b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..9b975c4
Binary files /dev/null and b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/src-tauri/icons/android/values/ic_launcher_background.xml b/src-tauri/icons/android/values/ic_launcher_background.xml
new file mode 100644
index 0000000..ea9c223
--- /dev/null
+++ b/src-tauri/icons/android/values/ic_launcher_background.xml
@@ -0,0 +1,4 @@
+
+
+ #fff
+
\ No newline at end of file
diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns
index 12a5bce..625f895 100644
Binary files a/src-tauri/icons/icon.icns and b/src-tauri/icons/icon.icns differ
diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico
index b3636e4..cc36390 100644
Binary files a/src-tauri/icons/icon.ico and b/src-tauri/icons/icon.ico differ
diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png
index e1cd261..05a086e 100644
Binary files a/src-tauri/icons/icon.png and b/src-tauri/icons/icon.png differ
diff --git a/src-tauri/icons/ios/AppIcon-20x20@1x.png b/src-tauri/icons/ios/AppIcon-20x20@1x.png
new file mode 100644
index 0000000..b54de24
Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-20x20@1x.png differ
diff --git a/src-tauri/icons/ios/AppIcon-20x20@2x-1.png b/src-tauri/icons/ios/AppIcon-20x20@2x-1.png
new file mode 100644
index 0000000..ef0fd16
Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-20x20@2x-1.png differ
diff --git a/src-tauri/icons/ios/AppIcon-20x20@2x.png b/src-tauri/icons/ios/AppIcon-20x20@2x.png
new file mode 100644
index 0000000..ef0fd16
Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-20x20@2x.png differ
diff --git a/src-tauri/icons/ios/AppIcon-20x20@3x.png b/src-tauri/icons/ios/AppIcon-20x20@3x.png
new file mode 100644
index 0000000..8a1c4c6
Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-20x20@3x.png differ
diff --git a/src-tauri/icons/ios/AppIcon-29x29@1x.png b/src-tauri/icons/ios/AppIcon-29x29@1x.png
new file mode 100644
index 0000000..5a11956
Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-29x29@1x.png differ
diff --git a/src-tauri/icons/ios/AppIcon-29x29@2x-1.png b/src-tauri/icons/ios/AppIcon-29x29@2x-1.png
new file mode 100644
index 0000000..557894e
Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-29x29@2x-1.png differ
diff --git a/src-tauri/icons/ios/AppIcon-29x29@2x.png b/src-tauri/icons/ios/AppIcon-29x29@2x.png
new file mode 100644
index 0000000..557894e
Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-29x29@2x.png differ
diff --git a/src-tauri/icons/ios/AppIcon-29x29@3x.png b/src-tauri/icons/ios/AppIcon-29x29@3x.png
new file mode 100644
index 0000000..758d0a8
Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-29x29@3x.png differ
diff --git a/src-tauri/icons/ios/AppIcon-40x40@1x.png b/src-tauri/icons/ios/AppIcon-40x40@1x.png
new file mode 100644
index 0000000..ef0fd16
Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-40x40@1x.png differ
diff --git a/src-tauri/icons/ios/AppIcon-40x40@2x-1.png b/src-tauri/icons/ios/AppIcon-40x40@2x-1.png
new file mode 100644
index 0000000..9e34bc7
Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-40x40@2x-1.png differ
diff --git a/src-tauri/icons/ios/AppIcon-40x40@2x.png b/src-tauri/icons/ios/AppIcon-40x40@2x.png
new file mode 100644
index 0000000..9e34bc7
Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-40x40@2x.png differ
diff --git a/src-tauri/icons/ios/AppIcon-40x40@3x.png b/src-tauri/icons/ios/AppIcon-40x40@3x.png
new file mode 100644
index 0000000..430b947
Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-40x40@3x.png differ
diff --git a/src-tauri/icons/ios/AppIcon-512@2x.png b/src-tauri/icons/ios/AppIcon-512@2x.png
new file mode 100644
index 0000000..c51b85a
Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-512@2x.png differ
diff --git a/src-tauri/icons/ios/AppIcon-60x60@2x.png b/src-tauri/icons/ios/AppIcon-60x60@2x.png
new file mode 100644
index 0000000..430b947
Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-60x60@2x.png differ
diff --git a/src-tauri/icons/ios/AppIcon-60x60@3x.png b/src-tauri/icons/ios/AppIcon-60x60@3x.png
new file mode 100644
index 0000000..046a47f
Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-60x60@3x.png differ
diff --git a/src-tauri/icons/ios/AppIcon-76x76@1x.png b/src-tauri/icons/ios/AppIcon-76x76@1x.png
new file mode 100644
index 0000000..9b31232
Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-76x76@1x.png differ
diff --git a/src-tauri/icons/ios/AppIcon-76x76@2x.png b/src-tauri/icons/ios/AppIcon-76x76@2x.png
new file mode 100644
index 0000000..95a3da3
Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-76x76@2x.png differ
diff --git a/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png b/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png
new file mode 100644
index 0000000..fbf8737
Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png differ
diff --git a/src-tauri/scripts/patch-appimage-wayland.sh b/src-tauri/scripts/patch-appimage-wayland.sh
new file mode 100755
index 0000000..3340a8a
--- /dev/null
+++ b/src-tauri/scripts/patch-appimage-wayland.sh
@@ -0,0 +1,107 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+root_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
+hook_src="${root_dir}/appimage/apprun-wayland-compat.sh"
+bundle_root="${root_dir}/target"
+
+if [ ! -f "$hook_src" ]; then
+ echo "Wayland compat hook not found at ${hook_src}" >&2
+ exit 1
+fi
+
+find_linuxdeploy() {
+ local arch="$1"
+ local candidates=(
+ "${XDG_CACHE_HOME:-$HOME/.cache}/tauri/linuxdeploy-${arch}.AppImage"
+ "${root_dir}/target/release/bundle/appimage/linuxdeploy-${arch}.AppImage"
+ "${root_dir}/target/debug/bundle/appimage/linuxdeploy-${arch}.AppImage"
+ )
+
+ for candidate in "${candidates[@]}"; do
+ if [ -f "$candidate" ]; then
+ printf '%s\n' "$candidate"
+ return 0
+ fi
+ done
+
+ return 1
+}
+
+patch_appdir() {
+ local appdir="$1"
+ local hook_dst="${appdir}/apprun-hooks/wayland-compat.sh"
+ local apprun="${appdir}/AppRun"
+
+ if [ ! -d "$appdir" ] || [ ! -f "$apprun" ]; then
+ return 0
+ fi
+
+ mkdir -p "${appdir}/apprun-hooks"
+ cp "$hook_src" "$hook_dst"
+ chmod +x "$hook_dst"
+
+ if ! grep -q 'apprun-hooks/wayland-compat.sh' "$apprun"; then
+ sed -i '/^exec "\$this_dir"\/AppRun.wrapped/i source "$this_dir"/apprun-hooks/wayland-compat.sh' "$apprun"
+ fi
+
+ printf 'Patched %s\n' "$appdir"
+}
+
+repack_appimage() {
+ local appdir="$1"
+ local arch="$2"
+ local appimage="$3"
+ local linuxdeploy
+
+ if ! linuxdeploy="$(find_linuxdeploy "$arch")"; then
+ echo "linuxdeploy not found for ${arch}; skipping AppImage repack for ${appdir}" >&2
+ return 0
+ fi
+
+ export OUTPUT="$appimage"
+ export ARCH="$arch"
+ export APPIMAGE_EXTRACT_AND_RUN=1
+
+ "$linuxdeploy" \
+ --appimage-extract-and-run \
+ --verbosity 1 \
+ --appdir "$appdir" \
+ --output appimage
+
+ printf 'Repacked %s\n' "$appimage"
+}
+
+map_arch() {
+ case "$1" in
+ amd64) printf '%s\n' x86_64 ;;
+ aarch64) printf '%s\n' aarch64 ;;
+ armhf) printf '%s\n' armhf ;;
+ i386) printf '%s\n' i686 ;;
+ *) return 1 ;;
+ esac
+}
+
+patched=0
+
+while IFS= read -r -d '' appdir; do
+ patch_appdir "$appdir"
+ patched=1
+
+ appimage_dir="$(dirname "$appdir")"
+ product_name="$(basename "$appdir" .AppDir)"
+
+ for appimage in "${appimage_dir}/${product_name}"_*.AppImage; do
+ [ -f "$appimage" ] || continue
+
+ arch_tag="${appimage##*_}"
+ arch_tag="${arch_tag%.AppImage}"
+ linuxdeploy_arch="$(map_arch "$arch_tag")" || continue
+
+ repack_appimage "$appdir" "$linuxdeploy_arch" "$appimage"
+ done
+done < <(find "$bundle_root" -path '*/bundle/appimage/*.AppDir' -type d -print0 2>/dev/null)
+
+if [ "$patched" -eq 0 ]; then
+ echo "No AppImage AppDir found under ${bundle_root}; skipping Wayland patch" >&2
+fi
\ No newline at end of file
diff --git a/src-tauri/scripts/prepare-litho-sidecar.ps1 b/src-tauri/scripts/prepare-litho-sidecar.ps1
new file mode 100644
index 0000000..ed22593
--- /dev/null
+++ b/src-tauri/scripts/prepare-litho-sidecar.ps1
@@ -0,0 +1,64 @@
+# Build the litho CLI and copy it into src-tauri/binaries/ with the target-triple
+# suffix (and .exe on Windows) required by Tauri externalBin sidecars.
+$ErrorActionPreference = 'Stop'
+
+$Root = (Resolve-Path (Join-Path $PSScriptRoot '..\..')).Path
+$LithoDir = (Resolve-Path (Join-Path $Root '..\litho')).Path
+$BinDir = Join-Path $Root 'src-tauri\binaries'
+
+New-Item -ItemType Directory -Force -Path $BinDir | Out-Null
+
+function Ensure-StaticLibLzma {
+ $vcpkgRoot = 'C:\vcpkg'
+ $vcpkgExe = Join-Path $vcpkgRoot 'vcpkg.exe'
+ if (-not (Test-Path -LiteralPath $vcpkgExe)) {
+ Write-Error @"
+vcpkg not found at $vcpkgExe.
+Install vcpkg (or use GitHub Actions windows-latest) and run:
+ vcpkg install liblzma:x64-windows-static-md
+"@
+ }
+ $env:VCPKG_ROOT = $vcpkgRoot
+ if (Test-Path Env:VCPKGRS_DYNAMIC) {
+ Remove-Item Env:VCPKGRS_DYNAMIC
+ }
+ Write-Host 'Ensuring static liblzma (x64-windows-static-md) is installed...'
+ & $vcpkgExe install liblzma:x64-windows-static-md
+ if ($LASTEXITCODE -ne 0) {
+ exit $LASTEXITCODE
+ }
+}
+
+Ensure-StaticLibLzma
+
+Write-Host 'Building litho CLI (release, real-io)...'
+Push-Location $LithoDir
+try {
+ cargo build --release --no-default-features --features real-io --bin litho
+ if ($LASTEXITCODE -ne 0) {
+ exit $LASTEXITCODE
+ }
+} finally {
+ Pop-Location
+}
+
+$Triple = (rustc --print host-tuple).Trim()
+$Source = Join-Path $LithoDir 'target\release\litho.exe'
+$Dest = Join-Path $BinDir "litho-$Triple.exe"
+
+if (-not (Test-Path -LiteralPath $Source)) {
+ Write-Error "litho binary not found at $Source"
+}
+
+Copy-Item -LiteralPath $Source -Destination $Dest -Force
+
+# Release Windows builds strip Rust symbol names; sanity-check CLI strings instead.
+$bytes = [System.IO.File]::ReadAllBytes($Dest)
+$text = [System.Text.Encoding]::ASCII.GetString($bytes)
+foreach ($marker in @('gui', 'flash', 'clone')) {
+ if ($text -notmatch $marker) {
+ Write-Error "litho sidecar failed sanity check (missing '$marker'; stale or wrong binary?)"
+ }
+}
+
+Write-Host "Sidecar ready: $Dest"
\ No newline at end of file
diff --git a/src-tauri/scripts/prepare-litho-sidecar.sh b/src-tauri/scripts/prepare-litho-sidecar.sh
new file mode 100755
index 0000000..efb64b4
--- /dev/null
+++ b/src-tauri/scripts/prepare-litho-sidecar.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+# Build the litho CLI and copy it into src-tauri/binaries/ with the target-triple suffix
+# required by Tauri externalBin sidecars.
+set -euo pipefail
+
+ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
+LITHO_DIR="$(cd "$ROOT/../litho" && pwd)"
+BIN_DIR="$ROOT/src-tauri/binaries"
+
+mkdir -p "$BIN_DIR"
+
+echo "Building litho CLI (release, real-io)..."
+(cd "$LITHO_DIR" && cargo build --release --no-default-features --features real-io --bin litho)
+
+TRIPLE="$(rustc --print host-tuple)"
+DEST="$BIN_DIR/litho-${TRIPLE}"
+
+cp "$LITHO_DIR/target/release/litho" "$DEST"
+chmod +x "$DEST"
+
+# Post-write verify needs LinuxBufferedDeviceReader (not O_DIRECT new_reader).
+# Use process substitution — `grep -q` closes the pipe early and SIGPIPE + pipefail
+# would otherwise make `strings | grep -q` look like a failed check.
+if ! grep -Fq "new_verify_reader" < <(strings "$DEST"); then
+ echo "error: litho sidecar is missing buffered verification I/O (stale litho build?)" >&2
+ exit 1
+fi
+
+echo "Sidecar ready: $DEST"
\ No newline at end of file
diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs
new file mode 100644
index 0000000..85c1152
--- /dev/null
+++ b/src-tauri/src/lib.rs
@@ -0,0 +1,623 @@
+mod litho_output;
+mod litho_runner;
+mod litho_sidecar;
+mod privilege;
+
+// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/
+#[tauri::command]
+fn greet(name: &str) -> String {
+ format!("Hello, {}! You've been greeted from Rust!", name)
+}
+
+use litho_runner::{
+ cancel_litho_operation as stop_litho_child, spawn_litho_operation, LithoRunRequest,
+ LithoRunnerState, SharedLithoRunner,
+};
+
+use std::path::Path;
+use std::sync::{Arc, Mutex};
+
+use liblitho::devices::{self as litho_devices, DeviceInfo as LithoDeviceInfo};
+
+#[derive(serde::Serialize)]
+struct StartupDiagnostics {
+ platform: String,
+ desktop_environment: String,
+ current_user: String,
+ is_elevated: bool,
+ elevation_method: String,
+ elevation_agent: Option,
+ elevation_ready: bool,
+ elevation_status: String,
+ spawn_mode: String,
+ litho_spawn_preview: String,
+ /// Legacy alias for `is_elevated` (Linux root / Windows Administrator).
+ is_root: bool,
+ /// Legacy alias for `elevation_agent` on Linux (polkit agent path).
+ polkit_agent_path: Option,
+ /// Legacy alias for `elevation_ready`.
+ polkit_agent_is_executable: bool,
+ /// Legacy alias for `elevation_status`.
+ polkit_status: String,
+}
+
+#[derive(serde::Serialize, Clone, Debug)]
+struct LaunchParams {
+ mode: Option,
+ device: Option,
+ image: Option,
+ auto_run: bool,
+ auto_unmount: bool,
+ verify: bool,
+ block_size: Option,
+}
+
+fn parse_launch_args() -> LaunchParams {
+ let args: Vec = std::env::args().skip(1).collect();
+ let mut params = LaunchParams {
+ mode: None,
+ device: None,
+ image: None,
+ auto_run: false,
+ auto_unmount: false,
+ verify: false,
+ block_size: None,
+ };
+
+ let mut i = 0;
+ while i < args.len() {
+ let arg = &args[i];
+ match arg.as_str() {
+ "--mode" | "-m" => {
+ if i + 1 < args.len() {
+ params.mode = Some(args[i + 1].clone());
+ i += 1;
+ }
+ }
+ "--device" | "-d" => {
+ if i + 1 < args.len() {
+ params.device = Some(args[i + 1].clone());
+ i += 1;
+ }
+ }
+ "--image" | "-i" | "--file" => {
+ if i + 1 < args.len() {
+ params.image = Some(args[i + 1].clone());
+ i += 1;
+ }
+ }
+ "--block-size" | "-b" => {
+ if i + 1 < args.len() {
+ params.block_size = args[i + 1].parse().ok();
+ i += 1;
+ }
+ }
+ "--auto-run" => {
+ params.auto_run = true;
+ }
+ "--auto-unmount" => {
+ params.auto_unmount = true;
+ }
+ "--verify" => {
+ params.verify = true;
+ }
+ _ if !arg.starts_with('-') => {
+ // positional args: first = image, second = device
+ if params.image.is_none() {
+ params.image = Some(arg.clone());
+ } else if params.device.is_none() {
+ params.device = Some(arg.clone());
+ }
+ }
+ _ => {}
+ }
+ i += 1;
+ }
+
+ // Normalize mode value
+ if let Some(ref m) = params.mode {
+ let lower = m.to_lowercase();
+ if lower == "clone" || lower == "backup" {
+ params.mode = Some("clone".to_string());
+ } else {
+ params.mode = Some("flash".to_string());
+ }
+ }
+
+ params
+}
+
+#[tauri::command]
+fn get_launch_params() -> LaunchParams {
+ parse_launch_args()
+}
+
+fn get_current_user() -> String {
+ std::env::var("USER")
+ .or_else(|_| std::env::var("LOGNAME"))
+ .or_else(|_| std::env::var("USERNAME"))
+ .unwrap_or_else(|_| "unknown".to_string())
+}
+
+fn platform_name() -> String {
+ if cfg!(windows) {
+ "windows".to_string()
+ } else if cfg!(target_os = "linux") {
+ "linux".to_string()
+ } else {
+ std::env::consts::OS.to_string()
+ }
+}
+
+fn litho_gui_args_preview() -> &'static str {
+ "-o gui -f -d -b --cancel-file [--verify]"
+}
+
+fn litho_spawn_preview(sidecar: &Path, is_elevated: bool) -> String {
+ let litho = sidecar.display();
+ let args = litho_gui_args_preview();
+
+ if is_elevated {
+ return format!("{litho} {args}");
+ }
+
+ #[cfg(windows)]
+ {
+ return format!("UAC runas → lithographer --auto-run … → {litho} {args}");
+ }
+
+ #[cfg(not(windows))]
+ {
+ format!("{} {litho} {args}", privilege::elevation_method())
+ }
+}
+
+fn litho_spawn_preview_unresolved(is_elevated: bool) -> String {
+ litho_spawn_preview(Path::new(""), is_elevated)
+}
+
+fn perform_startup_checks_with_sidecar(sidecar: Option<&Path>) -> StartupDiagnostics {
+ let platform = platform_name();
+ let desktop_environment = privilege::platform_environment();
+ let current_user = get_current_user();
+ let is_elevated = privilege::has_privileged_access();
+ let elevation_method = privilege::elevation_method();
+ let spawn_mode = privilege::spawn_mode();
+
+ #[cfg(windows)]
+ let (elevation_agent, elevation_ready, elevation_status) = {
+ let agent = Some("UAC (User Account Control)".to_string());
+ let ready = true;
+ let status = if is_elevated {
+ "Running elevated (Administrator). Flash/clone operations will run directly."
+ .to_string()
+ } else {
+ "UAC available. Litho will request administrator approval when an operation starts."
+ .to_string()
+ };
+ (agent, ready, status)
+ };
+
+ #[cfg(not(windows))]
+ let (elevation_agent, elevation_ready, elevation_status) = {
+ let agent = privilege::elevation_agent_description();
+ let ready = privilege::elevation_ready();
+ let status = if ready {
+ format!(
+ "Elevation via {} is available. Password/fingerprint prompt when an operation starts.",
+ elevation_method
+ )
+ } else {
+ "No elevation backend ready. Install polkit (pkexec), run under GNOME, \
+ or set LITHOGRAPHER_ELEVATION=sudo with SUDO_ASKPASS.".to_string()
+ };
+ (agent, ready, status)
+ };
+
+ let litho_spawn_preview = match sidecar {
+ Some(path) => litho_spawn_preview(path, is_elevated),
+ None => litho_spawn_preview_unresolved(is_elevated),
+ };
+
+ StartupDiagnostics {
+ platform,
+ desktop_environment,
+ current_user,
+ is_elevated,
+ elevation_method,
+ elevation_agent: elevation_agent.clone(),
+ elevation_ready,
+ elevation_status: elevation_status.clone(),
+ spawn_mode,
+ litho_spawn_preview,
+ is_root: is_elevated,
+ polkit_agent_path: elevation_agent,
+ polkit_agent_is_executable: elevation_ready,
+ polkit_status: elevation_status,
+ }
+}
+
+fn perform_startup_checks() -> StartupDiagnostics {
+ perform_startup_checks_with_sidecar(None)
+}
+
+fn log_startup_report(diag: &StartupDiagnostics, sidecar: &Result) {
+ println!("=== Lithographer Startup Checks ===");
+ println!("Platform : {}", diag.platform);
+ println!("Environment : {}", diag.desktop_environment);
+ println!("Current user : {}", diag.current_user);
+ println!("Elevated : {}", diag.is_elevated);
+ println!("Elevation method : {}", diag.elevation_method);
+ println!("Elevation ready : {}", diag.elevation_ready);
+ if let Some(ref agent) = diag.elevation_agent {
+ println!("Elevation agent : {}", agent);
+ } else {
+ println!("Elevation agent : NOT FOUND");
+ }
+ println!("Elevation status : {}", diag.elevation_status);
+ println!("Litho spawn mode : {}", diag.spawn_mode);
+ println!("Litho command : {}", diag.litho_spawn_preview);
+ println!("=====================================");
+
+ let launch = parse_launch_args();
+ println!(
+ "Launch params : mode={:?}, device={:?}, image={:?}",
+ launch.mode, launch.device, launch.image
+ );
+
+ println!("--- Querying storage devices ---");
+ match query_storage_devices() {
+ Ok(devs) => {
+ println!("Found {} storage device(s):", devs.len());
+ for d in &devs {
+ let kind = if d.removable { "removable" } else { "fixed" };
+ println!(" {} ({} • {})", d.path, d.size, kind);
+ }
+ }
+ Err(e) => {
+ println!("Storage device query failed: {}", e);
+ }
+ }
+ println!("--------------------------------");
+
+ if diag.is_elevated {
+ #[cfg(windows)]
+ println!("Note: App is running elevated. Litho sidecar will be spawned directly.");
+ #[cfg(not(windows))]
+ println!("Note: App is running as root. Litho sidecar will be spawned directly.");
+ } else if !diag.elevation_ready {
+ #[cfg(windows)]
+ eprintln!("WARNING: Administrator elevation (UAC) is not available.");
+ #[cfg(not(windows))]
+ {
+ eprintln!("WARNING: No usable polkit authentication agent found.");
+ eprintln!(" GUI privilege escalation (for writing to devices) may not work.");
+ eprintln!(" Install the polkit agent for your desktop environment.");
+ }
+ } else {
+ #[cfg(windows)]
+ println!("UAC looks ready. Litho will prompt for administrator approval per operation.");
+ #[cfg(not(windows))]
+ println!("Polkit agent looks ready for privilege escalation requests.");
+ }
+
+ match sidecar {
+ Ok(path) => println!("Litho sidecar path : {}", path.display()),
+ Err(err) => eprintln!("Litho sidecar missing : {err}"),
+ }
+}
+
+#[tauri::command]
+fn get_startup_diagnostics(app: tauri::AppHandle) -> StartupDiagnostics {
+ let sidecar = litho_sidecar::resolve_litho_binary(&app).ok();
+ perform_startup_checks_with_sidecar(sidecar.as_deref())
+}
+
+/// Spawn the litho CLI sidecar (via pkexec when not root) and stream GUI protocol
+/// lines back to the frontend as `litho-event` payloads.
+///
+/// When `block_size` is omitted, picks the largest I/O buffer allowed for the target
+/// device (same table as historical Lithographer `execute` / litho-tui).
+#[allow(clippy::too_many_arguments)]
+#[tauri::command]
+fn start_litho_operation(
+ app: tauri::AppHandle,
+ state: tauri::State<'_, SharedLithoRunner>,
+ mode: String,
+ device: String,
+ image: String,
+ block_size: Option,
+ verify: Option,
+ auto_unmount: Option,
+) -> Result<(), String> {
+ let diag = perform_startup_checks();
+ if !diag.is_root && !diag.polkit_agent_is_executable {
+ #[cfg(windows)]
+ return Err("Administrator elevation (UAC) is not available on this system.".to_string());
+ #[cfg(not(windows))]
+ return Err(format!(
+ "Elevation is not available ({}). On Fedora GNOME try LITHOGRAPHER_ELEVATION=pkexec; \
+ if polkit still fails, try LITHOGRAPHER_ELEVATION=sudo with a graphical askpass, \
+ or run: sudo ./lithographer*.AppImage",
+ diag.elevation_method
+ ));
+ }
+
+ let launch = parse_launch_args();
+ if launch.auto_run {
+ // UAC handoff replays the same device path; WMI may enumerate slightly later.
+ validate_device_for_operation(&device)?;
+ } else {
+ let known_devices = query_storage_devices()?;
+ let known_paths: Vec = known_devices.iter().map(|d| d.path.clone()).collect();
+ litho_devices::validate_listed_block_device(&device, &known_paths)
+ .map_err(map_device_validation_error)?;
+ }
+
+ let io_block_size = block_size.unwrap_or_else(|| litho_devices::optimal_io_block_size(&device));
+ let verify = verify.unwrap_or(launch.verify);
+ let auto_unmount = auto_unmount.unwrap_or(launch.auto_unmount);
+
+ spawn_litho_operation(
+ app,
+ Arc::clone(state.inner()),
+ LithoRunRequest {
+ mode,
+ device,
+ image,
+ block_size: io_block_size,
+ verify,
+ auto_unmount,
+ },
+ )
+}
+
+#[tauri::command]
+fn cancel_litho_operation(state: tauri::State<'_, SharedLithoRunner>) -> Result<(), String> {
+ stop_litho_child(state.inner())
+}
+
+#[tauri::command]
+fn get_litho_sidecar_path(app: tauri::AppHandle) -> Result {
+ litho_sidecar::resolve_litho_binary(&app).map(|p| p.to_string_lossy().to_string())
+}
+
+// Device enumeration and disk I/O use the litho Rust library (liblitho) in-process.
+
+#[derive(serde::Serialize, Clone, Debug)]
+pub struct DeviceMountInfo {
+ pub source: String,
+ pub mount_point: String,
+}
+
+#[derive(serde::Serialize, Clone, Debug)]
+pub struct StorageDeviceInfo {
+ /// Human friendly name, e.g. "SanDisk Ultra" or basename of the device
+ pub name: String,
+ /// Full device path, e.g. "/dev/sdb"
+ pub path: String,
+ /// Human readable size, e.g. "59.6 GB"
+ pub size: String,
+ pub removable: bool,
+ pub model: String,
+ /// True when partitions on this disk are mounted (Linux) or drive letters are assigned (Windows).
+ pub mounted: bool,
+ pub mounts: Vec,
+}
+
+fn validate_device_for_operation(device: &str) -> Result<(), String> {
+ litho_devices::validate_device_for_io(device).map_err(map_device_validation_error)
+}
+
+/// Map liblitho [`DeviceError`] (or any displayable validation error) to a GUI-facing string.
+fn map_device_validation_error(err: impl std::fmt::Display) -> String {
+ let err = err.to_string();
+ if err.contains("still mounted") || err.contains("device is mounted") {
+ return err;
+ }
+ if err.contains("system disk") {
+ return format!("{err} Choose a removable USB drive or another non-system disk.");
+ }
+ err
+}
+
+fn format_size_from_sectors(sectors: u64) -> String {
+ const SECTOR_SIZE: u64 = 512;
+ let bytes = sectors.saturating_mul(SECTOR_SIZE);
+ if bytes >= 1_000_000_000_000 {
+ format!("{:.1} TB", bytes as f64 / 1_000_000_000_000.0)
+ } else if bytes >= 1_000_000_000 {
+ format!("{:.1} GB", bytes as f64 / 1_000_000_000.0)
+ } else if bytes >= 1_000_000 {
+ format!("{:.1} MB", bytes as f64 / 1_000_000.0)
+ } else if bytes >= 1_000 {
+ format!("{:.1} KB", bytes as f64 / 1_000.0)
+ } else {
+ format!("{} B", bytes)
+ }
+}
+
+/// Query storage devices by calling the Rust API in the litho crate directly.
+fn query_storage_devices() -> Result, String> {
+ let raw_devices: Vec = litho_devices::get_storage_devices()
+ .map_err(|e| format!("Failed to get storage devices: {}", e))?;
+
+ let mut devices: Vec = raw_devices
+ .into_iter()
+ .map(|raw| {
+ let vendor = raw.vendor_name.trim();
+ let model = raw.model_name.trim();
+
+ let display_name = if !vendor.is_empty() || !model.is_empty() {
+ format!("{} {}", vendor, model).trim().to_string()
+ } else if let Some(basename) = raw.device_name.split('/').next_back() {
+ basename.to_string()
+ } else {
+ "Unknown Device".to_string()
+ };
+
+ let name = if display_name.is_empty() {
+ "Unknown Device".to_string()
+ } else {
+ display_name
+ };
+
+ let path = raw.device_name.clone();
+ let mounts: Vec = litho_devices::list_device_mounts(&path)
+ .unwrap_or_default()
+ .into_iter()
+ .map(|m| DeviceMountInfo {
+ source: m.source,
+ mount_point: m.mount_point,
+ })
+ .collect();
+ let mounted = !mounts.is_empty();
+
+ StorageDeviceInfo {
+ name,
+ path,
+ size: format_size_from_sectors(raw.size),
+ removable: raw.removable != 0,
+ model: model.to_string(),
+ mounted,
+ mounts,
+ }
+ })
+ .collect();
+
+ // Sort: removable devices first, then by path for stable order
+ devices.sort_by(|a, b| match (a.removable, b.removable) {
+ (true, false) => std::cmp::Ordering::Less,
+ (false, true) => std::cmp::Ordering::Greater,
+ _ => a.path.cmp(&b.path),
+ });
+
+ Ok(devices)
+}
+
+#[tauri::command]
+fn get_storage_devices() -> Result, String> {
+ query_storage_devices()
+}
+
+const IMAGE_EXTENSIONS: &[&str] = &["img", "iso", "raw", "dd", "bin", "xz", "wim", "dmg"];
+
+/// Resize the main window height to match rendered content (width unchanged).
+#[tauri::command]
+fn fit_window_to_content(window: tauri::WebviewWindow, content_height: f64) -> Result<(), String> {
+ use tauri::{LogicalSize, Size};
+
+ const MIN_HEIGHT: f64 = 360.0;
+
+ let scale = window.scale_factor().map_err(|e| e.to_string())?;
+ let outer = window.outer_size().map_err(|e| e.to_string())?;
+ let logical_width = outer.width as f64 / scale;
+ let height = content_height.max(MIN_HEIGHT);
+
+ window
+ .set_size(Size::Logical(LogicalSize {
+ width: logical_width,
+ height,
+ }))
+ .map_err(|e| e.to_string())
+}
+
+/// Native open/save dialog for flash source or clone destination.
+#[tauri::command]
+fn pick_image_path(mode: String) -> Result, String> {
+ let is_clone = mode.eq_ignore_ascii_case("clone") || mode.eq_ignore_ascii_case("backup");
+
+ let mut dialog = rfd::FileDialog::new();
+ dialog = dialog
+ .set_title(if is_clone {
+ "Choose output image file"
+ } else {
+ "Choose image to flash"
+ })
+ .add_filter("Disk images", IMAGE_EXTENSIONS)
+ .add_filter("All files", &["*"]);
+
+ let picked = if is_clone {
+ dialog.save_file()
+ } else {
+ dialog.pick_file()
+ };
+
+ Ok(picked.map(|p| p.to_string_lossy().into_owned()))
+}
+
+#[cfg_attr(mobile, tauri::mobile_entry_point)]
+pub fn run() {
+ let litho_runner: SharedLithoRunner = Arc::new(Mutex::new(LithoRunnerState::default()));
+
+ tauri::Builder::default()
+ .plugin(tauri_plugin_opener::init())
+ .manage(litho_runner)
+ .invoke_handler(tauri::generate_handler![
+ greet,
+ get_startup_diagnostics,
+ get_launch_params,
+ get_storage_devices,
+ pick_image_path,
+ fit_window_to_content,
+ start_litho_operation,
+ cancel_litho_operation,
+ get_litho_sidecar_path
+ ])
+ .setup(|_app| {
+ let sidecar = litho_sidecar::resolve_litho_binary(_app.handle());
+ let diag =
+ perform_startup_checks_with_sidecar(sidecar.as_ref().ok().map(|p| p.as_path()));
+ log_startup_report(&diag, &sidecar);
+
+ Ok(())
+ })
+ .build(tauri::generate_context!())
+ .expect("error while running tauri application")
+ .run(|_app_handle, event| {
+ if let tauri::RunEvent::Exit = event {
+ litho_sidecar::cleanup_staged_litho();
+ }
+ });
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_startup_diagnostics_runs_without_panic() {
+ let diag = perform_startup_checks();
+
+ // Basic sanity: we always get some strings
+ assert!(!diag.desktop_environment.is_empty());
+ assert!(!diag.current_user.is_empty());
+ assert!(!diag.polkit_status.is_empty());
+
+ // Print for visibility when running with --nocapture
+ println!("=== TEST: Startup Diagnostics ===");
+ println!("DE: {}", diag.desktop_environment);
+ println!("User: {}", diag.current_user);
+ println!("Root: {}", diag.is_root);
+ println!("Polkit agent: {:?}", diag.polkit_agent_path);
+ println!("Executable: {}", diag.polkit_agent_is_executable);
+ println!("Polkit status: {}", diag.polkit_status);
+ println!("=================================");
+ }
+
+ #[test]
+ fn test_desktop_env_detection() {
+ let de = privilege::platform_environment();
+ println!("Detected desktop environment: {}", de);
+ // Should not be empty
+ assert!(!de.is_empty());
+ }
+
+ #[test]
+ fn test_root_detection() {
+ let root = privilege::has_privileged_access();
+ println!("is_root() = {}", root);
+ // In normal test runs we are not root
+ // (this is informational)
+ }
+}
diff --git a/src-tauri/src/litho_output.rs b/src-tauri/src/litho_output.rs
new file mode 100644
index 0000000..03ec969
--- /dev/null
+++ b/src-tauri/src/litho_output.rs
@@ -0,0 +1,226 @@
+use serde::Serialize;
+
+/// Parsed line from `litho -o gui` stdout/stderr.
+#[derive(Debug, Clone, Serialize)]
+#[serde(tag = "type", rename_all = "snake_case")]
+pub enum LithoUiEvent {
+ Status {
+ phase: Option,
+ message: Option,
+ },
+ Progress {
+ phase: Option,
+ pct: Option,
+ bytes: Option,
+ total: Option,
+ message: Option,
+ },
+ Error {
+ message: String,
+ },
+ Done {
+ success: bool,
+ cancelled: bool,
+ },
+ Raw {
+ stream: String,
+ line: String,
+ },
+}
+
+pub fn parse_litho_line(stream: &str, line: &str) -> LithoUiEvent {
+ let trimmed = line.trim();
+ if trimmed.is_empty() {
+ return LithoUiEvent::Raw {
+ stream: stream.to_string(),
+ line: trimmed.to_string(),
+ };
+ }
+
+ if let Some(rest) = trimmed.strip_prefix("@status ") {
+ let fields = parse_fields(rest);
+ return LithoUiEvent::Status {
+ phase: fields.get("phase").cloned(),
+ message: fields.get("msg").cloned(),
+ };
+ }
+
+ if let Some(rest) = trimmed.strip_prefix("@progress ") {
+ let fields = parse_fields(rest);
+ return LithoUiEvent::Progress {
+ phase: fields.get("phase").cloned(),
+ pct: fields.get("pct").and_then(|v| v.parse().ok()),
+ bytes: fields.get("bytes").and_then(|v| v.parse().ok()),
+ total: fields.get("total").and_then(|v| v.parse().ok()),
+ message: fields.get("msg").cloned(),
+ };
+ }
+
+ if let Some(rest) = trimmed.strip_prefix("@error ") {
+ let fields = parse_fields(rest);
+ let message = fields
+ .get("msg")
+ .cloned()
+ .unwrap_or_else(|| rest.to_string());
+ return LithoUiEvent::Error { message };
+ }
+
+ if trimmed == "@done ok" {
+ return LithoUiEvent::Done {
+ success: true,
+ cancelled: false,
+ };
+ }
+
+ if trimmed == "@done cancelled" {
+ return LithoUiEvent::Done {
+ success: false,
+ cancelled: true,
+ };
+ }
+
+ if let Some(rest) = trimmed.strip_prefix("@done ") {
+ return LithoUiEvent::Done {
+ success: rest.eq_ignore_ascii_case("ok"),
+ cancelled: false,
+ };
+ }
+
+ LithoUiEvent::Raw {
+ stream: stream.to_string(),
+ line: trimmed.to_string(),
+ }
+}
+
+fn parse_fields(input: &str) -> std::collections::HashMap {
+ let mut fields = std::collections::HashMap::new();
+ let bytes = input.as_bytes();
+ let mut i = 0usize;
+
+ while i < bytes.len() {
+ while i < bytes.len() && bytes[i] == b' ' {
+ i += 1;
+ }
+ if i >= bytes.len() {
+ break;
+ }
+
+ let key_start = i;
+ while i < bytes.len() && bytes[i] != b'=' {
+ i += 1;
+ }
+ if i >= bytes.len() || bytes[i] != b'=' {
+ break;
+ }
+ let key = &input[key_start..i];
+ i += 1;
+
+ let value = if i < bytes.len() && bytes[i] == b'"' {
+ i += 1;
+ let mut value = String::new();
+ while i < bytes.len() {
+ match bytes[i] {
+ b'\\' if i + 1 < bytes.len() => {
+ value.push(bytes[i + 1] as char);
+ i += 2;
+ }
+ b'"' => {
+ i += 1;
+ break;
+ }
+ b => {
+ value.push(b as char);
+ i += 1;
+ }
+ }
+ }
+ value
+ } else {
+ let start = i;
+ while i < bytes.len() && bytes[i] != b' ' {
+ i += 1;
+ }
+ input[start..i].to_string()
+ };
+
+ fields.insert(key.to_string(), value);
+ }
+
+ fields
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn parse_progress_line() {
+ let event = parse_litho_line(
+ "stdout",
+ "@progress phase=writing pct=45.2 bytes=1234567 total=536870912",
+ );
+ match event {
+ LithoUiEvent::Progress {
+ phase,
+ pct,
+ bytes,
+ total,
+ ..
+ } => {
+ assert_eq!(phase.as_deref(), Some("writing"));
+ assert!((pct.unwrap() - 45.2).abs() < f64::EPSILON);
+ assert_eq!(bytes, Some(1_234_567));
+ assert_eq!(total, Some(536_870_912));
+ }
+ other => panic!("unexpected event: {other:?}"),
+ }
+ }
+
+ #[test]
+ fn parse_error_line() {
+ let event = parse_litho_line("stderr", r#"@error msg="Permission denied""#);
+ match event {
+ LithoUiEvent::Error { message } => assert_eq!(message, "Permission denied"),
+ other => panic!("unexpected event: {other:?}"),
+ }
+ }
+
+ #[test]
+ fn parse_done_ok() {
+ let event = parse_litho_line("stdout", "@done ok");
+ match event {
+ LithoUiEvent::Done { success, cancelled } => {
+ assert!(success);
+ assert!(!cancelled);
+ }
+ other => panic!("unexpected event: {other:?}"),
+ }
+ }
+
+ #[test]
+ fn parse_done_cancelled() {
+ let event = parse_litho_line("stdout", "@done cancelled");
+ match event {
+ LithoUiEvent::Done { success, cancelled } => {
+ assert!(!success);
+ assert!(cancelled);
+ }
+ other => panic!("unexpected event: {other:?}"),
+ }
+ }
+
+ #[test]
+ fn parse_progress_cancelled_phase() {
+ let event = parse_litho_line(
+ "stdout",
+ r#"@progress phase=cancelled msg="Clone cancelled""#,
+ );
+ match event {
+ LithoUiEvent::Progress { phase, message, .. } => {
+ assert_eq!(phase.as_deref(), Some("cancelled"));
+ assert_eq!(message.as_deref(), Some("Clone cancelled"));
+ }
+ other => panic!("unexpected event: {other:?}"),
+ }
+ }
+}
diff --git a/src-tauri/src/litho_runner.rs b/src-tauri/src/litho_runner.rs
new file mode 100644
index 0000000..996ceab
--- /dev/null
+++ b/src-tauri/src/litho_runner.rs
@@ -0,0 +1,440 @@
+use crate::litho_output::{parse_litho_line, LithoUiEvent};
+use crate::litho_sidecar::resolve_litho_binary;
+#[cfg(target_os = "linux")]
+use crate::privilege::build_elevated_litho_command;
+use crate::privilege::{elevation_method, has_privileged_access, spawn_mode};
+use liblitho::cancel::{create_cancel_file, remove_cancel_file, request_cancel_via_file};
+use liblitho::progress::STDIN_CANCEL_LINE;
+use std::io::{BufRead, BufReader, Write};
+use std::path::PathBuf;
+use std::process::{Child, ChildStdin, Command, Stdio};
+use std::sync::{Arc, Mutex};
+use tauri::{AppHandle, Emitter};
+
+/// Matches `cli_cancel::CANCEL_EXIT_CODE` in the litho CLI.
+const LITHO_CANCEL_EXIT_CODE: i32 = 3;
+
+/// Win32 ERROR_CANCELLED when the user denies a UAC prompt.
+#[cfg(windows)]
+const UAC_CANCELLED_EXIT: i32 = 1223;
+
+#[derive(Default)]
+pub struct LithoRunnerState {
+ pub child: Option,
+ pub child_stdin: Option,
+ pub cancel_file: Option,
+ pub running: bool,
+ pub cancel_requested: bool,
+}
+
+
+pub type SharedLithoRunner = Arc>;
+
+#[derive(Clone, Debug)]
+pub struct LithoRunRequest {
+ pub mode: String,
+ pub device: String,
+ pub image: String,
+ pub block_size: usize,
+ pub verify: bool,
+ /// User confirmed automatic unmount of volumes on the target disk (`--yes` for litho).
+ pub auto_unmount: bool,
+}
+
+pub fn spawn_litho_operation(
+ app: AppHandle,
+ state: SharedLithoRunner,
+ request: LithoRunRequest,
+) -> Result<(), String> {
+ {
+ let mut guard = state.lock().map_err(|e| e.to_string())?;
+ if guard.running {
+ return Err("An operation is already in progress.".to_string());
+ }
+ guard.cancel_requested = false;
+ }
+
+ let litho_path = resolve_litho_binary(&app)?;
+ liblitho::devices::validate_device_for_io(&request.device).map_err(|e| e.to_string())?;
+
+ #[cfg(windows)]
+ if !has_privileged_access() {
+ return handoff_to_elevated_lithographer(app, &request);
+ }
+
+ let cancel_file =
+ create_cancel_file().map_err(|e| format!("Failed to create cancel flag file: {e}"))?;
+
+ let device = request.device.clone();
+ let mode = request.mode.to_lowercase();
+ let subcommand = if mode == "clone" || mode == "backup" {
+ "clone"
+ } else {
+ "flash"
+ };
+
+ let mut litho_args = vec![
+ "-o".to_string(),
+ "gui".to_string(),
+ subcommand.to_string(),
+ "-f".to_string(),
+ request.image.clone(),
+ "-d".to_string(),
+ device.clone(),
+ "-b".to_string(),
+ request.block_size.to_string(),
+ "--cancel-file".to_string(),
+ cancel_file.display().to_string(),
+ ];
+
+ if subcommand == "flash" && request.verify {
+ litho_args.push("--verify".to_string());
+ }
+
+ // Lithographer only spawns litho after explicit user confirmation (Start / mount dialog).
+ // --yes lets litho auto-unmount/dismount volumes on the target disk before raw I/O.
+ let _ = request.auto_unmount;
+ litho_args.push("--yes".to_string());
+
+ let mut cmd = if has_privileged_access() {
+ let mut c = Command::new(&litho_path);
+ c.args(&litho_args);
+ #[cfg(windows)]
+ {
+ use std::os::windows::process::CommandExt;
+ // Console-subsystem litho.exe must not inherit or allocate a visible console;
+ // stdout/stderr are piped into the GUI protocol parser below.
+ const CREATE_NO_WINDOW: u32 = 0x0800_0000;
+ const DETACHED_PROCESS: u32 = 0x0000_0008;
+ detach_parent_console_before_spawn();
+ c.creation_flags(CREATE_NO_WINDOW | DETACHED_PROCESS);
+ }
+ c
+ } else {
+ #[cfg(target_os = "linux")]
+ {
+ build_elevated_litho_command(&litho_path, &litho_args)?
+ }
+ #[cfg(not(target_os = "linux"))]
+ {
+ return Err("Privileged flash/clone is not supported on this platform.".into());
+ }
+ };
+
+ cmd.stdout(Stdio::piped());
+ cmd.stderr(Stdio::piped());
+ cmd.stdin(Stdio::piped());
+
+ let launcher = if has_privileged_access() {
+ litho_path.display().to_string()
+ } else {
+ elevation_method()
+ };
+
+ println!(
+ "Spawning litho sidecar (mode={}, verify={}, cancel_file={}): {} {:?}",
+ spawn_mode(),
+ request.verify,
+ cancel_file.display(),
+ launcher,
+ litho_args
+ );
+
+ let mut child = cmd.spawn().map_err(|e| {
+ #[cfg(windows)]
+ {
+ format!("Failed to spawn litho: {e}.")
+ }
+ #[cfg(not(windows))]
+ {
+ format!("Failed to spawn litho: {e}. Is pkexec installed?")
+ }
+ })?;
+
+ let stdout = child
+ .stdout
+ .take()
+ .ok_or_else(|| "Failed to capture litho stdout".to_string())?;
+ let stderr = child
+ .stderr
+ .take()
+ .ok_or_else(|| "Failed to capture litho stderr".to_string())?;
+ let stdin = child
+ .stdin
+ .take()
+ .ok_or_else(|| "Failed to open litho stdin".to_string())?;
+
+ {
+ let mut guard = state.lock().map_err(|e| e.to_string())?;
+ guard.running = true;
+ guard.child = Some(child);
+ guard.child_stdin = Some(stdin);
+ guard.cancel_file = Some(cancel_file);
+ }
+
+ let app_stdout = app.clone();
+ std::thread::spawn(move || {
+ let reader = BufReader::new(stdout);
+ for line in reader.lines().map_while(Result::ok) {
+ emit_parsed_line(&app_stdout, "stdout", &line);
+ }
+ });
+
+ let app_stderr = app.clone();
+ std::thread::spawn(move || {
+ let reader = BufReader::new(stderr);
+ for line in reader.lines().map_while(Result::ok) {
+ emit_parsed_line(&app_stderr, "stderr", &line);
+ }
+ });
+
+ let app_wait = app.clone();
+ let state_wait = Arc::clone(&state);
+ std::thread::spawn(move || {
+ let mut child = {
+ let mut guard = match state_wait.lock() {
+ Ok(g) => g,
+ Err(_) => return,
+ };
+ guard.child_stdin.take();
+ guard.child.take()
+ };
+
+ let exit_code = child
+ .as_mut()
+ .and_then(|child| child.wait().ok().and_then(|status| status.code()));
+
+ finish_litho_operation(&app_wait, &state_wait, exit_code);
+ });
+
+ Ok(())
+}
+
+#[cfg(windows)]
+fn lithographer_elevation_cli_args(request: &LithoRunRequest) -> Vec {
+ let mut args = vec![
+ "--mode".to_string(),
+ request.mode.clone(),
+ "--device".to_string(),
+ request.device.clone(),
+ "--image".to_string(),
+ request.image.clone(),
+ "--block-size".to_string(),
+ request.block_size.to_string(),
+ "--auto-run".to_string(),
+ ];
+ if request.verify {
+ args.push("--verify".to_string());
+ }
+ if request.auto_unmount {
+ args.push("--auto-unmount".to_string());
+ }
+ args
+}
+
+/// Drop an inherited debug/dev console so a console-subsystem litho child cannot write
+/// progress to a stray terminal instead of our stdout pipe.
+#[cfg(windows)]
+fn detach_parent_console_before_spawn() {
+ use winapi::um::wincon::{FreeConsole, GetConsoleWindow};
+ use winapi::um::winuser::ShowWindow;
+ use winapi::um::winuser::SW_HIDE;
+
+ unsafe {
+ let hwnd = GetConsoleWindow();
+ if !hwnd.is_null() {
+ ShowWindow(hwnd, SW_HIDE);
+ }
+ let _ = FreeConsole();
+ }
+}
+
+/// UAC cannot pipe stdout from an elevated litho child. Relaunch Lithographer elevated
+/// so litho runs as a normal piped subprocess in the elevated GUI session.
+#[cfg(windows)]
+fn handoff_to_elevated_lithographer(
+ app: AppHandle,
+ request: &LithoRunRequest,
+) -> Result<(), String> {
+ let args = lithographer_elevation_cli_args(request);
+ println!(
+ "Handing off to elevated Lithographer (mode=uac-relaunch): {:?}",
+ args
+ );
+
+ crate::privilege::relaunch_elevated_lithographer(&args).map_err(|message| {
+ let _ = app.emit(
+ "litho-event",
+ LithoUiEvent::Error {
+ message: message.clone(),
+ },
+ );
+ message
+ })?;
+
+ let _ = app.emit(
+ "litho-event",
+ LithoUiEvent::Status {
+ phase: Some("preparing".to_string()),
+ message: Some(
+ "Approve UAC to open an elevated Lithographer window. Progress will stream there."
+ .to_string(),
+ ),
+ },
+ );
+
+ std::thread::spawn(|| {
+ std::thread::sleep(std::time::Duration::from_millis(600));
+ std::process::exit(0);
+ });
+
+ Ok(())
+}
+
+fn finish_litho_operation(app: &AppHandle, state: &SharedLithoRunner, exit_code: Option) {
+ let (cancel_requested, cancel_file) = {
+ let mut guard = match state.lock() {
+ Ok(g) => g,
+ Err(_) => return,
+ };
+ let cancel_requested = guard.cancel_requested;
+ let cancel_file = guard.cancel_file.take();
+ guard.running = false;
+ guard.cancel_requested = false;
+ guard.child_stdin = None;
+ guard.child = None;
+ (cancel_requested, cancel_file)
+ };
+
+ if let Some(path) = cancel_file {
+ remove_cancel_file(&path);
+ }
+
+ emit_completion_event(app, exit_code, cancel_requested);
+}
+
+pub fn cancel_litho_operation(state: &SharedLithoRunner) -> Result<(), String> {
+ let cancel_file = {
+ let mut guard = state.lock().map_err(|e| e.to_string())?;
+ if !guard.running {
+ return Ok(());
+ }
+ guard.cancel_requested = true;
+ guard.cancel_file.clone()
+ };
+
+ let path = cancel_file.ok_or_else(|| "Cancel flag file is not available.".to_string())?;
+ request_cancel_via_file(&path).map_err(|e| format!("Failed to write cancel flag file: {e}"))?;
+
+ // Stdin is a best-effort fallback when pkexec forwards it (usually it does not).
+ let mut guard = state.lock().map_err(|e| e.to_string())?;
+ if let Some(stdin) = guard.child_stdin.as_mut() {
+ let _ = writeln!(stdin, "{STDIN_CANCEL_LINE}");
+ let _ = stdin.flush();
+ }
+
+ Ok(())
+}
+
+fn emit_completion_event(app: &AppHandle, exit_code: Option, cancel_requested: bool) {
+ match exit_code {
+ Some(0) => {
+ let _ = app.emit(
+ "litho-event",
+ LithoUiEvent::Done {
+ success: true,
+ cancelled: false,
+ },
+ );
+ }
+ code if code == Some(LITHO_CANCEL_EXIT_CODE) || cancel_requested => {
+ let _ = app.emit(
+ "litho-event",
+ LithoUiEvent::Done {
+ success: false,
+ cancelled: true,
+ },
+ );
+ }
+ Some(126) => {
+ emit_auth_denied(app);
+ }
+ #[cfg(windows)]
+ Some(UAC_CANCELLED_EXIT) => {
+ emit_auth_denied(app);
+ }
+ Some(code) => {
+ let _ = app.emit(
+ "litho-event",
+ LithoUiEvent::Error {
+ message: litho_exit_message(code),
+ },
+ );
+ let _ = app.emit(
+ "litho-event",
+ LithoUiEvent::Done {
+ success: false,
+ cancelled: false,
+ },
+ );
+ }
+ None => {
+ let _ = app.emit(
+ "litho-event",
+ LithoUiEvent::Error {
+ message: "litho process ended without an exit code.".to_string(),
+ },
+ );
+ let _ = app.emit(
+ "litho-event",
+ LithoUiEvent::Done {
+ success: false,
+ cancelled: false,
+ },
+ );
+ }
+ }
+}
+
+fn litho_exit_message(code: i32) -> String {
+ #[cfg(windows)]
+ {
+ return match code {
+ 1 => "Flash/clone failed. The disk may be in use (close File Explorer on that drive), \
+ or access was denied. Run Lithographer from a console (or set LITHOGRAPHER_CONSOLE=1) \
+ for litho error details."
+ .to_string(),
+ 5 => "Flash/clone failed: access denied. Close programs using the target disk and retry."
+ .to_string(),
+ _ => format!(
+ "litho exited with code {code}. Run from a console for detailed litho output."
+ ),
+ };
+ }
+
+ #[cfg(not(windows))]
+ {
+ format!("litho exited with code {code}")
+ }
+}
+
+fn emit_auth_denied(app: &AppHandle) {
+ let _ = app.emit(
+ "litho-event",
+ LithoUiEvent::Error {
+ message: "Authentication was cancelled or denied.".to_string(),
+ },
+ );
+ let _ = app.emit(
+ "litho-event",
+ LithoUiEvent::Done {
+ success: false,
+ cancelled: false,
+ },
+ );
+}
+
+fn emit_parsed_line(app: &AppHandle, stream: &str, line: &str) {
+ let event = parse_litho_line(stream, line);
+ let _ = app.emit("litho-event", event);
+}
diff --git a/src-tauri/src/litho_sidecar.rs b/src-tauri/src/litho_sidecar.rs
new file mode 100644
index 0000000..5bf46e3
--- /dev/null
+++ b/src-tauri/src/litho_sidecar.rs
@@ -0,0 +1,249 @@
+#[cfg(unix)]
+use std::fs;
+use std::path::{Path, PathBuf};
+use std::sync::{Mutex, OnceLock};
+use tauri::{AppHandle, Manager};
+
+/// Path to a litho copy staged outside the AppImage FUSE mount for pkexec/sudo.
+static STAGED_LITHO: OnceLock>> = OnceLock::new();
+
+fn staged_litho_slot() -> &'static Mutex> {
+ STAGED_LITHO.get_or_init(|| Mutex::new(None))
+}
+
+/// Remove temporary artifacts created for privileged litho launch (AppImage staging, askpass helpers).
+pub fn cleanup_staged_litho() {
+ #[cfg(unix)]
+ {
+ let path = staged_litho_slot()
+ .lock()
+ .ok()
+ .and_then(|mut guard| guard.take());
+ if let Some(path) = path {
+ if is_staged_litho_path(&path) {
+ let _ = fs::remove_file(&path);
+ }
+ }
+
+ let zenity_helper = std::env::temp_dir().join(format!(
+ "lithographer-zenity-askpass-{}",
+ std::process::id()
+ ));
+ if zenity_helper.is_file() {
+ let _ = fs::remove_file(zenity_helper);
+ }
+ }
+}
+
+#[cfg(unix)]
+fn is_staged_litho_path(path: &Path) -> bool {
+ path.file_name()
+ .and_then(|name| name.to_str())
+ .map(|name| name.starts_with("lithographer-litho-"))
+ .unwrap_or(false)
+}
+
+/// Resolve the litho CLI binary for dev builds and bundled sidecar installs.
+pub fn resolve_litho_binary(app: &AppHandle) -> Result {
+ let path = resolve_litho_binary_raw(app)?;
+ #[cfg(unix)]
+ {
+ prepare_for_pkexec(&path)
+ }
+ #[cfg(not(unix))]
+ {
+ Ok(path)
+ }
+}
+
+fn resolve_litho_binary_raw(app: &AppHandle) -> Result {
+ if let Some(dev) = dev_litho_binary() {
+ return Ok(dev);
+ }
+
+ let mut tried = Vec::new();
+ for candidate in bundled_sidecar_candidates(app) {
+ tried.push(candidate.display().to_string());
+ if candidate.is_file() {
+ return Ok(candidate);
+ }
+ }
+
+ Err(format!(
+ "litho sidecar not found. Searched:\n - {}\nRebuild with `npm run prepare-sidecar && npm run tauri:build`.",
+ tried.join("\n - ")
+ ))
+}
+
+fn sidecar_filenames(triple: &str) -> Vec {
+ #[cfg(windows)]
+ let names = vec![
+ format!("litho-{triple}.exe"),
+ "litho.exe".to_string(),
+ format!("litho-{triple}"),
+ "litho".to_string(),
+ ];
+ #[cfg(not(windows))]
+ let names = vec![format!("litho-{triple}"), "litho".to_string()];
+ dedupe_strings(names)
+}
+
+fn sidecar_relpaths(triple: &str) -> Vec {
+ sidecar_filenames(triple)
+ .into_iter()
+ .map(|name| format!("binaries/{name}"))
+ .chain(sidecar_filenames(triple))
+ .collect()
+}
+
+fn dedupe_strings(values: Vec) -> Vec {
+ let mut out = Vec::new();
+ for value in values {
+ if !out.iter().any(|v| v == &value) {
+ out.push(value);
+ }
+ }
+ out
+}
+
+/// Tauri `externalBin: ["binaries/litho"]` installs the binary as `usr/bin/litho`
+/// in AppImages (not under `usr/lib/lithographer/binaries/…`). Check every layout.
+fn bundled_sidecar_candidates(app: &AppHandle) -> Vec {
+ let triple = env!("LITHO_TARGET_TRIPLE");
+ let mut candidates = Vec::new();
+
+ if let Ok(appdir) = std::env::var("APPDIR") {
+ for name in sidecar_filenames(triple) {
+ candidates.push(PathBuf::from(&appdir).join(format!("usr/bin/{name}")));
+ candidates
+ .push(PathBuf::from(&appdir).join(format!("usr/lib/lithographer/binaries/{name}")));
+ }
+ }
+
+ if let Ok(resource_dir) = app.path().resource_dir() {
+ for name in sidecar_filenames(triple) {
+ candidates.push(resource_dir.join(&name));
+ candidates.push(resource_dir.join(format!("binaries/{name}")));
+ }
+ }
+
+ for rel in sidecar_relpaths(triple) {
+ if let Ok(path) = app
+ .path()
+ .resolve(&rel, tauri::path::BaseDirectory::Resource)
+ {
+ candidates.push(path);
+ }
+ }
+
+ if let Ok(exe) = std::env::current_exe() {
+ if let Some(dir) = exe.parent() {
+ for name in sidecar_filenames(triple) {
+ candidates.push(dir.join(&name));
+ candidates.push(dir.join(format!("binaries/{name}")));
+ }
+ // AppImage mount: exe is usr/bin/lithographer
+ if let Some(usr) = dir.parent() {
+ candidates.push(usr.join("bin/litho"));
+ #[cfg(windows)]
+ candidates.push(usr.join("bin/litho.exe"));
+ }
+ }
+ }
+
+ // Source-tree layout for local `cargo tauri build` without AppImage.
+ let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
+ for name in sidecar_filenames(triple) {
+ candidates.push(manifest_dir.join(format!("binaries/{name}")));
+ }
+
+ dedupe_paths(candidates)
+}
+
+fn dedupe_paths(paths: Vec) -> Vec {
+ let mut out = Vec::new();
+ for path in paths {
+ if !out.iter().any(|p| p == &path) {
+ out.push(path);
+ }
+ }
+ out
+}
+
+/// pkexec runs as root and cannot execute binaries inside an AppImage FUSE mount.
+#[cfg(unix)]
+fn prepare_for_pkexec(path: &Path) -> Result {
+ let display = path.display().to_string();
+ let in_appimage = std::env::var("APPIMAGE").is_ok() || display.contains("/.mount_");
+ if !in_appimage {
+ return Ok(path.to_path_buf());
+ }
+
+ let dest = std::env::temp_dir().join(format!("lithographer-litho-{}", std::process::id()));
+ fs::copy(path, &dest).map_err(|e| format!("Failed to stage litho sidecar for pkexec: {e}"))?;
+ {
+ use std::os::unix::fs::PermissionsExt;
+ if let Ok(meta) = fs::metadata(&dest) {
+ let mut perms = meta.permissions();
+ perms.set_mode(0o755);
+ let _ = fs::set_permissions(&dest, perms);
+ }
+ }
+ if let Ok(mut guard) = staged_litho_slot().lock() {
+ *guard = Some(dest.clone());
+ }
+ Ok(dest)
+}
+
+fn dev_litho_binary() -> Option {
+ if !cfg!(debug_assertions) {
+ return None;
+ }
+
+ let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
+ let triple = env!("LITHO_TARGET_TRIPLE");
+
+ // Prefer release (typically built with real-io for sidecar) over debug (often simulated-io).
+ #[cfg(windows)]
+ let candidates = [
+ manifest_dir.join(format!("binaries/litho-{triple}.exe")),
+ manifest_dir.join("../../litho/target/release/litho.exe"),
+ manifest_dir.join("../../litho/target/debug/litho.exe"),
+ manifest_dir.join(format!("binaries/litho-{triple}")),
+ manifest_dir.join("../../litho/target/release/litho"),
+ manifest_dir.join("../../litho/target/debug/litho"),
+ ];
+ #[cfg(not(windows))]
+ let candidates = [
+ manifest_dir.join(format!("binaries/litho-{triple}")),
+ manifest_dir.join("../../litho/target/release/litho"),
+ manifest_dir.join("../../litho/target/debug/litho"),
+ ];
+
+ candidates.into_iter().find(|candidate| candidate.is_file())
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn dedupe_paths_removes_duplicates() {
+ let paths = dedupe_paths(vec![
+ PathBuf::from("/a"),
+ PathBuf::from("/a"),
+ PathBuf::from("/b"),
+ ]);
+ assert_eq!(paths.len(), 2);
+ }
+
+ #[cfg(windows)]
+ #[test]
+ fn windows_sidecar_filenames_include_exe() {
+ let names = sidecar_filenames("x86_64-pc-windows-msvc");
+ assert!(names
+ .iter()
+ .any(|n| n == "litho-x86_64-pc-windows-msvc.exe"));
+ assert!(names.iter().any(|n| n == "litho.exe"));
+ }
+}
diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs
index 8f048fb..706d579 100644
--- a/src-tauri/src/main.rs
+++ b/src-tauri/src/main.rs
@@ -1,160 +1,15 @@
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
-use litho;
-use nix::unistd::Uid;
-use serde::{Deserialize, Serialize};
-use std::process;
-use tauri::Window;
-
-#[derive(Serialize, Deserialize, Debug, Clone)]
-pub struct DeviceInfo {
- pub device_name: String,
- pub vendor_name: String,
- pub model_name: String,
- pub removable: u8,
- pub size: u64,
-}
-
-#[derive(Clone, serde::Serialize)]
-struct Progress {
- percentage: f64,
-}
-
-const BLOCKS: [u64; 14] = [
- 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608,
- 16777216, 33554432,
-];
-
-#[tauri::command]
-async fn get_root() -> Result {
- if !Uid::effective().is_root() {
- println!("not root");
- Ok(false)
- } else {
- Ok(true)
- }
-}
-
-#[tauri::command]
-async fn execute(
- operation: String,
- device: String,
- image: String,
- size: u64,
- window: Window,
-) -> Result {
- println!(
- "operation: {}, device: {}, image: {}, size:{}",
- operation, device, image, size
- );
-
- let callback = |percentage| {
- // println!("callback progress: {}", percentage);
- match window.emit("percent", Some(Progress { percentage })) {
- Ok(_) => {}
- Err(e) => {
- println!("error occured while emitting progress: {}", e);
- }
- };
- };
- let mut block_size: u64 = 0;
- if size < BLOCKS[0] || size > BLOCKS[13] {
- println!("size is not in the range of 4096 to 33554432");
- return Err("".to_string());
- }
- // calculate the max block size
- for i in 0..BLOCKS.len() {
- if size <= BLOCKS[i] {
- block_size = BLOCKS[i];
- break;
- }
- }
-
- if operation == "flash".to_string() {
- let _ = litho::flash(image, device, block_size as usize, false, callback);
- } else if operation == "clone".to_string() {
- let _ = litho::clone(device, image, block_size as usize, false, callback);
- }
- Ok("".to_string())
-}
-
-fn validate_and_execute(
- operation: String,
- device: String,
- image: String,
-) -> Result {
- println!(
- "operation: {}, device: {}, image: {}",
- operation, device, image
- );
- if litho::devices::is_removable_device(&device).unwrap() {
- println!("device is removable");
- } else {
- println!("device is not removable");
- }
- Ok("".to_string())
-}
-
-#[tauri::command]
-fn get_storage_devices() -> Result, String> {
- litho::devices::get_storage_devices()
-}
+mod win_console;
fn main() {
- tauri::Builder::default()
- .setup(|app| {
- match app.get_cli_matches() {
- Ok(matches) => {
- // println!("{:?}", matches);
- match matches.subcommand {
- Some(subcommand) => {
- println!("subcommand found: {:?}", subcommand);
- subcommand.matches.args.iter().for_each(|(key, value)| {
- println!("key: {:?}, value: {}", key, value.value);
- });
- let operation = subcommand.name;
- let image = subcommand
- .matches
- .args
- .get("file")
- .unwrap()
- .value
- .as_str()
- .unwrap()
- .to_string();
- // .clone()
- // .to_string();
- let device = subcommand
- .matches
- .args
- .get("disk")
- .unwrap()
- .value
- .as_str()
- .unwrap()
- .to_string()
- .clone();
+ // Must run before any `println!` so Rust stdio picks up the console handles.
+ #[cfg(windows)]
+ win_console::ensure();
+
+ #[cfg(target_os = "linux")]
+ std::env::set_var("WEBKIT_DISABLE_COMPOSITING_MODE", "1");
- let _ = validate_and_execute(operation, device, image);
- process::exit(0);
- }
- None => {
- // println!("no subcommand found");
- }
- }
- }
- Err(e) => {
- println!("error occured while parsing the cli args: {}", e);
- }
- }
- Ok(())
- })
- .invoke_handler(tauri::generate_handler![
- get_storage_devices,
- execute,
- get_root
- ])
- .run(tauri::generate_context!())
- .expect("error while running tauri application");
+ lithographer_lib::run()
}
diff --git a/src-tauri/src/privilege/linux.rs b/src-tauri/src/privilege/linux.rs
new file mode 100644
index 0000000..2b245a7
--- /dev/null
+++ b/src-tauri/src/privilege/linux.rs
@@ -0,0 +1,238 @@
+use std::fs;
+use std::path::Path;
+use std::process::Command;
+
+/// How litho is elevated when the GUI is unprivileged.
+#[derive(Clone, Copy, Debug, PartialEq, Eq)]
+pub enum ElevationBackend {
+ Pkexec,
+ SudoAskpass,
+ Run0,
+}
+
+pub fn is_running_as_root() -> bool {
+ if let Ok(output) = Command::new("id").arg("-u").output() {
+ let uid = String::from_utf8_lossy(&output.stdout).trim().to_string();
+ uid == "0"
+ } else {
+ false
+ }
+}
+
+/// Whether privilege escalation can plausibly show an auth dialog on this session.
+pub fn polkit_agent_ready() -> bool {
+ match elevation_backend() {
+ ElevationBackend::Pkexec => {
+ find_polkit_auth_agent().is_some() || gnome_shell_polkit_ready() || pkexec_on_path()
+ }
+ ElevationBackend::Run0 => run0_on_path(),
+ ElevationBackend::SudoAskpass => command_on_path("sudo") && resolve_sudo_askpass().is_ok(),
+ }
+}
+
+pub fn elevation_backend() -> ElevationBackend {
+ match std::env::var("LITHOGRAPHER_ELEVATION")
+ .unwrap_or_default()
+ .to_ascii_lowercase()
+ .as_str()
+ {
+ "sudo" | "sudo-askpass" => ElevationBackend::SudoAskpass,
+ "run0" => ElevationBackend::Run0,
+ _ => ElevationBackend::Pkexec,
+ }
+}
+
+pub fn elevation_backend_label(backend: ElevationBackend) -> &'static str {
+ match backend {
+ ElevationBackend::Pkexec => "pkexec",
+ ElevationBackend::SudoAskpass => "sudo -A",
+ ElevationBackend::Run0 => "run0",
+ }
+}
+
+/// Build a command that runs `litho` with `args` using the configured elevation backend.
+pub fn build_elevated_litho_command(litho_path: &Path, args: &[String]) -> Result {
+ let backend = elevation_backend();
+ match backend {
+ ElevationBackend::Pkexec => build_pkexec_command(litho_path, args),
+ ElevationBackend::SudoAskpass => build_sudo_askpass_command(litho_path, args),
+ ElevationBackend::Run0 => build_run0_command(litho_path, args),
+ }
+}
+
+fn build_pkexec_command(litho_path: &Path, args: &[String]) -> Result {
+ if !pkexec_on_path() {
+ return Err("pkexec not found. Install polkit or set LITHOGRAPHER_ELEVATION=sudo.".into());
+ }
+ let mut cmd = Command::new("pkexec");
+ cmd.arg(litho_path);
+ cmd.args(args);
+ Ok(cmd)
+}
+
+fn build_run0_command(litho_path: &Path, args: &[String]) -> Result {
+ if !run0_on_path() {
+ return Err(
+ "run0 not found. Install systemd (Fedora 41+) or set LITHOGRAPHER_ELEVATION=pkexec."
+ .into(),
+ );
+ }
+ let mut cmd = Command::new("run0");
+ cmd.arg(litho_path);
+ cmd.args(args);
+ Ok(cmd)
+}
+
+fn build_sudo_askpass_command(litho_path: &Path, args: &[String]) -> Result {
+ let askpass = resolve_sudo_askpass()?;
+ let mut cmd = Command::new("sudo");
+ cmd.env("SUDO_ASKPASS", askpass);
+ cmd.arg("-A");
+ cmd.arg(litho_path);
+ cmd.args(args);
+ Ok(cmd)
+}
+
+fn resolve_sudo_askpass() -> Result {
+ if let Ok(path) = std::env::var("SUDO_ASKPASS") {
+ if !path.is_empty() && Path::new(&path).is_file() {
+ return Ok(path);
+ }
+ }
+
+ for path in [
+ "/usr/bin/ksshaskpass",
+ "/usr/bin/kdialog",
+ "/usr/bin/zenity",
+ "/usr/libexec/openssh/gnome-ssh-askpass",
+ "/usr/libexec/ssh-askpass",
+ "/usr/bin/ssh-askpass",
+ "/usr/bin/x11-ssh-askpass",
+ ] {
+ if fs::metadata(path).map(|m| m.is_file()).unwrap_or(false) {
+ if path.ends_with("zenity") {
+ return write_zenity_askpass_helper();
+ }
+ return Ok(path.to_string());
+ }
+ }
+
+ Err(
+ "No graphical sudo askpass found. Set SUDO_ASKPASS, install ksshaskpass/zenity, \
+ or use LITHOGRAPHER_ELEVATION=pkexec."
+ .into(),
+ )
+}
+
+fn write_zenity_askpass_helper() -> Result {
+ let helper = std::env::temp_dir().join(format!(
+ "lithographer-zenity-askpass-{}",
+ std::process::id()
+ ));
+ let script = "#!/bin/sh\nexec zenity --password --title=\"Lithographer requires administrator access\"\n";
+ fs::write(&helper, script)
+ .map_err(|e| format!("Failed to write zenity askpass helper: {e}"))?;
+ {
+ use std::os::unix::fs::PermissionsExt;
+ let mut perms = fs::metadata(&helper)
+ .map_err(|e| format!("Failed to chmod zenity askpass helper: {e}"))?
+ .permissions();
+ perms.set_mode(0o755);
+ fs::set_permissions(&helper, perms)
+ .map_err(|e| format!("Failed to chmod zenity askpass helper: {e}"))?;
+ }
+ Ok(helper.to_string_lossy().into_owned())
+}
+
+fn pkexec_on_path() -> bool {
+ command_on_path("pkexec")
+}
+
+fn run0_on_path() -> bool {
+ command_on_path("run0")
+}
+
+fn command_on_path(name: &str) -> bool {
+ Command::new("which")
+ .arg(name)
+ .output()
+ .map(|o| o.status.success())
+ .unwrap_or(false)
+}
+
+/// Fedora/GNOME: polkit-gnome was retired; gnome-shell provides the auth UI in-session.
+fn gnome_shell_polkit_ready() -> bool {
+ let desktop = std::env::var("XDG_CURRENT_DESKTOP")
+ .or_else(|_| std::env::var("GNOME_DESKTOP_SESSION_ID").map(|_| "GNOME".to_string()))
+ .unwrap_or_default()
+ .to_lowercase();
+ if !desktop.contains("gnome") {
+ return false;
+ }
+
+ let user = std::env::var("USER")
+ .or_else(|_| std::env::var("LOGNAME"))
+ .unwrap_or_default();
+
+ if user.is_empty() {
+ return false;
+ }
+
+ if let Ok(output) = Command::new("ps")
+ .args(["-u", &user, "-o", "comm=", "--no-headers"])
+ .output()
+ {
+ let stdout = String::from_utf8_lossy(&output.stdout).to_lowercase();
+ return stdout.lines().any(|line| line.trim() == "gnome-shell");
+ }
+
+ false
+}
+
+fn find_polkit_auth_agent() -> Option {
+ let user = std::env::var("USER")
+ .or_else(|_| std::env::var("LOGNAME"))
+ .unwrap_or_default();
+
+ if let Ok(output) = Command::new("ps")
+ .args(["-u", &user, "-o", "pid,comm,args", "--no-headers"])
+ .output()
+ {
+ let stdout = String::from_utf8_lossy(&output.stdout);
+ for line in stdout.lines() {
+ let lower = line.to_lowercase();
+ if lower.contains("polkit")
+ && (lower.contains("agent") || lower.contains("-authentication-agent"))
+ {
+ for token in line.split_whitespace() {
+ if token.starts_with('/') && token.contains("polkit")
+ && fs::metadata(token).map(|m| m.is_file()).unwrap_or(false) {
+ return Some(token.to_string());
+ }
+ }
+ }
+ }
+ }
+
+ for path in [
+ "/usr/libexec/polkit-gnome-authentication-agent-1",
+ "/usr/libexec/polkit-kde-authentication-agent-1",
+ "/usr/libexec/polkit-mate-authentication-agent-1",
+ "/usr/bin/lxpolkit",
+ "/usr/libexec/xfce-polkit",
+ ] {
+ if fs::metadata(path).map(|m| m.is_file()).unwrap_or(false) {
+ return Some(path.to_string());
+ }
+ }
+
+ if gnome_shell_polkit_ready() {
+ return Some("gnome-shell (built-in polkit)".to_string());
+ }
+
+ None
+}
+
+pub fn elevation_agent_description() -> Option {
+ find_polkit_auth_agent()
+}
diff --git a/src-tauri/src/privilege/mod.rs b/src-tauri/src/privilege/mod.rs
new file mode 100644
index 0000000..80ce27e
--- /dev/null
+++ b/src-tauri/src/privilege/mod.rs
@@ -0,0 +1,113 @@
+#[cfg(target_os = "linux")]
+mod linux;
+#[cfg(windows)]
+mod windows;
+
+/// Whether the process can perform privileged block I/O without further elevation.
+pub fn has_privileged_access() -> bool {
+ #[cfg(target_os = "linux")]
+ {
+ linux::is_running_as_root()
+ }
+ #[cfg(windows)]
+ {
+ windows::is_elevated()
+ }
+ #[cfg(not(any(target_os = "linux", windows)))]
+ {
+ false
+ }
+}
+
+/// Short elevation backend label for logs and diagnostics.
+pub fn elevation_method() -> String {
+ #[cfg(target_os = "linux")]
+ {
+ linux::elevation_backend_label(linux::elevation_backend()).to_string()
+ }
+ #[cfg(windows)]
+ {
+ "uac".to_string()
+ }
+ #[cfg(not(any(target_os = "linux", windows)))]
+ {
+ "unsupported".to_string()
+ }
+}
+
+#[cfg(target_os = "linux")]
+pub use linux::build_elevated_litho_command;
+
+/// How litho will be launched for the next privileged operation.
+pub fn spawn_mode() -> String {
+ if has_privileged_access() {
+ "direct".to_string()
+ } else {
+ #[cfg(windows)]
+ {
+ "uac-relaunch".to_string()
+ }
+ #[cfg(target_os = "linux")]
+ {
+ linux::elevation_backend_label(linux::elevation_backend()).to_string()
+ }
+ #[cfg(not(any(windows, target_os = "linux")))]
+ {
+ elevation_method()
+ }
+ }
+}
+
+/// OS / desktop environment label for startup diagnostics.
+pub fn platform_environment() -> String {
+ #[cfg(windows)]
+ {
+ windows::environment_label()
+ }
+ #[cfg(target_os = "linux")]
+ {
+ std::env::var("XDG_CURRENT_DESKTOP")
+ .or_else(|_| std::env::var("DESKTOP_SESSION"))
+ .or_else(|_| std::env::var("GDMSESSION"))
+ .unwrap_or_else(|_| "Linux".to_string())
+ }
+ #[cfg(not(any(windows, target_os = "linux")))]
+ {
+ "unknown".to_string()
+ }
+}
+
+/// Human-readable elevation agent (polkit agent path or gnome-shell hint).
+pub fn elevation_agent_description() -> Option {
+ #[cfg(target_os = "linux")]
+ {
+ linux::elevation_agent_description()
+ }
+ #[cfg(windows)]
+ {
+ Some("UAC (User Account Control)".to_string())
+ }
+ #[cfg(not(any(target_os = "linux", windows)))]
+ {
+ None
+ }
+}
+
+/// Whether privilege escalation can be requested on this machine.
+pub fn elevation_ready() -> bool {
+ #[cfg(target_os = "linux")]
+ {
+ linux::polkit_agent_ready()
+ }
+ #[cfg(windows)]
+ {
+ true
+ }
+ #[cfg(not(any(target_os = "linux", windows)))]
+ {
+ false
+ }
+}
+
+#[cfg(windows)]
+pub use windows::relaunch_elevated_lithographer;
diff --git a/src-tauri/src/privilege/windows.rs b/src-tauri/src/privilege/windows.rs
new file mode 100644
index 0000000..f4713e1
--- /dev/null
+++ b/src-tauri/src/privilege/windows.rs
@@ -0,0 +1,201 @@
+use std::ffi::OsStr;
+use std::mem;
+use std::os::windows::ffi::OsStrExt;
+use std::path::Path;
+use std::ptr;
+use winapi::shared::minwindef::DWORD;
+use winapi::shared::winerror::ERROR_CANCELLED;
+use winapi::um::handleapi::CloseHandle;
+use winapi::um::processthreadsapi::{GetCurrentProcess, GetExitCodeProcess, OpenProcessToken};
+use winapi::um::securitybaseapi::GetTokenInformation;
+use winapi::um::shellapi::{
+ ShellExecuteExW, ShellExecuteW, SEE_MASK_NOCLOSEPROCESS, SHELLEXECUTEINFOW,
+};
+use winapi::um::synchapi::WaitForSingleObject;
+use winapi::um::winbase::INFINITE;
+use winapi::um::winnt::{TokenElevation, TOKEN_ELEVATION, TOKEN_QUERY};
+use winapi::um::winuser::SW_SHOW;
+
+const UAC_CANCELLED_EXIT: i32 = 1223;
+
+/// Human-readable Windows version for startup diagnostics.
+pub fn environment_label() -> String {
+ use winapi::um::sysinfoapi::GetVersionExW;
+ use winapi::um::winnt::OSVERSIONINFOEXW;
+
+ let mut info = OSVERSIONINFOEXW {
+ dwOSVersionInfoSize: mem::size_of::() as u32,
+ dwMajorVersion: 0,
+ dwMinorVersion: 0,
+ dwBuildNumber: 0,
+ dwPlatformId: 0,
+ szCSDVersion: [0; 128],
+ wServicePackMajor: 0,
+ wServicePackMinor: 0,
+ wSuiteMask: 0,
+ wProductType: 0,
+ wReserved: 0,
+ };
+
+ let arch = std::env::consts::ARCH;
+ let ok = unsafe { GetVersionExW(&mut info as *mut _ as *mut _) };
+ if ok == 0 {
+ return format!("Windows ({arch})");
+ }
+
+ let product = if info.dwMajorVersion >= 10 && info.dwBuildNumber >= 22000 {
+ "Windows 11"
+ } else if info.dwMajorVersion >= 10 {
+ "Windows 10"
+ } else {
+ "Windows"
+ };
+
+ format!(
+ "{product} {major}.{minor} (build {build}, {arch})",
+ major = info.dwMajorVersion,
+ minor = info.dwMinorVersion,
+ build = info.dwBuildNumber
+ )
+}
+
+pub fn is_elevated() -> bool {
+ unsafe {
+ let mut token = ptr::null_mut();
+ if OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &mut token) == 0 {
+ return false;
+ }
+
+ let mut elevation = TOKEN_ELEVATION { TokenIsElevated: 0 };
+ let mut size = 0;
+ let ok = GetTokenInformation(
+ token,
+ TokenElevation,
+ &mut elevation as *mut _ as *mut _,
+ mem::size_of::() as u32,
+ &mut size,
+ );
+ CloseHandle(token);
+
+ ok != 0 && elevation.TokenIsElevated != 0
+ }
+}
+
+/// Spawn an elevated Lithographer child via UAC with the same flash/clone selections.
+/// The unprivileged caller should exit after `Ok(())` so only the elevated window remains.
+pub fn relaunch_elevated_lithographer(args: &[String]) -> Result<(), String> {
+ if is_elevated() {
+ return Err("Already running with administrator privileges.".into());
+ }
+
+ let exe = std::env::current_exe().map_err(|e| format!("Could not resolve executable: {e}"))?;
+ let parameters = windows_argument_string(args);
+
+ let verb = wide("runas");
+ let file = wide(&exe.to_string_lossy());
+ let params = wide(¶meters);
+
+ let status = unsafe {
+ ShellExecuteW(
+ ptr::null_mut(),
+ verb.as_ptr(),
+ file.as_ptr(),
+ params.as_ptr(),
+ ptr::null(),
+ SW_SHOW,
+ )
+ };
+
+ if (status as isize) <= 32 {
+ if (status as isize) == 1223 {
+ return Err(
+ "UAC elevation was cancelled or denied. Flash/clone requires administrator access."
+ .into(),
+ );
+ }
+ return Err(format!(
+ "UAC elevation failed (ShellExecute code {}). Try running Lithographer as administrator.",
+ status as isize
+ ));
+ }
+
+ Ok(())
+}
+
+/// Launch litho elevated via UAC and wait (no stdout capture). Prefer
+/// `relaunch_elevated_lithographer` so litho runs as a piped child instead.
+#[allow(dead_code)]
+pub fn spawn_elevated_litho_and_wait(
+ litho_path: &Path,
+ args: &[String],
+) -> Result, String> {
+ let verb = wide("runas");
+ let file = wide(&litho_path.to_string_lossy());
+ let parameters = wide(&windows_argument_string(args));
+
+ let mut info = unsafe { mem::zeroed::() };
+ info.cbSize = mem::size_of::() as u32;
+ info.fMask = SEE_MASK_NOCLOSEPROCESS;
+ info.lpVerb = verb.as_ptr();
+ info.lpFile = file.as_ptr();
+ info.lpParameters = parameters.as_ptr();
+ info.nShow = SW_SHOW;
+
+ let ok = unsafe { ShellExecuteExW(&mut info) };
+ if ok == 0 {
+ let code = unsafe { winapi::um::errhandlingapi::GetLastError() };
+ if code == ERROR_CANCELLED {
+ return Ok(Some(UAC_CANCELLED_EXIT));
+ }
+ return Err(format!(
+ "UAC elevation failed (Win32 error {code}). Try running Lithographer as administrator."
+ ));
+ }
+
+ if info.hProcess.is_null() {
+ return Err("UAC elevation succeeded but no process handle was returned.".into());
+ }
+
+ let wait = unsafe { WaitForSingleObject(info.hProcess, INFINITE) };
+ if wait != 0 {
+ unsafe {
+ CloseHandle(info.hProcess);
+ }
+ return Err(format!(
+ "Failed waiting for elevated litho process (code {wait})."
+ ));
+ }
+
+ let mut exit_code: DWORD = 0;
+ let got_code = unsafe { GetExitCodeProcess(info.hProcess, &mut exit_code) };
+ unsafe {
+ CloseHandle(info.hProcess);
+ }
+
+ if got_code == 0 {
+ return Err("Failed to read litho exit code.".into());
+ }
+
+ Ok(Some(exit_code as i32))
+}
+
+fn windows_argument_string(args: &[String]) -> String {
+ args.iter()
+ .map(|arg| {
+ if needs_windows_quoting(arg) {
+ format!("\"{}\"", arg.replace('"', "\\\""))
+ } else {
+ arg.clone()
+ }
+ })
+ .collect::>()
+ .join(" ")
+}
+
+fn needs_windows_quoting(arg: &str) -> bool {
+ arg.is_empty() || arg.chars().any(|c| c.is_whitespace() || c == '"') || arg.contains('\\')
+}
+
+fn wide(value: &str) -> Vec {
+ OsStr::new(value).encode_wide().chain(Some(0)).collect()
+}
diff --git a/src-tauri/src/win_console.rs b/src-tauri/src/win_console.rs
new file mode 100644
index 0000000..c39f895
--- /dev/null
+++ b/src-tauri/src/win_console.rs
@@ -0,0 +1,92 @@
+//! Attach or allocate a Windows console so `println!` / `eprintln!` reach a terminal.
+//!
+//! GUI-subsystem executables (and child processes spawned by `cargo tauri dev`) do not
+//! inherit stdout/stderr unless we attach to the parent console or allocate one.
+
+#[cfg(windows)]
+pub fn ensure() {
+ use std::sync::Once;
+
+ static INIT: Once = Once::new();
+ INIT.call_once(attach_or_allocate_console);
+}
+
+#[cfg(windows)]
+fn launch_args_want_console() -> bool {
+ if std::env::var_os("LITHOGRAPHER_CONSOLE").is_some_and(|v| !v.is_empty() && v != "0") {
+ return true;
+ }
+ // Elevated relaunch after UAC should not open a stray console; litho runs as a hidden
+ // piped child and streams progress into the GUI instead.
+ let args: Vec = std::env::args().skip(1).collect();
+ !args.iter().any(|arg| arg == "--auto-run")
+}
+
+#[cfg(windows)]
+fn attach_or_allocate_console() {
+ use std::ffi::OsStr;
+ use std::os::windows::ffi::OsStrExt;
+ use winapi::um::consoleapi::AllocConsole;
+ use winapi::um::errhandlingapi::GetLastError;
+ use winapi::um::winbase::{STD_ERROR_HANDLE, STD_OUTPUT_HANDLE};
+ use winapi::um::wincon::{AttachConsole, SetConsoleTitleW, ATTACH_PARENT_PROCESS};
+
+ if !launch_args_want_console() {
+ return;
+ }
+
+ let attached = unsafe { AttachConsole(ATTACH_PARENT_PROCESS) != 0 };
+ if !attached {
+ let want_console = cfg!(debug_assertions)
+ || std::env::var_os("LITHOGRAPHER_CONSOLE").is_some_and(|v| !v.is_empty() && v != "0");
+ if !want_console {
+ return;
+ }
+ if unsafe { AllocConsole() } == 0 {
+ // Already has a console, or allocation failed — still try to wire std handles.
+ let _ = unsafe { GetLastError() };
+ } else {
+ let title: Vec = OsStr::new("Lithographer")
+ .encode_wide()
+ .chain(Some(0))
+ .collect();
+ unsafe {
+ SetConsoleTitleW(title.as_ptr());
+ }
+ }
+ }
+
+ reopen_std_handle(STD_OUTPUT_HANDLE);
+ reopen_std_handle(STD_ERROR_HANDLE);
+}
+
+#[cfg(windows)]
+fn reopen_std_handle(std_handle: winapi::shared::minwindef::DWORD) {
+ use std::ffi::OsStr;
+ use std::os::windows::ffi::OsStrExt;
+ use winapi::um::fileapi::{CreateFileW, OPEN_EXISTING};
+ use winapi::um::handleapi::INVALID_HANDLE_VALUE;
+ use winapi::um::processenv::SetStdHandle;
+ use winapi::um::winnt::{FILE_ATTRIBUTE_NORMAL, FILE_SHARE_WRITE, GENERIC_WRITE};
+
+ let conout: Vec = OsStr::new("CONOUT$").encode_wide().chain(Some(0)).collect();
+
+ unsafe {
+ let handle = CreateFileW(
+ conout.as_ptr(),
+ GENERIC_WRITE,
+ FILE_SHARE_WRITE,
+ std::ptr::null_mut(),
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ std::ptr::null_mut(),
+ );
+ if handle != INVALID_HANDLE_VALUE {
+ SetStdHandle(std_handle, handle);
+ }
+ }
+}
+
+#[cfg(not(windows))]
+#[allow(dead_code)]
+pub fn ensure() {}
diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json
index 1b84d66..19f8f7e 100644
--- a/src-tauri/tauri.conf.json
+++ b/src-tauri/tauri.conf.json
@@ -1,95 +1,42 @@
{
+ "$schema": "https://schema.tauri.app/config/2",
+ "productName": "lithographer",
+ "version": "0.1.0",
+ "identifier": "com.girish.lithographer",
"build": {
- "beforeDevCommand": "",
- "beforeBuildCommand": "",
- "devPath": "../src",
- "distDir": "../src",
- "withGlobalTauri": true
+ "frontendDist": "../src"
},
- "package": {
- "productName": "lithographer",
- "version": "0.0.1"
- },
- "tauri": {
- "allowlist": {
- "all": false,
- "fs": {
- "all": false
- },
- "dialog": {
- "all": false,
- "open": true,
- "save": true
- },
- "shell": {
- "all": false,
- "execute": true
- }
- },
- "bundle": {
- "active": true,
- "targets": "all",
- "identifier": "com.lithographer.dev",
- "icon": [
- "icons/32x32.png",
- "icons/128x128.png",
- "icons/128x128@2x.png",
- "icons/icon.icns",
- "icons/icon.ico"
- ]
- },
- "cli": {
- "description": "",
- "longDescription": "",
- "beforeHelp": "",
- "afterHelp": "",
- "args": [],
- "subcommands": {
- "clone": {
- "args": [
- {
- "name": "file",
- "short": "f",
- "takesValue": true,
- "multiple": false
- },
- {
- "name": "disk",
- "short": "d",
- "takesValue": true,
- "multiple": false
- }
- ]
- },
- "flash": {
- "args": [
- {
- "name": "file",
- "short": "f",
- "takesValue": true,
- "multiple": false
- },
- {
- "name": "disk",
- "short": "d",
- "takesValue": true,
- "multiple": false
- }
- ]
- }
- }
- },
- "security": {
- "csp": null
- },
+ "app": {
+ "withGlobalTauri": true,
"windows": [
{
- "fullscreen": false,
- "resizable": false,
+ "label": "main",
"title": "lithographer",
- "width": 1215,
- "height": 600
+ "width": 920,
+ "height": 720,
+ "minWidth": 300,
+ "minHeight": 360,
+ "resizable": true,
+ "decorations": true
}
+ ],
+ "security": {
+ "csp": null
+ }
+ },
+ "bundle": {
+ "active": true,
+ "targets": "all",
+ "icon": [
+ "icons/32x32.png",
+ "icons/128x128.png",
+ "icons/128x128@2x.png",
+ "icons/icon.icns",
+ "icons/icon.ico"
+ ],
+ "resources": [],
+ "externalBin": [
+ "binaries/litho"
]
}
}
diff --git a/src-tauri/tauri.linux.conf.json b/src-tauri/tauri.linux.conf.json
new file mode 100644
index 0000000..e1a56cf
--- /dev/null
+++ b/src-tauri/tauri.linux.conf.json
@@ -0,0 +1,16 @@
+{
+ "app": {
+ "windows": [
+ {
+ "label": "main",
+ "title": "lithographer",
+ "width": 920,
+ "height": 720,
+ "minWidth": 300,
+ "minHeight": 360,
+ "resizable": true,
+ "decorations": false
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json
new file mode 100644
index 0000000..375bf08
--- /dev/null
+++ b/src-tauri/tauri.windows.conf.json
@@ -0,0 +1,16 @@
+{
+ "app": {
+ "windows": [
+ {
+ "label": "main",
+ "title": "lithographer",
+ "width": 920,
+ "height": 720,
+ "minWidth": 300,
+ "minHeight": 360,
+ "resizable": true,
+ "decorations": true
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/src/assets/dark-logo.jpg b/src/assets/dark-logo.jpg
new file mode 100644
index 0000000..95237c3
Binary files /dev/null and b/src/assets/dark-logo.jpg differ
diff --git a/src/assets/light-logo.jpg b/src/assets/light-logo.jpg
new file mode 100644
index 0000000..d44a11f
Binary files /dev/null and b/src/assets/light-logo.jpg differ
diff --git a/src/assets/lithographer-banner-dark.jpg b/src/assets/lithographer-banner-dark.jpg
new file mode 100644
index 0000000..8a1db52
Binary files /dev/null and b/src/assets/lithographer-banner-dark.jpg differ
diff --git a/src/assets/lithographer-banner-light.jpg b/src/assets/lithographer-banner-light.jpg
new file mode 100644
index 0000000..b81e0a3
Binary files /dev/null and b/src/assets/lithographer-banner-light.jpg differ
diff --git a/src/assets/lithographer-window.png b/src/assets/lithographer-window.png
index d910dda..ca8db4a 100644
Binary files a/src/assets/lithographer-window.png and b/src/assets/lithographer-window.png differ
diff --git a/src/assets/logo.png b/src/assets/logo.png
deleted file mode 100644
index 530b7db..0000000
Binary files a/src/assets/logo.png and /dev/null differ
diff --git a/src/index.html b/src/index.html
index 3363ec9..18d1816 100644
--- a/src/index.html
+++ b/src/index.html
@@ -1,43 +1,1464 @@
-
-
-
- SD Card Writer UI
-
+
+
+ Lithographer • SD Card Writer
+
+
+
+
+
+
+
+
+
+
+
+
+
+