From 518074d1e84b92464dd4a2dbb87fcef766272bd7 Mon Sep 17 00:00:00 2001 From: Baptiste Parmantier Date: Tue, 22 Sep 2026 13:18:26 +0200 Subject: [PATCH 1/4] chore(studio): swap the dioxus dependency for gpui-kit and freeze the state contract MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The studio cannot be published. It depends on dioxus-primitives and dioxus-attributes through a git dependency pinned at DioxusLabs/components@02801f27, and cargo refuses to publish any crate carrying one. Hence publish = false, and no cargo install rustmotion-studio. That dependency will not become publishable: dioxus-primitives on crates.io is 0.0.0, a name reservation with no code, untouched since April 2025. The whole gpui-kit tree, by contrast, resolves to crates.io alone — 854 packages, zero git sources — and compiles here in 49 s. This is the scaffolding commit of the rewrite, not the rewrite: it swaps the manifest and writes the one contract six parallel workstreams would otherwise each invent. Under Dioxus the editor state was ten scattered Signal; gpui owns state in an Entity and notifies explicitly, so the shape has to be decided once, up front. Selection replaces a (u32, String, String) tuple whose two Strings were interchangeable at the type level — nothing stopped a pointer being passed where a kind was meant. The crate does not build between this commit and WS-1: a framework swap has no smaller atom. What the partition does buy is everything after that. The frozen core — scenario/*, properties, prefetch, audio, frames, library/data, some 5 200 lines carrying 121 unit tests — contains exactly two references to dioxus, both single prelude imports in hook functions already assigned to a workstream. So the intelligence of the studio (optimistic editing, the self-write ledger, the debounce rebased onto fresh disk content, undo/redo, the diff, the frame cache, the audio clock, the schema-driven registry) is not being rewritten at all, and its tests hold every later workstream honest. image and smallvec become direct dependencies: RenderImage::new takes an image::Frame inside a SmallVec, and gpui-kit re-exports neither, so the types only unify if this manifest names the same major versions. gpui-kit is pinned exactly. These are 0.x crates that ship breaking changes in patch slots — 0.6.2 removed the dock tiles canvas — and 0.7.0 drops the three Root::render_*_layer calls this app needs, with no documented replacement. Refs #306 --- crates/rustmotion-studio/Cargo.toml | 18 ++- crates/rustmotion-studio/src/app/mod.rs | 1 + crates/rustmotion-studio/src/app/state.rs | 134 ++++++++++++++++++++++ 3 files changed, 150 insertions(+), 3 deletions(-) create mode 100644 crates/rustmotion-studio/src/app/state.rs diff --git a/crates/rustmotion-studio/Cargo.toml b/crates/rustmotion-studio/Cargo.toml index 1e568e66..40970e2b 100644 --- a/crates/rustmotion-studio/Cargo.toml +++ b/crates/rustmotion-studio/Cargo.toml @@ -13,14 +13,26 @@ path = "src/bin/main.rs" [dependencies] rustmotion = { path = "../rustmotion" } -dioxus = { version = "0.7", features = ["desktop"] } -dioxus-primitives = { git = "https://github.com/DioxusLabs/components", version = "0.0.1", default-features = false } + +# Pinned exactly, for two reasons. These are 0.x crates that ship breaking +# changes in patch slots (0.6.2 removed the dock tiles canvas), and 0.7.0 +# removes `Root::render_dialog_layer`/`_sheet_`/`_notification_` with no +# documented replacement — the three calls this app needs, kept isolated in +# `app/overlays.rs` so that migration stays a localised patch. The kit in turn +# pins `gpui-pre` at `=0.3.6`, so the whole graph moves in lockstep anyway; +# saying so here makes it visible rather than surprising. +gpui-kit = "=0.6.6" + clap = { version = "4", features = ["derive"] } notify = "7" +# Also a *direct* dependency now, not only a transitive one: `RenderImage::new` +# takes an `image::Frame`, and gpui-kit does not re-export `image`, so the types +# only unify if we name the same major version ourselves. image = { version = "0.25", default-features = false, features = ["png", "jpeg", "webp"] } +# Same reason: `RenderImage::new` takes a `SmallVec<[Frame; 1]>`. +smallvec = "1" serde_json = { version = "1", features = ["preserve_order"] } tokio = { version = "1", features = ["time"] } -dioxus-icons = { version = "0.1.0", default-features = false } rfd = "0.17" rodio = { version = "0.22", default-features = false, features = ["playback"] } dirs = "6.0.0" diff --git a/crates/rustmotion-studio/src/app/mod.rs b/crates/rustmotion-studio/src/app/mod.rs index 7bde8fa5..9ed00827 100644 --- a/crates/rustmotion-studio/src/app/mod.rs +++ b/crates/rustmotion-studio/src/app/mod.rs @@ -2,6 +2,7 @@ //! re-targetable file watcher. mod root; +pub mod state; use std::path::PathBuf; use std::sync::mpsc::Sender; diff --git a/crates/rustmotion-studio/src/app/state.rs b/crates/rustmotion-studio/src/app/state.rs new file mode 100644 index 00000000..d6ba2f62 --- /dev/null +++ b/crates/rustmotion-studio/src/app/state.rs @@ -0,0 +1,134 @@ +//! The studio's owned state — the frozen contract of the gpui-kit rewrite. +//! +//! Under Dioxus the editor's state was ten `Signal` scattered across the +//! component tree, each subscribing its own readers. gpui has no such thing: +//! state is owned by an `Entity` and readers are notified explicitly. This +//! module is where that state lives, and it is written once — by the +//! orchestrator, before any workstream starts — precisely so six independent +//! rewrites cannot each invent their own shape for it. +//! +//! **No workstream modifies this file.** A workstream that needs a field it +//! does not find reports the exact line it wants; the orchestrator adds it. +//! +//! What is *not* here is as deliberate as what is: `StudioModel`, `Mutation`, +//! the history, baseline, sidecar and diff types all keep living in +//! [`crate::scenario`], untouched by the rewrite. They never knew about the UI +//! framework, which is the only reason this chantier is a view-layer rewrite +//! rather than a rewrite of the studio. + +use std::sync::Arc; + +use gpui_kit::RenderImage; + +use crate::editor::diff_panel::DiffSide; +use crate::library::SharedLibrary; +use crate::scenario::{Shared, View}; + +/// Which element the inspector is editing. +/// +/// Replaces the `(u32, String, String)` tuple the Dioxus signal carried. The +/// tuple was positional at ten call sites, and the two `String`s were +/// interchangeable at the type level — the compiler could not tell a pointer +/// passed as a kind from a correct one. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Selection { + /// Node id from the engine's hit map. `u32::MAX` when the selection came + /// from the diff panel, which addresses elements by pointer only. + pub node_id: u32, + /// Absolute JSON pointer into the scenario's `raw`. + pub pointer: String, + /// Component tag (`text`, `card`, …). Decides which inspector sections render. + pub kind: String, +} + +/// The user's theme choice, persisted across launches. +/// +/// gpui-component's own `ThemeMode` has only `Light | Dark`; `System` is built +/// on top of it here, by observing the window appearance. Persisted next to the +/// recents, under `dirs::config_dir()/rustmotion/`, because the previous studio +/// reset to `System` at every launch. +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +pub enum ThemePref { + Light, + Dark, + #[default] + System, +} + +impl ThemePref { + /// Cycle order of the topbar button: Dark → Light → System → Dark. + #[must_use] + pub fn next(self) -> Self { + match self { + Self::Dark => Self::Light, + Self::Light => Self::System, + Self::System => Self::Dark, + } + } + + #[must_use] + pub fn label(self) -> &'static str { + match self { + Self::Dark => "Dark", + Self::Light => "Light", + Self::System => "System", + } + } +} + +/// Application-level state: which screen is up, and the two shared handles +/// every screen needs. +pub struct StudioState { + /// The live scenario model. Cloned under a brief lock and used *without* + /// it — see [`crate::scenario::model`]. + pub shared: Shared, + /// Workspace scan, recents, thumbnail cache, watcher channel. + pub library: SharedLibrary, + pub view: View, + pub theme_pref: ThemePref, +} + +/// Editor-screen state. +/// +/// Everything here was a `Signal` under Dioxus. The ordering below follows +/// the old declaration order in `editor/view.rs` so the two can be diffed. +pub struct EditorState { + /// Playhead, in frames. + pub current: u32, + pub playing: bool, + /// Preview audio mute. The mix itself is owned by [`crate::editor::audio`]. + pub muted: bool, + /// Hot-reload revision. Bumped when the watcher swaps in a reloaded model, + /// and by every optimistic edit, so the canvas refetches. + pub rev: u64, + pub selected: Option, + pub show_annotations: bool, + /// The clickable-element overlay. Starts **enabled**, as it did before. + pub show_hits: bool, + pub diff_active: bool, + /// A = baseline, B = current. + pub diff_side: DiffSide, + /// Preview render scale, percent. Mirrors the atomic in + /// [`crate::editor::prefetch`], which non-UI threads read without a + /// gpui context. Write the atomic *first*, then this field. + pub preview_scale: u16, + /// The frame currently on screen, in BGRA. + /// + /// Replacing this **must** hand the previous value to + /// `cx.drop_image(old, Some(window))`. gpui's sprite atlas has no eviction + /// and each 1920×1080 frame owns a ~8 MB Metal texture, so a swap that + /// forgets to drop leaks roughly half a gigabyte per second at 60 fps. + /// Drop in the update path, before paint — never while painting a frame + /// that still references it. + pub frame: Option>, +} + +impl EditorState { + /// The hit map is a full main-thread paint pass (~150 ms measured), so it + /// is computed at rest only — never per frame during playback, and never + /// for the baseline side, which has no selectable elements. + #[must_use] + pub fn should_compute_hits(&self) -> bool { + self.show_hits && !(self.diff_active && self.diff_side == DiffSide::A) && !self.playing + } +} From 233ae6517c2b9185976d18b8229621d9a0bf10dd Mon Sep 17 00:00:00 2001 From: Baptiste Parmantier Date: Tue, 22 Sep 2026 14:09:25 +0200 Subject: [PATCH 2/4] style(studio): remove every comment from the frozen core MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The user wants no comments in rustmotion-studio — inline, doc and module alike. This strips the 14 files of the frozen core, the part no workstream of the gpui-kit chantier owns. Each workstream strips the files it owns in its own commit; the view modules still to be rewritten will be written comment-free from the start rather than written and then stripped. Scope is the studio crate only. rustmotion, rustmotion-core, rustmotion-components and rustmotion-html are published, and emptying their doc comments would empty their docs.rs pages. 759 deletions against 3 insertions, and all three insertions are lines that merely lost a trailing comment — read_style's #[allow(dead_code)], a return in audio::prepare, an undo call in a history test. No line of code changed meaning. The stripper is string-literal aware, so the // inside "https://example.com", inside raw strings, and after an escaped quote all survived; rustfmt then proved every file still parses. What the deleted prose explained is not lost, only moved. The load-bearing rationale — why RENDER_STACK is 32 MiB (untagged serde buffers a frame per nesting level, and the default 2 MiB stack overflowed the prefetch workers), why the playhead follows the audio clock rather than a timer, why resolve_flush replays onto fresh disk content instead of a snapshot, and the CSS completeness-by-construction invariant — is written up in #306 and the workstream issues, which are prose-friendly and are where someone reconstructing a decision actually looks. From here the rule is upstream of the writing: when a comment feels necessary, rename the binding or extract a named function, so the explanation sits in an identifier that cannot drift from the code. Refs #306 --- crates/rustmotion-studio/src/app/state.rs | 64 ------ crates/rustmotion-studio/src/editor/audio.rs | 48 +--- crates/rustmotion-studio/src/editor/frames.rs | 50 ----- .../src/editor/properties.rs | 208 ------------------ crates/rustmotion-studio/src/library/data.rs | 27 --- .../src/scenario/baseline.rs | 16 -- crates/rustmotion-studio/src/scenario/diff.rs | 43 ---- crates/rustmotion-studio/src/scenario/edit.rs | 29 +-- .../rustmotion-studio/src/scenario/history.rs | 67 +----- crates/rustmotion-studio/src/scenario/mod.rs | 8 - .../rustmotion-studio/src/scenario/model.rs | 35 --- .../src/scenario/optimistic.rs | 97 -------- .../rustmotion-studio/src/scenario/sidecar.rs | 33 --- crates/rustmotion-studio/tests/audit_ws_g.rs | 37 ---- 14 files changed, 3 insertions(+), 759 deletions(-) diff --git a/crates/rustmotion-studio/src/app/state.rs b/crates/rustmotion-studio/src/app/state.rs index d6ba2f62..547e7b7e 100644 --- a/crates/rustmotion-studio/src/app/state.rs +++ b/crates/rustmotion-studio/src/app/state.rs @@ -1,21 +1,3 @@ -//! The studio's owned state — the frozen contract of the gpui-kit rewrite. -//! -//! Under Dioxus the editor's state was ten `Signal` scattered across the -//! component tree, each subscribing its own readers. gpui has no such thing: -//! state is owned by an `Entity` and readers are notified explicitly. This -//! module is where that state lives, and it is written once — by the -//! orchestrator, before any workstream starts — precisely so six independent -//! rewrites cannot each invent their own shape for it. -//! -//! **No workstream modifies this file.** A workstream that needs a field it -//! does not find reports the exact line it wants; the orchestrator adds it. -//! -//! What is *not* here is as deliberate as what is: `StudioModel`, `Mutation`, -//! the history, baseline, sidecar and diff types all keep living in -//! [`crate::scenario`], untouched by the rewrite. They never knew about the UI -//! framework, which is the only reason this chantier is a view-layer rewrite -//! rather than a rewrite of the studio. - use std::sync::Arc; use gpui_kit::RenderImage; @@ -24,29 +6,13 @@ use crate::editor::diff_panel::DiffSide; use crate::library::SharedLibrary; use crate::scenario::{Shared, View}; -/// Which element the inspector is editing. -/// -/// Replaces the `(u32, String, String)` tuple the Dioxus signal carried. The -/// tuple was positional at ten call sites, and the two `String`s were -/// interchangeable at the type level — the compiler could not tell a pointer -/// passed as a kind from a correct one. #[derive(Clone, Debug, PartialEq, Eq)] pub struct Selection { - /// Node id from the engine's hit map. `u32::MAX` when the selection came - /// from the diff panel, which addresses elements by pointer only. pub node_id: u32, - /// Absolute JSON pointer into the scenario's `raw`. pub pointer: String, - /// Component tag (`text`, `card`, …). Decides which inspector sections render. pub kind: String, } -/// The user's theme choice, persisted across launches. -/// -/// gpui-component's own `ThemeMode` has only `Light | Dark`; `System` is built -/// on top of it here, by observing the window appearance. Persisted next to the -/// recents, under `dirs::config_dir()/rustmotion/`, because the previous studio -/// reset to `System` at every launch. #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] pub enum ThemePref { Light, @@ -56,7 +22,6 @@ pub enum ThemePref { } impl ThemePref { - /// Cycle order of the topbar button: Dark → Light → System → Dark. #[must_use] pub fn next(self) -> Self { match self { @@ -76,57 +41,28 @@ impl ThemePref { } } -/// Application-level state: which screen is up, and the two shared handles -/// every screen needs. pub struct StudioState { - /// The live scenario model. Cloned under a brief lock and used *without* - /// it — see [`crate::scenario::model`]. pub shared: Shared, - /// Workspace scan, recents, thumbnail cache, watcher channel. pub library: SharedLibrary, pub view: View, pub theme_pref: ThemePref, } -/// Editor-screen state. -/// -/// Everything here was a `Signal` under Dioxus. The ordering below follows -/// the old declaration order in `editor/view.rs` so the two can be diffed. pub struct EditorState { - /// Playhead, in frames. pub current: u32, pub playing: bool, - /// Preview audio mute. The mix itself is owned by [`crate::editor::audio`]. pub muted: bool, - /// Hot-reload revision. Bumped when the watcher swaps in a reloaded model, - /// and by every optimistic edit, so the canvas refetches. pub rev: u64, pub selected: Option, pub show_annotations: bool, - /// The clickable-element overlay. Starts **enabled**, as it did before. pub show_hits: bool, pub diff_active: bool, - /// A = baseline, B = current. pub diff_side: DiffSide, - /// Preview render scale, percent. Mirrors the atomic in - /// [`crate::editor::prefetch`], which non-UI threads read without a - /// gpui context. Write the atomic *first*, then this field. pub preview_scale: u16, - /// The frame currently on screen, in BGRA. - /// - /// Replacing this **must** hand the previous value to - /// `cx.drop_image(old, Some(window))`. gpui's sprite atlas has no eviction - /// and each 1920×1080 frame owns a ~8 MB Metal texture, so a swap that - /// forgets to drop leaks roughly half a gigabyte per second at 60 fps. - /// Drop in the update path, before paint — never while painting a frame - /// that still references it. pub frame: Option>, } impl EditorState { - /// The hit map is a full main-thread paint pass (~150 ms measured), so it - /// is computed at rest only — never per frame during playback, and never - /// for the baseline side, which has no selectable elements. #[must_use] pub fn should_compute_hits(&self) -> bool { self.show_hits && !(self.diff_active && self.diff_side == DiffSide::A) && !self.playing diff --git a/crates/rustmotion-studio/src/editor/audio.rs b/crates/rustmotion-studio/src/editor/audio.rs index 7f720c14..dd737eea 100644 --- a/crates/rustmotion-studio/src/editor/audio.rs +++ b/crates/rustmotion-studio/src/editor/audio.rs @@ -1,18 +1,3 @@ -//! Preview audio for the transport bar. -//! -//! What plays is the output of [`mix_audio_tracks`] — the same function the -//! encoder calls — so `start`/`end`, fades, per-track volume and volume -//! keyframes are heard in the studio exactly as they will be muxed. Anything -//! less would make the preview lie about the cut. -//! -//! The mix spans the whole scenario, silence included, which is what lets the -//! playhead follow the audio clock from the first frame to the last instead of -//! drifting against a timer (and freezing when a track ends early). -//! -//! cpal's output stream is not `Send`, so it lives on a dedicated thread driven -//! by a command channel; position and state are published as atomics the UI -//! reads without ever touching that thread. - use std::collections::hash_map::DefaultHasher; use std::hash::{Hash, Hasher}; use std::sync::atomic::{AtomicBool, AtomicU64, AtomicUsize, Ordering}; @@ -23,22 +8,17 @@ use std::time::Duration; use rustmotion::schema::{AudioTrack, ResolvedScenario}; enum Cmd { - /// Interleaved stereo f32 for the whole scenario, and its sample rate. Load(Arc>, u32), - /// Drop the current mix — the scenario has no audio at all. Clear, PlayFrom(f64), Stop, SetMuted(bool), } -/// Playhead position in milliseconds, valid only while [`PLAYING`] is true. static POSITION_MS: AtomicU64 = AtomicU64::new(0); static PLAYING: AtomicBool = AtomicBool::new(false); static HAS_AUDIO: AtomicBool = AtomicBool::new(false); static MUTED: AtomicBool = AtomicBool::new(false); -/// Bumped per prepared scenario so a slow mix that finishes after a newer one -/// started cannot install itself over the newer result. static MIX_TOKEN: AtomicUsize = AtomicUsize::new(0); static TX: OnceLock>> = OnceLock::new(); @@ -52,8 +32,6 @@ fn spawn_audio_thread() -> Option> { std::thread::Builder::new() .name("rm-preview-audio".into()) .spawn(move || { - // No output device (CI, headless, a machine with sound disabled) is - // not an error: keep draining so senders never block, just silent. let stream = match rodio::stream::DeviceSinkBuilder::from_default_device() .and_then(|b| b.open_stream()) { @@ -70,8 +48,6 @@ fn spawn_audio_thread() -> Option> { let mut start_offset = 0.0f64; loop { - // Short timeout so the published position stays fresh enough to - // drive the playhead at any sane fps. match rx.recv_timeout(Duration::from_millis(10)) { Ok(Cmd::Load(pcm, rate)) => { mix = Some((pcm, rate)); @@ -122,8 +98,6 @@ fn spawn_audio_thread() -> Option> { if let Some(s) = sink.as_ref() { if s.empty() { - // Ran off the end of the mix: stop claiming a position - // so the transport falls back to its own clock. sink = None; PLAYING.store(false, Ordering::Relaxed); } else { @@ -147,13 +121,6 @@ fn sample_rate(rate: u32) -> rodio::SampleRate { rodio::SampleRate::new(rate).unwrap_or(rodio::SampleRate::new(44_100).unwrap()) } -/// Fingerprint of everything a mix depends on: every track's placement and -/// volume envelope, plus the total duration silence pads out to. Serialised -/// rather than hashed field by field so a field added to `AudioTrack` cannot -/// silently drop out of the comparison. Two scenarios with the same -/// fingerprint would remix to the same PCM, so [`use_hot_reload`](super::playback::use_hot_reload) -/// calls [`prepare`] only when it changes — an edit to anything else (layout, -/// text, color) must not re-decode and resample every track from scratch. pub fn audio_fingerprint(audio: &[AudioTrack], total_duration: f64) -> u64 { let mut hasher = DefaultHasher::new(); serde_json::to_string(audio) @@ -163,8 +130,6 @@ pub fn audio_fingerprint(audio: &[AudioTrack], total_duration: f64) -> u64 { hasher.finish() } -/// Mix the scenario's audio in the background and hand it to the audio thread. -/// Cheap to call on every model reload: a scenario with no tracks just clears. pub fn prepare(scenario: Arc, total_duration: f64) { let Some(tx) = tx() else { return }; if scenario.audio.is_empty() { @@ -173,12 +138,10 @@ pub fn prepare(scenario: Arc, total_duration: f64) { } let token = MIX_TOKEN.fetch_add(1, Ordering::SeqCst) + 1; let tx = tx.clone(); - // Mixing decodes and resamples every track: seconds on a long scenario, so - // never on the UI thread. std::thread::spawn(move || { let mixed = rustmotion::encode::audio::mix_audio_tracks(&scenario.audio, total_duration); if MIX_TOKEN.load(Ordering::SeqCst) != token { - return; // a newer scenario is already being prepared + return; } match mixed { Ok(Some(pcm_bytes)) => { @@ -203,12 +166,6 @@ pub fn prepare(scenario: Arc, total_duration: f64) { const SAMPLE_RATE: u32 = rustmotion::encode::audio::OUTPUT_SAMPLE_RATE; -/// Start (or restart) playback at `frame`. A no-op when the scenario is silent. -/// -/// The position is published here rather than waiting for the audio thread to -/// pick the command up: a seek must not read back as the old position for the -/// handful of milliseconds in between, or the transport — which follows this -/// clock — would snap the playhead back before the sound catches up. pub fn play_from_frame(frame: u32, fps: u32) { let seconds = frame as f64 / fps.max(1) as f64; POSITION_MS.store((seconds * 1000.0) as u64, Ordering::Relaxed); @@ -235,8 +192,6 @@ pub fn has_audio() -> bool { HAS_AUDIO.load(Ordering::Relaxed) } -/// The frame the audio is currently at, or `None` when nothing is playing — -/// in which case the transport advances on its own timer. pub fn position_frame(fps: u32) -> Option { if !PLAYING.load(Ordering::Relaxed) { return None; @@ -265,7 +220,6 @@ mod tests { PLAYING.store(false, Ordering::Relaxed); } - /// fps 0 would divide by zero on the way in and out. #[test] fn zero_fps_is_clamped() { PLAYING.store(true, Ordering::Relaxed); diff --git a/crates/rustmotion-studio/src/editor/frames.rs b/crates/rustmotion-studio/src/editor/frames.rs index b56ce160..32358518 100644 --- a/crates/rustmotion-studio/src/editor/frames.rs +++ b/crates/rustmotion-studio/src/editor/frames.rs @@ -5,32 +5,8 @@ use std::sync::{Arc, Mutex, OnceLock}; use rustmotion::encode::video::FrameTask; use rustmotion::schema::ResolvedScenario; -/// Stack for any thread that renders a frame. -/// -/// The depth cost is **deserialisation**, not painting: `prepare_scene` calls -/// `deserialize_children` on every frame, and `ChildComponent` → `Component` → -/// `Container`/`Card` recurses once per level of nesting. Because those enums -/// are untagged, serde buffers each level through `ContentDeserializer`, so a -/// level is expensive in stack as well as deep — and a debug build's frames are -/// several times fatter than a release build's. -/// -/// Measured: a scenario nested ~28 levels — which a UI composed from small -/// helper functions reaches without trying — needs between 2 and 4 MiB in debug. -/// Rust's default for a spawned thread is 2 MiB, so the prefetch workers -/// overflowed and aborted the process; the same file rendered fine from the CLI, -/// which happens to run on the 8 MiB main thread. The two webview asset handlers -/// get whatever stack the platform hands their callback, which is no better. -/// -/// Address space is cheap and committed lazily; take a wide margin. pub const RENDER_STACK: usize = 32 * 1024 * 1024; -/// [`render_frame`] on a thread with [`RENDER_STACK`], for callers that are not -/// on the main thread. Scoped, so the scenario and tasks are borrowed rather -/// than cloned. `Err` means the render thread panicked (a Skia panic, a -/// dimension mismatch, a JPEG encode failure): the caller must not treat that -/// as a successful empty frame. -// The panic payload carries no information callers act on; they only branch -// on success vs. failure (retry-budget ledger, cache, HTTP status). #[allow(clippy::result_unit_err)] pub fn render_frame_deep( scenario: &ResolvedScenario, @@ -48,9 +24,6 @@ pub fn render_frame_deep( }) } -/// Render one frame and encode it to JPEG bytes (preview-only; the final video -/// render path does not use this). JPEG keeps the encode cost low enough for -/// the webview transport to keep up with playback. pub fn render_frame( scenario: &ResolvedScenario, tasks: &[rustmotion::encode::video::FrameTask], @@ -67,7 +40,6 @@ pub fn render_frame( let w = (scenario.video.width as f32 * scale) as u32; let h = (scenario.video.height as f32 * scale) as u32; let rgba_img = image::RgbaImage::from_raw(w, h, rgba).expect("rgba matches dimensions"); - // JPEG has no alpha; drop it (preview frames are opaque). let rgb = image::DynamicImage::ImageRgba8(rgba_img).to_rgb8(); let mut jpeg = Vec::new(); image::DynamicImage::ImageRgb8(rgb) @@ -79,10 +51,6 @@ pub fn render_frame( jpeg } -/// Cached baseline scenario for the diff mode's A-side render, keyed by -/// (path, source hash) so it is rebuilt only when the baseline itself changes -/// (Set baseline) — never per frame. Arc snapshots so callers render OUTSIDE -/// this cache's lock. struct BaselineCache { path: PathBuf, source_hash: u64, @@ -95,19 +63,12 @@ fn baseline_cache() -> &'static Mutex> { CACHE.get_or_init(|| Mutex::new(None)) } -/// Stable hash of a baseline source string (also used as the side-A cache -/// generation in the prefetch frame cache). pub(crate) fn source_hash(source: &str) -> u64 { let mut h = std::collections::hash_map::DefaultHasher::new(); source.hash(&mut h); h.finish() } -/// Arc snapshot of the BASELINE scenario built from its source string: JSON is -/// loaded directly, HTML is re-transpiled — both entirely from the string, -/// never from the (already edited) file on disk. Cached by (path, source -/// hash); returns `(source_hash, scenario, tasks)` so the caller renders -/// without holding any lock. pub fn baseline_arcs( path: &Path, source: &str, @@ -140,7 +101,6 @@ pub fn baseline_arcs( Ok((hash, cache.scenario.clone(), cache.tasks.clone())) } -/// A clickable element box in percentage-of-frame coords, with its kind. #[derive(Debug, Clone, PartialEq)] pub struct HitPct { pub node_id: u32, @@ -149,13 +109,9 @@ pub struct HitPct { pub y: f32, pub w: f32, pub h: f32, - /// Full JSON Pointer into the source scenario, e.g. "/scenes/0/children/2". pub pointer: Option, } -/// Compute the current frame's clickable element boxes in percentage coords -/// (render only — no JPEG encode, so this is cheap per frame). `scene_prefix` -/// is the JSON-Pointer prefix of the current scene (see [`scene_prefix`]). pub fn frame_hits( scenario: &ResolvedScenario, tasks: &[rustmotion::encode::video::FrameTask], @@ -183,8 +139,6 @@ pub fn frame_hits( .collect() } -/// JSON-Pointer prefix to the scene of the given frame, derived from the raw -/// scenario JSON (handles both top-level `scenes` and `composition`). pub fn scene_prefix( raw: &serde_json::Value, tasks: &[rustmotion::encode::video::FrameTask], @@ -224,13 +178,9 @@ mod tests { assert!(!tasks.is_empty()); let jpeg = render_frame(&scenario, &tasks, 0, 1.0); assert!(jpeg.len() > 2); - // JPEG SOI marker. assert_eq!(&jpeg[0..2], &[0xFF, 0xD8], "must be a JPEG"); } - /// TEMP diagnostic (not part of CI): replicate the prefetch worker pool on - /// the dynamic-glass example and print RSS growth. Run with - /// `RM_STRESS_SCALE=0.5 cargo test -p rustmotion-studio --release stress_rss -- --ignored --nocapture` #[test] #[ignore] fn stress_rss_worker_pool() { diff --git a/crates/rustmotion-studio/src/editor/properties.rs b/crates/rustmotion-studio/src/editor/properties.rs index ef850254..83ef69c1 100644 --- a/crates/rustmotion-studio/src/editor/properties.rs +++ b/crates/rustmotion-studio/src/editor/properties.rs @@ -1,17 +1,3 @@ -//! Schema-driven property registry for the inspector. -//! -//! Derived lazily (OnceLock) from `schemars::schema_for!(Component)` — the -//! same source as `rustmotion validate`'s unknown-attribute check — and from -//! `schema_for!(CssStyle)` for the CSS sections. Two invariants: -//! -//! 1. Component root fields: every non-excluded property of every `oneOf` -//! variant gets a typed [`PropSpec`]; the exclusion list below is the only -//! curation. -//! 2. CSS completeness BY CONSTRUCTION: every property of the `CssStyle` -//! schema lands in exactly one [`CssSection`] — unmapped ones fall into -//! `Advanced` automatically, so schema evolution can never silently drop a -//! property from the inspector (locked by a test). - use std::collections::BTreeMap; use std::sync::OnceLock; @@ -20,15 +6,6 @@ use serde_json::Value; use rustmotion::components::Component; use rustmotion::core::css::CssStyle; -/// Root component fields NEVER shown as generic controls: -/// - `type`: the component identity, not editable. -/// - `style`: the whole CSS block (has its own sections). -/// - `children`: structural. -/// - `position`, `x`, `y`, `z-index`: `ChildComponent` wrapper fields. -/// - `animation`, `timeline`: structured animation config (dedicated tooling -/// later; a generic control would invite corruption). -/// - Structured data arrays (chart `data`, rich_text `spans`, …): no sensible -/// generic control in v1. pub const EXCLUDED_FIELDS: &[&str] = &[ "type", "style", @@ -39,7 +16,6 @@ pub const EXCLUDED_FIELDS: &[&str] = &[ "z-index", "animation", "timeline", - // structured data arrays "data", "radar_data", "spans", @@ -61,43 +37,23 @@ pub const EXCLUDED_FIELDS: &[&str] = &[ "states", ]; -/// How a schema field is edited by the generic control factory. #[derive(Debug, Clone, PartialEq)] pub enum PropKind { - /// Schema `"type": "integer"` (u8/u32/i64… — schemars adds a - /// `format: uint8/uint32/…` hint). Writes REAL JSON integers: a `12.0` - /// written into a `u32` field fails the typed parse ("invalid type: - /// floating point") and would drop the element at render. Integer, - /// Schema `"type": "number"` (f32/f64 — `format: float/double`). Float, Bool, String, - /// String enum with the exact variants from the schema. Enum(Vec), - /// String whose name contains "color" → color picker. Color, - /// Array of color strings (gradient_text `colors`) → per-entry pickers. ColorList, - /// Untagged string|gradient-object (shape `fill`) → mode-switched editor. Fill, - /// Untagged number|string (Length, LengthPercentage, Size, …) → unit input. Unit, - /// Object with known schema properties (stat `trend`, `stroke`, …) → - /// indented sub-rows through the same control factory (depth ≤ 2). Object(Vec), - /// Array of numbers (stat `sparkline_data`, …) → per-entry number rows. NumberList, - /// Array of non-color strings (chart `axes`/`categories`, …) → per-entry - /// text rows. StringList, - /// Objects/arrays without a known shape → JSON textarea. Complex, } -/// Shortest display form of a numeric raw string: `"405.0"` → `"405"`, -/// `"1.40"` → `"1.4"`, `"100"` → `"100"` (Rust's f64 Display is -/// shortest-round-trip). Non-numeric input passes through unchanged. pub fn display_number(raw: &str) -> String { raw.trim() .parse::() @@ -111,10 +67,6 @@ pub struct PropSpec { pub kind: PropKind, } -/// Default-palette prefill for an EMPTY color list: for `chart.colors`, -/// "+ Add color" seeds the list with the engine's actual rendering palette so -/// the user edits what the canvas shows instead of starting from nothing. -/// Extend the map here when other components gain a palette. pub fn palette_prefill( tag: &str, field: &str, @@ -129,10 +81,6 @@ pub fn palette_prefill( } } -/// Next entries after a "+ Add" click (pure, single decision point for every -/// list editor): an EMPTY list with a prefill (chart palette) is seeded with -/// it — the user gets all 8 editable rows at once; otherwise one default -/// entry is appended. pub fn next_entries_on_add( current: &[String], add_value: &str, @@ -148,8 +96,6 @@ pub fn next_entries_on_add( } } -/// Mutate one sub-key of an object value: `Null` prunes the key; an object -/// left empty collapses to `Null` (the whole field gets removed). pub fn mutate_object_field(current: &Value, key: &str, new: Value) -> Value { let mut map = current.as_object().cloned().unwrap_or_default(); if new.is_null() { @@ -164,7 +110,6 @@ pub fn mutate_object_field(current: &Value, key: &str, new: Value) -> Value { } } -/// Display mode of a [`PropKind::Fill`] value. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum FillMode { Single, @@ -172,8 +117,6 @@ pub enum FillMode { Radial, } -/// Decompose an existing fill value into `(mode, colors, angle)`. A bare -/// string is a single color; objects pick Linear/Radial from their `type`. pub fn parse_fill(v: &Value) -> (FillMode, Vec, f64) { match v { Value::String(s) => (FillMode::Single, vec![s.clone()], 0.0), @@ -198,8 +141,6 @@ pub fn parse_fill(v: &Value) -> (FillMode, Vec, f64) { } } -/// Serialize a fill editor state back to the scenario value: Single → the hex -/// string, Linear/Radial → the gradient object (angle only on Linear). pub fn fill_to_value(mode: FillMode, colors: &[String], angle: f64) -> Value { match mode { FillMode::Single => Value::String( @@ -220,9 +161,6 @@ pub fn fill_to_value(mode: FillMode, colors: &[String], angle: f64) -> Value { } } -/// The element as the ENGINE sees it: typed round-trip through `Component` -/// fills every `#[serde(default)]`. Falls back to the raw element when the -/// round-trip fails (invalid element). pub fn effective_element(raw: &Value) -> Value { serde_json::from_value::(raw.clone()) .ok() @@ -230,14 +168,10 @@ pub fn effective_element(raw: &Value) -> Value { .unwrap_or_else(|| raw.clone()) } -/// Multiline heuristic for String controls: known long-form field names, or a -/// current value that already contains a newline. pub fn is_multiline(name: &str, value: &str) -> bool { matches!(name, "code" | "content" | "message") || value.contains('\n') } -/// Engine-default placeholder for string inputs — properties whose effective -/// default has no displayable VALUE (auto-sized boxes, unset backgrounds). pub fn engine_placeholder(name: &str) -> Option<&'static str> { match name { "font-family" => Some("Inter"), @@ -250,58 +184,35 @@ pub fn engine_placeholder(name: &str) -> Option<&'static str> { } } -/// Effective ENGINE defaults for CSS properties left unset in the source — -/// what the renderer actually uses, so the inspector shows the truth instead -/// of empty controls (same honesty as the Properties round-trip). `CssStyle` -/// is all-`Option`, so this is a semantic table (source noted per entry), -/// not schema-derived. pub fn css_effective_default(prop: &str) -> Option { let v = match prop { - // Painter: full opacity when unset. "opacity" => Value::from(1.0), - // CSS initial value; the layout treats unset as static flow. "position" => Value::from("static"), - // Engine absolute-offset defaults (unset offset = 0). "top" | "right" | "bottom" | "left" => Value::from(0), - // Paint order default. "z-index" => Value::from(0), - // Taffy defaults: no spacing when unset. "padding" | "margin" | "gap" => Value::from(0), - // Painter: square corners when unset. "border-radius" => Value::from(0), - // CSS initial / engine clipping default. "overflow" | "overflow-x" | "overflow-y" => Value::from("visible"), "visibility" => Value::from("visible"), - // Scene/box-builder default (scenes flow as columns). "flex-direction" => Value::from("column"), - // Taffy defaults for unset alignment. "align-items" => Value::from("start"), "justify-content" => Value::from("start"), - // CSS spec initial values (taffy follows them). "flex-grow" => Value::from(0), "flex-shrink" => Value::from(1), - // Cascade default weight (Regular · 400 — matches the curated select). "font-weight" => Value::from("400"), _ => return None, }; Some(v) } -/// Painter-constant text sizes per component (the typographic default is NOT -/// global: text paints at 48px, terminal/codeblock at 14px). Unknown tags → -/// None (placeholder instead of a wrong number). pub fn text_default_font_size(tag: &str) -> Option { match tag { - // text.rs: `font_size_px_or(48.0)`. "text" | "caption" | "gradient_text" => Some(48.0), - // terminal.rs `FONT_SIZE: f32 = 14.0`; codeblock uses the same size. "terminal" | "codeblock" => Some(14.0), _ => None, } } -/// Display default for one CSS row of a given component: per-tag font-size, -/// white text for the text family (renderer default), else the global table. pub fn css_display_default(tag: &str, prop: &str) -> Option { match prop { "font-size" => text_default_font_size(tag).map(Value::from), @@ -310,8 +221,6 @@ pub fn css_display_default(tag: &str, prop: &str) -> Option { } } -/// `(displayed value, is_default)` for a CSS row: the raw value wins; when -/// absent, the effective default is shown with the dimmed default marker. pub fn css_row_value(raw: String, tag: &str, prop: &str) -> (String, bool) { if !raw.is_empty() { return (raw, false); @@ -323,14 +232,10 @@ pub fn css_row_value(raw: String, tag: &str, prop: &str) -> (String, bool) { } } -/// Root fields (name + kind) for a component tag, schema order. `None` for -/// unknown tags. pub fn component_props(tag: &str) -> Option<&'static Vec> { component_registry().get(tag) } -/// tag → root PropSpecs, from the `oneOf` variants of the Component schema -/// (same walk as the CLI's unknown-attribute check). fn component_registry() -> &'static BTreeMap> { static CACHE: OnceLock>> = OnceLock::new(); CACHE.get_or_init(|| { @@ -361,17 +266,10 @@ fn component_registry() -> &'static BTreeMap> { }) } -// ── Schema walking ─────────────────────────────────────────────────────────── - -/// Resolve one property schema to a [`PropKind`]. Handles `$ref` into -/// definitions, single-arm `allOf` wrappers, nullable `anyOf [T, null]`, and -/// untagged unions (`anyOf` of several arms). fn kind_of_schema(name: &str, schema: &Value, defs: &Value, depth: u8) -> PropKind { kind_of_schema_inner(name, schema, defs, depth, 0) } -/// `obj_level` counts object nesting for [`PropKind::Object`] (capped at 2 — -/// deeper structures fall back to the JSON textarea). fn kind_of_schema_inner( name: &str, schema: &Value, @@ -382,7 +280,6 @@ fn kind_of_schema_inner( if depth > 8 { return PropKind::Complex; } - // $ref → definitions lookup. if let Some(r) = schema.get("$ref").and_then(|r| r.as_str()) { let key = r.rsplit('/').next().unwrap_or_default(); return match defs.get(key) { @@ -390,19 +287,14 @@ fn kind_of_schema_inner( None => PropKind::Complex, }; } - // allOf: [X] wrapper (schemars uses it to attach descriptions to refs). if let Some(all) = schema.get("allOf").and_then(|a| a.as_array()) { if all.len() == 1 { return kind_of_schema_inner(name, &all[0], defs, depth + 1, obj_level); } } - // Direct string enum. if let Some(variants) = string_enum(schema) { return PropKind::Enum(variants); } - // anyOf/oneOf: drop null arms; single arm → recurse; several → union, - // flattened recursively (Size nests LengthPercentage which nests - // number|string). for key in ["anyOf", "oneOf"] { if let Some(arms) = schema.get(key).and_then(|a| a.as_array()) { let non_null: Vec<&Value> = arms.iter().filter(|a| !is_null_schema(a)).collect(); @@ -413,7 +305,6 @@ fn kind_of_schema_inner( for arm in &non_null { collect_union(arm, defs, depth + 1, &mut info); } - // Decision order (see the doc comment on `UnionInfo`). if info.has_string && info.has_gradient_object { return PropKind::Fill; } @@ -449,8 +340,6 @@ fn kind_of_schema_inner( } } -/// Sub-specs of an object schema with KNOWN properties (None for map-like / -/// empty objects → JSON textarea fallback). fn object_specs(schema: &Value, defs: &Value, depth: u8, obj_level: u8) -> Option> { let props = schema.get("properties")?.as_object()?; if props.is_empty() { @@ -467,8 +356,6 @@ fn object_specs(schema: &Value, defs: &Value, depth: u8, obj_level: u8) -> Optio ) } -/// Array whose items resolve to plain strings (labels, axes, categories) — -/// color-string arrays are caught earlier by `is_color_string_array`. fn is_string_array(schema: &Value, defs: &Value, depth: u8) -> bool { let Some(items) = schema.get("items") else { return false; @@ -482,7 +369,6 @@ fn is_string_array(schema: &Value, defs: &Value, depth: u8) -> bool { info.has_string && !info.has_number } -/// Array whose items resolve to numbers (`Vec`, dash patterns, …). fn is_number_array(schema: &Value, defs: &Value, depth: u8) -> bool { let Some(items) = schema.get("items") else { return false; @@ -496,9 +382,6 @@ fn is_number_array(schema: &Value, defs: &Value, depth: u8) -> bool { info.has_number && !info.has_string && info.variants.is_empty() } -/// Array-of-color-strings detection: the items resolve to strings (or a -/// Color-typed union with a string arm) AND either the field name contains -/// "color" or the items are the `Color` schema type. fn is_color_string_array(name: &str, schema: &Value, defs: &Value, depth: u8) -> bool { let Some(items) = schema.get("items") else { return false; @@ -514,25 +397,14 @@ fn is_color_string_array(name: &str, schema: &Value, defs: &Value, depth: u8) -> string_items && (name.contains("color") || name.contains("colour") || items_ref_is_color) } -/// What a (recursively flattened) union offers. Decision order in -/// `kind_of_schema`: -/// 1. string arm + color-ish name → `Color` (untagged string|rgba). -/// 2. number + (string or keywords) → `Unit` (Length/Size: free text accepts -/// numbers, "12px" and keywords alike). -/// 3. keywords only → `Enum` (an unreachable object arm like cubic-bezier is -/// accepted collateral — the picker covers the keyword variants). -/// 4. any string arm → `String` (free text is always a valid input). -/// 5. otherwise `Complex` (JSON textarea). #[derive(Default)] struct UnionInfo { variants: Vec, has_number: bool, has_string: bool, - /// An object arm with a `colors` property (the gradient side of `Fill`). has_gradient_object: bool, } -/// Recursively flatten a union arm into `UnionInfo`. fn collect_union(arm: &Value, defs: &Value, depth: u8, info: &mut UnionInfo) { if depth > 8 { return; @@ -564,7 +436,6 @@ fn collect_union(arm: &Value, defs: &Value, depth: u8, info: &mut UnionInfo) { } } -/// Follow refs/allOf for one union arm (no kind decision). fn resolve_arm(arm: &Value, defs: &Value, depth: u8) -> Value { if depth > 8 { return arm.clone(); @@ -583,7 +454,6 @@ fn resolve_arm(arm: &Value, defs: &Value, depth: u8) -> Value { arm.clone() } -/// The string variants of `{"enum": ["a", "b"]}` schemas, if all-string. fn string_enum(schema: &Value) -> Option> { let arr = schema.get("enum")?.as_array()?; let variants: Vec = arr @@ -601,7 +471,6 @@ fn is_null_schema(schema: &Value) -> bool { schema.get("type").and_then(|t| t.as_str()) == Some("null") } -/// The non-null primary type of a schema (`"type": "x"` or `["x", "null"]`). fn primary_type(schema: &Value) -> Option<&str> { match schema.get("type") { Some(Value::String(s)) => Some(s.as_str()), @@ -610,8 +479,6 @@ fn primary_type(schema: &Value) -> Option<&str> { } } -// ── CSS sections ───────────────────────────────────────────────────────────── - #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum CssSection { Typography, @@ -641,16 +508,12 @@ impl CssSection { } } -/// Section for a CSS property name. Every KNOWN property is mapped explicitly; -/// anything else (including future schema additions) lands in `Advanced`. pub fn section_for(prop: &str) -> CssSection { use CssSection::*; match prop { - // Typography "font-family" | "font-size" | "font-weight" | "font-style" | "line-height" | "letter-spacing" | "text-align" | "color" | "white-space" | "text-decoration" | "text-shadow" => Typography, - // Layout (flex + grid) "display" | "flex-direction" | "flex-wrap" @@ -670,27 +533,19 @@ pub fn section_for(prop: &str) -> CssSection { | "grid-auto-flow" | "justify-items" | "justify-self" => Layout, - // Sizing "width" | "height" | "min-width" | "min-height" | "max-width" | "max-height" | "aspect-ratio" | "box-sizing" => Sizing, - // Spacing "padding" | "margin" => Spacing, - // Position "position" | "top" | "right" | "bottom" | "left" | "z-index" => Position, - // Visual "background" | "border" | "border-radius" | "box-shadow" | "opacity" | "mix-blend-mode" | "visibility" | "clip-path" => Visual, - // Effects "filter" | "backdrop-filter" | "transform" | "transform-origin" | "perspective" | "perspective-origin" | "transition" | "audio-reactive" => Effects, - // Overflow "overflow" | "overflow-x" | "overflow-y" | "text-overflow" | "overflow-wrap" => Overflow, - // Everything else — including future schema additions — by construction. _ => Advanced, } } -/// All `CssStyle` schema properties with kinds, in schema order. pub fn css_props() -> &'static Vec { static CACHE: OnceLock> = OnceLock::new(); CACHE.get_or_init(|| { @@ -712,7 +567,6 @@ pub fn css_props() -> &'static Vec { }) } -/// The properties of one section, schema order. pub fn css_section_props(section: CssSection) -> Vec<&'static PropSpec> { css_props() .iter() @@ -720,10 +574,6 @@ pub fn css_section_props(section: CssSection) -> Vec<&'static PropSpec> { .collect() } -// ── Family → visible sections ──────────────────────────────────────────────── - -/// Which CSS sections a component family gets: Typography for text-likes, -/// Layout for containers, the common trunk for everyone. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum CssFamily { TextLike, @@ -731,8 +581,6 @@ pub enum CssFamily { Plain, } -/// Classify a component tag for CSS-section visibility (independent from the -/// inspector's curated-section `Family`). pub fn css_family(tag: &str) -> CssFamily { match tag { "text" | "caption" | "gradient_text" | "rich_text" | "counter" | "kbd" | "badge" @@ -744,8 +592,6 @@ pub fn css_family(tag: &str) -> CssFamily { } } -/// The CSS sections shown for a family, display order: the family-specific -/// section first, then the common trunk. pub fn visible_sections(family: CssFamily) -> Vec { use CssSection::*; let mut out = Vec::new(); @@ -760,8 +606,6 @@ pub fn visible_sections(family: CssFamily) -> Vec { out } -/// Heuristic slider ranges by property name: `(min, max, step)`. Anything not -/// listed gets a bare input. pub fn slider_range(prop: &str) -> Option<(f64, f64, f64)> { match prop { "opacity" => Some((0.0, 1.0, 0.01)), @@ -782,8 +626,6 @@ mod tests { props.iter().find(|p| p.name == name).map(|p| &p.kind) } - // ── Component registry ────────────────────────────────────────────── - #[test] fn counter_exposes_its_root_fields_with_kinds() { let props = component_props("counter").expect("counter in schema"); @@ -793,7 +635,6 @@ mod tests { assert_eq!(kind_of(props, "separator"), Some(&PropKind::String)); assert_eq!(kind_of(props, "prefix"), Some(&PropKind::String)); assert_eq!(kind_of(props, "suffix"), Some(&PropKind::String)); - // The exact enum variants come from the schema (snake_case). match kind_of(props, "easing") { Some(PropKind::Enum(variants)) => { assert!(variants.contains(&"linear".to_string()), "{variants:?}"); @@ -819,8 +660,6 @@ mod tests { ); } } - // Spot-check the data arrays actually exist on their components and - // are excluded (chart.data, rich_text.spans). assert!(component_props("chart").is_some()); assert!(component_props("rich_text").is_some()); } @@ -830,8 +669,6 @@ mod tests { assert!(component_props("definitely_not_a_component").is_none()); } - // ── CSS bucketing: completeness by construction ───────────────────── - #[test] fn every_css_schema_property_is_in_exactly_one_section() { let all = css_props(); @@ -890,8 +727,6 @@ mod tests { #[test] fn css_kinds_are_usable() { let all = css_props(); - // color is a Color control, opacity a Number, display an Enum, - // width a Unit (untagged number|string), box-shadow Complex. assert_eq!(kind_of(all, "color"), Some(&PropKind::Color)); assert_eq!(kind_of(all, "opacity"), Some(&PropKind::Float)); assert!(matches!(kind_of(all, "display"), Some(PropKind::Enum(_)))); @@ -905,8 +740,6 @@ mod tests { )); } - // ── Family visibility ─────────────────────────────────────────────── - #[test] fn counter_is_text_like_and_gets_typography() { assert_eq!(css_family("counter"), CssFamily::TextLike); @@ -940,14 +773,11 @@ mod tests { } } - // ── Round 6: string lists / palette prefill / typed enums ─────────── - #[test] fn chart_axes_and_categories_are_string_lists() { let props = component_props("chart").expect("chart in schema"); assert_eq!(kind_of(props, "axes"), Some(&PropKind::StringList)); assert_eq!(kind_of(props, "categories"), Some(&PropKind::StringList)); - // colors keeps the color editor, sparkline stays numeric (stat). assert_eq!(kind_of(props, "colors"), Some(&PropKind::ColorList)); let stat = component_props("stat").unwrap(); assert_eq!(kind_of(stat, "sparkline_data"), Some(&PropKind::NumberList)); @@ -967,9 +797,7 @@ mod tests { let palette = palette_prefill("chart", "colors", true).expect("chart palette"); assert_eq!(palette.len(), 8); assert_eq!(palette[0], "#3B82F6"); - // Non-empty list → no prefill (don't clobber user colors). assert_eq!(palette_prefill("chart", "colors", false), None); - // Other tags/fields → None. assert_eq!(palette_prefill("gradient_text", "colors", true), None); assert_eq!(palette_prefill("chart", "axes", true), None); } @@ -994,8 +822,6 @@ mod tests { } } - // ── Round 7: effective CSS defaults ───────────────────────────────── - #[test] fn css_effective_default_table_entries() { assert_eq!(css_effective_default("opacity"), Some(Value::from(1.0))); @@ -1009,7 +835,6 @@ mod tests { Some(Value::from("visible")) ); assert_eq!(css_effective_default("flex-shrink"), Some(Value::from(1))); - // No displayable default → placeholder territory. assert_eq!(css_effective_default("background"), None); assert_eq!(css_effective_default("width"), None); assert_eq!(engine_placeholder("background"), Some("none")); @@ -1022,7 +847,6 @@ mod tests { assert_eq!(text_default_font_size("codeblock"), Some(14.0)); assert_eq!(text_default_font_size("text"), Some(48.0)); assert_eq!(text_default_font_size("made_up_tag"), None); - // Routed through the display default too. assert_eq!( css_display_default("terminal", "font-size"), Some(Value::from(14.0)) @@ -1036,12 +860,10 @@ mod tests { #[test] fn css_row_value_prefers_raw_and_marks_defaults() { - // Raw present → raw, not a default. assert_eq!( css_row_value("12px".into(), "text", "opacity"), ("12px".to_string(), false) ); - // Raw absent + known default → displayed value with the marker. assert_eq!( css_row_value(String::new(), "text", "opacity"), ("1".to_string(), true) @@ -1050,34 +872,25 @@ mod tests { css_row_value(String::new(), "card", "position"), ("static".to_string(), true) ); - // Raw absent, no default → empty, no marker (placeholder shows). assert_eq!( css_row_value(String::new(), "card", "background"), (String::new(), false) ); } - // ── Chart-colors bug fix: unified add decision ────────────────────── - #[test] fn add_click_seeds_palette_or_appends() { let palette = palette_prefill("chart", "colors", true).unwrap(); - // Empty chart colors + prefill → all 8 editable rows at once. let seeded = next_entries_on_add(&[], "#ffffff", Some(palette)); assert_eq!(seeded.len(), 8); assert_eq!(seeded[0], "#3B82F6"); - // Non-empty list → plain append even with a prefill available. let appended = next_entries_on_add(&seeded, "#ffffff", Some(palette)); assert_eq!(appended.len(), 9); assert_eq!(appended[8], "#ffffff"); - // NumberList / StringList (no prefill): empty list appends ONE default - // entry — no palette-style seeding, no lost click. assert_eq!(next_entries_on_add(&[], "0", None), vec!["0".to_string()]); assert_eq!(next_entries_on_add(&[], "", None), vec![String::new()]); } - // ── Round 5: object / number-list editors ─────────────────────────── - #[test] fn stat_trend_is_an_object_with_known_sub_kinds() { let props = component_props("stat").expect("stat in schema"); @@ -1101,8 +914,6 @@ mod tests { #[test] fn shapeless_objects_stay_json_areas() { - // An object without known properties (map-like) must NOT become an - // Object control. let map_schema = serde_json::json!({ "type": "object", "additionalProperties": { "type": "string" } @@ -1120,10 +931,8 @@ mod tests { kind_of(props, "sparkline_data"), Some(&PropKind::NumberList) ); - // Color arrays keep their dedicated editor. let gt = component_props("gradient_text").unwrap(); assert_eq!(kind_of(gt, "colors"), Some(&PropKind::ColorList)); - // Plain string arrays get their own editor (round 6). let strings = serde_json::json!({"type": "array", "items": {"type": "string"}}); assert_eq!( kind_of_schema("labels", &strings, &Value::Null, 0), @@ -1134,19 +943,15 @@ mod tests { #[test] fn mutate_object_field_sets_prunes_and_collapses() { let trend = serde_json::json!({"value": "+340%", "direction": "up"}); - // Set a sub-key → whole object with the new value. let out = mutate_object_field(&trend, "direction", serde_json::json!("down")); assert_eq!( out, serde_json::json!({"value": "+340%", "direction": "down"}) ); - // Null prunes the key. let out = mutate_object_field(&out, "direction", Value::Null); assert_eq!(out, serde_json::json!({"value": "+340%"})); - // Last key removed → the whole field collapses to Null. let out = mutate_object_field(&out, "value", Value::Null); assert!(out.is_null()); - // Mutating a null/absent object starts a fresh one. let out = mutate_object_field(&Value::Null, "value", serde_json::json!("+1%")); assert_eq!(out, serde_json::json!({"value": "+1%"})); } @@ -1167,17 +972,12 @@ mod tests { ); } - // ── Round 3: Integer/Float split + display ────────────────────────── - #[test] fn integer_and_float_split_follows_the_schema() { - // f64 → "type": "number" → Float. let gauge = component_props("gauge").expect("gauge in schema"); assert_eq!(kind_of(gauge, "value"), Some(&PropKind::Float)); - // Option → "type": "integer" (format uint32) → Integer. let badge = component_props("badge").expect("badge in schema"); assert_eq!(kind_of(badge, "count"), Some(&PropKind::Integer)); - // u8 → "type": "integer" (format uint8) → Integer. let counter = component_props("counter").expect("counter in schema"); assert_eq!(kind_of(counter, "decimals"), Some(&PropKind::Integer)); } @@ -1195,9 +995,6 @@ mod tests { #[test] fn integer_write_round_trips_through_the_typed_parse() { - // Writing 12 into badge.count must produce a REAL JSON integer: a - // 12.0 float makes from_value:: fail ("invalid type: - // floating point") and the element would be dropped at render. let raw = serde_json::json!({"type": "badge", "text": "New", "count": 12}); assert!( serde_json::from_value::(raw).is_ok(), @@ -1210,8 +1007,6 @@ mod tests { ); } - // ── Round 2: color editors / effective view / multiline ───────────── - #[test] fn gradient_text_colors_is_a_color_list() { let props = component_props("gradient_text").expect("gradient_text in schema"); @@ -1269,13 +1064,10 @@ mod tests { #[test] fn effective_element_fills_serde_defaults() { - // User bug: gauge without show_value renders the value (default true), - // but the inspector showed the switch off. let raw = serde_json::json!({"type": "gauge", "value": 50.0}); let eff = effective_element(&raw); assert_eq!(eff["show_value"], serde_json::json!(true)); - // Counter without easing → the exact default variant, serialized. let raw = serde_json::json!({"type": "counter", "from": 0, "to": 10}); let eff = effective_element(&raw); assert_eq!(eff["easing"], serde_json::json!("linear")); diff --git a/crates/rustmotion-studio/src/library/data.rs b/crates/rustmotion-studio/src/library/data.rs index 62f72781..2a2b9735 100644 --- a/crates/rustmotion-studio/src/library/data.rs +++ b/crates/rustmotion-studio/src/library/data.rs @@ -1,44 +1,33 @@ -//! Library data layer: workspace scanning, recent files, and thumbnail cache. -//! Pure logic (no UI). The home page reads a `SharedLibrary` from context. - use std::collections::HashMap; use std::path::{Path, PathBuf}; use std::sync::mpsc::Sender; use std::sync::{Arc, Mutex}; -/// Control message to the single re-targetable file watcher. pub enum WatchMsg { Retarget(PathBuf), Changed, } -/// A single scenario in the library. #[derive(Clone, PartialEq)] pub struct ScenarioEntry { pub path: PathBuf, pub name: String, - /// Index into `LibraryState.index` — used for the `/thumb/{i}` URL. pub flat_index: usize, } -/// A folder group (the workspace root = "Default"; subdirs = their name). #[derive(Clone, PartialEq)] pub struct Group { pub name: String, pub entries: Vec, } -/// The full library state, shared between the home UI and the thumbnail handler. pub struct LibraryState { pub workspace: PathBuf, pub groups: Vec, pub recents: Vec, - /// Flat, authoritative path list; `/thumb/{i}` maps to `index[i]`. pub index: Vec, pub thumb_cache: HashMap>>, - /// When launched with `--file`, start directly in the editor. pub start_in_editor: bool, - /// Channel to the file watcher (set by `run_preview_root`). pub watch_tx: Option>, } @@ -59,14 +48,12 @@ impl LibraryState { s } - /// Tell the watcher to follow `path` (so editing it hot-reloads the editor). pub fn retarget_watch(&self, path: &Path) { if let Some(tx) = &self.watch_tx { let _ = tx.send(WatchMsg::Retarget(path.to_path_buf())); } } - /// Rescan the workspace + reload recents + rebuild the flat index. pub fn refresh(&mut self) { self.groups = scan_workspace(&self.workspace); self.recents = load_recents() @@ -80,12 +67,9 @@ impl LibraryState { self.reindex(); } - /// Ensure a freshly-opened path is visible (recents + index) even if it - /// lives outside the workspace (e.g. an imported file). pub fn note_opened(&mut self, path: &Path) { push_recent(path); self.refresh(); - // If still absent (e.g. canonicalization mismatch), append it. if !self.index.iter().any(|p| p == path) { self.index.push(path.to_path_buf()); } @@ -124,8 +108,6 @@ impl LibraryState { } } -/// Render a scenario's frame 0 to a small JPEG thumbnail. No lock held by design -/// (the caller renders this off-lock, then re-locks to cache the result). pub fn render_thumbnail(path: &Path) -> Option> { let scenario = rustmotion::loader::load_input(&path.to_path_buf()).ok()?; let tasks = rustmotion::encode::build_frame_tasks(&scenario); @@ -135,16 +117,12 @@ pub fn render_thumbnail(path: &Path) -> Option> { crate::editor::frames::render_frame_deep(&scenario, &tasks, 0, 0.25).ok() } -/// Cheap check: is this JSON a Rustmotion scenario? Avoids the heavier -/// `load_scenario` (includes/variables) during a directory scan. pub fn is_scenario_json(v: &serde_json::Value) -> bool { v.get("video").map(|x| x.is_object()).unwrap_or(false) && (v.get("scenes").map(|x| x.is_array()).unwrap_or(false) || v.get("composition").is_some()) } -/// Scan `root`: `.json` scenarios directly in it → a "Default" group; each -/// immediate subdirectory with scenarios → its own group. pub fn scan_workspace(root: &Path) -> Vec { let mut default = Vec::new(); let mut subgroups: Vec = Vec::new(); @@ -199,7 +177,6 @@ fn is_scenario_file(p: &Path) -> bool { .and_then(|s| serde_json::from_str::(&s).ok()) .map(|v| is_scenario_json(&v)) .unwrap_or(false), - // Cheap HTML-dialect check: a scenario has a root element. Some("html") | Some("htm") => std::fs::read_to_string(p) .map(|s| s.contains(" String { .to_string() } -// ── Recents ────────────────────────────────────────────────────────── - const RECENTS_CAP: usize = 15; fn recents_path() -> Option { @@ -264,7 +239,6 @@ pub fn push_recent(path: &Path) { save_recents(&list); } -/// Pure MRU insert: move `path` to front, dedup, cap length. pub fn mru_insert(mut list: Vec, path: PathBuf, cap: usize) -> Vec { list.retain(|p| p != &path); list.insert(0, path); @@ -300,7 +274,6 @@ mod tests { #[test] fn scan_workspace_groups_examples() { - // The repo's examples/ dir holds demo.json + component-showcase.json. let examples = Path::new(env!("CARGO_MANIFEST_DIR")).join("../../examples"); let groups = scan_workspace(&examples); let default = groups diff --git a/crates/rustmotion-studio/src/scenario/baseline.rs b/crates/rustmotion-studio/src/scenario/baseline.rs index 4b26b08c..95cc0d90 100644 --- a/crates/rustmotion-studio/src/scenario/baseline.rs +++ b/crates/rustmotion-studio/src/scenario/baseline.rs @@ -1,19 +1,9 @@ -//! Baseline snapshots for the diff/review mode. -//! -//! A baseline is the scenario as it was when first opened in the editor this -//! session (source text + parsed raw JSON), kept in an app-global map keyed by -//! path. Watcher reloads never touch it, and re-opening the same file keeps -//! its original baseline until the app quits or the user re-snapshots via -//! "Set baseline". - use std::collections::HashMap; use std::path::{Path, PathBuf}; use std::sync::{Arc, Mutex, OnceLock}; use serde_json::Value; -/// One snapshot: the source file text (JSON text or HTML markup) and the raw -/// scenario JSON derived from it (used for diffing). #[derive(Clone)] pub struct Baseline { pub source: String, @@ -22,15 +12,12 @@ pub struct Baseline { pub type SharedBaselines = Arc>>; -/// The app-global baseline map. pub fn baseline_slot() -> SharedBaselines { static SLOT: OnceLock = OnceLock::new(); SLOT.get_or_init(|| Arc::new(Mutex::new(HashMap::new()))) .clone() } -/// Insert a baseline for `path` if none exists yet (first open wins; watcher -/// reloads call this too and are no-ops). Skips null raw (unparseable source). pub fn ensure_baseline(slot: &SharedBaselines, path: &Path, source: &str, raw: &Value) { if raw.is_null() { return; @@ -42,13 +29,11 @@ pub fn ensure_baseline(slot: &SharedBaselines, path: &Path, source: &str, raw: & }); } -/// Re-snapshot: overwrite the baseline for `path` ("Set baseline" button). pub fn set_baseline(slot: &SharedBaselines, path: &Path, source: String, raw: Value) { let mut map = slot.lock().unwrap_or_else(|e| e.into_inner()); map.insert(path.to_path_buf(), Baseline { source, raw }); } -/// Fetch the baseline for `path`, if any. pub fn get_baseline(slot: &SharedBaselines, path: &Path) -> Option { let map = slot.lock().unwrap_or_else(|e| e.into_inner()); map.get(path).cloned() @@ -68,7 +53,6 @@ mod tests { let slot = local(); let p = Path::new("/w/a.json"); ensure_baseline(&slot, p, "v1", &json!({ "v": 1 })); - // A later ensure (e.g. watcher reload after an edit) must not replace it. ensure_baseline(&slot, p, "v2", &json!({ "v": 2 })); let b = get_baseline(&slot, p).unwrap(); assert_eq!(b.source, "v1"); diff --git a/crates/rustmotion-studio/src/scenario/diff.rs b/crates/rustmotion-studio/src/scenario/diff.rs index 456ff389..e28e25d5 100644 --- a/crates/rustmotion-studio/src/scenario/diff.rs +++ b/crates/rustmotion-studio/src/scenario/diff.rs @@ -1,15 +1,3 @@ -//! Pure scenario diff for the studio's before/after review mode. -//! -//! Compares the baseline raw scenario JSON against the current one and -//! reports element-level changes, identified by JSON pointer. Matching is -//! positional (by pointer): an element is compared with whatever sits at the -//! same index in the other tree. Consequently a reorder of different-typed -//! siblings shows as remove+add (type mismatch at both indices), and a -//! reorder of same-typed siblings shows as paired field modifications. -//! -//! Top-level `annotations` are deliberately ignored (studio feedback, not -//! scenario content). - use serde_json::{Map, Value}; #[derive(Debug, Clone, PartialEq)] @@ -19,9 +7,6 @@ pub enum ChangeKind { Modified, } -/// One changed field of a modified element, dot-flattened (`style.font-size`). -/// `before`/`after` are display strings; an empty string means the field was -/// absent on that side. #[derive(Debug, Clone, PartialEq)] pub struct FieldChange { pub field: String, @@ -29,29 +14,20 @@ pub struct FieldChange { pub after: String, } -/// One changed element (or the video config / document root), addressed by a -/// JSON pointer into the current scenario (or the baseline for removals). #[derive(Debug, Clone, PartialEq)] pub struct ElementChange { pub pointer: String, pub kind: ChangeKind, - /// Component `type` ("text", "card", …), or "scene" / "video" / "document". pub element_type: String, - /// Short display label (content snippet or the type). pub label: String, - /// Display group ("Video", "Scene 1", "View 2 · Scene 1", "Document"). pub group: String, - /// Per-field before → after list (only for `Modified`). pub fields: Vec, - /// The element's `start_at`, for click-to-scrub. pub start_at: Option, } -/// Diff two raw scenario JSON documents. Pure. pub fn diff_scenarios(baseline: &Value, current: &Value) -> Vec { let mut out = Vec::new(); - // Video config as one pseudo-element. let empty = Map::new(); let b_video = baseline .get("video") @@ -75,8 +51,6 @@ pub fn diff_scenarios(baseline: &Value, current: &Value) -> Vec { }); } - // Scene lists: top-level `scenes` and/or `composition/*/scenes`, keyed by - // pointer prefix so mismatched shapes fall out as remove+add naturally. for (prefix, group_prefix) in scene_prefixes(baseline, current) { let b_scenes = scenes_at(baseline, &prefix); let c_scenes = scenes_at(current, &prefix); @@ -95,8 +69,6 @@ pub fn diff_scenarios(baseline: &Value, current: &Value) -> Vec { } } - // Any other top-level drift (fonts, audio, config, backgrounds…) except - // scenes/composition (walked above) and annotations (studio feedback). let skip = ["video", "scenes", "composition", "annotations"]; let b_root = baseline.as_object().cloned().unwrap_or_default(); let c_root = current.as_object().cloned().unwrap_or_default(); @@ -125,8 +97,6 @@ pub fn diff_scenarios(baseline: &Value, current: &Value) -> Vec { out } -/// The scene-array pointer prefixes present in either document, with their -/// display group prefix (`""` or `"View N · "`), deduplicated, stable order. fn scene_prefixes(baseline: &Value, current: &Value) -> Vec<(String, String)> { let mut prefixes = Vec::new(); let mut push = |p: String, g: String| { @@ -150,7 +120,6 @@ fn scene_prefixes(baseline: &Value, current: &Value) -> Vec<(String, String)> { prefixes } -/// The scene array at a pointer prefix (empty when absent). fn scenes_at<'a>(doc: &'a Value, prefix: &str) -> &'a [Value] { doc.pointer(prefix) .and_then(|v| v.as_array()) @@ -158,9 +127,6 @@ fn scenes_at<'a>(doc: &'a Value, prefix: &str) -> &'a [Value] { .unwrap_or(&[]) } -/// Compare two elements at the same pointer. Same type → field diff (dot -/// flattened, recursive into objects like `style`, skipping `children`) then -/// recurse into children pairwise. Different type → remove + add. fn diff_element( pointer: &str, group: &str, @@ -217,8 +183,6 @@ fn diff_element( } } -/// Build an Added/Removed entry for a whole element (no recursion inside — one -/// entry per added/removed subtree). fn entry(pointer: &str, kind: ChangeKind, el: &Value, group: &str) -> ElementChange { let element_type = el .get("type") @@ -236,9 +200,6 @@ fn entry(pointer: &str, kind: ChangeKind, el: &Value, group: &str) -> ElementCha } } -/// Dot-flattened field diff over two objects, recursive into nested objects -/// (style etc.). `children` is skipped at the element's top level only. -/// Key order: baseline keys first, then current-only keys. fn diff_fields( prefix: &str, b: &Map, @@ -281,8 +242,6 @@ fn diff_fields( } } -/// Display string for a JSON value (strings unquoted; floats keep one decimal -/// via serde's canonical form). fn fmt(v: &Value) -> String { match v { Value::String(s) => s.clone(), @@ -290,7 +249,6 @@ fn fmt(v: &Value) -> String { } } -/// Short display label: content snippet (24 chars max) or the type. fn label_of(el: &Value, fallback: &str) -> String { match el.get("content").and_then(|c| c.as_str()) { Some(s) if !s.is_empty() => { @@ -426,7 +384,6 @@ mod tests { .unwrap() .reverse(); let d = diff_scenarios(&b, &cur); - // Type mismatch at both indices → remove+add per slot. assert_eq!(d.len(), 4); assert_eq!( d.iter().filter(|c| c.kind == ChangeKind::Removed).count(), diff --git a/crates/rustmotion-studio/src/scenario/edit.rs b/crates/rustmotion-studio/src/scenario/edit.rs index 5142c22c..aabb105a 100644 --- a/crates/rustmotion-studio/src/scenario/edit.rs +++ b/crates/rustmotion-studio/src/scenario/edit.rs @@ -1,8 +1,6 @@ use serde_json::Value; -/// Read a style property at the element addressed by `pointer`, e.g. -/// (`"/scenes/0/children/0"`, `"color"`). Returns the value as a string. -#[allow(dead_code)] // symmetric API counterpart to set_style; consumed as the inspector grows +#[allow(dead_code)] pub fn read_style(raw: &Value, pointer: &str, prop: &str) -> Option { let el = raw.pointer(pointer)?; let v = el.get("style")?.get(prop)?; @@ -12,9 +10,6 @@ pub fn read_style(raw: &Value, pointer: &str, prop: &str) -> Option { }) } -/// Read the whole `style` object of the element at `pointer` (or `Null`). The -/// inspector renders every supported property from this single value, which -/// keeps it stable (frame-independent) for memoization. pub fn read_style_object(raw: &Value, pointer: &str) -> Value { raw.pointer(pointer) .and_then(|el| el.get("style")) @@ -22,8 +17,6 @@ pub fn read_style_object(raw: &Value, pointer: &str) -> Value { .unwrap_or(Value::Null) } -/// Set a style property (as a JSON string) on the element at `pointer`. -/// Returns the mutated clone; the caller writes it to disk. pub fn set_style(mut raw: Value, pointer: &str, prop: &str, value: &str) -> Option { let el = raw.pointer_mut(pointer)?; let obj = el.as_object_mut()?; @@ -35,9 +28,6 @@ pub fn set_style(mut raw: Value, pointer: &str, prop: &str, value: &str) -> Opti Some(raw) } -/// Read a top-level field (e.g. `"content"`) of the element at `pointer` as a -/// string. Unlike [`read_style`], this reads a field on the element itself, not -/// inside its `style` object. pub fn read_field(raw: &Value, pointer: &str, field: &str) -> Option { let v = raw.pointer(pointer)?.get(field)?; Some(match v { @@ -46,8 +36,6 @@ pub fn read_field(raw: &Value, pointer: &str, field: &str) -> Option { }) } -/// Set a top-level field (e.g. `"content"`, as a JSON string) on the element at -/// `pointer`. Returns the mutated clone; the caller writes it to disk. pub fn set_field(mut raw: Value, pointer: &str, field: &str, value: &str) -> Option { let el = raw.pointer_mut(pointer)?; let obj = el.as_object_mut()?; @@ -55,10 +43,6 @@ pub fn set_field(mut raw: Value, pointer: &str, field: &str, value: &str) -> Opt Some(raw) } -/// Typed variant of [`set_field`]: writes the JSON value as-is (a number stays -/// a number, a bool a bool). `Value::Null` REMOVES the field — an emptied -/// control unsets rather than writing an empty string. Returns the mutated -/// clone. pub fn set_field_value(mut raw: Value, pointer: &str, field: &str, value: Value) -> Option { let el = raw.pointer_mut(pointer)?; let obj = el.as_object_mut()?; @@ -70,9 +54,6 @@ pub fn set_field_value(mut raw: Value, pointer: &str, field: &str, value: Value) Some(raw) } -/// Typed variant of [`set_style`]: writes the JSON value as-is into the -/// element's `style` object. `Value::Null` REMOVES the property. Returns the -/// mutated clone. pub fn set_style_value(mut raw: Value, pointer: &str, prop: &str, value: Value) -> Option { let el = raw.pointer_mut(pointer)?; let obj = el.as_object_mut()?; @@ -90,9 +71,6 @@ pub fn set_style_value(mut raw: Value, pointer: &str, prop: &str, value: Value) Some(raw) } -/// Duration (seconds) of the scene containing the element at `pointer` -/// (`/scenes/N/…` or `/composition/V/scenes/N/…`). Used by the inspector's -/// Timing section as the upper bound for start_at/end_at. pub fn scene_duration_for_pointer(raw: &Value, pointer: &str) -> Option { let segs: Vec<&str> = pointer.split('/').collect(); let scene_ptr = match segs.as_slice() { @@ -103,8 +81,6 @@ pub fn scene_duration_for_pointer(raw: &Value, pointer: &str) -> Option { raw.pointer(&scene_ptr)?.get("duration")?.as_f64() } -/// Append an annotation object to `raw["annotations"]` (creating the array if -/// absent). Returns the mutated clone. pub fn append_annotation(mut raw: Value, annotation: Value) -> Value { if let Some(obj) = raw.as_object_mut() { let arr = obj @@ -117,7 +93,6 @@ pub fn append_annotation(mut raw: Value, annotation: Value) -> Value { raw } -/// Remove the annotation with the given id from `raw["annotations"]`. pub fn remove_annotation(mut raw: Value, id: &str) -> Value { if let Some(Value::Array(a)) = raw.get_mut("annotations") { a.retain(|x| x.get("id").and_then(|v| v.as_str()) != Some(id)); @@ -125,7 +100,6 @@ pub fn remove_annotation(mut raw: Value, id: &str) -> Value { raw } -/// List the annotations as (id, note, frame, kind) tuples for the panel. pub fn list_annotations(raw: &Value) -> Vec<(String, String, u64, String)> { raw.get("annotations") .and_then(|v| v.as_array()) @@ -246,7 +220,6 @@ mod tests { assert!(updated["scenes"][0]["children"][0]["style"] .get("color") .is_none()); - // Typed write keeps the number. let updated = set_style_value(updated, "/scenes/0/children/0", "font-size", json!(64)).unwrap(); assert_eq!( diff --git a/crates/rustmotion-studio/src/scenario/history.rs b/crates/rustmotion-studio/src/scenario/history.rs index 37378cfa..a67de43b 100644 --- a/crates/rustmotion-studio/src/scenario/history.rs +++ b/crates/rustmotion-studio/src/scenario/history.rs @@ -1,25 +1,10 @@ -//! Undo/redo history for studio edits. -//! -//! One history entry = one effective disk write (post-debounce), capturing the -//! full file text as it was BEFORE the write — uniform for JSON scenarios and -//! HTML sources. Undo/redo rewrite the source file; the watcher reload then -//! refreshes the model (reloads never push history, so an undo-induced reload -//! is not captured as a new edit). -//! -//! The stacks live in an app-global slot ([`history_slot`]) separate from -//! `StudioModel`, so they survive the model replacement a watcher reload -//! performs. Switching to a different file resets them lazily (the slot tracks -//! which path it belongs to). - use std::path::{Path, PathBuf}; use std::sync::{Arc, Mutex, OnceLock}; use super::Shared; -/// Maximum retained undo entries; the oldest is evicted beyond this. pub const HISTORY_CAP: usize = 64; -/// Pure bounded undo/redo stacks over full-file snapshots. #[derive(Default)] pub struct History { undo: Vec, @@ -27,9 +12,6 @@ pub struct History { } impl History { - /// Record the pre-write state of the file as a new undo entry. Clears the - /// redo stack (a new edit after an undo invalidates the redone future) and - /// evicts the oldest entry beyond [`HISTORY_CAP`]. pub fn record(&mut self, snapshot: String) { self.undo.push(snapshot); if self.undo.len() > HISTORY_CAP { @@ -38,16 +20,12 @@ impl History { self.redo.clear(); } - /// Pop the previous state, pushing `current` onto the redo stack. Returns - /// `None` (and leaves both stacks untouched) when there is nothing to undo. pub fn undo(&mut self, current: String) -> Option { let prev = self.undo.pop()?; self.redo.push(current); Some(prev) } - /// Pop the next state, pushing `current` onto the undo stack. Returns - /// `None` (and leaves both stacks untouched) when there is nothing to redo. pub fn redo(&mut self, current: String) -> Option { let next = self.redo.pop()?; self.undo.push(current); @@ -63,8 +41,6 @@ impl History { } } -/// The slot state: which file the stacks belong to, the stacks, and whether a -/// debounced write is pending ("Saving…" indicator). #[derive(Default)] pub struct HistoryState { pub path: Option, @@ -73,7 +49,6 @@ pub struct HistoryState { } impl HistoryState { - /// Reset the stacks when the edited file changes (lazy file-switch reset). pub fn ensure_path(&mut self, path: &Path) { if self.path.as_deref() != Some(path) { self.path = Some(path.to_path_buf()); @@ -84,50 +59,31 @@ impl HistoryState { pub type SharedHistory = Arc>; -/// The app-global history slot. Global (not in `StudioModel`) so the stacks -/// survive watcher reloads, which replace the model wholesale. pub fn history_slot() -> SharedHistory { static SLOT: OnceLock = OnceLock::new(); SLOT.get_or_init(|| Arc::new(Mutex::new(HistoryState::default()))) .clone() } -/// Record a pre-write snapshot for `path` (called by the write paths after a -/// successful, effective disk write). pub fn record_edit(slot: &SharedHistory, path: &Path, snapshot: String) { let mut st = slot.lock().unwrap_or_else(|e| e.into_inner()); st.ensure_path(path); st.history.record(snapshot); } -/// Set the pending-write ("Saving…") indicator. pub fn set_saving(slot: &SharedHistory, saving: bool) { let mut st = slot.lock().unwrap_or_else(|e| e.into_inner()); st.saving = saving; } -/// Undo the last edit: write the previous file state back to disk. The watcher -/// reload does the rest. Write failures are surfaced via the model's -/// `write_error` (same guarantees as every studio write) and roll the stacks -/// back so the step isn't lost. pub fn undo(shared: &Shared, slot: &SharedHistory) { step(shared, slot, true) } -/// Redo the last undone edit (see [`undo`]). pub fn redo(shared: &Shared, slot: &SharedHistory) { step(shared, slot, false) } -/// Shared body of [`undo`]/[`redo`]. Lock discipline: the model lock and the -/// slot lock are never held together (model → path, then slot → stacks + -/// disk, then model → report). -/// -/// Drains the pending-write queue for `path` before touching the file: any -/// edit still waiting out its debounce window would otherwise fire later and -/// replay over the state this step is about to write, silently reverting the -/// undo/redo and destroying the redo entry that could have recovered it -/// (`record_edit` clears redo on every write). fn step(shared: &Shared, slot: &SharedHistory, is_undo: bool) { let path = { let m = shared.lock().unwrap_or_else(|e| e.into_inner()); @@ -153,11 +109,6 @@ fn step(shared: &Shared, slot: &SharedHistory, is_undo: bool) { }; match std::fs::write(&path, &target) { Ok(()) => { - // Record the self-write so the watcher skips the reload, - // and adopt the restored state in memory ourselves. If - // adoption fails (shouldn't: disk states were valid when - // captured), clear the note so the watcher reloads - // normally instead of leaving stale memory. super::optimistic::note_self_write( &super::optimistic::self_write_slot(), &path, @@ -166,10 +117,6 @@ fn step(shared: &Shared, slot: &SharedHistory, is_undo: bool) { Ok(true) } Err(e) => { - // Roll the stacks back so the failed step isn't lost: the - // inverse operation with `target` restores both stacks - // exactly (the popped entry returns, `current` comes back - // off the other stack and is discarded). if is_undo { let _ = st.history.redo(target); } else { @@ -183,8 +130,6 @@ fn step(shared: &Shared, slot: &SharedHistory, is_undo: bool) { match outcome { Ok(true) => { - // Adopt the restored state in memory (the watcher will skip the - // self-write). Failure → clear the note so the watcher reloads. let disk = std::fs::read_to_string(&path).unwrap_or_default(); if super::optimistic::adopt_source(shared, &path, &disk).is_err() { super::optimistic::clear_self_write(&super::optimistic::self_write_slot(), &path); @@ -206,15 +151,12 @@ mod tests { use super::*; use crate::scenario::{empty_scenario, StudioModel}; - // ── Pure stack behavior ───────────────────────────────────────────── - #[test] fn record_caps_at_64_evicting_oldest() { let mut h = History::default(); for i in 0..(HISTORY_CAP + 5) { h.record(format!("s{i}")); } - // Cap holds; undoing all the way lands on the oldest KEPT entry (s5). let mut last = None; let mut current = "top".to_string(); while let Some(s) = h.undo(current.clone()) { @@ -262,17 +204,13 @@ mod tests { st.ensure_path(Path::new("/a.json")); st.history.record("s".into()); assert!(st.history.can_undo()); - // Same path: stacks kept. st.ensure_path(Path::new("/a.json")); assert!(st.history.can_undo()); - // Different path: stacks reset. st.ensure_path(Path::new("/b.json")); assert!(!st.history.can_undo()); assert!(!st.history.can_redo()); } - // ── Model-level integration (no UI) ───────────────────────────────── - fn temp_file(tag: &str, content: &str) -> PathBuf { let p = std::env::temp_dir().join(format!("rm_history_{tag}_{}.json", std::process::id())); std::fs::write(&p, content).unwrap(); @@ -297,7 +235,6 @@ mod tests { let shared = model_for(&path); let slot = local_slot(); - // The edit that produced STATE_B recorded the pre-write state. record_edit(&slot, &path, "STATE_A".into()); undo(&shared, &slot); @@ -334,16 +271,14 @@ mod tests { record_edit(&slot, &a, "old_a".into()); assert!(slot.lock().unwrap().history.can_undo()); - // Recording for another file drops the previous file's stacks. record_edit(&slot, &b, "old_b".into()); let st = slot.lock().unwrap(); assert_eq!(st.path.as_deref(), Some(b.as_path())); - // Only b's single entry remains: one undo possible, then empty. drop(st); let shared = model_for(&b); undo(&shared, &slot); assert_eq!(std::fs::read_to_string(&b).unwrap(), "old_b"); - undo(&shared, &slot); // empty now → no-op + undo(&shared, &slot); assert_eq!(std::fs::read_to_string(&b).unwrap(), "old_b"); let _ = std::fs::remove_file(&a); diff --git a/crates/rustmotion-studio/src/scenario/mod.rs b/crates/rustmotion-studio/src/scenario/mod.rs index f6e18098..82ef7d59 100644 --- a/crates/rustmotion-studio/src/scenario/mod.rs +++ b/crates/rustmotion-studio/src/scenario/mod.rs @@ -1,6 +1,3 @@ -//! Scenario data layer: the live studio model, JSON-pointer style edits, and -//! the top-level view enum shared across features. - mod baseline; mod diff; mod edit; @@ -23,14 +20,12 @@ pub use optimistic::{ }; pub use sidecar::{append_sidecar_annotation, remove_sidecar_annotation}; -/// Which top-level view is shown (library home vs. the editor). #[derive(Clone, Copy, PartialEq)] pub enum View { Library, Editor, } -/// The active UI theme. `System` follows the OS `prefers-color-scheme`. #[derive(Clone, Copy, PartialEq)] pub enum Theme { Dark, @@ -39,8 +34,6 @@ pub enum Theme { } impl Theme { - /// CSS class applied to the themed root; the stylesheet keys palette - /// variables off it. pub fn class(self) -> &'static str { match self { Theme::Dark => "rm-dark", @@ -49,7 +42,6 @@ impl Theme { } } - /// Cycle Dark → Light → System → Dark. pub fn next(self) -> Theme { match self { Theme::Dark => Theme::Light, diff --git a/crates/rustmotion-studio/src/scenario/model.rs b/crates/rustmotion-studio/src/scenario/model.rs index 6fe74582..99abd902 100644 --- a/crates/rustmotion-studio/src/scenario/model.rs +++ b/crates/rustmotion-studio/src/scenario/model.rs @@ -3,35 +3,16 @@ use std::sync::{Arc, Mutex}; use rustmotion::encode::video::FrameTask; use rustmotion::schema::ResolvedScenario; -/// Live studio state shared between the file watcher and the UI/asset handler. -/// Wrapped in `Arc>` (`Shared`) so the watcher thread can swap in a -/// reloaded scenario while the webview reads frames. -/// -/// `scenario`/`tasks` are `Arc` snapshots: consumers that render clone the -/// Arcs under a brief lock and work WITHOUT the model lock (frame handler, -/// hit-map, prefetcher). Watcher reloads build fresh Arcs; in-flight renders -/// keep the old snapshot alive until they finish. pub struct StudioModel { pub scenario: Arc, pub tasks: Arc>, pub total_frames: u32, - /// Load/parse error surfaced as a full-screen banner in the editor. pub error: Option, - /// Disk-write error surfaced as a topbar indicator. Cleared on the next - /// successful write or on model reload. pub write_error: Option, - /// Audio tracks the analyser could not read, surfaced as a topbar - /// indicator. Without it an undecodable track just makes `waveform` and - /// `audio_spectrum` draw their flat fallback, with nothing to explain it. pub audio_error: Option, - /// Bumped on every hot-reload so the UI can detect a change. pub generation: u64, - /// Path to the scenario file (for inspector write-back). pub path: Option, - /// Raw parsed scenario JSON (for reading/editing element props by pointer). pub raw: serde_json::Value, - /// In-memory HTML source for `.html` scenarios (kept in sync by the - /// optimistic edit path; `None` for JSON sources). pub html_source: Option, } @@ -43,9 +24,6 @@ impl StudioModel { error: Option, path: Option, ) -> Self { - // For HTML sources the raw JSON is the transpiled scenario, plus the - // annotations sidecar merged in so `list_annotations` and the comments - // panel work unchanged; the inspector reads element props by pointer. let mut html_source = None; let raw = path .as_ref() @@ -53,27 +31,18 @@ impl StudioModel { let s = std::fs::read_to_string(p).ok()?; let raw = if rustmotion::loader::is_html_path(p) { let raw = rustmotion::loader::html_to_scenario_json(&s).ok()?; - // A corrupt sidecar already failed the scenario load in the - // loader (error banner); a read failure here can only be a - // race, so fall back to the bare transpile. let annotations = super::sidecar::read_sidecar(p).unwrap_or_default(); html_source = Some(s.clone()); super::sidecar::merge_annotations(raw, annotations) } else { serde_json::from_str(&s).ok()? }; - // First-open snapshot for the diff/review mode. Insert-if-absent, - // so watcher reloads of an edited file keep the original baseline. super::baseline::ensure_baseline(&super::baseline::baseline_slot(), p, &s, &raw); Some(raw) }) .unwrap_or(serde_json::Value::Null); let tasks = rustmotion::encode::build_frame_tasks(&scenario); let total_frames = tasks.len() as u32; - // Analyse here rather than once at launch: every reload path — the - // watcher, opening a file from the library, undo — funnels through this - // constructor, and a scenario that gained a track or had its path fixed - // must not keep the previous scenario's (or no) analysis. let failures = rustmotion::encode::audio_analysis::analyze_scenario_audio(&scenario); let audio_error = (!failures.is_empty()).then(|| { failures @@ -97,10 +66,6 @@ impl StudioModel { } } -/// A minimal placeholder scenario (no scenes). Used as the initial model when -/// the studio launches into the library with no file open, and for the -/// error-display model. The editor isn't shown for it; thumbnail/frame -/// rendering guards against the empty task list. pub fn empty_scenario() -> ResolvedScenario { use rustmotion::schema::{EasingType, ResolvedView, VideoConfig, ViewType}; ResolvedScenario { diff --git a/crates/rustmotion-studio/src/scenario/optimistic.rs b/crates/rustmotion-studio/src/scenario/optimistic.rs index 2d0a6f32..66b886a1 100644 --- a/crates/rustmotion-studio/src/scenario/optimistic.rs +++ b/crates/rustmotion-studio/src/scenario/optimistic.rs @@ -1,15 +1,3 @@ -//! Optimistic in-memory edits: apply every edit event to the live model -//! immediately (rebuild scenario + tasks from memory, bump generation) so the -//! canvas refreshes in ~one render, while the DISK keeps the existing -//! debounced write path untouched (250 ms, history/undo, write_error). -//! -//! Also owns the self-write ledger: the debounced writer and undo/redo record -//! a hash of what they wrote; the watcher skips reloads whose disk content -//! matches the last self-write (the in-memory model is already up to date — -//! and possibly NEWER under continuous typing, so the skip is a correctness -//! fix, not just an optimization). External edits (agent, editor) hash -//! differently and reload normally. - use std::collections::HashMap; use std::hash::{Hash, Hasher}; use std::path::{Path, PathBuf}; @@ -21,8 +9,6 @@ use rustmotion::schema::ResolvedScenario; use super::{set_field_value, set_style_value, Shared}; -/// One in-memory edit, mirroring the debounced write payloads. -/// `Value::Null` removes the property / field. #[derive(Debug, Clone)] pub enum Mutation { Style { @@ -37,12 +23,6 @@ pub enum Mutation { }, } -/// Apply a mutation to the in-memory model: mutate the raw (JSON) or the -/// in-memory HTML source (retranspiled), rebuild scenario/tasks (fresh Arcs — -/// the prefetcher follows), bump generation. On rebuild failure (transiently -/// invalid edit, e.g. mid-typing in a JSON area) the model is left UNTOUCHED -/// and no write_error is raised — the disk is only ever written by the -/// debounced path, which has its own guards. pub fn apply_optimistic(shared: &Shared, mutation: &Mutation) -> Result<(), String> { let mut m = shared.lock().unwrap_or_else(|e| e.into_inner()); let Some(path) = m.path.clone() else { @@ -50,7 +30,6 @@ pub fn apply_optimistic(shared: &Shared, mutation: &Mutation) -> Result<(), Stri }; if rustmotion::loader::is_html_path(&path) { - // HTML: mutate the in-memory source, retranspile, rebuild. let source = match &m.html_source { Some(s) => s.clone(), None => std::fs::read_to_string(&path).map_err(|e| format!("read: {e}"))?, @@ -63,7 +42,6 @@ pub fn apply_optimistic(shared: &Shared, mutation: &Mutation) -> Result<(), Stri let scenario = rebuild_from_value(&new_raw)?; commit(&mut m, scenario, new_raw, Some(new_source)); } else { - // JSON: mutate the raw value, rebuild. let new_raw = apply_to_raw(m.raw.clone(), mutation).ok_or("mutation didn't apply")?; let scenario = rebuild_from_value(&new_raw)?; commit(&mut m, scenario, new_raw, None); @@ -71,9 +49,6 @@ pub fn apply_optimistic(shared: &Shared, mutation: &Mutation) -> Result<(), Stri Ok(()) } -/// Adopt a full source text as the new in-memory state (undo/redo: they -/// rewrite the disk themselves and the watcher skips the self-write, so the -/// memory must be updated here). Rebuilds like `apply_optimistic`. pub fn adopt_source(shared: &Shared, path: &Path, source: &str) -> Result<(), String> { let mut m = shared.lock().unwrap_or_else(|e| e.into_inner()); if rustmotion::loader::is_html_path(path) { @@ -91,8 +66,6 @@ pub fn adopt_source(shared: &Shared, path: &Path, source: &str) -> Result<(), St Ok(()) } -/// Swap the rebuilt state into the model: fresh Arcs (the prefetcher follows), -/// new totals, generation bump. fn commit( m: &mut super::StudioModel, scenario: ResolvedScenario, @@ -110,7 +83,6 @@ fn commit( m.generation = m.generation.wrapping_add(1); } -/// Apply a mutation to a raw JSON document (pure). fn apply_to_raw(raw: Value, mutation: &Mutation) -> Option { match mutation { Mutation::Style { @@ -126,8 +98,6 @@ fn apply_to_raw(raw: Value, mutation: &Mutation) -> Option { } } -/// Apply a mutation to an HTML source string (pure). `content` maps to the -/// element's text node; other fields are attributes. fn apply_to_html(source: &str, mutation: &Mutation) -> Option { match mutation { Mutation::Style { @@ -165,11 +135,8 @@ fn apply_to_html(source: &str, mutation: &Mutation) -> Option { } } -// ── Self-write ledger ──────────────────────────────────────────────────────── - pub type SelfWrites = Arc>>; -/// App-global ledger: path → hash of the last content this process wrote. pub fn self_write_slot() -> SelfWrites { static SLOT: OnceLock = OnceLock::new(); SLOT.get_or_init(|| Arc::new(Mutex::new(HashMap::new()))) @@ -182,62 +149,39 @@ fn content_hash(content: &str) -> u64 { h.finish() } -/// Record that this process wrote `content` to `path`. pub fn note_self_write(slot: &SelfWrites, path: &Path, content: &str) { let mut map = slot.lock().unwrap_or_else(|e| e.into_inner()); map.insert(path.to_path_buf(), content_hash(content)); } -/// Forget the note for `path` (adoption failed → let the watcher reload). pub fn clear_self_write(slot: &SelfWrites, path: &Path) { let mut map = slot.lock().unwrap_or_else(|e| e.into_inner()); map.remove(path); } -/// Whether `content` on disk is exactly the last self-write for `path` -/// (watcher: true → skip the reload). pub fn is_self_write(slot: &SelfWrites, path: &Path, content: &str) -> bool { let map = slot.lock().unwrap_or_else(|e| e.into_inner()); map.get(path) == Some(&content_hash(content)) } -// ── Pending writes (debounce queue) ───────────────────────────────────────── - pub type PendingWrites = Arc>>>; -/// App-global queue of mutations accumulated since the last successful disk -/// flush, keyed by scenario path. The debounce timer in `inspector.rs` -/// appends to it on every edit and drains it when it fires; `undo`/`redo` -/// drain it too, before touching the file, so an orphaned flush that still -/// fires after a revert has nothing left to replay. pub fn pending_write_slot() -> PendingWrites { static SLOT: OnceLock = OnceLock::new(); SLOT.get_or_init(|| Arc::new(Mutex::new(HashMap::new()))) .clone() } -/// Queue one mutation for `path`, to be replayed onto the freshest disk -/// content the next time the debounce flushes. pub fn queue_mutation(slot: &PendingWrites, path: &Path, mutation: Mutation) { let mut map = slot.lock().unwrap_or_else(|e| e.into_inner()); map.entry(path.to_path_buf()).or_default().push(mutation); } -/// Remove and return every mutation queued for `path`, in the order they were -/// queued (empty when there is nothing pending: a no-op flush, or a queue a -/// concurrent undo/redo already drained). pub fn take_pending(slot: &PendingWrites, path: &Path) -> Vec { let mut map = slot.lock().unwrap_or_else(|e| e.into_inner()); map.remove(path).unwrap_or_default() } -// ── Flush decision (pure) ──────────────────────────────────────────────────── - -/// Replay `mutations`, in order, onto `disk_content` — the freshest content on -/// disk, read right before the flush, never a snapshot captured back when an -/// edit happened. `Ok(None)` means every mutation was a no-op (nothing to -/// write); `Err` means `disk_content` itself could not be parsed as JSON (the -/// HTML branch has no such failure mode: any string is a valid rebase base). pub fn resolve_flush( disk_content: &str, is_html: bool, @@ -271,12 +215,6 @@ pub fn resolve_flush( } } -// ── Rebuild ────────────────────────────────────────────────────────────────── - -/// Build a `ResolvedScenario` from a raw scenario JSON value — the same -/// pipeline as the loader (variable defaults + include resolution; includes -/// resolve as Inline, so file-relative includes are a known limitation shared -/// with the diff baseline render). fn rebuild_from_value(raw: &Value) -> Result { let json = serde_json::to_string(raw).map_err(|e| format!("serialize: {e}"))?; rustmotion::loader::load_scenario_from_source(None, Some(&json)).map_err(|e| e.to_string()) @@ -307,21 +245,12 @@ mod tests { { "type": "text", "content": "Hi", "style": { "font-size": 48 } } ] } ] }"##; - // ── Integration: full chart-colors write path (user bug repro) ────── - - /// End-to-end repro of "editing chart colors does nothing": promo file → - /// optimistic Field mutation with the 8-color palette (the prefill - /// write), second mutation turning colors[0] red, rebuild, pixel check on - /// the chart's scene. Proves the DATA path (pointer → set_field_value → - /// rebuild → painter `get_color`) end to end. #[test] fn chart_colors_edit_reaches_the_rendered_pixels() { let promo = std::path::Path::new("../../examples/rustmotion-promo.json"); if !promo.exists() { panic!("examples/rustmotion-promo.json missing"); } - // Real open path: typed scenario loaded from the file (model_for uses - // an empty scenario and would have no frames before the first edit). let loaded = rustmotion::loader::load_input(&promo.to_path_buf()).expect("promo loads"); let shared: Shared = Arc::new(Mutex::new(StudioModel::new( loaded, @@ -329,7 +258,6 @@ mod tests { Some(promo.to_path_buf()), ))); - // Find the first chart component in the raw (nested scene→div→card→chart). fn find_chart(node: &Value, ptr: String, out: &mut Option) { if out.is_some() { return; @@ -371,7 +299,6 @@ mod tests { if *s == scene_idx) }) .expect("scene has frames"); - // Mid-scene so staggered entrances have landed. let idx = (base + 45).min(m.tasks.len() - 1); rustmotion::encode::render_frame_task_scaled( &m.scenario.video, @@ -391,7 +318,6 @@ mod tests { let before = render_scene(&shared); - // Edit 1: the prefill write (exactly what "+ Add color" commits). let palette: Vec = rustmotion::components::chart::DEFAULT_PALETTE .iter() .map(|c| Value::String(c.to_string())) @@ -405,7 +331,6 @@ mod tests { }, ) .expect("palette write applies"); - // Identical palette → the canvas must NOT change (the UX trap). let after_prefill = render_scene(&shared); assert_eq!( count_red(&before), @@ -413,7 +338,6 @@ mod tests { "prefill palette renders identically by design" ); - // Edit 2: the user picks red for the first series. let mut reddened = palette; reddened[0] = Value::String("#FF0000".into()); apply_optimistic( @@ -433,8 +357,6 @@ mod tests { ); } let after_red = render_scene(&shared); - // At 0.25 scale the red series line is thin — a clear nonzero jump - // is the signal (measured ~14 px; before: 0). assert!( count_red(&after_red) >= count_red(&before) + 10, "chart must actually turn red: before={} after={}", @@ -443,30 +365,21 @@ mod tests { ); } - // ── Self-write skip decision ──────────────────────────────────────── - #[test] fn self_write_skip_decision() { let slot: SelfWrites = Arc::new(Mutex::new(HashMap::new())); let a = Path::new("/w/a.json"); let b = Path::new("/w/b.json"); - // Nothing recorded → reload (not a self-write). assert!(!is_self_write(&slot, a, "content")); note_self_write(&slot, a, "content"); - // Identical content → skip. assert!(is_self_write(&slot, a, "content")); - // Different content (external edit) → reload. assert!(!is_self_write(&slot, a, "external change")); - // Same content on a DIFFERENT path → reload. assert!(!is_self_write(&slot, b, "content")); - // Cleared → reload again. note_self_write(&slot, a, "content"); clear_self_write(&slot, a); assert!(!is_self_write(&slot, a, "content")); } - // ── Optimistic rebuild (JSON) ─────────────────────────────────────── - #[test] fn optimistic_style_mutation_rebuilds_the_scenario() { let path = temp_json("style", DOC); @@ -485,7 +398,6 @@ mod tests { model.raw["scenes"][0]["children"][0]["style"]["font-size"], json!(64) ); - // The rebuilt scenario carries the new value too (children are raw values). assert_eq!( model.scenario.views[0].scenes[0].children[0]["style"]["font-size"], json!(64) @@ -504,7 +416,6 @@ mod tests { (m.generation, m.raw.clone()) }; - // width: "abc" breaks the typed Scenario parse → rebuild fails. let m = Mutation::Field { pointer: "/video".into(), field: "width".into(), @@ -518,8 +429,6 @@ mod tests { let _ = std::fs::remove_file(&path); } - // ── Optimistic rebuild (HTML) ─────────────────────────────────────── - #[test] fn optimistic_html_mutation_retranspiles_in_memory() { let p = std::env::temp_dir().join(format!("rm_opt_html_{}.html", std::process::id())); @@ -538,7 +447,6 @@ mod tests { apply_optimistic(&shared, &m).expect("html mutation applies"); let model = shared.lock().unwrap(); - // Retranspiled + re-typed by the transpiler's coercion. assert_eq!(model.raw["scenes"][0]["children"][0]["from"], json!(250)); assert!( model @@ -550,8 +458,6 @@ mod tests { let _ = std::fs::remove_file(&p); } - // ── Undo + self-write flow ────────────────────────────────────────── - #[test] fn undo_notes_self_write_and_adopts_in_memory() { let before = DOC; @@ -563,12 +469,9 @@ mod tests { crate::scenario::undo(&shared, &hist); - // Disk restored… let disk = std::fs::read_to_string(&path).unwrap(); assert_eq!(disk, before); - // …the write is recorded as a self-write (watcher will skip it)… assert!(is_self_write(&self_write_slot(), &path, &disk)); - // …and the memory adopted the restored state itself. let model = shared.lock().unwrap(); assert_eq!( model.raw["scenes"][0]["children"][0]["style"]["font-size"], diff --git a/crates/rustmotion-studio/src/scenario/sidecar.rs b/crates/rustmotion-studio/src/scenario/sidecar.rs index 691b0f4b..71a66889 100644 --- a/crates/rustmotion-studio/src/scenario/sidecar.rs +++ b/crates/rustmotion-studio/src/scenario/sidecar.rs @@ -1,27 +1,11 @@ -//! Annotations sidecar for HTML-dialect scenarios. -//! -//! HTML sources can't carry an `annotations` array like JSON scenarios do, so -//! the studio persists comments in a sidecar file next to the source: -//! `foo.html` → `foo.annotations.json`, holding `{"annotations": [...]}` with -//! exactly the same annotation object format as the JSON scenarios' field. -//! -//! The HTML file itself is never touched by annotations. The sidecar is -//! created lazily on the first comment and deleted when the last one is -//! removed. A present-but-corrupt sidecar is always an error — it is never -//! silently overwritten. - use std::path::{Path, PathBuf}; use serde_json::Value; -/// Sidecar path for an HTML source: `foo.html` → `foo.annotations.json`. pub fn sidecar_path(html_path: &Path) -> PathBuf { html_path.with_extension("annotations.json") } -/// Merge sidecar annotations into a scenario raw value by appending them to -/// `raw["annotations"]` (created if absent). Pure; used at model load so -/// `list_annotations` and the comments panel work unchanged for HTML sources. pub fn merge_annotations(mut raw: Value, annotations: Vec) -> Value { if annotations.is_empty() { return raw; @@ -37,9 +21,6 @@ pub fn merge_annotations(mut raw: Value, annotations: Vec) -> Value { raw } -/// Read and parse the sidecar for an HTML source. A missing sidecar is -/// `Ok(vec![])`; an unreadable or malformed one is `Err(reason)` so callers -/// surface it instead of clobbering the file. pub fn read_sidecar(html_path: &Path) -> Result, String> { let p = sidecar_path(html_path); let text = match std::fs::read_to_string(&p) { @@ -55,16 +36,12 @@ pub fn read_sidecar(html_path: &Path) -> Result, String> { .ok_or_else(|| format!("{}: missing \"annotations\" array", p.display())) } -/// Append one annotation to the sidecar, creating the file lazily on first -/// use. Refuses to overwrite a corrupt sidecar (returns its parse error). pub fn append_sidecar_annotation(html_path: &Path, annotation: Value) -> Result<(), String> { let mut annotations = read_sidecar(html_path)?; annotations.push(annotation); write_sidecar(html_path, &annotations) } -/// Remove the annotation with `id` from the sidecar. Deletes the file when it -/// becomes empty (no ghost `{"annotations": []}` files). pub fn remove_sidecar_annotation(html_path: &Path, id: &str) -> Result<(), String> { let mut annotations = read_sidecar(html_path)?; annotations.retain(|x| x.get("id").and_then(|v| v.as_str()) != Some(id)); @@ -80,7 +57,6 @@ pub fn remove_sidecar_annotation(html_path: &Path, id: &str) -> Result<(), Strin } } -/// Serialize `{"annotations": [...]}` (pretty) to the sidecar path. fn write_sidecar(html_path: &Path, annotations: &[Value]) -> Result<(), String> { let doc = serde_json::json!({ "annotations": annotations }); let text = serde_json::to_string_pretty(&doc).map_err(|e| format!("json: {e}"))?; @@ -93,11 +69,9 @@ mod tests { use super::*; use serde_json::json; - /// Unique per-test HTML path in the OS temp dir (no tempfile dependency). fn temp_html(tag: &str) -> PathBuf { let dir = std::env::temp_dir(); let p = dir.join(format!("rm_sidecar_{}_{}.html", tag, std::process::id())); - // Clean any leftover sidecar from a previous crashed run. let _ = std::fs::remove_file(sidecar_path(&p)); p } @@ -130,7 +104,6 @@ mod tests { assert_eq!(arr.len(), 2); assert_eq!(arr[0]["id"], "a1"); - // Existing annotations are preserved, sidecar ones appended after. let raw = json!({ "annotations": [ { "id": "pre" } ] }); let merged = merge_annotations(raw, vec![ann("post")]); let arr = merged["annotations"].as_array().unwrap(); @@ -155,8 +128,6 @@ mod tests { let arr = doc["annotations"].as_array().unwrap(); assert_eq!(arr.len(), 1); assert_eq!(arr[0], ann("an_1")); - // Exactly one top-level key: the same `annotations` field JSON - // scenarios use. assert_eq!(doc.as_object().unwrap().len(), 1); let _ = std::fs::remove_file(sidecar_path(&html)); @@ -173,11 +144,9 @@ mod tests { assert_eq!(left.len(), 1); assert_eq!(left[0]["id"], "a2"); - // Removing the last annotation deletes the file (no ghost sidecar). remove_sidecar_annotation(&html, "a2").unwrap(); assert!(!sidecar_path(&html).exists()); - // Removing from a missing sidecar is a no-op, not an error. assert_eq!(remove_sidecar_annotation(&html, "a2"), Ok(())); } @@ -190,11 +159,9 @@ mod tests { assert!(append_sidecar_annotation(&html, ann("x")).is_err()); assert!(remove_sidecar_annotation(&html, "x").is_err()); - // The corrupt content is still intact — nothing clobbered it. let text = std::fs::read_to_string(sidecar_path(&html)).unwrap(); assert_eq!(text, "{ not json"); - // A sidecar without an `annotations` array is also an error. std::fs::write(sidecar_path(&html), r#"{ "foo": 1 }"#).unwrap(); assert!(read_sidecar(&html).is_err()); diff --git a/crates/rustmotion-studio/tests/audit_ws_g.rs b/crates/rustmotion-studio/tests/audit_ws_g.rs index 2e23d8f2..e0344873 100644 --- a/crates/rustmotion-studio/tests/audit_ws_g.rs +++ b/crates/rustmotion-studio/tests/audit_ws_g.rs @@ -1,23 +1,3 @@ -//! Regression tests for the studio's file-write pipeline and a few other -//! previously-untestable decision points: a debounced write that must rebase -//! onto the current disk instead of replaying a stale in-memory snapshot, -//! coalesced edits inside one debounce window that must all survive (not -//! just the last), undo/redo cancelling a still-pending write before it can -//! clobber the just-restored state, a render-thread panic that must surface -//! as an error instead of a cached empty JPEG, and the preview audio mixer -//! only re-running when the audio itself changed. -//! -//! `rustmotion-studio` has no `[dev-dependencies]` and cannot gain one in -//! this change, so every test below drives the crate's existing public -//! surface (`scenario::*`, `editor::audio`, `editor::frames`) against real -//! temp files with plain synchronous `#[test]`s — no Dioxus runtime, no -//! async executor. That public surface is itself the fix for the crate -//! having no integration tests: the defects lived in a debounce timer and -//! Dioxus event handlers that cannot be driven from a test, so each one was -//! reduced to a pure decision over plain data (`resolve_flush`, the -//! pending-write queue, `audio_fingerprint`) and the handler calls that -//! instead of deciding inline. - use std::fs; use std::path::PathBuf; use std::sync::{Arc, Mutex}; @@ -48,8 +28,6 @@ fn read(path: &std::path::Path) -> String { fs::read_to_string(path).unwrap() } -// ── A debounced flush rebases onto the current disk, never a stale snapshot ── - #[test] fn debounced_flush_rebases_onto_disk_and_survives_a_concurrent_external_edit() { let path = temp_path("stale_snapshot", "json"); @@ -68,8 +46,6 @@ fn debounced_flush_rebases_onto_disk_and_survives_a_concurrent_external_edit() { }, ); - // An agent (or another editor) writes the file while the debounce window - // is still open. let external_edit = r#"{"scenes":[{"duration":1.0,"children":[{"type":"text","content":"AGENT EDIT","style":{}}]}]}"#; write(&path, external_edit); @@ -94,8 +70,6 @@ fn debounced_flush_rebases_onto_disk_and_survives_a_concurrent_external_edit() { let _ = fs::remove_file(&path); } -// ── Every coalesced HTML mutation in a burst survives, not just the last ──── - #[test] fn coalesced_html_edits_in_one_debounce_window_all_survive_the_flush() { let path = temp_path("coalesced_html", "html"); @@ -139,8 +113,6 @@ fn coalesced_html_edits_in_one_debounce_window_all_survive_the_flush() { let _ = fs::remove_file(&path); } -// ── Undo/redo cancel the pending write queue before touching the file ────── - #[test] fn undo_cancels_the_pending_write_queue_before_touching_the_file() { let path = temp_path("undo_cancels_pending", "json"); @@ -151,7 +123,6 @@ fn undo_cancels_the_pending_write_queue_before_touching_the_file() { let hist: SharedHistory = Arc::new(Mutex::new(Default::default())); record_edit(&hist, &path, state_a.to_string()); - // An edit is still waiting out its debounce window when undo fires. let slot = pending_write_slot(); queue_mutation( &slot, @@ -183,8 +154,6 @@ fn undo_cancels_the_pending_write_queue_before_touching_the_file() { let _ = fs::remove_file(&path); } -// ── The write pipeline is reachable end to end without a Dioxus runtime ──── - #[test] fn the_write_pipeline_round_trips_an_edit_through_a_real_file() { let path = temp_path("full_pipeline", "json"); @@ -226,8 +195,6 @@ fn the_write_pipeline_round_trips_an_edit_through_a_real_file() { let _ = fs::remove_file(&path); } -// ── A render-thread panic surfaces as an error, never a cached empty JPEG ── - #[test] fn a_render_thread_panic_is_reported_as_an_error_not_an_empty_jpeg() { let big = rustmotion::loader::load_scenario_from_source( @@ -241,8 +208,6 @@ fn a_render_thread_panic_is_reported_as_an_error_not_an_empty_jpeg() { "need frames spanning both scenes to reach scene_idx 1" ); - // Deliberately mismatched: `tasks` reference a second scene this smaller - // scenario does not have, which panics inside the render thread. let small = rustmotion::loader::load_scenario_from_source( None, Some(r##"{ "video": { "width": 64, "height": 64 }, "scenes": [ { "duration": 0.1 } ] }"##), @@ -269,8 +234,6 @@ fn a_normal_render_returns_nonempty_jpeg_bytes() { assert!(!jpeg.is_empty()); } -// ── The preview audio mixer only re-runs when the audio actually changed ─── - #[test] fn audio_fingerprint_ignores_unrelated_edits_and_reacts_to_real_audio_changes() { let scenario_a = rustmotion::loader::load_scenario_from_source( From 024957bf3b2a0a490dbce4816b81c1a355aeec55 Mon Sep 17 00:00:00 2001 From: Baptiste Parmantier Date: Tue, 22 Sep 2026 14:09:34 +0200 Subject: [PATCH 3/4] docs(studio): record the no-comment rule in the entry document The rule is only useful where every session and every sub-agent will meet it before writing a line. Left in a conversation it would be re-litigated once per session; left in a commit message it would never be found at all. Scoped deliberately to rustmotion-studio. The other four crates are published, and the same rule applied there would empty their docs.rs pages. The clap note is there because it is the one place where the rule changes behaviour rather than style: the derive turns doc comments into --help text, so deleting them silently empties rustmotion-studio --help. schemars reads them into schema descriptions the same way, which costs nothing today only because the studio derives its schema from types defined in other crates. Refs #306 --- crates/rustmotion/CLAUDE.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/crates/rustmotion/CLAUDE.md b/crates/rustmotion/CLAUDE.md index 670d7a65..2c54f5df 100644 --- a/crates/rustmotion/CLAUDE.md +++ b/crates/rustmotion/CLAUDE.md @@ -219,6 +219,22 @@ crates/ > sous-commande `studio` — `rustmotion-studio` dépend de `rustmotion`, donc la > dépendance inverse serait un cycle. Le studio s'ouvre par son propre binaire. +### `rustmotion-studio` : aucun commentaire + +Le code du studio ne porte **aucun commentaire** — ni `//`, ni `///`, ni `//!`. +La règle ne vaut que pour cette crate : les quatre autres sont publiées, et +vider leurs doc comments viderait leurs pages docs.rs. + +Quand un commentaire semble nécessaire, c'est le signal qu'il faut **renommer +la liaison ou extraire une fonction nommée** : l'explication va dans un +identifiant, où elle ne peut pas diverger du code. Le raisonnement qui n'a +vraiment nulle part d'autre où vivre va dans le **message de commit**, la +description de PR ou l'issue. + +> Piège vérifié : clap dérive le texte de `--help` depuis les doc comments. +> Utiliser `#[arg(help = "…")]` plutôt que de perdre l'aide. Même vigilance +> avec `schemars`, qui lit les doc comments dans les `description` du schéma. + ### Ajouter un nouveau composant 1. Créer `crates/rustmotion-components/src/mon_composant.rs` avec struct serde + `impl Painter` (`paint_content`) From 65067ddec4e61f2270f4841a9c2cc27b89c59483 Mon Sep 17 00:00:00 2001 From: Baptiste Parmantier Date: Fri, 25 Sep 2026 00:51:08 +0200 Subject: [PATCH 4/4] feat: boot the studio on gpui-kit with a light, dark, system theme (#313) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(studio): boot the shell on gpui-kit with a light/dark/system theme Boot: gpui_kit::application().run(...) + gpui_kit::init(cx) inside it - there is no Application::new() in this kit. The window opens from cx.spawn(async move |cx| { cx.open_window(...) }) so the state entity and the theme can be set up with a live window and App context in hand before the first paint. Root wrapper: gpui_component::Root::render mounts the app's view but NOT the dialog/sheet/notification layers - the app has to composite those itself via Root::render_dialog_layer/_sheet_layer/ _notification_layer. Isolated all three calls in app/overlays.rs and nowhere else: gpui-kit 0.7.0 removes them with no documented replacement, so when that migration lands it is a one-file patch instead of a hunt across every screen. StudioRoot (app/root.rs) is currently a placeholder - it renders "Library" or "Editor" depending on StudioState.view, since library::view and editor::view (WS-3/WS-4) are not ported yet. What is live and testable ahead of them: the window, the theme, and the overlay layer stack. Theme: gpui-component's ThemeMode only has Light/Dark, and theme::init (run once by gpui_kit::init) hard-sets Light with nothing observing the OS. ThemePref::System is built on top in theme/mod.rs: - apply() resolves System via Theme::sync_system_appearance, which calls Theme::change internally - so it already re-projects onto the gpui-base layer (scrollbars, resize handles); no separate Theme::sync_base call is needed on this path. - watch_system_appearance() re-checks state.theme_pref on every window.observe_window_appearance callback (not a value captured at subscribe time), so it only re-resolves against the OS while the live preference is still System - an explicit Light/Dark choice made after subscribing is never clobbered by a later OS flip. - theme::set() is the pref-switching entry point the topbar's theme button (WS-4) will call once that screen exists; nothing calls it yet, hence the #[allow(dead_code)]. Persistence (theme/persist.rs): same shape as library::data::load_recents/push_recent - a JSON value under dirs::config_dir()/rustmotion/, here theme.json. Fixes the theme resetting to System on every launch. Window sizing (app/window.rs): 75% of the primary display, centered, same target as the old Dioxus shell's one-shot use_effect resize - but set on WindowOptions.window_bounds before the window opens via Bounds::centered(None, size, cx), so there is no first-frame resize flash. Falls back to a fixed 1280x800 when no display can be found, still centered, rather than the old silent no-op. Token mapping for screens styling off cx.theme() (gpui_component:: ActiveTheme) in place of the old --rm-* CSS custom properties (formerly THEME_CSS in app/root.rs): --rm-bg -> background --rm-surface -> popover (raised panel / card fill) --rm-surface-2 -> secondary (a step below popover) --rm-surface-3 -> muted (hover / selected fill) --rm-border -> border --rm-border-2 -> ring (stronger, focus-adjacent edge - no exact equivalent, this is guidance not a contract) --rm-text -> foreground --rm-text-strong -> popover_foreground / primary --rm-text-muted -> muted_foreground --rm-accent -> accent / primary --rm-on-accent -> accent_foreground / primary_foreground --rm-error -> danger (NOT destructive - that name does not exist on ThemeColor) --rm-overlay-hover -> muted (or accent at reduced opacity) --rm-overlay-border -> ring Nothing here re-brands the kit's default palette (no custom ThemeColor/ThemeConfig) - that is a separate, larger decision left to whichever workstream first needs brand-accurate colors. Also: gpui-component added as a direct Cargo.toml dependency (reported separately, not included in this diff) - ActiveTheme/Theme/ThemeMode/ Root are used by their real crate path throughout this code, which needs gpui-component in the extern prelude; gpui-kit only re-exports it as gpui_kit::component. * feat(studio): wire the crate back together on gpui-kit WS-1 restored the shell; this restores the crate around it. These are the convergence points the partition reserves to the orchestrator — module registration, the manifest, and the two frozen-core files whose only Dioxus tie was a hook. No workstream writes them, precisely so six parallel rewrites cannot each reshape the wiring under one another. Three Dioxus sites are removed rather than ported, because the thing they did no longer exists. use_prefetch_publisher and use_export_poll polled Dioxus signals; gpui notifies explicitly, so WS-2 and WS-6 replace them with state updates. ExportToast hand-rolled a floating div; the kit has a notification system, so WS-6 uses it. diff_panel.rs loses everything but DiffSide, the one piece a frozen file (app/state.rs) and a kept file (prefetch.rs, via FrameKey.side) both need. That file was a third Dioxus site the decomposition had not anticipated — it claimed exactly two, having grepped a file list that omitted it. WS-1 caught it. frame_for_change, the pointer-to-first-frame lookup deleted with the rest, is real logic rather than view code and is worth WS-6 rebuilding rather than reinventing. editor and library carry a crate-level #[allow(dead_code)] because each now mixes code with a live caller against code whose only caller is a view file excluded from its mod.rs until its workstream lands. Rustc cannot tell "orphaned pending a rewrite" from "genuinely dead", and a per-item allow would mean editing files that are frozen or owned elsewhere. Both allows come off once WS-2 through WS-6 have landed; library/mod.rs also stops re-exporting render_thumbnail and ScenarioEntry, which WS-3 puts back in one line. palette was declared default-features = false, and its default set is the only thing supplying std. Without it palette has no source for the Round/Sqrt/Abs trait impls on f32 — there is no libm fallback at 0.7.6 — so the dependency failed to build with 18 errors regardless of anything in this crate. It went unnoticed because an incremental target directory kept serving an artefact built before the flag was added. Pre-existing, unrelated to gpui-kit, and fixed here because nothing compiles until it is. Cli::file and Cli::dir move their descriptions into #[arg(help = ...)]. Under the no-comment rule their doc comments would simply have been deleted, and clap derives --help from exactly those, so rustmotion-studio --help would have gone quietly empty. The rule is about prose in the source, not about dropping behaviour. Verified on the integrated tree: cargo fmt --all --check, cargo clippy -p rustmotion-studio --all-targets -D warnings, and cargo test -p rustmotion-studio all exit 0, with 114 unit and 7 integration tests passing and 2 soak diagnostics ignored. Refs #306, #307 * ci(studio): install gpui's link-time dependencies instead of dioxus's The first CI run of the chantier failed with `unable to find library -lxkbcommon-x11`, and failed in a way worth recording: clippy was green. clippy type-checks but never links, so a missing system library is invisible to it and surfaces only in the test job, seventeen minutes later. Anyone reading "clippy pass, test fail" on this repo should suspect a linker dependency first. webkit2gtk, gtk-3 and xdo go. They were there for dioxus desktop, which no longer exists in this workspace, and nothing else in it pulls glib. In their place gpui needs xkbcommon-x11 for keyboard handling, plus wayland and xcb-cursor for the two display backends it builds on Linux. fontconfig, freetype and asound are untouched: the first two belong to Skia's text stack and the third to cpal, which rodio pulls in for preview audio. Neither had anything to do with the UI framework. publish.yaml gets the same list, and its explanatory block is rewritten rather than extended. It described the GTK/WebKit stack and glib-2.0 as the reason the packages were needed, which stopped being true with this change. A release workflow whose comment explains a dependency that is no longer there is worse than one with no comment: it sends the next reader looking for a glib failure that cannot happen. Refs #306 * feat(studio): put frames on screen through gpui's image path Closes #308. Part of #306. The JPEG encode disappears. It never existed for quality or size — it existed because the frame had to cross into a webview, and an tag needs an encoded byte stream. gpui takes decoded pixels directly, so the encode, the wry asset handler and the /frame/{idx}?v={rev} URL all go, and with them a round trip through a codec on every displayed frame. What replaces it is `RenderImage::new(smallvec![Frame::new(buffer)])` wrapped in `img(ImageSource::Render(..))`. That variant bypasses every software cache in gpui — it hands the Arc straight back — and `RenderImage::new` mints a fresh monotonic ImageId per call, so a frozen preview from a stale cache entry is not merely unlikely here, it is unrepresentable. The old path needed no-cache headers on every response to get the same guarantee. Frames are written opaque. gpui's image pipeline blends with SourceAlpha / OneMinusSourceAlpha — straight alpha — while Skia produces premultiplied, and reconciling the two would mean a division pass per pixel per frame. It is unnecessary: `render_frame_v2_scaled` clears the whole framebuffer with the scenario background before anything paints, and the JPEG path it replaces already discarded alpha via to_rgb8(). Forcing 255 in the same loop that swaps R and B costs nothing and sidesteps the mismatch entirely. `swap_frame` hands the evicted frame to `cx.drop_image`. This is the one place in the rewrite where forgetting a line leaks half a gigabyte of VRAM per second: gpui's sprite atlas has no eviction, and each 1920x1080 frame owns its own ~8 MB Metal texture. The drop happens in the update path, never during paint, because update and paint are turns of the same single-threaded loop and cannot interleave — an argument from the executor model, not something a test exercises, since no live window is available without a test-support feature this crate does not enable. `render_frame_rgba_deep` mirrors the existing `render_frame_deep` rather than calling `render_frame_rgba` directly. The 32 MiB stack is not decoration: untagged serde buffers a frame per level of scene nesting, and the 2 MiB default overflowed the prefetch workers. The new path runs on the background executor pool, which has no better stack than they did. `prefetch_target_for` is split out of `publish_prefetch_target` so the target it builds can be tested as a value. Its own test previously waited two seconds for a real worker thread to render, then asserted on frame 0 — which `prefetch_window` never schedules, since a playing prefetcher only looks forward from the playhead. It also keyed on a global atomic that a sibling test mutates. It could not pass, and would have raced if it could. * feat(studio): rebuild the diff panel, annotations and export status on gpui-kit Closes #312. Part of #306. Three panels, and one of them stops being hand-rolled. The export toast was an absolutely-positioned div with its own dismiss timer and close button; gpui-kit has a notification system, so `ExportWatcher` pushes into it instead, keyed by a marker type so a running export's progress replaces its own toast in place rather than stacking. That watcher polls the export slot at 150 ms rather than being driven from the encode thread, and the reason is a frozen boundary, not laziness: `start_export` runs on a plain std::thread with no window handle, and `export_slot()`'s mutex has no notification hook. Pushing from inside would mean modifying code this workstream was told not to touch. The idiom is also the library's own — `NotificationList::start_advancing` in gpui-component polls its lifecycle the same way, with the same `cx.spawn_in` + timer shape. `frame_for_change` comes back with tests it never had. It maps a change's pointer to a playable frame so clicking a diff entry scrubs to where the element actually lives. Two details in it are load-bearing and were previously recorded nowhere: `start_at` is floored at zero, because a negative value would walk the playhead backward into the previous scene; and the result is clamped to the last frame, because a late `start_at` — or one left over from a scene that has since been shortened — would otherwise index past the end of the task list. It used to live inline in a Dioxus component, which is why it had no coverage; it now has five tests. The annotation capture box reads its target from `EditorState.selected` rather than taking pointer and kind as constructor props. The props version put a stale-data footgun in the caller's hands: whoever mounts the box would have to remember to update it on every selection change, and forgetting would file a comment against the wrong element in silence. Reading at submit time makes that unrepresentable, and matches how the box already read the playhead. Diff badges use theme tokens instead of the literal #22c55e the CSS carried, so the panel follows light and dark without a second palette. Persistence is untouched: JSON sources rewrite the scenario and record an undo snapshot, HTML sources write the sidecar and never touch the HTML, and a corrupt sidecar is still an error rather than something to overwrite. Left for integration with WS-4: `TOPBAR_HEIGHT` is px(40.), transcribed from the old CSS, and needs checking against the real topbar once it exists. * fix(studio): use as_chunks_mut for the rgba-to-bgra swap CI's clippy rejected `chunks_exact_mut(4)` under `clippy::chunks_exact_to_as_chunks`, while the same command passed locally. The lint is not the interesting part; the gap is. This machine runs rustc 1.97.1 from July, CI pins stable as of today, and the lint landed in between. So a local green does not close a workstream here — it only makes one ready for CI to judge. Worth stating plainly, because every earlier failure in this chantier reproduced locally (the linker one failed on both sides) and this is the first that could not. Refs #306 * feat(studio): rebuild the property inspector on gpui-kit Closes #311. Part of #306. The largest piece of the chantier: 2 225 lines in one file become 2 856 across four, split along the line that matters — what depends on the UI framework and what does not. `sections.rs` carries the curated schema and its value helpers with zero gpui in it, so the tables that decide which control appears for which property can be tested as data. `write.rs` carries the write path. `controls.rs` is the only place an Entity is created. `mod.rs` assembles the panel. The write path keeps both of its halves, and they stay independent: an edit applies optimistically in memory so the canvas moves within one render, and separately queues a Mutation behind a 250 ms debounce that, when it fires, re-reads the file from disk and replays the queue onto *that* content. Replaying onto a snapshot would be simpler and would silently destroy an agent's edit landing mid-window; `tests/audit_ws_g.rs` simulates exactly that race and is green. Dioxus's cancellable Task becomes `Option>`, where replacing the field drops and cancels the previous one — same semantics, and this time the cancellation is the language's rather than the framework's. Entities are created once per selection, not per render. `ensure_controls_for_selection` runs at the top of every render but rebuilds only when the selected pointer changes, so typing, dragging a slider or picking a colour never destroys the widget holding the cursor. The one deliberate exception is structural edits — adding or removing a list entry, switching a Fill between solid and gradient — which change how many controls exist and so must rebuild; `force_rebuild` marks those explicitly rather than letting the rebuild gate guess. `apply_open_change` comes back with its test. It was the one test this chantier had lost, deleted with the in-house colour picker, and it encodes a rule the kit does not: `ColorPickerState` owns its own `open` flag and emits no open/close event, so panel-wide exclusivity is enforced by observing each picker's `is_open()` and force-closing the others. Scrolling the panel still closes the expanded one. On the curated schema, which is what sank the discarded first attempt: 44 Field entries and 64 assembled rows, both matching the original and both now locked by a test. The earlier "45 against 47" alarm turned out to be a miscount — a raw grep for `Field {` also catches the struct definition and the `Mutation::Field` literals in the write path. Counting the thing rather than the string is what a test buys here, and the registry's own completeness invariant (every CssStyle property lands in exactly one section, unmapped ones falling to Advanced) is untouched and still locked. Bold/Italic and the alignment group render as text labels rather than icons. The Lucide variants exist in gpui-kit-assets but the embedded default bundle does not carry them, and a missing icon fails silently at runtime rather than at compile time — not something to gamble on without a window to look at. Swapping them back is one line once the asset registration grows. 159 tests pass, up from 144. * feat(studio): rebuild the library home on gpui-kit and mount it Closes #309. Part of #306. Thumbnails stop being JPEGs. The frozen `data::render_thumbnail` encodes to JPEG because the old wry handler served them to an tag; feeding gpui that would mean decoding straight back to the pixels the renderer already had. The library now calls `build_frame_tasks` + `render_frame_rgba_deep` at scale 0.25 and hands the result to WS-2's `frame_from_rgba`, so the whole codec round trip disappears and the two image paths in the app are one path. That makes the grid a real memory surface, since every decoded thumbnail owns a Metal texture in an atlas with no eviction. It is bounded to exactly what is visible: `sync_thumbnails` diffs the current section-and-search result against what is held, renders what appeared, and hands what vanished to `cx.drop_image`. Switching folders or narrowing the search frees the rest. The grid computes its own column count from the viewport each render, because `grid_cols` takes a fixed number and there is no per-track minmax — so `repeat(auto-fill, minmax(240px, 1fr))` becomes an arithmetic floor over the available width, which resizes like the CSS did rather than approximating it with flex wrap. `StudioRoot` stops being a placeholder for the library half and mounts the screen. It also gains `cx.observe` on the shared state: `view` lives in `StudioState`, so a card click flipping it to `Editor` changes a field the root had read but was not subscribed to, and the screen would not have repainted. One bug worth recording, because it was in a test rather than in code: the first version of the recents test read the developer's real `~/.config/rustmotion/recent.json` and passed or failed depending on what that machine happened to have opened. It now sets `LibraryState.recents` directly and covers both branches. A test that depends on the machine it runs on is worse than no test — it reports the environment, not the behaviour. Also noticed, not acted on: `LibraryState.thumb_cache` appears to have no callers left. It cached JPEG bytes for the wry handler that no longer exists. It sits in a frozen file and belongs to its own change, not this one. 166 tests pass, up from 159. * feat(studio): land the editor shell and connect the prefetch cache to the canvas Closes #310. Part of #306. The last of the six workstreams, and the one that assembles the others: topbar, canvas, hit overlay, transport and shortcuts, mounting the inspector, the diff panel, the annotations panel, the export watcher and the frame surface. The app opens on the library, opens a scenario into the editor, and both screens boot clean. Shortcuts move from bubbled key events to gpui actions bound under a `key_context`. The old code kept Space out of text fields by calling `stop_propagation` on every container that might contain one — a rule enforced at each site and silently broken by forgetting one. gpui resolves bindings by context specificity instead, so an `Input` owning `left`/`right`/`cmd-z` under its own context wins over the editor's while focused, without the editor knowing text fields exist. `playback_action` keeps its four tests and stays the single source of truth; only its key type changes, since gpui has no `Key` enum and hands over a plain string. The larger fix here was not in WS-4's own code. The prefetch workers filled a frame cache that nothing ever read: `FrameCache::get` had no callers anywhere in the crate. The workers rendered every frame in the window ahead of the playhead, JPEG-encoded it and stored it, while the canvas independently re-rendered the same frame in RGBA — so the pool was not merely useless, it competed for CPU with the render the UI was waiting on. It surfaced only when the transitional crate-level `#[allow(dead_code)]` came off. The cause is a gap in the decomposition rather than in either workstream. `FrameKey` was frozen as a shared contract, but nothing in either brief said the canvas must consult the cache before rendering, so WS-2 built the producer, WS-4 built the consumer, and each was internally correct. WS-4 even defined its own local `FrameKey` tuple for render deduplication, which is exactly what a missing contract looks like from the inside. The canvas now builds the real `FrameKey` — model generation for side B, baseline source hash for side A, matching what the workers key on — and decodes a cache hit rather than re-rendering. Decoding a JPEG costs a few milliseconds against tens for a Skia render, and it keeps the cache's memory profile and its tested eviction policy untouched. Caching raw RGBA would be faster still, at 8 MB a frame against a cap of 120; that trade deserves its own change. 171 tests pass, up from 166. * refactor(studio): drop the dioxus-era leftovers the rewrite made unreachable Part of #306. The transitional `#[allow(dead_code)]` on `editor`, `library`, `state` and the theme module existed because, mid-chantier, each mixed live code with code whose only caller was a view file not yet ported. All six workstreams have landed, so the allows come off — and with them off, the compiler names what the rewrite left behind. `scenario::Theme` goes. It mapped Dark/Light/System onto the CSS class names `rm-dark`/`rm-light`/`rm-system`, which is a sentence that only parses in a webview. `ThemePref` in `app/state.rs` replaced it, and nothing had referenced the old one since WS-1. `render_thumbnail` goes. It encoded frame 0 to JPEG for the wry asset handler that served `/thumb/{i}`; the library now renders straight to RGBA through the same path as the canvas, so the encode had no consumer. `seg_button` and `num_display` go the same way — superseded during the inspector rewrite by `fill_seg_button` and by `properties::display_number`. Three declarations keep a narrow, deliberate allow rather than being stripped: `SelectionData`, `ColorWidget` and `ScalarWidget` each carry fields the inspector populates and never reads. Removing them means proving, field by field, that nothing in 2 857 lines of freshly written code wanted them — which is a review, not a cleanup, and belongs to its own change rather than to the tail of this one. The allow is on the exact declaration so a future reader sees the scope, not a blanket over the module. What this pass is really worth is the defect it exposed rather than the lines it deleted: the crate-level allow was also hiding `FrameCache::get`, uncalled, which meant the entire prefetch pool was rendering frames nothing consumed. That is fixed in the preceding commit. A blanket allow does not merely tolerate dead code, it conceals live code that stopped being reachable. * fix(studio): make the editor actually render, and stop blocking the window on assets Part of #306. Four defects, all found by opening the app and looking at it. Every one of them survived a green `fmt`/`clippy`/`test` run and a check that the process stayed alive for six seconds — which is exactly as much as that check is worth. Two of them made the editor useless. **No icons anywhere.** `gpui_kit::application()` was called without `.with_assets(..)`, so no asset source was registered and every icon resolved to nothing — silently, because a missing icon is not an error. It registers `AllAssets` rather than the curated set: WS-4 and WS-5 had each fallen back to text labels for icons the default bundle does not embed (mute, theme-system, baseline, diff, comments, export, bold, italic, alignment), and the full Lucide catalog removes the reason for those fallbacks. **A blank canvas.** The aspect-ratio box carried `aspect_ratio` plus `max_w_full`/`max_h_full` and no concrete dimension. In flexbox, a box with only maximum constraints resolves to zero, and the frame inside it is `size_full` — 100% of nothing. Measured before and after by printing the resolved bounds: 0 × 0, then 1222 × 687. The frame had been rendering correctly the whole time and being painted into a box with no area. **The scrubber pinned at maximum.** `EditorView` is constructed once, in `StudioRoot::new`, before any scenario is open — so the slider was built with the empty scenario's frame count, its `max` froze at 1, and every `set_value` clamped there. `SliderState::max` is a consuming builder with no runtime setter, so the fix is not to update it but to stop depending on it: the slider now runs on a normalized 0..1 fraction, converted at both ends. That also unbinds the slider's lifetime from the scenario's, so the same bug cannot return through that path when a different file is opened. **Up to a second of dead time before the window appeared.** `prefetch_icons` and `preextract_video_frames` ran synchronously ahead of `gpui_kit::application().run(..)`. Measured: 53 ms for component-showcase, 30 ms for depth-3d-showcase, **909 ms for mega-showcase** — during which there is no window at all, so it reads as the app being slow to start rather than slow to load. They move to a background thread that bumps the model generation when done, and the canvas shows a spinner while `frame` is `None` instead of empty space. mega-showcase now opens immediately and paints its first frame in 53 ms. The scrubber conversion gets four tests, including the round trip and the one-frame scenario where the denominator is zero. 175 tests pass, up from 171. * fix(studio): give the hit map its own stack before running it off the main thread Part of #306. The preceding commit moved hit-map computation onto `cx.background_spawn` to stop it freezing the UI for 75 ms per frame change. gpui's background executor runs on libdispatch worker threads, which get **544 KiB** of stack. The hit map goes through `render_scene_hits` → `prepare_scene` → `deserialize_children`, and untagged serde recurses once per level of scene nesting, buffering each level through `ContentDeserializer`. It overflowed and took the process with it: `EXC_BAD_ACCESS` in a stack guard region, roughly thirty seconds into a session. This crate already knew. `RENDER_STACK` is 32 MiB and `render_frame_deep` exists precisely because the prefetch workers hit the same wall on Rust's 2 MiB default — and 544 KiB is four times worse than what broke them. What was missing is that `frame_hits` never had a `_deep` counterpart, because until now it only ever ran on the main thread, where macOS hands out 8 MiB. Moving it off that thread removed the one thing that was holding it up, and nothing in the type system said so. `frame_hits_deep` mirrors the two existing wrappers. All three call sites that reach the engine's recursion now own a 32 MiB stack: the hit map and the canvas frame on the background executor, and the library thumbnails. The regression test spawns a thread with exactly libdispatch's 544 KiB and calls through `frame_hits_deep` against `mega-showcase.json`. It is worth noting how it fails if the fix is reverted: a stack overflow aborts rather than unwinds, so `join()` never returns and the whole test binary dies. Loud, if not graceful — which is the right trade for a defect whose signature is a process disappearing. 175 tests pass. * fix(studio): reset the editor when a different document is opened Part of #306. Opening a project, returning to the library and opening another one showed the first project's frame for an instant. `EditorView` is built once, in `StudioRoot::new`, and every field it holds outlives the document it describes. The flicker was the visible part. The rest of the state survived too, and one piece of it is worse than cosmetic: `selected` carries a JSON pointer like `/scenes/2/children/3`, which resolves perfectly well in the *new* document and addresses a different element. An inspector edit would have landed on the wrong node without anything looking wrong. The playhead also stayed where it was — frame 412 of a document that may only have 200 — and diff mode stayed armed against a baseline belonging to the previous file. `sync_document` compares the model's path against the one the view last drew and resets when it changes. The comparison is on the path, not the generation, deliberately: a hot reload of the *same* file must keep showing the current frame while the new one renders, or every keystroke in the inspector would flash a spinner. Only a different document clears. `reset_for_new_document` is split out as a pure function over `EditorState`, and it hands the stale frame back rather than dropping it. The caller has the `Window` and must pass it to `cx.drop_image`; `#[must_use]` makes ignoring the return value a warning. The obligation that leaks ~8 MB of VRAM per miss is now in the signature instead of in someone's memory. What is deliberately kept: preview quality, the Inspect toggle and the Comments toggle. Those are choices about how the user works, not about the file. Four tests cover the split, one per class of state — including the selection, which is the one that was quietly dangerous. 179 tests pass. * perf(studio): decode audio on the warmup thread, not in the click handler Part of #306. Opening a project froze the UI for over two seconds. The instrumented trace puts the whole delay before the editor even begins to draw: [OPEN+ 2.13s] sync_document: new document detected Loading audio: out/showcase/assets/track.wav `StudioModel::new` called `analyze_scenario_audio`, which decodes every track and runs an FFT over it — 24.7 MB of wav for that project. It ran inside `open_scenario`, on the UI thread, *before* the view switched to the editor. So the freeze was in the library, with the library still on screen, and the editor's spinner could not appear by construction: the thing meant to cover the wait was downstream of it. This also explains why the earlier measurements missed it. They were taken on `examples/*.json`, none of which carry audio; the project that froze lives under `out/`. A sample that excludes the failing case measures nothing. The analysis moves onto the thread that already warms up icons and video frames — renamed `spawn_scenario_warmup` since it is no longer only prefetch — and publishes `audio_error` plus a generation bump when it lands. Deferring is safe because the analysis writes into a global cache the renderer reads: the first frame paints without waveform data and the bump repaints it. An `Arc::ptr_eq` guard drops the result if the model has been replaced meanwhile, so a slow analysis cannot attach its findings to a document nobody opened. The watcher's reload path gets the warmup too. It calls `StudioModel::new` like every other path, and would otherwise have lost audio analysis entirely. Measured on the same project: `sync_document` at **183 ms** instead of 2.13 s, with the spinner up at 183 ms and the frame at 356 ms. "Loading audio" now appears in the log after the spinner rather than before it. The regression test does not time anything — a timing assertion would be flaky. It builds a model whose audio track does not exist: had the analysis run inline, the missing file would have set `audio_error`. That the field is `None` is proof the work was deferred. 179 tests pass. * fix(studio): let the user move the playhead while the video is playing Part of #306. Scrubbing during playback snapped straight back. The playhead has two writers with opposite intents and no way to tell them apart: the clock advancing time, and the user asking to be somewhere else. Both just assigned `state.current`. While a scenario has audio, the clock takes its next position from `audio::position_frame` — the sound card's idea of where we are, which a scrub does not move. So the tick after a scrub restored the old frame, and `audio_armed` stayed true, so the sound was never repositioned either. The playhead could not be moved at all while playing. The count matters for how this is fixed. Nine places write `state.current`: the clock, the scrubber, two step buttons, four keyboard actions, Present, a diff entry, and an annotation's "go to frame". Eight of the nine are seeks, and patching each to re-arm the audio would work until someone adds a tenth. So the clock detects instead. It remembers the frame it last wrote; if what it reads back differs, something else moved the playhead, and it adopts that position and re-arms the sound there rather than overwriting it. No call site has to know, and a tenth writer is covered on the day it appears. `advance_playhead` is a pure function over (current, last written, audio position, total) returning the next frame and whether to re-arm. Seven tests cover it, and they are where the intent lives now: a forward scrub, a backward one, undisturbed playback with and without audio, the first tick of a session where there is no previous write to compare against, the wrap past the last frame that has to restart the track rather than let it run on, and a seek past the end being clamped. Undisturbed playback still follows the audio clock rather than a timer. That is deliberate and unchanged: a timer ticking at 1/fps drifts against the sound card, and by the end of a long scenario the picture no longer matches what you hear. 188 tests pass. * fix(studio): stop aborting on playback keys, and pause when the user seeks Part of #306. Two changes, one a crash and one a behaviour the user asked for. **Any playback key killed the process.** Not a panic — an abort: panicked at gpui-pre-0.3.6/src/window.rs:5175: called `Option::unwrap()` on a `None` value panic in a function that cannot unwind thread caused non-unwinding panic. aborting. `Window::request_animation_frame` starts with `self.current_view()`, which reads the stack of entities being rendered and unwraps it. It is only valid inside a render or prepaint pass. `apply_playback_action` called it at the end of every transport action, and those run during key-event dispatch — outside any render. Because the panic unwinds through Objective-C frames, which cannot unwind, it aborted rather than failing. The call is simply removed: `EditorView::render` already requests the next animation frame while playing, which is the documented place for it. Toggling play notifies, notifying renders, and the render requests the frame. Nothing is lost, and the transport keys stop being fatal. **Moving the cursor on the timeline now stops playback**, so restarting is always an explicit act. The codebase already worked this way for the step buttons, which set `playing = false`; the scrubber did not, which is why dragging during playback fought the clock. `seek_from_user` is the one path for "the user asked to be somewhere else": it sets the frame and clears `playing`. Three call sites use it — the scrubber, a diff entry, and an annotation's "go to frame". The last two are inspection jumps, and leaving the video running after clicking "show me this element" would be strange. Home and End are deliberately left alone. They are transport controls rather than inspection jumps, and jumping to the start of a playing scenario reads as a restart, not as a request to stop. It returns whether anything changed, and that return is why dropping the cursor on the frame already displayed still counts: the frame did not move but the transport did, so the view has to repaint or the play button would keep showing pause. Three tests cover exactly that distinction. 191 tests pass. --- .github/workflows/ci.yaml | 10 +- .github/workflows/publish.yaml | 13 +- Cargo.lock | 6988 ++++++++++++----- crates/rustmotion-studio/Cargo.toml | 16 +- .../assets/dx-components-theme.css | 70 - crates/rustmotion-studio/src/app/mod.rs | 80 +- crates/rustmotion-studio/src/app/overlays.rs | 9 + crates/rustmotion-studio/src/app/root.rs | 228 +- crates/rustmotion-studio/src/app/window.rs | 55 + .../src/components/button/component.rs | 107 - .../src/components/button/mod.rs | 2 - .../src/components/button/style.css | 202 - .../src/components/color_picker/component.rs | 567 -- .../src/components/color_picker/mod.rs | 2 - .../src/components/color_picker/style.css | 267 - .../src/components/input/component.rs | 54 - .../src/components/input/mod.rs | 2 - .../src/components/input/style.css | 33 - .../rustmotion-studio/src/components/mod.rs | 14 - .../src/components/popover/component.rs | 59 - .../src/components/popover/mod.rs | 1 - .../src/components/popover/style.css | 238 - .../src/components/select/component.rs | 120 - .../src/components/select/mod.rs | 2 - .../src/components/select/style.css | 131 - .../src/components/separator/component.rs | 23 - .../src/components/separator/mod.rs | 2 - .../src/components/separator/style.css | 13 - .../src/components/sheet/component.rs | 147 - .../src/components/sheet/mod.rs | 2 - .../src/components/sheet/style.css | 253 - .../src/components/sidebar/component.rs | 839 -- .../src/components/sidebar/mod.rs | 1 - .../src/components/sidebar/style.css | 855 -- .../src/components/skeleton/component.rs | 17 - .../src/components/skeleton/mod.rs | 2 - .../src/components/skeleton/style.css | 16 - .../src/components/slider/component.rs | 51 - .../src/components/slider/mod.rs | 2 - .../src/components/slider/style.css | 80 - .../src/components/switch/component.rs | 20 - .../src/components/switch/mod.rs | 2 - .../src/components/switch/style.css | 48 - .../src/components/textarea/component.rs | 84 - .../src/components/textarea/mod.rs | 2 - .../src/components/textarea/style.css | 84 - .../src/components/tooltip/component.rs | 61 - .../src/components/tooltip/mod.rs | 2 - .../src/components/tooltip/style.css | 150 - .../src/editor/annotations.rs | 615 +- .../src/editor/diff_panel.rs | 445 +- crates/rustmotion-studio/src/editor/export.rs | 180 +- crates/rustmotion-studio/src/editor/frames.rs | 110 + .../rustmotion-studio/src/editor/inspector.rs | 2225 ------ .../src/editor/inspector/controls.rs | 1187 +++ .../src/editor/inspector/mod.rs | 748 ++ .../src/editor/inspector/sections.rs | 609 ++ .../src/editor/inspector/write.rs | 294 + crates/rustmotion-studio/src/editor/mod.rs | 19 +- .../rustmotion-studio/src/editor/overlay.rs | 130 + .../rustmotion-studio/src/editor/playback.rs | 802 +- .../rustmotion-studio/src/editor/prefetch.rs | 189 +- .../rustmotion-studio/src/editor/surface.rs | 215 + crates/rustmotion-studio/src/editor/topbar.rs | 571 +- crates/rustmotion-studio/src/editor/view.rs | 1166 +-- crates/rustmotion-studio/src/lib.rs | 17 +- crates/rustmotion-studio/src/library/data.rs | 9 - crates/rustmotion-studio/src/library/mod.rs | 5 +- crates/rustmotion-studio/src/library/view.rs | 618 +- crates/rustmotion-studio/src/scenario/mod.rs | 33 - .../rustmotion-studio/src/scenario/model.rs | 42 +- crates/rustmotion-studio/src/theme/mod.rs | 33 + crates/rustmotion-studio/src/theme/persist.rs | 65 + 73 files changed, 11236 insertions(+), 11117 deletions(-) delete mode 100644 crates/rustmotion-studio/assets/dx-components-theme.css create mode 100644 crates/rustmotion-studio/src/app/overlays.rs create mode 100644 crates/rustmotion-studio/src/app/window.rs delete mode 100644 crates/rustmotion-studio/src/components/button/component.rs delete mode 100644 crates/rustmotion-studio/src/components/button/mod.rs delete mode 100644 crates/rustmotion-studio/src/components/button/style.css delete mode 100644 crates/rustmotion-studio/src/components/color_picker/component.rs delete mode 100644 crates/rustmotion-studio/src/components/color_picker/mod.rs delete mode 100644 crates/rustmotion-studio/src/components/color_picker/style.css delete mode 100644 crates/rustmotion-studio/src/components/input/component.rs delete mode 100644 crates/rustmotion-studio/src/components/input/mod.rs delete mode 100644 crates/rustmotion-studio/src/components/input/style.css delete mode 100644 crates/rustmotion-studio/src/components/mod.rs delete mode 100644 crates/rustmotion-studio/src/components/popover/component.rs delete mode 100644 crates/rustmotion-studio/src/components/popover/mod.rs delete mode 100644 crates/rustmotion-studio/src/components/popover/style.css delete mode 100644 crates/rustmotion-studio/src/components/select/component.rs delete mode 100644 crates/rustmotion-studio/src/components/select/mod.rs delete mode 100644 crates/rustmotion-studio/src/components/select/style.css delete mode 100644 crates/rustmotion-studio/src/components/separator/component.rs delete mode 100644 crates/rustmotion-studio/src/components/separator/mod.rs delete mode 100644 crates/rustmotion-studio/src/components/separator/style.css delete mode 100644 crates/rustmotion-studio/src/components/sheet/component.rs delete mode 100644 crates/rustmotion-studio/src/components/sheet/mod.rs delete mode 100644 crates/rustmotion-studio/src/components/sheet/style.css delete mode 100644 crates/rustmotion-studio/src/components/sidebar/component.rs delete mode 100644 crates/rustmotion-studio/src/components/sidebar/mod.rs delete mode 100644 crates/rustmotion-studio/src/components/sidebar/style.css delete mode 100644 crates/rustmotion-studio/src/components/skeleton/component.rs delete mode 100644 crates/rustmotion-studio/src/components/skeleton/mod.rs delete mode 100644 crates/rustmotion-studio/src/components/skeleton/style.css delete mode 100644 crates/rustmotion-studio/src/components/slider/component.rs delete mode 100644 crates/rustmotion-studio/src/components/slider/mod.rs delete mode 100644 crates/rustmotion-studio/src/components/slider/style.css delete mode 100644 crates/rustmotion-studio/src/components/switch/component.rs delete mode 100644 crates/rustmotion-studio/src/components/switch/mod.rs delete mode 100644 crates/rustmotion-studio/src/components/switch/style.css delete mode 100644 crates/rustmotion-studio/src/components/textarea/component.rs delete mode 100644 crates/rustmotion-studio/src/components/textarea/mod.rs delete mode 100644 crates/rustmotion-studio/src/components/textarea/style.css delete mode 100644 crates/rustmotion-studio/src/components/tooltip/component.rs delete mode 100644 crates/rustmotion-studio/src/components/tooltip/mod.rs delete mode 100644 crates/rustmotion-studio/src/components/tooltip/style.css delete mode 100644 crates/rustmotion-studio/src/editor/inspector.rs create mode 100644 crates/rustmotion-studio/src/editor/inspector/controls.rs create mode 100644 crates/rustmotion-studio/src/editor/inspector/mod.rs create mode 100644 crates/rustmotion-studio/src/editor/inspector/sections.rs create mode 100644 crates/rustmotion-studio/src/editor/inspector/write.rs create mode 100644 crates/rustmotion-studio/src/editor/overlay.rs create mode 100644 crates/rustmotion-studio/src/editor/surface.rs create mode 100644 crates/rustmotion-studio/src/theme/mod.rs create mode 100644 crates/rustmotion-studio/src/theme/persist.rs diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c584463d..65240d15 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -24,9 +24,10 @@ jobs: steps: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - name: Install system dependencies - # webkit/gtk/xdo: required to compile rustmotion-studio (dioxus desktop) + # xkbcommon-x11/wayland/xcb-cursor: required to LINK rustmotion-studio (gpui). + # clippy passes without them — it never links — so the failure only shows in tests. # asound: required by cpal, which rodio pulls in for preview audio - run: sudo apt-get update && sudo apt-get install -y libfontconfig1-dev libfreetype6-dev libwebkit2gtk-4.1-dev libgtk-3-dev libxdo-dev libasound2-dev + run: sudo apt-get update && sudo apt-get install -y libfontconfig1-dev libfreetype6-dev libxkbcommon-x11-dev libwayland-dev libxcb-cursor-dev libasound2-dev - uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable channel, 2026-09-22 with: components: clippy @@ -39,9 +40,10 @@ jobs: steps: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - name: Install system dependencies - # webkit/gtk/xdo: required to compile rustmotion-studio (dioxus desktop) + # xkbcommon-x11/wayland/xcb-cursor: required to LINK rustmotion-studio (gpui). + # clippy passes without them — it never links — so the failure only shows in tests. # asound: required by cpal, which rodio pulls in for preview audio - run: sudo apt-get update && sudo apt-get install -y libfontconfig1-dev libfreetype6-dev libwebkit2gtk-4.1-dev libgtk-3-dev libxdo-dev libasound2-dev + run: sudo apt-get update && sudo apt-get install -y libfontconfig1-dev libfreetype6-dev libxkbcommon-x11-dev libwayland-dev libxcb-cursor-dev libasound2-dev - uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable channel, 2026-09-22 - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2 - name: Run tests diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index c30152cd..f54fd937 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -13,12 +13,15 @@ jobs: - name: Install system dependencies # Doit rester identique à ci.yaml : l'étape « Run tests » ci-dessous lance - # `cargo test --workspace`, qui compile rustmotion-studio et tire donc la - # pile GTK/WebKit, elle-même adossée à glib-2.0. Sans ces paquets le build - # de glib-sys échoue et la release s'arrête avant toute publication. - # webkit/gtk/xdo: required to compile rustmotion-studio (dioxus desktop) + # `cargo test --workspace`, qui compile ET LIE rustmotion-studio. Sans ces + # paquets l'édition de liens échoue et la release s'arrête avant toute + # publication. + # xkbcommon-x11/wayland/xcb-cursor : exigés par gpui, à l'édition de liens + # seulement. clippy passe sans eux puisqu'il ne lie pas — la panne + # n'apparaît donc qu'au job de test. C'est ce qui a cassé le premier CI du + # chantier gpui (#306) : `-lxkbcommon-x11` introuvable, clippy vert. # asound: required by cpal, which rodio pulls in for preview audio - run: sudo apt-get update && sudo apt-get install -y libfontconfig1-dev libfreetype6-dev libwebkit2gtk-4.1-dev libgtk-3-dev libxdo-dev libasound2-dev + run: sudo apt-get update && sudo apt-get install -y libfontconfig1-dev libfreetype6-dev libxkbcommon-x11-dev libwayland-dev libxcb-cursor-dev libasound2-dev - uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable channel, 2026-09-22 diff --git a/Cargo.lock b/Cargo.lock index 39836ca3..f46bbd86 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,126 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "accesskit" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b7f7f85a7e5f68090000ed7622545829afd484d210358702ae4cb97dd0c320" +dependencies = [ + "enumn", + "uuid", +] + +[[package]] +name = "accesskit_atspi_common" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "023da0e5097f46df7092d5280b02efb9bbf8d93298daeced42652463e357d636" +dependencies = [ + "accesskit", + "accesskit_consumer", + "atspi-common", + "phf 0.13.1", + "serde", + "zvariant", +] + +[[package]] +name = "accesskit_consumer" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d10a236f96f87d70732e44520046785431ef01d5bcd6b041317bfadd2f88245" +dependencies = [ + "accesskit", + "hashbrown 0.16.1", +] + +[[package]] +name = "accesskit_macos" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce02dc63b43f0c9296af9ac946312a2dc8814427d7a64d2d600971dac55b6076" +dependencies = [ + "accesskit", + "accesskit_consumer", + "hashbrown 0.16.1", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "accesskit_unix" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03e156ed3802e35eefe894ef2671bc6c889303d8a7e110b5e1b48f504b91362f" +dependencies = [ + "accesskit", + "accesskit_atspi_common", + "async-channel", + "async-executor", + "async-task", + "atspi", + "futures-lite", + "futures-util", + "serde", + "zbus", +] + +[[package]] +name = "accesskit_windows" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "106c2b961215864d1c2e703ee63269c25c4e80a577ffb2c1017b9c17dcdf83a1" +dependencies = [ + "accesskit", + "accesskit_consumer", + "hashbrown 0.16.1", + "static_assertions", + "windows 0.62.2", + "windows-core 0.62.2", +] + +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + [[package]] name = "adler2" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", + "zeroize", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "const-random", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.4" @@ -48,7 +162,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812947049edcd670a82cd5c73c3661d2e58468577ba8489de58e1a73c04cbd5d" dependencies = [ "alsa-sys", - "bitflags 2.11.0", + "bitflags 2.13.2", "cfg-if", "libc", ] @@ -63,6 +177,25 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + +[[package]] +name = "annotate-snippets" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96401ca08501972288ecbcde33902fce858bf73fbcbdf91dab8c3a9544e106bb" +dependencies = [ + "anstyle", + "unicode-width 0.2.0", +] + [[package]] name = "anstream" version = "0.6.21" @@ -134,6 +267,15 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +[[package]] +name = "arc-swap" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b" +dependencies = [ + "rustversion", +] + [[package]] name = "arg_enum_proc_macro" version = "0.3.4" @@ -145,6 +287,12 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "arraydeque" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" + [[package]] name = "arrayref" version = "0.3.9" @@ -157,6 +305,12 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + [[package]] name = "as-slice" version = "0.2.1" @@ -166,6 +320,187 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + +[[package]] +name = "ashpd" +version = "0.13.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb8421aaa9644a5faf26735f258b669b15f063313ef8f8e2bdb28912a1a6f111" +dependencies = [ + "enumflags2", + "futures-channel", + "futures-util", + "getrandom 0.4.2", + "serde", + "serde_repr", + "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-compression" +version = "0.4.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb61aea1a7def73ee7c350a184f0e70b32c182344e2e75bf70c9b621b83417fd" +dependencies = [ + "compression-codecs", + "compression-core", + "futures-io", + "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.117", +] + +[[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 = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + [[package]] name = "async-trait" version = "0.1.89" @@ -178,26 +513,52 @@ dependencies = [ ] [[package]] -name = "atk" -version = "0.18.2" +name = "atomic" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "atspi" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77886257be21c9cd89a4ae7e64860c6f0eefca799bb79127913052bd0eefb3d" +dependencies = [ + "atspi-common", + "atspi-proxies", +] + +[[package]] +name = "atspi-common" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +checksum = "20c5617155740c98003016429ad13fe43ce7a77b007479350a9f8bf95a29f63d" dependencies = [ - "atk-sys", - "glib", - "libc", + "enumflags2", + "serde", + "static_assertions", + "zbus", + "zbus-lockstep", + "zbus-lockstep-macros", + "zbus_names", + "zvariant", ] [[package]] -name = "atk-sys" -version = "0.18.2" +name = "atspi-proxies" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +checksum = "2230e48787ed3eb4088996eab66a32ca20c0b67bbd4fd6cdfe79f04f1f04c9fc" dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", + "atspi-common", + "serde", + "zbus", ] [[package]] @@ -249,6 +610,27 @@ dependencies = [ "arrayvec", ] +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link 0.2.1", +] + +[[package]] +name = "base62" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3a647dce9631f152a99ec16cfc09267ae55fe280d5dc288964027d458076323" + [[package]] name = "base64" version = "0.22.1" @@ -270,7 +652,7 @@ version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "cexpr", "clang-sys", "itertools 0.12.1", @@ -284,7 +666,7 @@ dependencies = [ "rustc-hash 1.1.0", "shlex", "syn 2.0.117", - "which", + "which 4.4.2", ] [[package]] @@ -293,7 +675,7 @@ version = "0.71.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "cexpr", "clang-sys", "itertools 0.13.0", @@ -313,7 +695,7 @@ version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "cexpr", "clang-sys", "itertools 0.13.0", @@ -333,7 +715,16 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ - "bit-vec", + "bit-vec 0.8.0", +] + +[[package]] +name = "bit-set" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ddef2995421ab6a5c779542c81ee77c115206f4ad9d5a8e05f4ff49716a3dd" +dependencies = [ + "bit-vec 0.9.1", ] [[package]] @@ -342,6 +733,12 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" +[[package]] +name = "bit-vec" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71798fca2c1fe1086445a7258a4bc81e6e49dcd24c8d0dd9a1e57395b603f51" + [[package]] name = "bit_field" version = "0.10.3" @@ -356,12 +753,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.11.0" +version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" -dependencies = [ - "serde_core", -] +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" [[package]] name = "bitstream-io" @@ -388,16 +782,76 @@ dependencies = [ ] [[package]] -name = "block2" -version = "0.6.2" +name = "block-buffer" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" dependencies = [ - "objc2", + "hybrid-array", ] [[package]] -name = "built" +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +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.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a70e4329df6cb94385eed412ec92375c3cdd8a6e502493d1229b6414e4036dfa" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "borsh" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "553c5d846a6ba5150c65e3b1b8ec073bcf1abc20f9b7220de384a4443ea4e20a" +dependencies = [ + "bytes", + "cfg_aliases", +] + +[[package]] +name = "bstr" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb31b46c14244e20ee9984b11bf5c992b91fb6939fea616e3512c8baecdbe5f" +dependencies = [ + "memchr", + "serde_core", +] + +[[package]] +name = "built" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c0e531d93d39c34eef561e929e8a7f86d77a5af08aac4f6d6e39976c51858e9" @@ -451,33 +905,39 @@ name = "bytes" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "bzip2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a53fac24f34a81bc9954b5d6cfce0c21e18ec6959f44f56e8e90e4bb7c346c" dependencies = [ - "serde", + "libbz2-rs-sys", ] [[package]] -name = "cairo-rs" -version = "0.18.5" +name = "calloop" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" dependencies = [ - "bitflags 2.11.0", - "cairo-sys-rs", - "glib", - "libc", - "once_cell", - "thiserror 1.0.69", + "bitflags 2.13.2", + "polling", + "rustix 1.1.4", + "slab", + "tracing", ] [[package]] -name = "cairo-sys-rs" -version = "0.18.2" +name = "calloop-wayland-source" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa" dependencies = [ - "glib-sys", - "libc", - "system-deps", + "calloop", + "rustix 1.1.4", + "wayland-backend", + "wayland-client", ] [[package]] @@ -495,6 +955,33 @@ dependencies = [ "rustversion", ] +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + +[[package]] +name = "cbindgen" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadd868a2ce9ca38de7eeafdcec9c7065ef89b42b32f0839278d55f35c54d1ff" +dependencies = [ + "heck 0.4.1", + "indexmap", + "log", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn 2.0.117", + "tempfile", + "toml 0.8.23", +] + [[package]] name = "cc" version = "1.2.56" @@ -523,31 +1010,61 @@ dependencies = [ ] [[package]] -name = "cfb" -version = "0.7.3" +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "cgl" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" dependencies = [ - "byteorder", - "fnv", - "uuid", + "libc", ] [[package]] -name = "cfg-expr" -version = "0.15.8" +name = "chacha20" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" dependencies = [ - "smallvec", - "target-lexicon", + "cfg-if", + "cpufeatures 0.3.1", + "rand_core 0.10.1", ] [[package]] -name = "cfg-if" -version = "1.0.4" +name = "chrono" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link 0.2.1", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common 0.1.7", + "inout", + "zeroize", +] [[package]] name = "clang-sys" @@ -557,7 +1074,7 @@ checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", - "libloading 0.8.9", + "libloading", ] [[package]] @@ -609,18 +1126,48 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +[[package]] +name = "cocoa" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation 0.1.2", + "core-foundation 0.9.4", + "core-graphics 0.23.2", + "foreign-types", + "libc", + "objc", +] + [[package]] name = "cocoa" version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad36507aeb7e16159dfe68db81ccc27571c3ccd4b76fb2fb72fc59e7a4b1b64c" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "block", - "cocoa-foundation", - "core-foundation", + "cocoa-foundation 0.2.1", + "core-foundation 0.10.1", "core-graphics 0.24.0", - "foreign-types 0.5.0", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", "libc", "objc", ] @@ -631,13 +1178,24 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81411967c50ee9a1fc11365f8c585f863a22a9697c89239c452292c40ba79b0d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "block", - "core-foundation", - "core-graphics-types", + "core-foundation 0.10.1", + "core-graphics-types 0.2.0", "objc", ] +[[package]] +name = "codespan-reporting" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" +dependencies = [ + "serde", + "termcolor", + "unicode-width 0.2.0", +] + [[package]] name = "color_quant" version = "1.1.0" @@ -675,91 +1233,85 @@ dependencies = [ ] [[package]] -name = "const-serialize" -version = "0.7.2" +name = "compression-codecs" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad7154afa56de2f290e3c82c2c6dc4f5b282b6870903f56ef3509aba95866edc" +checksum = "bef16c47ba2797aa6a909cc37d39911f3a6743811fe7408ac0b0cc0276b656e9" dependencies = [ - "const-serialize-macro 0.7.2", + "bzip2", + "compression-core", + "flate2", + "memchr", ] [[package]] -name = "const-serialize" -version = "0.8.0-alpha.0" +name = "compression-core" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e42cd5aabba86f128b3763da1fec1491c0f728ce99245062cd49b6f9e6d235b" -dependencies = [ - "const-serialize 0.7.2", - "const-serialize-macro 0.8.0-alpha.0", - "serde", -] +checksum = "6e8ccc4ea9f6acc32d102c0f6d471d11d913ad15f20c04de743374861fa1d414" [[package]] -name = "const-serialize-macro" -version = "0.7.2" +name = "concurrent-queue" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f160aad86b4343e8d4e261fee9965c3005b2fd6bc117d172ab65948779e4acf" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "crossbeam-utils", ] [[package]] -name = "const-serialize-macro" -version = "0.8.0-alpha.0" +name = "console_error_panic_hook" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42571ed01eb46d2e1adcf99c8ca576f081e46f2623d13500eba70d1d99a4c439" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "cfg-if", + "wasm-bindgen", ] [[package]] -name = "const_format" -version = "0.2.36" +name = "const-oid" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" -dependencies = [ - "const_format_proc_macros", - "konst", -] +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" [[package]] -name = "const_format_proc_macros" -version = "0.2.34" +name = "const-random" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", + "const-random-macro", ] [[package]] -name = "convert_case" -version = "0.4.0" +name = "const-random-macro" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "tiny-keccak", +] [[package]] name = "convert_case" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" dependencies = [ "unicode-segmentation", ] [[package]] -name = "cookie" -version = "0.18.1" +name = "core-foundation" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ - "time", - "version_check", + "core-foundation-sys", + "libc", ] [[package]] @@ -778,29 +1330,53 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", + "foreign-types", + "libc", +] + [[package]] name = "core-graphics" version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ - "bitflags 2.11.0", - "core-foundation", - "core-graphics-types", - "foreign-types 0.5.0", + "bitflags 2.13.2", + "core-foundation 0.10.1", + "core-graphics-types 0.2.0", + "foreign-types", "libc", ] [[package]] -name = "core-graphics" -version = "0.25.0" +name = "core-graphics-helmer-fork" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32eb7c354ae9f6d437a6039099ce7ecd049337a8109b23d73e48e8ffba8e9cd5" +dependencies = [ + "bitflags 2.13.2", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ - "bitflags 2.11.0", - "core-foundation", - "core-graphics-types", - "foreign-types 0.5.0", + "bitflags 1.3.2", + "core-foundation 0.9.4", "libc", ] @@ -810,9 +1386,48 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.11.0", - "core-foundation", + "bitflags 2.13.2", + "core-foundation 0.10.1", + "libc", +] + +[[package]] +name = "core-graphics2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4416167a69126e617f8d0a214af0e3c1dbdeffcb100ddf72dcd1a1ac9893c146" +dependencies = [ + "bitflags 2.13.2", + "block", + "cfg-if", + "core-foundation 0.10.1", + "libc", +] + +[[package]] +name = "core-text" +version = "21.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a593227b66cbd4007b2a050dfdd9e1d1318311409c8d600dc82ba1b15ca9c130" +dependencies = [ + "core-foundation 0.10.1", + "core-graphics 0.24.0", + "foreign-types", + "libc", +] + +[[package]] +name = "core-video" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139679cc63eb9504bdbe37e37874b0247136177655f0008588781e90863afa62" +dependencies = [ + "block", + "core-foundation 0.10.1", + "core-graphics2", + "io-surface", "libc", + "metal", ] [[package]] @@ -830,7 +1445,7 @@ version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d5d7dca3ebcf65a035582c9ad4385371a9d9ee6537474d2a278f4e1e475bb58" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "libc", "objc2-audio-toolbox", "objc2-core-audio", @@ -844,7 +1459,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be17b688510d934ce13f48a2beba700e11583e281e0fda99c22bb256a14eda73" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "fontdb 0.23.0", "harfrust", "linebender_resource_handle", @@ -871,7 +1486,7 @@ dependencies = [ "alsa", "coreaudio-rs", "dasp_sample", - "jni 0.21.1", + "jni", "js-sys", "libc", "mach2", @@ -879,17 +1494,17 @@ dependencies = [ "ndk-context", "num-derive", "num-traits", - "objc2", + "objc2 0.6.4", "objc2-audio-toolbox", "objc2-avf-audio", "objc2-core-audio", "objc2-core-audio-types", "objc2-core-foundation", - "objc2-foundation", + "objc2-foundation 0.3.2", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "windows", + "windows 0.61.3", ] [[package]] @@ -902,21 +1517,21 @@ dependencies = [ ] [[package]] -name = "crc32fast" -version = "1.5.0" +name = "cpufeatures" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" dependencies = [ - "cfg-if", + "libc", ] [[package]] -name = "crossbeam-channel" -version = "0.5.15" +name = "crc32fast" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ - "crossbeam-utils", + "cfg-if", ] [[package]] @@ -938,6 +1553,15 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03e8bd762f7479489c70ed6c768ddca99d7296857de437a68dcb2a94365b3fae" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.21" @@ -950,7 +1574,7 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "crossterm_winapi", "mio", "parking_lot", @@ -986,40 +1610,22 @@ dependencies = [ ] [[package]] -name = "cssparser" -version = "0.29.6" +name = "crypto-common" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" dependencies = [ - "cssparser-macros", - "dtoa-short", - "itoa", - "matches", - "phf 0.10.1", - "proc-macro2", - "quote", - "smallvec", - "syn 1.0.109", + "hybrid-array", ] [[package]] -name = "cssparser-macros" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" -dependencies = [ - "quote", - "syn 2.0.117", -] - -[[package]] -name = "darling" -version = "0.21.3" +name = "ctor" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +checksum = "914a755b7c2d4af2bdcff7ce1739e2db9a1b81a9b07123d8015786ae03c0980d" dependencies = [ - "darling_core 0.21.3", - "darling_macro 0.21.3", + "link-section", + "linktime-proc-macro", ] [[package]] @@ -1028,21 +1634,8 @@ version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" dependencies = [ - "darling_core 0.23.0", - "darling_macro 0.23.0", -] - -[[package]] -name = "darling_core" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "syn 2.0.117", + "darling_core", + "darling_macro", ] [[package]] @@ -1058,24 +1651,13 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "darling_macro" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" -dependencies = [ - "darling_core 0.21.3", - "quote", - "syn 2.0.117", -] - [[package]] name = "darling_macro" version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ - "darling_core 0.23.0", + "darling_core", "quote", "syn 2.0.117", ] @@ -1100,12 +1682,6 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" -[[package]] -name = "data-encoding" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" - [[package]] name = "data-url" version = "0.3.2" @@ -1123,15 +1699,25 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.20" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" dependencies = [ - "convert_case 0.4.0", + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "convert_case", "proc-macro2", "quote", "rustc_version", "syn 2.0.117", + "unicode-xid", ] [[package]] @@ -1140,654 +1726,321 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", - "crypto-common", + "block-buffer 0.10.4", + "crypto-common 0.1.7", + "subtle", ] [[package]] -name = "dioxus" -version = "0.7.9" +name = "digest" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c01ecf7ddbae18a419ad3d83c486101a85ffc5740ea09cdd0f09a30dc12170d" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ - "dioxus-asset-resolver", - "dioxus-cli-config", - "dioxus-config-macro", - "dioxus-config-macros", - "dioxus-core", - "dioxus-core-macro", - "dioxus-desktop", - "dioxus-devtools", - "dioxus-document", - "dioxus-history", - "dioxus-hooks", - "dioxus-html", - "dioxus-logger", - "dioxus-signals", - "dioxus-stores", - "dioxus-web", - "manganis", - "subsecond", - "warnings", + "block-buffer 0.12.1", + "const-oid", + "crypto-common 0.2.2", ] [[package]] -name = "dioxus-asset-resolver" -version = "0.7.9" +name = "dirs" +version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69387edbbc60c7cb93ad96d8cc7a22b49a76e21643380b89b1c49a78d347ff60" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" dependencies = [ - "dioxus-cli-config", - "http", - "infer", - "jni 0.21.1", - "ndk", - "ndk-context", - "ndk-sys", - "percent-encoding", - "thiserror 2.0.18", - "tokio", + "dirs-sys 0.4.1", ] [[package]] -name = "dioxus-attributes" -version = "0.1.0" -source = "git+https://github.com/DioxusLabs/components#02801f27e4b3e30606e5c77e435c9d955c708eb3" +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" dependencies = [ - "dioxus-rsx", - "proc-macro2", - "quote", - "syn 2.0.117", + "dirs-sys 0.5.0", ] [[package]] -name = "dioxus-cli-config" -version = "0.7.9" +name = "dirs-sys" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c000f584ddf608e2b272b3074bf11512a474eeeb2eb85a1915f276ce5c4a8615" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" dependencies = [ - "wasm-bindgen", + "libc", + "option-ext", + "redox_users 0.4.6", + "windows-sys 0.48.0", ] [[package]] -name = "dioxus-config-macro" -version = "0.7.9" +name = "dirs-sys" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7637091592978fbfdb45a16b26bd99fd97fb1bd7e31c6a963530e00c022af321" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" dependencies = [ - "proc-macro2", - "quote", + "libc", + "option-ext", + "redox_users 0.5.2", + "windows-sys 0.61.2", ] [[package]] -name = "dioxus-config-macros" -version = "0.7.9" +name = "dispatch" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54f9ed8fc1a215ad34bb8dbae42a4ea54efbcd26ca9006bbe5cca78e511bf25f" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" [[package]] -name = "dioxus-core" -version = "0.7.9" +name = "dispatch2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45887100ff0cf89abeb8b659808294fda48cd53f3b424e36407dedffcfea830b" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "anyhow", - "const_format", - "dioxus-core-types", - "futures-channel", - "futures-util", - "generational-box", - "longest-increasing-subsequence", - "rustc-hash 2.1.1", - "rustversion", - "serde", - "slab", - "slotmap", - "subsecond", - "tracing", + "bitflags 2.13.2", + "block2 0.6.2", + "libc", + "objc2 0.6.4", ] [[package]] -name = "dioxus-core-macro" -version = "0.7.9" +name = "displaydoc" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "370c63663dff0f24df5dfea643ca239283542c6b228a302f69b32e1d36762b7f" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ - "convert_case 0.8.0", - "dioxus-rsx", "proc-macro2", "quote", "syn 2.0.117", ] [[package]] -name = "dioxus-core-types" -version = "0.7.9" +name = "dlib" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36963eab106b169737762f9cd5ee5fd97f585989dcb2d8e30a596e97a6999009" +checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" +dependencies = [ + "libloading", +] [[package]] -name = "dioxus-desktop" -version = "0.7.9" +name = "document-features" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "662cd78c73ca3f17346adbf2d64757df40dd0ce20536c05123097fd31828d2bd" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" dependencies = [ - "anyhow", - "async-trait", - "base64", - "bytes", - "cocoa", - "core-foundation", - "dioxus-asset-resolver", - "dioxus-cli-config", - "dioxus-core", - "dioxus-devtools", - "dioxus-document", - "dioxus-history", - "dioxus-hooks", - "dioxus-html", - "dioxus-interpreter-js", - "dioxus-signals", - "dunce", - "futures-channel", - "futures-util", - "generational-box", - "global-hotkey", - "image", - "infer", - "jni 0.21.1", - "lazy-js-bundle", - "libc", - "muda", - "ndk", - "ndk-context", - "ndk-sys", - "objc", - "objc_id", - "percent-encoding", - "rand 0.9.2", - "rfd", - "rustc-hash 2.1.1", - "serde", - "serde_json", - "signal-hook", - "slab", - "subtle", - "tao", - "thiserror 2.0.18", - "tokio", - "tracing", - "tray-icon", - "tungstenite", - "webbrowser", - "wry", + "litrs", ] [[package]] -name = "dioxus-devtools" -version = "0.7.9" +name = "downcast-rs" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2349cedbdf1b429df1f1bea61fdee0ad3dae7b2548eedfbeca82710122a57da0" -dependencies = [ - "dioxus-cli-config", - "dioxus-core", - "dioxus-devtools-types", - "dioxus-signals", - "serde", - "serde_json", - "subsecond", - "thiserror 2.0.18", - "tracing", - "tungstenite", -] +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] -name = "dioxus-devtools-types" -version = "0.7.9" +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dwrote" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab9b0f7565d1916b70915f59b89ea8054ef0a9d67a364a32bbee68ef5f3818d" +checksum = "9e1b35532432acc8b19ceed096e35dfa088d3ea037fe4f3c085f1f97f33b4d02" dependencies = [ - "dioxus-core", - "serde", - "subsecond-types", + "lazy_static", + "libc", + "winapi", + "wio", ] [[package]] -name = "dioxus-document" -version = "0.7.9" +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "embed-resource" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37e3a5bec7ffc999ff23446a487eb5cd86111d1574a23533dd3f8b3c69a53a22" +checksum = "fbfdaacccebec3b28e4866b8973543c7647797db5ada1bdab552e48fe665fbbd" dependencies = [ - "dioxus-core", - "dioxus-core-macro", - "dioxus-core-types", - "dioxus-html", - "futures-channel", - "futures-util", - "generational-box", - "lazy-js-bundle", - "serde", - "serde_json", - "tracing", + "cc", + "memchr", + "rustc_version", + "toml 1.1.4+spec-1.1.0", + "vswhom", + "winreg", ] [[package]] -name = "dioxus-history" -version = "0.7.9" +name = "encoding_rs" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a15232302d1933015fcf2d6fe9e286ad36f6e9c205a546089a0f326023bb0d2" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ - "dioxus-core", - "tracing", + "cfg-if", ] [[package]] -name = "dioxus-hooks" -version = "0.7.9" +name = "encoding_rs_io" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4534f91cf6305204b948bdec130076ac9ecc7c22faab29475b76870558bf73ea" +checksum = "fba3fe847045ecff794b9c138293a80db914678c453ad63fbf0c6a9eb6e00b22" dependencies = [ - "dioxus-core", - "dioxus-signals", - "futures-channel", - "futures-util", - "generational-box", - "rustversion", - "slab", - "tracing", + "encoding_rs", ] [[package]] -name = "dioxus-html" -version = "0.7.9" +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enum-iterator" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e03d6ad4040b667f2b2eefcb678840e630938c09bf9ec39b04ea4d1d96d90d44" +checksum = "a4549325971814bda7a44061bf3fe7e487d447cba01e4220a4b454d630d7a016" dependencies = [ - "async-trait", - "bytes", - "dioxus-core", - "dioxus-core-macro", - "dioxus-core-types", - "dioxus-hooks", - "dioxus-html-internal-macro", - "enumset", - "euclid", - "futures-channel", - "futures-util", - "generational-box", - "keyboard-types", - "lazy-js-bundle", - "rustversion", - "serde", - "serde_json", - "serde_repr", - "tracing", + "enum-iterator-derive", ] [[package]] -name = "dioxus-html-internal-macro" -version = "0.7.9" +name = "enum-iterator-derive" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "584e2772127ab00f0d5e1d4d9795f39fecebc828ece0b7a02349d438bc1b1ce7" +checksum = "685adfa4d6f3d765a26bc5dbc936577de9abf756c1feeb3089b01dd395034842" dependencies = [ - "convert_case 0.8.0", "proc-macro2", "quote", "syn 2.0.117", ] [[package]] -name = "dioxus-icons" -version = "0.1.0" +name = "enumflags2" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ae929a4cdde2e51fca98ccb8a8fe2ea11640e5026c57486b15dbd5618ba7e56" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" dependencies = [ - "dioxus", - "dioxus-signals", - "lazy-js-bundle", + "enumflags2_derive", + "serde", ] [[package]] -name = "dioxus-interpreter-js" -version = "0.7.9" +name = "enumflags2_derive" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11999d6eb5bb179a9512dad30e5de408aab66f2cb65de9098c9fbe02927e2978" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ - "dioxus-core", - "dioxus-core-types", - "dioxus-html", - "js-sys", - "lazy-js-bundle", - "rustc-hash 2.1.1", - "serde", - "sledgehammer_bindgen", - "sledgehammer_utils", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] -name = "dioxus-logger" -version = "0.7.9" +name = "enumn" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28ccdfe36d2cb830a2784e40f7e6f7199805a2c6da99bd65b1ca308f11aed28" +checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ - "dioxus-cli-config", - "tracing", - "tracing-subscriber", - "tracing-wasm", + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] -name = "dioxus-primitives" -version = "0.0.1" -source = "git+https://github.com/DioxusLabs/components#02801f27e4b3e30606e5c77e435c9d955c708eb3" +name = "equator" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" dependencies = [ - "dioxus", - "dioxus-attributes", - "dioxus-sdk-time", - "lazy-js-bundle", - "num-integer", - "palette", - "serde", - "time", - "tracing", + "equator-macro", ] [[package]] -name = "dioxus-rsx" -version = "0.7.9" +name = "equator-macro" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2106afda239a4c7c22ffa1ca19117011225fc1c735c139c0a5b765996aa8bb1d" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", - "proc-macro2-diagnostics", "quote", - "rustversion", "syn 2.0.117", ] [[package]] -name = "dioxus-sdk-time" -version = "0.7.0" +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 = "80c25ae93a3f72e734873b97fbd09d9b1b6adff97205fb0ffd8543e3564fb78e" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" dependencies = [ - "dioxus", - "futures", - "gloo-timers", - "tokio", + "serde", + "serde_core", + "typeid", ] [[package]] -name = "dioxus-signals" -version = "0.7.9" +name = "errno" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3705754f5e043deec9fc7af0d159f18e5b21c02c47d255c7e477f31368f0b6d2" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ - "dioxus-core", - "futures-channel", - "futures-util", - "generational-box", - "parking_lot", - "rustc-hash 2.1.1", - "tracing", - "warnings", + "libc", + "windows-sys 0.61.2", ] [[package]] -name = "dioxus-stores" -version = "0.7.9" +name = "etagere" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64bec7b21c86b1360ec965a07a53a2c96b7caee3465049e1c299a45024e87614" +checksum = "fc89bf99e5dc15954a60f707c1e09d7540e5cd9af85fa75caa0b510bc08c5342" dependencies = [ - "dioxus-core", - "dioxus-signals", - "dioxus-stores-macro", - "generational-box", + "euclid", + "svg_fmt", ] [[package]] -name = "dioxus-stores-macro" -version = "0.7.9" +name = "euclid" +version = "0.22.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a5875e9f890f27b1cc3e5b56c1e23601211470315a1fb8627c4ca4f3b2be9a" +checksum = "df61bf483e837f88d5c2291dcf55c67be7e676b3a51acc48db3a7b163b91ed63" dependencies = [ - "convert_case 0.8.0", - "proc-macro2", - "quote", - "syn 2.0.117", + "num-traits", ] [[package]] -name = "dioxus-web" -version = "0.7.9" +name = "event-listener" +version = "5.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0a0be76b404e8242a597db0fb239d05f8dee4e7856bc1fc7144f7e244822fd" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" dependencies = [ - "dioxus-cli-config", - "dioxus-core", - "dioxus-core-types", - "dioxus-devtools", - "dioxus-document", - "dioxus-history", - "dioxus-html", - "dioxus-interpreter-js", - "dioxus-signals", - "futures-channel", - "futures-util", - "generational-box", - "gloo-timers", - "js-sys", - "lazy-js-bundle", - "rustc-hash 2.1.1", - "send_wrapper", - "serde", - "serde-wasm-bindgen", - "serde_json", - "tracing", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", -] - -[[package]] -name = "dirs" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.61.2", -] - -[[package]] -name = "dispatch2" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" -dependencies = [ - "bitflags 2.11.0", - "block2", - "libc", - "objc2", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "dlib" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" -dependencies = [ - "libloading 0.8.9", -] - -[[package]] -name = "dlopen2" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" -dependencies = [ - "dlopen2_derive", - "libc", - "once_cell", - "winapi", -] - -[[package]] -name = "dlopen2_derive" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - -[[package]] -name = "dpi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" - -[[package]] -name = "dtoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" - -[[package]] -name = "dtoa-short" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" -dependencies = [ - "dtoa", -] - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enumset" -version = "1.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "839c4174b41e75c8f7306110b2c51996a293b8d1d850edd529011841d9fede7d" -dependencies = [ - "enumset_derive", -] - -[[package]] -name = "enumset_derive" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd536557b58c682b217b8fb199afdff47cd3eff260623f19e77074eb073d63a" -dependencies = [ - "darling 0.21.3", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "equator" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" -dependencies = [ - "equator-macro", -] - -[[package]] -name = "equator-macro" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[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", + "parking", + "pin-project-lite", ] [[package]] -name = "euclid" -version = "0.22.13" +name = "event-listener-strategy" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df61bf483e837f88d5c2291dcf55c67be7e676b3a51acc48db3a7b163b91ed63" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "num-traits", - "serde", + "event-listener", + "pin-project-lite", ] [[package]] @@ -1817,7 +2070,7 @@ version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f" dependencies = [ - "bit-set", + "bit-set 0.8.0", "regex-automata", "regex-syntax", ] @@ -1833,6 +2086,9 @@ name = "fastrand" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +dependencies = [ + "getrandom 0.2.17", +] [[package]] name = "fax" @@ -1859,13 +2115,14 @@ dependencies = [ ] [[package]] -name = "field-offset" -version = "0.3.6" +name = "filedescriptor" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d" dependencies = [ - "memoffset", - "rustc_version", + "libc", + "thiserror 1.0.69", + "winapi", ] [[package]] @@ -1885,6 +2142,12 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + [[package]] name = "flate2" version = "1.1.9" @@ -1901,6 +2164,39 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +[[package]] +name = "float-ord" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce81f49ae8a0482e4c55ea62ebbd7e5a686af544c00b9d090bba3ff9be97b3d" + +[[package]] +name = "float_next_after" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf7cc16383c4b8d58b9905a8509f02926ce3058053c056376248d958c9df1e8" + +[[package]] +name = "fluent-uri" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17c704e9dbe1ddd863da1e6ff3567795087b1eb201ce80d8fa81162e1516500d" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "flume" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e139bc46ca777eb5efaf62df0ab8cc5fd400866427e56c68b22e414e53bd3be" +dependencies = [ + "fastrand", + "futures-core", + "futures-sink", + "spin 0.9.9", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1913,6 +2209,12 @@ 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 = "font-types" version = "0.11.3" @@ -1928,7 +2230,7 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646" dependencies = [ - "roxmltree", + "roxmltree 0.20.0", ] [[package]] @@ -1959,15 +2261,6 @@ dependencies = [ "ttf-parser 0.25.1", ] -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared 0.1.1", -] - [[package]] name = "foreign-types" version = "0.5.0" @@ -1975,7 +2268,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ "foreign-types-macros", - "foreign-types-shared 0.3.1", + "foreign-types-shared", ] [[package]] @@ -1989,12 +2282,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "foreign-types-shared" version = "0.3.1" @@ -2010,6 +2297,17 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "freetype-sys" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7edc5b9669349acfda99533e9e0bcf26a51862ab43b08ee7745c55d28eb134" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + [[package]] name = "fsevent-sys" version = "4.1.0" @@ -2031,9 +2329,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" dependencies = [ "futures-channel", "futures-core", @@ -2046,25 +2344,38 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" dependencies = [ "futures-core", "futures-sink", ] +[[package]] +name = "futures-concurrency" +version = "7.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175cd8cca9e1d45b87f18ffa75088f2099e3c4fe5e2f83e42de112560bea8ea6" +dependencies = [ + "fixedbitset", + "futures-core", + "futures-lite", + "pin-project", + "smallvec", +] + [[package]] name = "futures-core" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" [[package]] name = "futures-executor" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" dependencies = [ "futures-core", "futures-task", @@ -2073,38 +2384,51 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" [[package]] -name = "futures-macro" -version = "0.3.32" +name = "futures-lite" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", ] [[package]] name = "futures-sink" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" [[package]] name = "futures-task" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" [[package]] name = "futures-util" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" dependencies = [ "futures-channel", "futures-core", @@ -2117,110 +2441,6 @@ dependencies = [ "slab", ] -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "gdk" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" -dependencies = [ - "cairo-rs", - "gdk-pixbuf", - "gdk-sys", - "gio", - "glib", - "libc", - "pango", -] - -[[package]] -name = "gdk-pixbuf" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" -dependencies = [ - "gdk-pixbuf-sys", - "gio", - "glib", - "libc", - "once_cell", -] - -[[package]] -name = "gdk-pixbuf-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" -dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "gdk-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" -dependencies = [ - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "pkg-config", - "system-deps", -] - -[[package]] -name = "gdkwayland-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" -dependencies = [ - "gdk-sys", - "glib-sys", - "gobject-sys", - "libc", - "pkg-config", - "system-deps", -] - -[[package]] -name = "gdkx11-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" -dependencies = [ - "gdk-sys", - "glib-sys", - "libc", - "system-deps", - "x11", -] - -[[package]] -name = "generational-box" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd0d825b8d339701ad330dbcd6399519ced4d143484954daf6e3185dace4f77" -dependencies = [ - "parking_lot", - "tracing", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -2241,17 +2461,6 @@ dependencies = [ "windows-link 0.2.1", ] -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - [[package]] name = "getrandom" version = "0.2.17" @@ -2259,8 +2468,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", + "js-sys", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", + "wasm-bindgen", ] [[package]] @@ -2270,9 +2481,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi 5.3.0", "wasip2", + "wasm-bindgen", ] [[package]] @@ -2282,10 +2495,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi 6.0.0", + "rand_core 0.10.1", "wasip2", "wasip3", + "wasm-bindgen", ] [[package]] @@ -2309,234 +2525,842 @@ dependencies = [ ] [[package]] -name = "gio" -version = "0.18.4" +name = "gimli" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "gio-sys", - "glib", - "libc", - "once_cell", - "pin-project-lite", - "smallvec", - "thiserror 1.0.69", -] +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] -name = "gio-sys" -version = "0.18.1" +name = "gl_generator" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", - "winapi", + "khronos_api", + "log", + "xml-rs", ] [[package]] -name = "glib" -version = "0.18.5" +name = "glob" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" -dependencies = [ - "bitflags 2.11.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 1.0.69", -] +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] -name = "glib-macros" -version = "0.18.5" +name = "globset" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +checksum = "e47d37d2ae4464254884b60ab7071be2b876a9c35b696bd018ddcc76847309cd" dependencies = [ - "heck 0.4.1", - "proc-macro-crate 2.0.2", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.117", + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", ] [[package]] -name = "glib-sys" -version = "0.18.1" +name = "globwalk" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" dependencies = [ - "libc", - "system-deps", + "bitflags 1.3.2", + "ignore", + "walkdir", ] [[package]] -name = "glob" -version = "0.3.3" +name = "glow" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +checksum = "29038e1c483364cc6bb3cf78feee1816002e127c331a1eec55a4d202b9e1adb5" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] [[package]] -name = "global-hotkey" -version = "0.7.0" +name = "glutin_wgl_sys" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9247516746aa8e53411a0db9b62b0e24efbcf6a76e0ba73e5a91b512ddabed7" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" dependencies = [ - "crossbeam-channel", - "keyboard-types", - "objc2", - "objc2-app-kit", - "once_cell", - "thiserror 2.0.18", - "windows-sys 0.59.0", - "x11rb", - "xkeysym", + "gl_generator", ] [[package]] -name = "gloo-timers" -version = "0.3.0" +name = "gpu-allocator" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +checksum = "51255ea7cfaadb6c5f1528d43e92a82acb2b96c43365989a28b2d44ee38f8795" dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", + "ash", + "hashbrown 0.16.1", + "log", + "presser", + "thiserror 2.0.18", + "windows 0.61.3", ] [[package]] -name = "gobject-sys" -version = "0.18.0" +name = "gpu-descriptor" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ - "glib-sys", - "libc", - "system-deps", + "bitflags 2.13.2", + "gpu-descriptor-types", + "hashbrown 0.15.5", ] [[package]] -name = "grid" -version = "1.0.1" +name = "gpu-descriptor-types" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b40ca9252762c466af32d0b1002e91e4e1bc5398f77455e55474deb466355ff5" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +dependencies = [ + "bitflags 2.13.2", +] [[package]] -name = "gtk" -version = "0.18.2" +name = "gpui-base" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +checksum = "c9e904ee0d351f4e85b967e26ae986d3aa195a8d9d35fcd18184a2c40989694e" dependencies = [ - "atk", - "cairo-rs", - "field-offset", - "futures-channel", - "gdk", - "gdk-pixbuf", - "gio", - "glib", - "gtk-sys", - "gtk3-macros", - "libc", - "pango", - "pkg-config", + "aho-corasick", + "anyhow", + "ashpd", + "async-channel", + "chrono", + "data-url", + "futures", + "gpui-pre", + "gpui-pre-macros", + "gpui-pre-sum-tree", + "html5ever 0.27.0", + "instant", + "lsp-types", + "markdown", + "markup5ever_rcdom 0.3.0", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", + "raw-window-handle", + "regex", + "ropey", + "schemars 1.2.2", + "serde", + "serde_json", + "smallvec", + "smol", + "tracing", + "unicode-segmentation", + "web-time", + "windows 0.58.0", ] [[package]] -name = "gtk-sys" -version = "0.18.2" +name = "gpui-component" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +checksum = "0cf6c72516b44bb2e66a1bd2ccf77a122ecd1b54a75559ac299bb296bfcb5bb7" dependencies = [ - "atk-sys", - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "system-deps", + "anyhow", + "chrono", + "core-text", + "enum-iterator", + "gpui-base", + "gpui-component-macros", + "gpui-kit-assets", + "gpui-pre", + "gpui-pre-macros", + "gpui-pre-sum-tree", + "instant", + "itertools 0.13.0", + "log", + "lsp-types", + "markdown", + "notify", + "num-traits", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", + "once_cell", + "paste", + "raw-window-handle", + "regex", + "resvg 0.45.1", + "ropey", + "rust-i18n", + "schemars 1.2.2", + "serde", + "serde_json", + "serde_repr", + "smallvec", + "smol", + "tracing", + "uuid", + "windows 0.58.0", ] [[package]] -name = "gtk3-macros" -version = "0.18.2" +name = "gpui-component-macros" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +checksum = "3867545508c7cf6a5f6da586f60d894a3f8e7cce94b7fe82df7fad5f868ec20e" dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro-error", + "proc-macro-crate", "proc-macro2", "quote", "syn 2.0.117", ] [[package]] -name = "half" -version = "2.7.1" +name = "gpui-kit" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +checksum = "42732dc20f50926278b2abf7a99d427a7741ab28bca6bfb49685f9ce3a53a1c7" dependencies = [ - "cfg-if", - "crunchy", - "zerocopy", + "gpui-base", + "gpui-component", + "gpui-kit-assets", + "gpui-pre", + "gpui-pre-platform", + "gpui-pre-web", ] [[package]] -name = "harfrust" -version = "0.5.2" +name = "gpui-kit-assets" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9da2e5ae821f6e96664977bf974d6d6a2d6682f9ccee23e62ec1d134246845f9" +checksum = "111d3d03a68454318a193f137419864ccebdc7d3dc0194b0b0b3f818a6bc3d55" dependencies = [ - "bitflags 2.11.0", - "bytemuck", - "core_maths", - "read-fonts", - "smallvec", + "anyhow", + "gpui-pre", + "gpui-pre-reqwest", + "log", + "rust-embed", + "wasm-bindgen", + "wasm-bindgen-futures", ] [[package]] -name = "hashbrown" -version = "0.14.5" +name = "gpui-pre" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "a0437c0b83e636a92bd1a39fa1d05fb632ae671289537497b35871ffbe231b84" +dependencies = [ + "accesskit", + "anyhow", + "async-channel", + "async-task", + "bindgen 0.72.1", + "bitflags 2.13.2", + "chrono", + "core-video", + "ctor", + "derive_more", + "embed-resource", + "etagere", + "futures", + "futures-concurrency", + "getrandom 0.3.4", + "gpui-pre-collections", + "gpui-pre-http-client", + "gpui-pre-macros", + "gpui-pre-refineable", + "gpui-pre-scheduler", + "gpui-pre-shared-string", + "gpui-pre-sum-tree", + "gpui-pre-util", + "gpui-pre-util-macros", + "heapless", + "image", + "inventory", + "itertools 0.14.0", + "log", + "lyon", + "num_cpus", + "objc2-core-foundation", + "objc2-core-video", + "parking", + "parking_lot", + "pin-project", + "pollster 0.4.0", + "postage", + "profiling", + "rand 0.9.2", + "raw-window-handle", + "regex", + "resvg 0.46.0", + "schemars 1.2.2", + "seahash", + "serde", + "serde_json", + "slotmap", + "smallvec", + "spin 0.10.1", + "strum 0.28.0", + "taffy 0.13.0", + "thiserror 2.0.18", + "ttf-parser 0.25.1", + "url", + "usvg 0.46.0", + "uuid", + "waker-fn", + "web-time", + "windows 0.62.2", + "zed-font-kit", + "zed-scap", +] [[package]] -name = "hashbrown" -version = "0.15.5" +name = "gpui-pre-apple" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +checksum = "3af534f0746eb9e014114bcc0ee00dc250c4b8d75df2e437180c403aa65649c1" dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", + "anyhow", + "block", + "cbindgen", + "cocoa 0.26.1", + "core-foundation 0.10.1", + "core-video", + "derive_more", + "etagere", + "foreign-types", + "gpui-pre", + "image", + "log", + "metal", + "objc", + "objc2 0.6.4", + "parking_lot", ] [[package]] -name = "hashbrown" -version = "0.16.1" +name = "gpui-pre-collections" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +checksum = "15e7a65204039187d1f4b3d4c2e0233eeac54d4acb0b13f9dc1a3b5adad26c1f" +dependencies = [ + "gpui-pre-util", + "indexmap", + "rustc-hash 2.1.1", +] + +[[package]] +name = "gpui-pre-derive-refineable" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79dfb4a05f3cd9893d7768dbf5dba1bbbe99cab7394e89b360ccb3b2bcb6b34e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "gpui-pre-http-client" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfd5a7542c77887a5aff997d78c95884119c8463409569b63fcf060956da1682" +dependencies = [ + "anyhow", + "async-compression", + "bytes", + "derive_more", + "futures", + "http", + "http-body", + "log", + "parking_lot", + "serde", + "serde_json", + "serde_urlencoded", + "url", +] + +[[package]] +name = "gpui-pre-linux" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aab655cda1d6dcd549ac869e8678babc84cf573ab6794a1fe1a39c6c70c60b48" +dependencies = [ + "accesskit", + "accesskit_unix", + "anyhow", + "as-raw-xcb-connection", + "ashpd", + "bitflags 2.13.2", + "bytemuck", + "calloop", + "calloop-wayland-source", + "filedescriptor", + "futures", + "gpui-pre", + "gpui-pre-collections", + "gpui-pre-http-client", + "gpui-pre-util", + "gpui-pre-wgpu", + "libc", + "log", + "notify-rust", + "oo7", + "open", + "parking_lot", + "raw-window-handle", + "smallvec", + "smol", + "strum 0.28.0", + "url", + "uuid", + "wayland-backend", + "wayland-client", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-plasma", + "wayland-protocols-wlr", + "x11-clipboard", + "x11rb", + "xkbcommon", + "zed-scap", + "zed-xim", +] + +[[package]] +name = "gpui-pre-macos" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "951d17e41a72067ad2d35c60e08a62e8ad7fa9400b41c802e26cfb459f6c05da" +dependencies = [ + "accesskit", + "accesskit_macos", + "anyhow", + "async-task", + "block2 0.6.2", + "cocoa 0.26.1", + "core-foundation 0.10.1", + "core-foundation-sys", + "core-graphics 0.24.0", + "core-text", + "ctor", + "dispatch2", + "foreign-types", + "futures", + "gpui-pre", + "gpui-pre-apple", + "gpui-pre-collections", + "gpui-pre-util", + "image", + "itertools 0.14.0", + "libc", + "log", + "mach2", + "objc", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-core-graphics", + "objc2-core-media", + "objc2-foundation 0.3.2", + "objc2-screen-capture-kit", + "objc2-user-notifications", + "parking_lot", + "pathfinder_geometry", + "raw-window-handle", + "semver", + "smallvec", + "strum 0.28.0", + "uuid", + "zed-font-kit", +] + +[[package]] +name = "gpui-pre-macros" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6324092b40ea8ec7c327a4a28427e366a489b4d5d23b5d1bd0243fc2f4ca7a9e" +dependencies = [ + "heck 0.5.0", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "gpui-pre-perf" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b94bff26ccd8105f6206144f8dab16a2dc02e7a68f39dada02cdf492f0afd940" +dependencies = [ + "gpui-pre-collections", + "serde", + "serde_json", +] + +[[package]] +name = "gpui-pre-platform" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8423d1e0a693d2f9f16c0326bb01b5e81ec0531854d596a18476934ac6880478" +dependencies = [ + "console_error_panic_hook", + "gpui-pre", + "gpui-pre-linux", + "gpui-pre-macos", + "gpui-pre-web", + "gpui-pre-windows", +] + +[[package]] +name = "gpui-pre-refineable" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93b4b0a8d296a3ee5beb1136bc48f8167a6028eb1e243b56851dcd8c9fc6d7a1" +dependencies = [ + "gpui-pre-derive-refineable", +] + +[[package]] +name = "gpui-pre-reqwest" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05be23908e707966824f8c51a609904b7f30739e8d915e120a53c1b995ba964c" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "mime_guess", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-native-certs", + "rustls-pemfile", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-rustls", + "tokio-socks", + "tokio-util", + "tower", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "windows-registry 0.4.0", +] + +[[package]] +name = "gpui-pre-scheduler" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff7b10b3d2fc3fda24847a04436eca9531612c8414874a37ddc005f20e521e12" +dependencies = [ + "async-task", + "backtrace", + "chrono", + "flume", + "futures", + "parking_lot", + "rand 0.9.2", + "wasm_thread", + "web-time", +] + +[[package]] +name = "gpui-pre-shared-string" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe17f81bd98a0253140ea79f7f76442d7499bd8d17db302861af8e46c11d38df" +dependencies = [ + "schemars 1.2.2", + "serde", + "smol_str", +] + +[[package]] +name = "gpui-pre-sum-tree" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6d35e998a51d24248dad731de1f09d386cbbf46a04edde3b67f469b2ce3f16" +dependencies = [ + "gpui-pre-ztracing", + "heapless", + "log", + "rayon", + "tracing", +] + +[[package]] +name = "gpui-pre-util" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a026a30c578930d20974fd8c3d77de36223ac7ba193bd4259e7238929bc8806" +dependencies = [ + "anyhow", + "log", + "which 8.0.6", +] + +[[package]] +name = "gpui-pre-util-macros" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cbf79627a6afc626d4e887dad9d2d92bb069413e8cc692ba3e90bff219eb7a9" +dependencies = [ + "gpui-pre-perf", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "gpui-pre-web" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34be433b9fcb370b1fe9a1c7fe911f0eb6058791ef8167dcf6c5a5deb624975c" +dependencies = [ + "anyhow", + "console_error_panic_hook", + "futures", + "gpui-pre", + "gpui-pre-http-client", + "gpui-pre-scheduler", + "gpui-pre-wgpu", + "js-sys", + "log", + "parking_lot", + "raw-window-handle", + "smallvec", + "unicode-properties", + "unicode-script", + "unicode-segmentation", + "uuid", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm_thread", + "web-sys", + "web-time", +] + +[[package]] +name = "gpui-pre-wgpu" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05515b32799b1767d69300921c1b562cd53104965211a0e8905acdc7aa18e693" +dependencies = [ + "anyhow", + "bytemuck", + "cosmic-text", + "etagere", + "gpui-pre", + "gpui-pre-collections", + "gpui-pre-util", + "itertools 0.14.0", + "log", + "parking_lot", + "profiling", + "raw-window-handle", + "smallvec", + "swash", + "unicode-bidi", + "unicode-segmentation", + "web-sys", + "wgpu", + "zed-font-kit", +] + +[[package]] +name = "gpui-pre-windows" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27662e65bfcf4445d2cccfad91f1570ec07f4b1b5de98400a9f207fd19c464cf" +dependencies = [ + "accesskit", + "accesskit_windows", + "anyhow", + "dunce", + "etagere", + "futures", + "gpui-pre", + "gpui-pre-collections", + "gpui-pre-util", + "image", + "itertools 0.14.0", + "log", + "parking_lot", + "rand 0.9.2", + "raw-window-handle", + "smallvec", + "uuid", + "windows 0.62.2", + "windows-core 0.62.2", + "windows-numerics 0.3.1", + "windows-registry 0.6.1", +] + +[[package]] +name = "gpui-pre-zlog" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a5af0b734a391a84872eb770b3ee9830091ec2487b79d06371fe14eefb2b5d" +dependencies = [ + "anyhow", + "chrono", + "gpui-pre-collections", + "log", +] + +[[package]] +name = "gpui-pre-ztracing" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a24cb19f78c5bc3aab8ddf1e8e0bd6b402fbcb9c7f112f64ddbedef8f8768a59" +dependencies = [ + "gpui-pre-zlog", + "gpui-pre-ztracing-macro", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "gpui-pre-ztracing-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1bb25850ad31b88bbdef454afb93ec4cdb81f5e200ba5b3f1a0368111780d2c" + +[[package]] +name = "granit-parser" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e20f99e46474f56bd905c56e817ebddcf377a611f94c53ac4649e4d3fa3c0cd0" +dependencies = [ + "arraydeque", + "smallvec", +] + +[[package]] +name = "grid" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b40ca9252762c466af32d0b1002e91e4e1bc5398f77455e55474deb466355ff5" + +[[package]] +name = "h2" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8e5e5a340588f4452631496976cf8636d4a7ecf600239fdc27615d2530bc16" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "num-traits", + "zerocopy", +] + +[[package]] +name = "harfrust" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9da2e5ae821f6e96664977bf974d6d6a2d6682f9ccee23e62ec1d134246845f9" +dependencies = [ + "bitflags 2.13.2", + "bytemuck", + "core_maths", + "read-fonts", + "smallvec", +] + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[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.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] + +[[package]] +name = "heapless" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ba4bd83f9415b58b4ed8dc5714c76e626a105be4646c02630ad730ad3b5aa4" +dependencies = [ + "hash32", + "stable_deref_trait", +] [[package]] name = "heck" @@ -2550,6 +3374,42 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + [[package]] name = "home" version = "0.5.12" @@ -2561,42 +3421,157 @@ dependencies = [ [[package]] name = "html5ever" -version = "0.29.1" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" +checksum = "c13771afe0e6e846f1e67d038d4cb29998a6779f93c809212e4e9c32efd244d4" dependencies = [ "log", "mac", - "markup5ever 0.14.1", - "match_token", + "markup5ever 0.12.1", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "html5ever" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a1761807faccc9a19e86944bbf40610014066306f96edcdedc2fb714bcb7b8" +dependencies = [ + "log", + "markup5ever 0.39.0", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" +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 = "hybrid-array" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27f864f10dfb56725ce5ce5472bc52252c8f93a4ab86327122cebf62c5f59a17" +dependencies = [ + "typenum", +] + +[[package]] +name = "hyper" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa8e654703247911e29c23fbeaa261834bd9bb74efba2f9acddc37bfb127f53" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "libc", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", ] [[package]] -name = "html5ever" -version = "0.39.0" +name = "iana-time-zone" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a1761807faccc9a19e86944bbf40610014066306f96edcdedc2fb714bcb7b8" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", "log", - "markup5ever 0.39.0", + "wasm-bindgen", + "windows-core 0.61.2", ] [[package]] -name = "http" -version = "1.4.0" +name = "iana-time-zone-haiku" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "bytes", - "itoa", + "cc", ] -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - [[package]] name = "icu_collections" version = "2.1.1" @@ -2711,6 +3686,22 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "ignore" +version = "0.4.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b17771570a2b94107741a7b033f19132c2eee21d59d21b24d2ced26500bd66e" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata", + "same-file", + "walkdir", + "winapi-util", +] + [[package]] name = "image" version = "0.25.9" @@ -2729,7 +3720,6 @@ dependencies = [ "qoi", "ravif", "rayon", - "rgb", "tiff", "zune-core 0.5.1", "zune-jpeg 0.5.12", @@ -2761,6 +3751,12 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" +[[package]] +name = "imagesize" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e54e57b4c48b40f7aec75635392b12b3421fa26fe8b4332e63138ed278459c" + [[package]] name = "imgref" version = "1.12.2" @@ -2788,15 +3784,6 @@ 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 = "inotify" version = "0.10.2" @@ -2817,13 +3804,23 @@ dependencies = [ "libc", ] +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "block-padding", + "generic-array", +] + [[package]] name = "instability" version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5eb2d60ef19920a3a9193c3e371f726ec1dafc045dac788d0fb3704272458971" dependencies = [ - "darling 0.23.0", + "darling", "indoc", "proc-macro2", "quote", @@ -2837,6 +3834,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", ] [[package]] @@ -2850,12 +3850,67 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "inventory" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "io-surface" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "554b8c5d64ec09a3a520fe58e4d48a73e00ff32899cdcbe32a4877afd4968b8e" +dependencies = [ + "cgl", + "core-foundation 0.10.1", + "core-foundation-sys", + "leaky-cow", +] + +[[package]] +name = "ipnet" +version = "2.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0" + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.12.1" @@ -2889,29 +3944,6 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" -[[package]] -name = "javascriptcore-rs" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" -dependencies = [ - "bitflags 1.3.2", - "glib", - "javascriptcore-rs-sys", -] - -[[package]] -name = "javascriptcore-rs-sys" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - [[package]] name = "jni" version = "0.21.1" @@ -2928,36 +3960,6 @@ dependencies = [ "windows-sys 0.45.0", ] -[[package]] -name = "jni" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" -dependencies = [ - "cfg-if", - "combine", - "jni-macros", - "jni-sys 0.4.1", - "log", - "simd_cesu8", - "thiserror 2.0.18", - "walkdir", - "windows-link 0.2.1", -] - -[[package]] -name = "jni-macros" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" -dependencies = [ - "proc-macro2", - "quote", - "rustc_version", - "simd_cesu8", - "syn 2.0.117", -] - [[package]] name = "jni-sys" version = "0.3.1" @@ -2998,39 +4000,31 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.91" +version = "0.3.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e" dependencies = [ - "once_cell", + "cfg-if", + "futures-util", "wasm-bindgen", ] [[package]] -name = "keyboard-types" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" -dependencies = [ - "bitflags 2.11.0", - "serde", - "unicode-segmentation", -] - -[[package]] -name = "konst" -version = "0.2.20" +name = "khronos-egl" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" dependencies = [ - "konst_macro_rules", + "libc", + "libloading", + "pkg-config", ] [[package]] -name = "konst_macro_rules" -version = "0.2.19" +name = "khronos_api" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" [[package]] name = "kqueue" @@ -3052,18 +4046,6 @@ dependencies = [ "libc", ] -[[package]] -name = "kuchikiki" -version = "0.8.8-speedreader" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" -dependencies = [ - "cssparser", - "html5ever 0.29.1", - "indexmap", - "selectors", -] - [[package]] name = "kurbo" version = "0.11.3" @@ -3076,10 +4058,16 @@ dependencies = [ ] [[package]] -name = "lazy-js-bundle" -version = "0.7.9" +name = "kurbo" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccafada6c9541db44db758619236f2748f6e1bdaa84d04ded858567cd1e89321" +checksum = "4b60dfc32f652b926df6192e55525b16d186c69d47876c3ead4da5cc9f8450e2" +dependencies = [ + "arrayvec", + "euclid", + "polycool", + "smallvec", +] [[package]] name = "lazy_static" @@ -3093,6 +4081,21 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +[[package]] +name = "leak" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd100e01f1154f2908dfa7d02219aeab25d0b9c7fa955164192e3245255a0c73" + +[[package]] +name = "leaky-cow" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40a8225d44241fd324a8af2806ba635fc7c8a7e9a7de4d5cf3ef54e71f5926fc" +dependencies = [ + "leak", +] + [[package]] name = "leb128fmt" version = "0.1.0" @@ -3106,28 +4109,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" [[package]] -name = "libappindicator" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" -dependencies = [ - "glib", - "gtk", - "gtk-sys", - "libappindicator-sys", - "log", -] - -[[package]] -name = "libappindicator-sys" -version = "0.9.0" +name = "libbz2-rs-sys" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" -dependencies = [ - "gtk-sys", - "libloading 0.7.4", - "once_cell", -] +checksum = "34b357333733e8260735ba5894eb928c02ecc69c78715f01a8019e7fa7f2db4c" [[package]] name = "libc" @@ -3145,16 +4130,6 @@ dependencies = [ "cc", ] -[[package]] -name = "libloading" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if", - "winapi", -] - [[package]] name = "libloading" version = "0.8.9" @@ -3177,43 +4152,36 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1744e39d1d6a9948f4f388969627434e31128196de472883b39f148769bfe30a" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "libc", "plain", "redox_syscall 0.7.3", ] -[[package]] -name = "libxdo" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00333b8756a3d28e78def82067a377de7fa61b24909000aeaa2b446a948d14db" -dependencies = [ - "libxdo-sys", -] - -[[package]] -name = "libxdo-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db23b9e7e2b7831bbd8aac0bbeeeb7b68cbebc162b227e7052e8e55829a09212" -dependencies = [ - "libc", - "x11", -] - [[package]] name = "linebender_resource_handle" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4" +[[package]] +name = "link-section" +version = "0.19.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39c29a617ce3df32c08497bdc1ab6e2376e0b17948ac166a2fbe5977c5954cd9" + [[package]] name = "linked-hash-map" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +[[package]] +name = "linktime-proc-macro" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e57c38c1e860fd37c604281cdfb1dd2216977fd76a50f85ba2f388ef3219616" + [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -3221,54 +4189,129 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] -name = "linux-raw-sys" -version = "0.12.1" +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +dependencies = [ + "serde_core", + "value-bag", +] + +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "lru-slab" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" +checksum = "4050469837a6ff301cd14c1f8f24f88549e6d548f24f64e2148eb0f72cebc51f" [[package]] -name = "litemap" -version = "0.8.1" +name = "lsp-types" +version = "0.97.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "53353550a17c04ac46c585feb189c2db82154fc84b79c7a66c96c2c644f66071" +dependencies = [ + "bitflags 1.3.2", + "fluent-uri", + "serde", + "serde_json", + "serde_repr", +] [[package]] -name = "lock_api" -version = "0.4.14" +name = "lyon" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +checksum = "bd0578bdecb7d6d88987b8b2b1e3a4e2f81df9d0ece1078623324a567904e7b7" dependencies = [ - "scopeguard", + "lyon_algorithms", + "lyon_tessellation", ] [[package]] -name = "log" -version = "0.4.29" +name = "lyon_algorithms" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +checksum = "cdfa8785f95e57914ddb35e3b59994aeba6f5e79e9cfd03da1c269f010f36009" +dependencies = [ + "lyon_path", + "num-traits", +] [[package]] -name = "longest-increasing-subsequence" -version = "0.1.0" +name = "lyon_geom" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3bd0dd2cd90571056fdb71f6275fada10131182f84899f4b2a916e565d81d86" +checksum = "4336502e29e32af93cf2dad2214ed6003c17ceb5bd499df77b1de663b9042b92" +dependencies = [ + "arrayvec", + "euclid", + "num-traits", +] [[package]] -name = "loop9" -version = "0.1.5" +name = "lyon_path" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +checksum = "5c463f9c428b7fc5ec885dcd39ce4aa61e29111d0e33483f6f98c74e89d8621e" dependencies = [ - "imgref", + "lyon_geom", + "num-traits", ] [[package]] -name = "lru" -version = "0.12.5" +name = "lyon_tessellation" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +checksum = "43b8dcf906637ecef61b3c0740c7a4e7f27caeb31257cfac0cc579ce15be6005" dependencies = [ - "hashbrown 0.15.5", + "float_next_after", + "lyon_path", + "num-traits", ] [[package]] @@ -3278,23 +4321,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" [[package]] -name = "mach2" -version = "0.5.0" +name = "mac-notification-sys" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a1b95cd5421ec55b445b5ae102f5ea0e768de1f82bd3001e11f426c269c3aea" +checksum = "fd604973958ddcc11b561193c0fb96ba146506ef2f231ef2e7c35fd2cbc9beca" dependencies = [ - "libc", + "cc", + "log", + "objc2 0.6.4", + "objc2-foundation 0.3.2", + "time", + "uuid", ] [[package]] -name = "macro-string" -version = "0.1.4" +name = "mach2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +checksum = "6a1b95cd5421ec55b445b5ae102f5ea0e768de1f82bd3001e11f426c269c3aea" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "libc", ] [[package]] @@ -3307,54 +4353,20 @@ dependencies = [ ] [[package]] -name = "manganis" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bfcf56309de35b48b8780ea097ace5c3b773a617b52edc49dfc9a63a7d9dc43" -dependencies = [ - "const-serialize 0.7.2", - "const-serialize 0.8.0-alpha.0", - "jni 0.21.1", - "manganis-core", - "manganis-macro", - "ndk-context", - "objc2", - "thiserror 2.0.18", -] - -[[package]] -name = "manganis-core" -version = "0.7.9" +name = "markdown" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a24d6be68f594495aea60850a284029d585d7b7839b26096c1b6d758f8518648" +checksum = "a5cab8f2cadc416a82d2e783a1946388b31654d391d1c7d92cc1f03e295b1deb" dependencies = [ - "const-serialize 0.7.2", - "const-serialize 0.8.0-alpha.0", - "dioxus-cli-config", - "dioxus-core-types", "serde", - "winnow 0.7.14", -] - -[[package]] -name = "manganis-macro" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e782a10318d707c0833e31876ded8acf91287eee0010af8392559af614c7226" -dependencies = [ - "dunce", - "macro-string", - "manganis-core", - "proc-macro2", - "quote", - "syn 2.0.117", + "unicode-id", ] [[package]] name = "markup5ever" -version = "0.14.1" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" +checksum = "16ce3abbeba692c8b8441d036ef91aea6df8da2c6b6e21c7e14d3c18e526be45" dependencies = [ "log", "phf 0.11.3", @@ -3377,50 +4389,46 @@ dependencies = [ [[package]] name = "markup5ever_rcdom" -version = "0.39.0+unofficial" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ac010f19d6c4af81eeb4018a39d7a115de9d285af45c126a4ac02e6fc5716b7" +checksum = "edaa21ab3701bfee5099ade5f7e1f84553fd19228cf332f13cd6e964bf59be18" dependencies = [ - "html5ever 0.39.0", - "markup5ever 0.39.0", - "tendril 0.5.0", - "xml5ever", + "html5ever 0.27.0", + "markup5ever 0.12.1", + "tendril 0.4.3", + "xml5ever 0.18.1", ] [[package]] -name = "match_token" -version = "0.1.0" +name = "markup5ever_rcdom" +version = "0.39.0+unofficial" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" +checksum = "3ac010f19d6c4af81eeb4018a39d7a115de9d285af45c126a4ac02e6fc5716b7" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "html5ever 0.39.0", + "markup5ever 0.39.0", + "tendril 0.5.0", + "xml5ever 0.39.0", ] [[package]] -name = "matchers" -version = "0.2.0" +name = "maybe-rayon" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" dependencies = [ - "regex-automata", + "cfg-if", + "rayon", ] [[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - -[[package]] -name = "maybe-rayon" -version = "0.1.1" +name = "md-5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ "cfg-if", - "rayon", + "digest 0.10.7", ] [[package]] @@ -3429,15 +4437,6 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" -[[package]] -name = "memfd" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" -dependencies = [ - "rustix 1.1.4", -] - [[package]] name = "memmap2" version = "0.9.10" @@ -3456,6 +4455,37 @@ dependencies = [ "autocfg", ] +[[package]] +name = "metal" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7047791b5bc903b8cd963014b355f71dc9864a9a0b727057676c1dcae5cbc15" +dependencies = [ + "bitflags 2.13.2", + "block", + "core-graphics-types 0.2.0", + "foreign-types", + "log", + "objc", + "paste", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -3501,7 +4531,7 @@ checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", "log", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", "windows-sys 0.61.2", ] @@ -3516,24 +4546,29 @@ dependencies = [ ] [[package]] -name = "muda" -version = "0.17.2" +name = "naga" +version = "29.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c9fec5a4e89860383d778d10563a605838f8f0b2f9303868937e5ff32e86177" +checksum = "b2bf919621e7975acb27d881bae2fb993e0d45c8e0446e85e6272971e00dc8df" dependencies = [ - "crossbeam-channel", - "dpi", - "gtk", - "keyboard-types", - "libxdo", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", + "arrayvec", + "bit-set 0.9.1", + "bitflags 2.13.2", + "cfg-if", + "cfg_aliases", + "codespan-reporting", + "half", + "hashbrown 0.16.1", + "hexf-parse", + "indexmap", + "libm", + "log", + "num-traits", "once_cell", - "png 0.17.16", + "rustc-hash 1.1.0", + "spirv", "thiserror 2.0.18", - "windows-sys 0.60.2", + "unicode-ident", ] [[package]] @@ -3545,35 +4580,17 @@ dependencies = [ "log", ] -[[package]] -name = "native-tls" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - [[package]] name = "ndk" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "jni-sys 0.3.1", "log", "ndk-sys", "num_enum", - "raw-window-handle 0.6.2", "thiserror 1.0.69", ] @@ -3608,10 +4625,10 @@ dependencies = [ ] [[package]] -name = "nodrop" -version = "0.1.14" +name = "nohash-hasher" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" [[package]] name = "nom" @@ -3638,13 +4655,22 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" +[[package]] +name = "normpath" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b11ce00d2594068e8a27c9146fdc5cf9f3ac38eb42c7cd34d05fea618873ac9f" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "notify" version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c533b4c39709f9ba5005d8002048266593c1cfaf3c5f0739d5b8ab0c6c504009" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "filetime", "fsevent-sys", "inotify", @@ -3657,6 +4683,20 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "notify-rust" +version = "4.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5b4c1b4f2aa9f25f63a7a49d3dd0ed567b3670da15330a66b29434be899b891" +dependencies = [ + "futures-lite", + "log", + "mac-notification-sys", + "serde", + "tauri-winrt-notification", + "zbus", +] + [[package]] name = "notify-types" version = "1.0.1" @@ -3666,6 +4706,38 @@ dependencies = [ "instant", ] +[[package]] +name = "ntapi" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" +dependencies = [ + "winapi", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + [[package]] name = "num-bigint" version = "0.4.6" @@ -3676,6 +4748,23 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-bigint-dig" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7f9a86e097b0d187ad0e65667c2f58b9254671e86e7dbb78036b16692eae099" +dependencies = [ + "libm", + "num-integer", + "num-iter", + "num-traits", + "once_cell", + "rand 0.9.2", + "serde", + "smallvec", + "zeroize", +] + [[package]] name = "num-complex" version = "0.4.6" @@ -3711,6 +4800,16 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-iter" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-rational" version = "0.4.2" @@ -3729,6 +4828,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", ] [[package]] @@ -3747,28 +4857,47 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" dependencies = [ - "proc-macro-crate 3.5.0", + "proc-macro-crate", "proc-macro2", "quote", "syn 2.0.117", ] [[package]] -name = "num_threads" -version = "0.1.7" +name = "objc" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ - "libc", + "malloc_buf", + "objc_exception", ] [[package]] -name = "objc" -version = "0.2.7" +name = "objc-foundation" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" dependencies = [ - "malloc_buf", + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", ] [[package]] @@ -3778,7 +4907,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" dependencies = [ "objc2-encode", - "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.13.2", + "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]] @@ -3787,11 +4931,19 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.11.0", - "block2", - "objc2", + "bitflags 2.13.2", + "block2 0.6.2", + "libc", + "objc2 0.6.4", + "objc2-cloud-kit", + "objc2-core-data 0.3.2", "objc2-core-foundation", - "objc2-foundation", + "objc2-core-graphics", + "objc2-core-image 0.3.2", + "objc2-core-text", + "objc2-core-video", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", ] [[package]] @@ -3800,13 +4952,13 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6948501a91121d6399b79abaa33a8aa4ea7857fe019f341b8c23ad6e81b79b08" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "libc", - "objc2", + "objc2 0.6.4", "objc2-core-audio", "objc2-core-audio-types", "objc2-core-foundation", - "objc2-foundation", + "objc2-foundation 0.3.2", ] [[package]] @@ -3815,8 +4967,19 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13a380031deed8e99db00065c45937da434ca987c034e13b87e4441f9e4090be" dependencies = [ - "objc2", - "objc2-foundation", + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.13.2", + "objc2 0.6.4", + "objc2-foundation 0.3.2", ] [[package]] @@ -3826,10 +4989,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1eebcea8b0dbff5f7c8504f3107c68fc061a3eb44932051c8cf8a68d969c3b2" dependencies = [ "dispatch2", - "objc2", + "objc2 0.6.4", "objc2-core-audio-types", "objc2-core-foundation", - "objc2-foundation", + "objc2-foundation 0.3.2", ] [[package]] @@ -3838,8 +5001,31 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a89f2ec274a0cf4a32642b2991e8b351a404d290da87bb6a9a9d8632490bd1c" dependencies = [ - "bitflags 2.11.0", - "objc2", + "bitflags 2.13.2", + "objc2 0.6.4", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.13.2", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "bitflags 2.13.2", + "objc2 0.6.4", + "objc2-foundation 0.3.2", ] [[package]] @@ -3848,11 +5034,11 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.11.0", - "block2", + "bitflags 2.13.2", + "block2 0.6.2", "dispatch2", "libc", - "objc2", + "objc2 0.6.4", ] [[package]] @@ -3861,8 +5047,83 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", + "dispatch2", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal 0.2.2", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +dependencies = [ + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-core-media" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ec576860167a15dd9fce7fbee7512beb4e31f532159d3482d1f9c6caedf31d" +dependencies = [ + "bitflags 2.13.2", + "dispatch2", + "objc2 0.6.4", + "objc2-core-audio", + "objc2-core-audio-types", + "objc2-core-foundation", + "objc2-core-video", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.13.2", + "objc2 0.6.4", "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-core-video" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" +dependencies = [ + "bitflags 2.13.2", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-io-surface", ] [[package]] @@ -3872,12 +5133,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" [[package]] -name = "objc2-exception-helper" -version = "0.1.1" +name = "objc2-foundation" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "cc", + "bitflags 2.13.2", + "block2 0.5.1", + "libc", + "objc2 0.5.2", ] [[package]] @@ -3886,37 +5150,108 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.11.0", - "block2", + "bitflags 2.13.2", + "block2 0.6.2", "libc", - "objc2", + "objc2 0.6.4", "objc2-core-foundation", ] [[package]] -name = "objc2-ui-kit" +name = "objc2-io-surface" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ - "bitflags 2.11.0", - "objc2", + "bitflags 2.13.2", + "objc2 0.6.4", "objc2-core-foundation", - "objc2-foundation", ] [[package]] -name = "objc2-web-kit" +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.13.2", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-metal" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" +dependencies = [ + "bitflags 2.13.2", + "block2 0.6.2", + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.13.2", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal 0.2.2", +] + +[[package]] +name = "objc2-quartz-core" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" dependencies = [ - "bitflags 2.11.0", - "block2", - "objc2", - "objc2-app-kit", + "bitflags 2.13.2", + "objc2 0.6.4", "objc2-core-foundation", - "objc2-foundation", + "objc2-foundation 0.3.2", + "objc2-metal 0.3.2", +] + +[[package]] +name = "objc2-screen-capture-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74b7c5390f477482f001bc354d6571a70db7e4f8d5288e860c45521fbce11394" +dependencies = [ + "block2 0.6.2", + "dispatch2", + "objc2 0.6.4", + "objc2-core-graphics", + "objc2-core-media", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "bitflags 2.13.2", + "block2 0.6.2", + "objc2 0.6.4", + "objc2-core-location", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", ] [[package]] @@ -3928,6 +5263,15 @@ dependencies = [ "objc", ] +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.21.3" @@ -3940,6 +5284,51 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +[[package]] +name = "oo7" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78f2bfed90f1618b4b48dcad9307f25e14ae894e2949642c87c351601d62cebd" +dependencies = [ + "aes", + "ashpd", + "async-fs", + "async-io", + "async-lock", + "blocking", + "cbc", + "cipher", + "digest 0.10.7", + "endi", + "futures-lite", + "futures-util", + "getrandom 0.4.2", + "hkdf", + "hmac", + "md-5", + "num", + "num-bigint-dig", + "pbkdf2", + "serde", + "serde_bytes", + "sha2 0.10.9", + "subtle", + "zbus", + "zbus_macros", + "zeroize", + "zvariant", +] + +[[package]] +name = "open" +version = "5.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa576c76302b7b808eecc68061e67336c47833ef9d22caa74dda10fa9675eebc" +dependencies = [ + "is-wsl", + "libc", +] + [[package]] name = "openh264" version = "0.6.6" @@ -3961,31 +5350,6 @@ dependencies = [ "walkdir", ] -[[package]] -name = "openssl" -version = "0.10.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a45fa2aa886c42762255da344f0a0d313e254066c46aad76f300c3d3da62d967" -dependencies = [ - "bitflags 2.11.0", - "cfg-if", - "foreign-types 0.3.2", - "libc", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "openssl-probe" version = "0.2.1" @@ -3993,22 +5357,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] -name = "openssl-sys" -version = "0.9.116" +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-float" +version = "5.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28a22dc7140cda5f096e5e7724a6962ca81a7f8bfd2979f9b18c11af56318c4" +checksum = "8c7c9e0d9b23589f26070720bac724174bfec1083e82f7854cdd0267518343c0" dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", + "num-traits", ] [[package]] -name = "option-ext" +name = "ordered-stream" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] [[package]] name = "palette" @@ -4019,7 +5390,6 @@ dependencies = [ "approx", "fast-srgb8", "palette_derive", - "phf 0.11.3", ] [[package]] @@ -4035,29 +5405,10 @@ dependencies = [ ] [[package]] -name = "pango" -version = "0.18.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" -dependencies = [ - "gio", - "glib", - "libc", - "once_cell", - "pango-sys", -] - -[[package]] -name = "pango-sys" -version = "0.18.0" +name = "parking" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -4095,38 +5446,46 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" [[package]] -name = "percent-encoding" -version = "2.3.2" +name = "pathfinder_geometry" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +checksum = "0b7b7e7b4ea703700ce73ebf128e1450eb69c3a8329199ffbfb9b2a0418e5ad3" +dependencies = [ + "log", + "pathfinder_simd", +] [[package]] -name = "phf" -version = "0.8.0" +name = "pathfinder_simd" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +checksum = "4500030c302e4af1d423f36f3b958d1aecb6c04184356ed5a833bf6b60435777" dependencies = [ - "phf_shared 0.8.0", + "rustc_version", ] [[package]] -name = "phf" -version = "0.10.1" +name = "pbkdf2" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ - "phf_macros 0.10.0", - "phf_shared 0.10.0", - "proc-macro-hack", + "digest 0.10.7", + "hmac", ] +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + [[package]] name = "phf" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ - "phf_macros 0.11.3", "phf_shared 0.11.3", ] @@ -4136,20 +5495,11 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" dependencies = [ + "phf_macros", "phf_shared 0.13.1", "serde", ] -[[package]] -name = "phf_codegen" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" -dependencies = [ - "phf_generator 0.8.0", - "phf_shared 0.8.0", -] - [[package]] name = "phf_codegen" version = "0.11.3" @@ -4165,94 +5515,42 @@ name = "phf_codegen" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" -dependencies = [ - "phf_generator 0.13.1", - "phf_shared 0.13.1", -] - -[[package]] -name = "phf_generator" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" -dependencies = [ - "phf_shared 0.8.0", - "rand 0.7.3", -] - -[[package]] -name = "phf_generator" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" -dependencies = [ - "phf_shared 0.10.0", - "rand 0.8.6", -] - -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared 0.11.3", - "rand 0.8.6", -] - -[[package]] -name = "phf_generator" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" -dependencies = [ - "fastrand", - "phf_shared 0.13.1", -] - -[[package]] -name = "phf_macros" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" -dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", - "proc-macro-hack", - "proc-macro2", - "quote", - "syn 1.0.109", +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", ] [[package]] -name = "phf_macros" +name = "phf_generator" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ - "phf_generator 0.11.3", "phf_shared 0.11.3", - "proc-macro2", - "quote", - "syn 2.0.117", + "rand 0.8.6", ] [[package]] -name = "phf_shared" -version = "0.8.0" +name = "phf_generator" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" dependencies = [ - "siphasher 0.3.11", + "fastrand", + "phf_shared 0.13.1", ] [[package]] -name = "phf_shared" -version = "0.10.0" +name = "phf_macros" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" dependencies = [ - "siphasher 0.3.11", + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] @@ -4261,7 +5559,7 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ - "siphasher 1.0.2", + "siphasher", ] [[package]] @@ -4270,7 +5568,7 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" dependencies = [ - "siphasher 1.0.2", + "siphasher", ] [[package]] @@ -4305,6 +5603,17 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + [[package]] name = "pkg-config" version = "0.3.32" @@ -4349,19 +5658,80 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "crc32fast", "fdeflate", "flate2", "miniz_oxide", ] +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + +[[package]] +name = "pollster" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7" + [[package]] name = "pollster" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" +[[package]] +name = "polycool" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50596ddc09eb5ad5f75cacd40209568e66df71baf86e1499a0e99c4cff12a5a6" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "portable-atomic" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" + +[[package]] +name = "portable-atomic-util" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10ab3eb7f3becc3a1cbc4f2c6f20267996cfc1a6467a873763411b136a122715" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "postage" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af3fb618632874fb76937c2361a7f22afd393c982a2165595407edc75b06d3c1" +dependencies = [ + "atomic", + "crossbeam-queue", + "futures", + "log", + "parking_lot", + "pin-project", + "pollster 0.2.5", + "static_assertions", + "thiserror 1.0.69", +] + [[package]] name = "potential_utf" version = "0.1.4" @@ -4392,6 +5762,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + [[package]] name = "prettyplease" version = "0.2.37" @@ -4411,26 +5787,6 @@ dependencies = [ "num-integer", ] -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - -[[package]] -name = "proc-macro-crate" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" -dependencies = [ - "toml_datetime 0.6.3", - "toml_edit 0.20.2", -] - [[package]] name = "proc-macro-crate" version = "3.5.0" @@ -4440,36 +5796,6 @@ dependencies = [ "toml_edit 0.25.8+spec-1.1.0", ] -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-hack" -version = "0.5.20+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" - [[package]] name = "proc-macro2" version = "1.0.106" @@ -4479,18 +5805,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "proc-macro2-diagnostics" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", - "version_check", -] - [[package]] name = "profiling" version = "1.0.18" @@ -4558,6 +5872,71 @@ dependencies = [ "memchr", ] +[[package]] +name = "quick-xml" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4051e23e9185c255a7e33ef59cdbca87a22d359052eecd22fc6b901fb37d9d11" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.1", + "rustls", + "socket2", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9746dbde176634f4f2f1faf2404e30a31b2bc1e9cafb5329c95d8177a18c9fc" +dependencies = [ + "bytes", + "getrandom 0.4.2", + "lru-slab", + "rand 0.10.3", + "rand_pcg", + "ring", + "rustc-hash 2.1.1", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.61.2", +] + [[package]] name = "quote" version = "1.0.44" @@ -4579,20 +5958,6 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" -[[package]] -name = "rand" -version = "0.7.3" -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", -] - [[package]] name = "rand" version = "0.8.6" @@ -4615,13 +5980,14 @@ dependencies = [ ] [[package]] -name = "rand_chacha" -version = "0.2.2" +name = "rand" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +checksum = "65c9fb96cbc91e3478eaae79a69fcd3f1ae4ad052e471fe6732fff548984b4af" dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", + "chacha20", + "getrandom 0.4.2", + "rand_core 0.10.1", ] [[package]] @@ -4644,15 +6010,6 @@ dependencies = [ "rand_core 0.9.5", ] -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - [[package]] name = "rand_core" version = "0.6.4" @@ -4672,23 +6029,26 @@ dependencies = [ ] [[package]] -name = "rand_hc" -version = "0.2.0" +name = "rand_core" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" [[package]] name = "rand_pcg" -version = "0.2.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" dependencies = [ - "rand_core 0.5.1", + "rand_core 0.10.1", ] +[[package]] +name = "range-alloc" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca45419789ae5a7899559e9512e58ca889e41f04f1f2445e9f4b290ceccd1d08" + [[package]] name = "rangemap" version = "1.7.1" @@ -4701,7 +6061,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "cassowary", "compact_str", "crossterm", @@ -4710,7 +6070,7 @@ dependencies = [ "itertools 0.13.0", "lru", "paste", - "strum", + "strum 0.26.3", "unicode-segmentation", "unicode-truncate", "unicode-width 0.2.0", @@ -4768,15 +6128,21 @@ dependencies = [ [[package]] name = "raw-window-handle" -version = "0.5.2" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] -name = "raw-window-handle" -version = "0.6.2" +name = "raw-window-metal" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" +checksum = "40d213455a5f1dc59214213c7330e074ddf8114c9a42411eb890c767357ce135" +dependencies = [ + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", +] [[package]] name = "rayon" @@ -4824,7 +6190,7 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", ] [[package]] @@ -4833,7 +6199,18 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 1.0.69", ] [[package]] @@ -4847,6 +6224,26 @@ dependencies = [ "thiserror 2.0.18", ] +[[package]] +name = "ref-cast" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + [[package]] name = "regex" version = "1.12.3" @@ -4876,41 +6273,81 @@ version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + +[[package]] +name = "resvg" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a325d5e8d1cebddd070b13f44cec8071594ab67d1012797c121f27a669b7958" +dependencies = [ + "gif 0.13.3", + "image-webp 0.1.3", + "log", + "pico-args", + "rgb", + "svgtypes 0.15.3", + "tiny-skia", + "usvg 0.44.0", + "zune-jpeg 0.4.21", +] + [[package]] name = "resvg" -version = "0.44.0" +version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a325d5e8d1cebddd070b13f44cec8071594ab67d1012797c121f27a669b7958" +checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43" dependencies = [ "gif 0.13.3", - "image-webp 0.1.3", + "image-webp 0.2.4", "log", "pico-args", "rgb", - "svgtypes", + "svgtypes 0.15.3", "tiny-skia", - "usvg", + "usvg 0.45.1", "zune-jpeg 0.4.21", ] +[[package]] +name = "resvg" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b563218631706d614e23059436526d005b50ab5f2d506b55a17eb65c5eb83419" +dependencies = [ + "gif 0.14.2", + "image-webp 0.2.4", + "log", + "pico-args", + "rgb", + "svgtypes 0.16.1", + "tiny-skia", + "usvg 0.46.0", + "zune-jpeg 0.5.12", +] + [[package]] name = "rfd" version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20dafead71c16a34e1ff357ddefc8afc11e7d51d6d2b9fbd07eaa48e3e540220" dependencies = [ - "block2", + "block2 0.6.2", "dispatch2", "js-sys", "libc", "log", - "objc2", - "objc2-app-kit", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", "objc2-core-foundation", - "objc2-foundation", + "objc2-foundation 0.3.2", "percent-encoding", - "pollster", - "raw-window-handle 0.6.2", + "pollster 0.4.0", + "raw-window-handle", "wasm-bindgen", "wasm-bindgen-futures", "wayland-backend", @@ -4955,12 +6392,30 @@ dependencies = [ "thiserror 2.0.18", ] +[[package]] +name = "ropey" +version = "2.0.0-beta.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4045a00dc327d084a2bbf126976e14125b54f23bd30511d45b842eba76c52d74" +dependencies = [ + "str_indices", +] + [[package]] name = "roxmltree" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" +[[package]] +name = "roxmltree" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1964b10c76125c36f8afe190065a4bf9a87bf324842c05701330bba9f1cacbb" +dependencies = [ + "memchr", +] + [[package]] name = "rubato" version = "0.16.2" @@ -4973,6 +6428,96 @@ dependencies = [ "realfft", ] +[[package]] +name = "rust-embed" +version = "8.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9e7760e252aaba7b09f4be00e36476cf585bdb68a53552ac954cdf504ab4bc9" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "8.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bcfc4d6f53af43755f7a723e4b6b8794fcce052a178dd8c6c1dadc5f5343097" +dependencies = [ + "mime_guess", + "proc-macro2", + "quote", + "rust-embed-utils", + "shellexpand", + "syn 2.0.117", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "8.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ffa149f6aa81b58a5b3011d01a857c4ed12c7a732d2c51947a4c7c692185f0" +dependencies = [ + "globset", + "sha2 0.11.0", + "walkdir", +] + +[[package]] +name = "rust-i18n" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c43fd69c20da13756643a5bf51ae799965465c78e05c57a1242a736aaa56527" +dependencies = [ + "globwalk", + "regex", + "rust-i18n-macro", + "rust-i18n-support", + "smallvec", +] + +[[package]] +name = "rust-i18n-macro" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "086ec8a9eaa6afda33919b9bc1661c1f4e017c40e99bbd33ca98f6e1cb6ca91f" +dependencies = [ + "glob", + "proc-macro2", + "quote", + "rust-i18n-support", + "serde", + "serde_json", + "syn 2.0.117", +] + +[[package]] +name = "rust-i18n-support" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac02dcb9a01ec145d0a5534ea9554a966050ca250b346bb2a9ab0fcdafab5979" +dependencies = [ + "arc-swap", + "base62", + "globwalk", + "itertools 0.11.0", + "normpath", + "serde", + "serde-saphyr", + "serde_json", + "siphasher", + "toml 0.8.23", + "triomphe", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b74b56ffa8bb2830709a538c2cbcae9aa062db0d2a42563bfb09bdaae44020eb" + [[package]] name = "rustc-hash" version = "1.1.0" @@ -5014,7 +6559,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "errno", "libc", "linux-raw-sys 0.4.15", @@ -5027,7 +6572,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "errno", "libc", "linux-raw-sys 0.12.1", @@ -5049,12 +6594,34 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-native-certs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "rustls-pki-types" version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" dependencies = [ + "web-time", "zeroize", ] @@ -5076,7 +6643,7 @@ dependencies = [ "clap", "clap_complete", "crossterm", - "dirs", + "dirs 6.0.0", "gif 0.13.3", "image", "minimp4", @@ -5084,13 +6651,13 @@ dependencies = [ "openh264", "ratatui", "rayon", - "resvg", + "resvg 0.44.0", "rubato", "rustfft", "rustmotion-components", "rustmotion-core", "rustmotion-html", - "schemars", + "schemars 0.8.22", "serde", "serde_json", "similar", @@ -5099,7 +6666,7 @@ dependencies = [ "syntect", "tiny-skia", "ureq", - "usvg", + "usvg 0.44.0", ] [[package]] @@ -5110,9 +6677,9 @@ dependencies = [ "gif 0.13.3", "image", "qrcode", - "resvg", + "resvg 0.44.0", "rustmotion-core", - "schemars", + "schemars 0.8.22", "serde", "serde_json", "similar", @@ -5120,7 +6687,7 @@ dependencies = [ "syntect", "thorvg", "tiny-skia", - "usvg", + "usvg 0.44.0", ] [[package]] @@ -5133,18 +6700,18 @@ dependencies = [ "notify", "qrcode", "rayon", - "resvg", - "schemars", + "resvg 0.44.0", + "schemars 0.8.22", "serde", "serde_json", "similar", "skia-safe", "syntect", - "taffy", + "taffy 0.10.1", "thiserror 2.0.18", "tiny-skia", "ureq", - "usvg", + "usvg 0.44.0", ] [[package]] @@ -5152,7 +6719,7 @@ name = "rustmotion-html" version = "0.7.1" dependencies = [ "html5ever 0.39.0", - "markup5ever_rcdom", + "markup5ever_rcdom 0.39.0+unofficial", "serde_json", "thiserror 2.0.18", ] @@ -5162,18 +6729,18 @@ name = "rustmotion-studio" version = "0.7.1" dependencies = [ "clap", - "dioxus", - "dioxus-icons", - "dioxus-primitives", - "dirs", + "dirs 6.0.0", + "gpui-component", + "gpui-kit", "image", "notify", "palette", "rfd", "rodio", "rustmotion", - "schemars", + "schemars 0.8.22", "serde_json", + "smallvec", "tokio", ] @@ -5189,14 +6756,32 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c85d1ccd519e61834798eb52c4e886e8c2d7d698dd3d6ce0b1b47eb8557f1181" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "bytemuck", "core_maths", "log", "smallvec", "ttf-parser 0.24.1", - "unicode-bidi-mirroring", - "unicode-ccc", + "unicode-bidi-mirroring 0.3.0", + "unicode-ccc 0.3.0", + "unicode-properties", + "unicode-script", +] + +[[package]] +name = "rustybuzz" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" +dependencies = [ + "bitflags 2.13.2", + "bytemuck", + "core_maths", + "log", + "smallvec", + "ttf-parser 0.25.1", + "unicode-bidi-mirroring 0.4.0", + "unicode-ccc 0.4.0", "unicode-properties", "unicode-script", ] @@ -5241,7 +6826,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" dependencies = [ "dyn-clone", - "schemars_derive", + "schemars_derive 0.8.22", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" +dependencies = [ + "dyn-clone", + "indexmap", + "ref-cast", + "schemars_derive 1.2.2", "serde", "serde_json", ] @@ -5254,10 +6853,22 @@ checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" dependencies = [ "proc-macro2", "quote", - "serde_derive_internals", + "serde_derive_internals 0.29.1", "syn 2.0.117", ] +[[package]] +name = "schemars_derive" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98c67716b46af2f0b8cf752abc930f6f9aecfbf671ecfb531db8a31dbe4e2ba" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals 0.30.0", + "syn 3.0.6", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -5270,14 +6881,43 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "screencapturekit" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5eeeb57ac94960cfe5ff4c402be6585ae4c8d29a2cf41b276048c2e849d64e" +dependencies = [ + "screencapturekit-sys", +] + +[[package]] +name = "screencapturekit-sys" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22411b57f7d49e7fe08025198813ee6fd65e1ee5eff4ebc7880c12c82bde4c60" +dependencies = [ + "block", + "dispatch", + "objc", + "objc-foundation", + "objc_id", + "once_cell", +] + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + [[package]] name = "security-framework" version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.11.0", - "core-foundation", + "bitflags 2.13.2", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -5293,24 +6933,6 @@ dependencies = [ "libc", ] -[[package]] -name = "selectors" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" -dependencies = [ - "bitflags 1.3.2", - "cssparser", - "derive_more", - "fxhash", - "log", - "phf 0.8.0", - "phf_codegen 0.8.0", - "precomputed-hash", - "servo_arc", - "smallvec", -] - [[package]] name = "self_cell" version = "1.2.2" @@ -5322,14 +6944,9 @@ name = "semver" version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" - -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" dependencies = [ - "futures-core", + "serde", + "serde_core", ] [[package]] @@ -5343,14 +6960,30 @@ dependencies = [ ] [[package]] -name = "serde-wasm-bindgen" -version = "0.6.5" +name = "serde-saphyr" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" +checksum = "b8050abb251097357e24aff63ba2c52a6309ecb7d23a5474023df960a02694d8" +dependencies = [ + "annotate-snippets", + "base64", + "encoding_rs_io", + "granit-parser", + "nohash-hasher", + "num-traits", + "serde_core", + "smallvec", + "zmij", +] + +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" dependencies = [ - "js-sys", "serde", - "wasm-bindgen", + "serde_core", ] [[package]] @@ -5384,6 +7017,26 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "serde_derive_internals" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f852137cce035d6a4df67ccce505ff6b3e9fd3a10e3e52b24dc71e650bb1a9bd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "serde_fmt" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e497af288b3b95d067a23a4f749f2861121ffcb2f6d8379310dcda040c345ed" +dependencies = [ + "serde_core", +] + [[package]] name = "serde_json" version = "1.0.149" @@ -5428,35 +7081,43 @@ dependencies = [ ] [[package]] -name = "servo_arc" -version = "0.2.0" +name = "serde_urlencoded" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ - "nodrop", - "stable_deref_trait", + "form_urlencoded", + "itoa", + "ryu", + "serde", ] [[package]] -name = "sha1" -version = "0.10.6" +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + +[[package]] +name = "sha2" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", - "digest", + "cpufeatures 0.2.17", + "digest 0.10.7", ] [[package]] name = "sha2" -version = "0.10.9" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", - "cpufeatures", - "digest", + "cpufeatures 0.3.1", + "digest 0.11.3", ] [[package]] @@ -5468,6 +7129,15 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shellexpand" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32824fab5e16e6c4d86dc1ba84489390419a39f97699852b66480bb87d297ed8" +dependencies = [ + "dirs 6.0.0", +] + [[package]] name = "shlex" version = "1.3.0" @@ -5511,16 +7181,6 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" -[[package]] -name = "simd_cesu8" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" -dependencies = [ - "rustc_version", - "simdutf8", -] - [[package]] name = "simd_helpers" version = "0.1.0" @@ -5530,12 +7190,6 @@ dependencies = [ "quote", ] -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - [[package]] name = "similar" version = "2.7.0" @@ -5551,12 +7205,6 @@ dependencies = [ "log", ] -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - [[package]] name = "siphasher" version = "1.0.2" @@ -5586,7 +7234,7 @@ version = "0.99.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f512ac418a64194842dd05566320805dad1c957c521039db2486fd6368865bc" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "skia-bindings", ] @@ -5601,39 +7249,10 @@ dependencies = [ ] [[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "sledgehammer_bindgen" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49e83e178d176459c92bc129cfd0958afac3ced925471b889b3a75546cfc4133" -dependencies = [ - "sledgehammer_bindgen_macro", - "wasm-bindgen", -] - -[[package]] -name = "sledgehammer_bindgen_macro" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb251b407f50028476a600541542b605bb864d35d9ee1de4f6cab45d88475e6d" -dependencies = [ - "quote", - "syn 2.0.117", -] - -[[package]] -name = "sledgehammer_utils" -version = "0.3.1" +name = "slab" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "debdd4b83524961983cea3c55383b3910fd2f24fd13a188f5b091d2d504a61ae" -dependencies = [ - "rustc-hash 1.1.0", -] +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "slotmap" @@ -5641,7 +7260,6 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" dependencies = [ - "serde", "version_check", ] @@ -5651,36 +7269,68 @@ version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +[[package]] +name = "smol" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33bd3e260892199c3ccfc487c88b2da2265080acb316cd920da72fdfd7c599f" +dependencies = [ + "async-channel", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-net", + "async-process", + "blocking", + "futures-lite", +] + [[package]] name = "smol_str" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4aaa7368fcf4852a4c2dd92df0cace6a71f2091ca0a23391ce7f3a31833f1523" +dependencies = [ + "borsh", + "serde_core", +] [[package]] -name = "soup3" -version = "0.5.0" +name = "socket2" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ - "futures-channel", - "gio", - "glib", "libc", - "soup3-sys", + "windows-sys 0.61.2", ] [[package]] -name = "soup3-sys" -version = "0.5.0" +name = "spin" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", + "lock_api", +] + +[[package]] +name = "spin" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "023a211cb3138dbc438680b32560ad89f699977624c9f8dbb95a47d5b4c07dd3" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spirv" +version = "0.4.0+sdk-1.4.341.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9571ea910ebd84c86af4b3ed27f9dbdc6ad06f17c5f96146b2b671e2976744f" +dependencies = [ + "bitflags 2.13.2", ] [[package]] @@ -5695,6 +7345,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "str_indices" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d08889ec5408683408db66ad89e0e1f93dff55c73a4ccc71c427d5b277ee47e6" + [[package]] name = "strength_reduce" version = "0.2.4" @@ -5772,7 +7428,16 @@ version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" dependencies = [ - "strum_macros", + "strum_macros 0.26.4", +] + +[[package]] +name = "strum" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" +dependencies = [ + "strum_macros 0.28.0", ] [[package]] @@ -5789,38 +7454,107 @@ dependencies = [ ] [[package]] -name = "subsecond" -version = "0.7.9" +name = "strum_macros" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cc79674bd55726e6b123204403389400229a95fe4a3b2c5453dada70b06ca95" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" dependencies = [ - "js-sys", - "libc", - "libloading 0.8.9", - "memfd", - "memmap2", - "serde", - "subsecond-types", - "thiserror 2.0.18", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "sval" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b81b254da21fe1fcc4e3a74fe39b46e25e3a863078f8b71c954d47f84889dbc6" + +[[package]] +name = "sval_buffer" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50be352d2822ffafb59e3e2ddac9d5ee60f2eeadbb7b5a2a951b9f3651e87a6f" +dependencies = [ + "sval", + "sval_ref", + "zerocopy", ] [[package]] -name = "subsecond-types" -version = "0.7.9" +name = "sval_dynamic" +version = "2.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9798bfed58797aed51c672aa99810aac30a50d3120ecfdcf28c13784e9a8f1c" +checksum = "b048ca293b998d9a45659159f94a64063791e74cdc670164943dbb434405573d" dependencies = [ - "serde", + "sval", ] [[package]] -name = "subtle" -version = "2.6.1" +name = "sval_fmt" +version = "2.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +checksum = "e6b5888e40f80568733217f27b7317b845f463400ced36c424b1a804730e53b2" +dependencies = [ + "itoa", + "ryu", + "sval", +] + +[[package]] +name = "sval_json" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17664d6bb6b74947afaab9d7c991caa9bf5638d4dee16fcbef637f440796049" +dependencies = [ + "itoa", + "ryu", + "sval", +] + +[[package]] +name = "sval_nested" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07c059969ca5ca163ea7fef6c9661758973d17691aba92abdcf5c428f4ec122c" +dependencies = [ + "sval", + "sval_buffer", + "sval_ref", +] + +[[package]] +name = "sval_ref" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d6b29ff568c85c87561807f51d2adfff4b6016c6363133f7cd1652a12548f3" +dependencies = [ + "sval", +] + +[[package]] +name = "sval_serde" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f33ec9edc42b12764d5c90ca0a1d84189c6bde81ed27507f1e661c6e4e05853" +dependencies = [ + "serde_core", + "sval", + "sval_nested", +] + +[[package]] +name = "svg_fmt" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" [[package]] name = "svgtypes" @@ -5828,8 +7562,18 @@ version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" dependencies = [ - "kurbo", - "siphasher 1.0.2", + "kurbo 0.11.3", + "siphasher", +] + +[[package]] +name = "svgtypes" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "695b5790b3131dafa99b3bbfd25a216edb3d216dad9ca208d4657bfb8f2abc3d" +dependencies = [ + "kurbo 0.13.1", + "siphasher", ] [[package]] @@ -6003,9 +7747,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.109" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -6014,15 +7758,24 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.117" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + [[package]] name = "synstructure" version = "0.13.2" @@ -6065,16 +7818,38 @@ dependencies = [ ] [[package]] -name = "system-deps" -version = "6.2.2" +name = "sysinfo" +version = "0.31.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +checksum = "355dbe4f8799b304b05e1b0f05fc59b2a18d36645cf169607da45bde2f69a1be" dependencies = [ - "cfg-expr", - "heck 0.5.0", - "pkg-config", - "toml 0.8.2", - "version-compare", + "core-foundation-sys", + "libc", + "memchr", + "ntapi", + "rayon", + "windows 0.57.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.13.2", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", ] [[package]] @@ -6090,53 +7865,27 @@ dependencies = [ ] [[package]] -name = "tao" -version = "0.34.8" +name = "taffy" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9103edf55f2da3c82aea4c7fab7c4241032bfeea0e71fa557d98e00e7ce7cc20" +checksum = "c034e05f6ee85a12daa63863c2245797715075c70649947aa0da54f3f2ab1d0f" dependencies = [ - "bitflags 2.11.0", - "block2", - "core-foundation", - "core-graphics 0.25.0", - "crossbeam-channel", - "dispatch2", - "dlopen2", - "dpi", - "gdkwayland-sys", - "gdkx11-sys", - "gtk", - "jni 0.21.1", - "libc", - "log", - "ndk", - "ndk-context", - "ndk-sys", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "once_cell", - "parking_lot", - "raw-window-handle 0.5.2", - "raw-window-handle 0.6.2", - "tao-macros", - "unicode-segmentation", - "url", - "windows", - "windows-core", - "windows-version", - "x11-dl", + "arrayvec", + "serde", + "slotmap", + "smallvec", ] [[package]] -name = "tao-macros" -version = "0.1.3" +name = "tao-core-video-sys" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +checksum = "271450eb289cb4d8d0720c6ce70c72c8c858c93dd61fc625881616752e6b98f6" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "cfg-if", + "core-foundation-sys", + "libc", + "objc", ] [[package]] @@ -6151,10 +7900,15 @@ dependencies = [ ] [[package]] -name = "target-lexicon" -version = "0.12.16" +name = "tauri-winrt-notification" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +checksum = "9ed071c670382e85fc2f48ae706492d8c338f4f89bf72520d32f8abfe880aade" +dependencies = [ + "thiserror 2.0.18", + "windows 0.61.3", + "windows-version", +] [[package]] name = "tempfile" @@ -6190,6 +7944,15 @@ dependencies = [ "utf-8", ] +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -6282,9 +8045,7 @@ checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", "itoa", - "libc", "num-conv", - "num_threads", "powerfmt", "serde_core", "time-core", @@ -6307,6 +8068,15 @@ dependencies = [ "time-core", ] +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + [[package]] name = "tiny-skia" version = "0.11.4" @@ -6360,36 +8130,64 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.52.3" +version = "1.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" dependencies = [ "bytes", + "libc", + "mio", "pin-project-lite", - "tokio-macros", + "socket2", + "windows-sys 0.61.2", ] [[package]] -name = "tokio-macros" -version = "2.7.0" +name = "tokio-rustls" +version = "0.26.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +checksum = "b0c85f2c3ef0b1cd58b36682f4b17aaa995f0e5db534d85692b4903abce21f67" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "rustls", + "tokio", +] + +[[package]] +name = "tokio-socks" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7e2948f60dbe26b35f2c7fb74ac2854c1fddded0fe9d7548fcc674a246f7615" +dependencies = [ + "either", + "futures-util", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "libc", + "pin-project-lite", + "tokio", ] [[package]] name = "toml" -version = "0.8.2" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned 0.6.9", - "toml_datetime 0.6.3", - "toml_edit 0.20.2", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", ] [[package]] @@ -6409,9 +8207,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] @@ -6427,54 +8225,77 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.19.15" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", - "toml_datetime 0.6.3", - "winnow 0.5.40", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.14", ] [[package]] name = "toml_edit" -version = "0.20.2" +version = "0.25.8+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +checksum = "16bff38f1d86c47f9ff0647e6838d7bb362522bdf44006c7068c2b1e606f1f3c" dependencies = [ "indexmap", - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.3", - "winnow 0.5.40", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.0", ] [[package]] -name = "toml_edit" -version = "0.25.8+spec-1.1.0" +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow 1.0.0", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "tower" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16bff38f1d86c47f9ff0647e6838d7bb362522bdf44006c7068c2b1e606f1f3c" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ - "indexmap", - "toml_datetime 1.1.1+spec-1.1.0", - "toml_parser", - "winnow 1.0.0", + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", ] [[package]] -name = "toml_parser" -version = "1.1.3+spec-1.1.0" +name = "tower-layer" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" -dependencies = [ - "winnow 1.0.0", -] +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] -name = "toml_writer" -version = "1.1.2+spec-1.1.0" +name = "tower-service" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -6482,6 +8303,7 @@ version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -6505,32 +8327,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", + "valuable", ] [[package]] -name = "tracing-subscriber" -version = "0.3.23" +name = "tracing-log" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ - "matchers", + "log", "once_cell", - "regex-automata", - "sharded-slab", - "thread_local", - "tracing", "tracing-core", ] [[package]] -name = "tracing-wasm" -version = "0.2.1" +name = "tracing-subscriber" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ - "tracing", - "tracing-subscriber", - "wasm-bindgen", + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", ] [[package]] @@ -6544,26 +8366,22 @@ dependencies = [ ] [[package]] -name = "tray-icon" -version = "0.21.3" +name = "triomphe" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c" +checksum = "b40688ea6389c8171614b25491f71d4a27946e0c7ce2da1c6de27e25abf1a0ae" dependencies = [ - "crossbeam-channel", - "dirs", - "libappindicator", - "muda", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-foundation", - "once_cell", - "png 0.17.16", - "thiserror 2.0.18", - "windows-sys 0.60.2", + "arc-swap", + "serde", + "stable_deref_trait", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "ttf-parser" version = "0.24.1" @@ -6583,23 +8401,10 @@ dependencies = [ ] [[package]] -name = "tungstenite" -version = "0.28.0" +name = "typeid" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" -dependencies = [ - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "native-tls", - "rand 0.9.2", - "rustls", - "sha1", - "thiserror 2.0.18", - "utf-8", -] +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" @@ -6607,6 +8412,23 @@ 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 = "unicase" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" + [[package]] name = "unicode-bidi" version = "0.3.18" @@ -6619,12 +8441,30 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64af057ad7466495ca113126be61838d8af947f41d93a949980b2389a118082f" +[[package]] +name = "unicode-bidi-mirroring" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe" + [[package]] name = "unicode-ccc" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "260bc6647b3893a9a90668360803a15f96b85a5257b1c3a0c3daf6ae2496de42" +[[package]] +name = "unicode-ccc" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" + +[[package]] +name = "unicode-id" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65dd75ab2d9d379dbe86d4059e91d8b5a6e7054865eaba1ddbfc7a817ff96392" + [[package]] name = "unicode-ident" version = "1.0.24" @@ -6747,16 +8587,70 @@ dependencies = [ "data-url", "flate2", "fontdb 0.22.0", - "imagesize", - "kurbo", + "imagesize 0.13.0", + "kurbo 0.11.3", + "log", + "pico-args", + "roxmltree 0.20.0", + "rustybuzz 0.18.0", + "simplecss", + "siphasher", + "strict-num", + "svgtypes 0.15.3", + "tiny-skia-path", + "unicode-bidi", + "unicode-script", + "unicode-vo", + "xmlwriter", +] + +[[package]] +name = "usvg" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" +dependencies = [ + "base64", + "data-url", + "flate2", + "fontdb 0.23.0", + "imagesize 0.13.0", + "kurbo 0.11.3", + "log", + "pico-args", + "roxmltree 0.20.0", + "rustybuzz 0.20.1", + "simplecss", + "siphasher", + "strict-num", + "svgtypes 0.15.3", + "tiny-skia-path", + "unicode-bidi", + "unicode-script", + "unicode-vo", + "xmlwriter", +] + +[[package]] +name = "usvg" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e419dff010bb12512b0ae9e3d2f318dfbdf0167fde7eb05465134d4e8756076f" +dependencies = [ + "base64", + "data-url", + "flate2", + "fontdb 0.23.0", + "imagesize 0.14.0", + "kurbo 0.13.1", "log", "pico-args", - "roxmltree", - "rustybuzz", + "roxmltree 0.21.1", + "rustybuzz 0.20.1", "simplecss", - "siphasher 1.0.2", + "siphasher", "strict-num", - "svgtypes", + "svgtypes 0.16.1", "tiny-skia-path", "unicode-bidi", "unicode-script", @@ -6788,7 +8682,10 @@ version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" dependencies = [ + "getrandom 0.4.2", "js-sys", + "serde_core", + "sha1_smol", "wasm-bindgen", ] @@ -6804,16 +8701,46 @@ dependencies = [ ] [[package]] -name = "vcpkg" -version = "0.2.15" +name = "valuable" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] -name = "version-compare" -version = "0.2.1" +name = "value-bag" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2799ffb329a792ecfd902b71306c8a815a6ef1c0470fa9953a6aa4d4cecbe511" +dependencies = [ + "value-bag-serde1", + "value-bag-sval2", +] + +[[package]] +name = "value-bag-serde1" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0941feceafbe7a8f59ea1096d45b97002884a41306315ad797b3684b63a81d8c" +dependencies = [ + "erased-serde", + "serde_core", + "serde_fmt", +] + +[[package]] +name = "value-bag-sval2" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" +checksum = "839752af8179287d27eb2b94164641b1ede9e60ab7424163388dc21ebd0508cd" +dependencies = [ + "sval", + "sval_buffer", + "sval_dynamic", + "sval_fmt", + "sval_json", + "sval_ref", + "sval_serde", +] [[package]] name = "version_check" @@ -6822,42 +8749,49 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] -name = "walkdir" -version = "2.5.0" +name = "vswhom" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" dependencies = [ - "same-file", - "winapi-util", + "libc", + "vswhom-sys", ] [[package]] -name = "warnings" -version = "0.2.1" +name = "vswhom-sys" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f68998838dab65727c9b30465595c6f7c953313559371ca8bf31759b3680ad" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" dependencies = [ - "pin-project", - "tracing", - "warnings-macro", + "cc", + "libc", ] [[package]] -name = "warnings-macro" -version = "0.2.0" +name = "waker-fn" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" + +[[package]] +name = "walkdir" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59195a1db0e95b920366d949ba5e0d3fc0e70b67c09be15ce5abb790106b0571" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "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" @@ -6885,9 +8819,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.114" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf" dependencies = [ "cfg-if", "once_cell", @@ -6898,23 +8832,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.64" +version = "0.4.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" +checksum = "6ef4c5d3d2cdf5c54f4231181768f5510842e350db025faf1f7163b1030ed928" dependencies = [ - "cfg-if", - "futures-util", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.114" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6922,22 +8852,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.114" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.6", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.114" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e" dependencies = [ "unicode-ident", ] @@ -6977,13 +8907,25 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasm_thread" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7516db7f32decdadb1c3b8deb1b7d78b9df7606c5cc2f6241737c2ab3a0258e" +dependencies = [ + "futures", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasmparser" version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "hashbrown 0.15.5", "indexmap", "semver", @@ -6997,6 +8939,7 @@ checksum = "2857dd20b54e916ec7253b3d6b4d5c4d7d4ca2c33c2e11c6c76a99bd8744755d" dependencies = [ "cc", "downcast-rs", + "log", "rustix 1.1.4", "scoped-tls", "smallvec", @@ -7009,21 +8952,58 @@ version = "0.31.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "645c7c96bb74690c3189b5c9cb4ca1627062bb23693a4fad9d8c3de958260144" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "rustix 1.1.4", "wayland-backend", "wayland-scanner", ] +[[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.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "563a85523cade2429938e790815fd7319062103b9f4a2dc806e9b53b95982d8f" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" +dependencies = [ + "bitflags 2.13.2", + "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.2", "wayland-backend", "wayland-client", + "wayland-protocols", "wayland-scanner", ] @@ -7046,14 +9026,25 @@ checksum = "d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be" dependencies = [ "dlib", "log", + "once_cell", "pkg-config", ] [[package]] name = "web-sys" -version = "0.3.91" +version = "0.3.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbddc4a036f00ec4f18c83445bd3115cb306a91da554919a099d9222fe4a7f8" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", @@ -7072,115 +9063,197 @@ dependencies = [ ] [[package]] -name = "webbrowser" -version = "1.2.1" +name = "webpki-roots" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "weezl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" + +[[package]] +name = "wgpu" +version = "29.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76e8840e1ba2881d4cbb18d2147627a56af426ff064c0401eb0c8410c6325d07" +dependencies = [ + "arrayvec", + "bitflags 2.13.2", + "bytemuck", + "cfg-if", + "cfg_aliases", + "document-features", + "hashbrown 0.16.1", + "js-sys", + "log", + "naga", + "parking_lot", + "portable-atomic", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "29.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc95580916af1e68ff6a7be07446fc5db73ebf71cf092de939bbf5f7e189f72" +checksum = "2f519832254e56965a9940c4af57dcb75f702b6f6fa4a0b172f685395843a4d7" dependencies = [ - "core-foundation", - "jni 0.22.4", + "arrayvec", + "bit-set 0.9.1", + "bit-vec 0.9.1", + "bitflags 2.13.2", + "bytemuck", + "cfg_aliases", + "document-features", + "hashbrown 0.16.1", + "indexmap", "log", - "ndk-context", - "objc2", - "objc2-foundation", - "url", - "web-sys", + "naga", + "once_cell", + "parking_lot", + "portable-atomic", + "profiling", + "raw-window-handle", + "rustc-hash 1.1.0", + "smallvec", + "thiserror 2.0.18", + "wgpu-core-deps-apple", + "wgpu-core-deps-emscripten", + "wgpu-core-deps-wasm", + "wgpu-core-deps-windows-linux-android", + "wgpu-hal", + "wgpu-naga-bridge", + "wgpu-types", ] [[package]] -name = "webkit2gtk" -version = "2.0.1" +name = "wgpu-core-deps-apple" +version = "29.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a" +checksum = "f5e39e26c4c0e07589e67d18546cf79ff45383659fc72fca4dd293358a0347f3" dependencies = [ - "bitflags 1.3.2", - "cairo-rs", - "gdk", - "gdk-sys", - "gio", - "gio-sys", - "glib", - "glib-sys", - "gobject-sys", - "gtk", - "gtk-sys", - "javascriptcore-rs", - "libc", - "once_cell", - "soup3", - "webkit2gtk-sys", + "wgpu-hal", ] [[package]] -name = "webkit2gtk-sys" -version = "2.0.1" +name = "wgpu-core-deps-emscripten" +version = "29.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c" +checksum = "01e09be551dc939498bdd5f6b2c66e55ab275dad25825267a08605a80fc9f0af" dependencies = [ - "bitflags 1.3.2", - "cairo-sys-rs", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "gtk-sys", - "javascriptcore-rs-sys", - "libc", - "pkg-config", - "soup3-sys", - "system-deps", + "wgpu-hal", ] [[package]] -name = "webpki-roots" -version = "1.0.6" +name = "wgpu-core-deps-wasm" +version = "29.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +checksum = "af1fb1798be2a912497d4c224f72d39bb0cb34af50e8bcc29865bc339c943059" dependencies = [ - "rustls-pki-types", + "wgpu-hal", ] [[package]] -name = "webview2-com" -version = "0.38.2" +name = "wgpu-core-deps-windows-linux-android" +version = "29.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +checksum = "4e592c1bbef6ad047647ae6e666ebd8cee7a32bb4544d9700ec96cbf73230257" dependencies = [ - "webview2-com-macros", - "webview2-com-sys", - "windows", - "windows-core", - "windows-implement", - "windows-interface", + "wgpu-hal", ] [[package]] -name = "webview2-com-macros" -version = "0.8.1" +name = "wgpu-hal" +version = "29.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +checksum = "97ace1c17727311c22a46e4e3faf56ea6de81af99dcc839bdfb54857b94d448d" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "android_system_properties", + "arrayvec", + "ash", + "bit-set 0.9.1", + "bitflags 2.13.2", + "block2 0.6.2", + "bytemuck", + "cfg-if", + "cfg_aliases", + "glow", + "glutin_wgl_sys", + "gpu-allocator", + "gpu-descriptor", + "hashbrown 0.16.1", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "naga", + "ndk-sys", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-metal 0.3.2", + "objc2-quartz-core 0.3.2", + "once_cell", + "ordered-float", + "parking_lot", + "portable-atomic", + "portable-atomic-util", + "profiling", + "range-alloc", + "raw-window-handle", + "raw-window-metal", + "renderdoc-sys", + "smallvec", + "thiserror 2.0.18", + "wasm-bindgen", + "wayland-sys", + "web-sys", + "wgpu-naga-bridge", + "wgpu-types", + "windows 0.62.2", + "windows-core 0.62.2", + "windows-result 0.4.1", ] [[package]] -name = "webview2-com-sys" -version = "0.38.2" +name = "wgpu-naga-bridge" +version = "29.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +checksum = "95226013f547544b223281cd16a4fb549aa9dcb562adbda0faae4c73ffbbc161" dependencies = [ - "thiserror 2.0.18", - "windows", - "windows-core", + "naga", + "wgpu-types", ] [[package]] -name = "weezl" -version = "0.1.12" +name = "wgpu-types" +version = "29.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" +checksum = "84bf84cd9ca8ca45e2b223a3868f1adf9bfc0c66aeac212e76ee7e40fdadf8f5" +dependencies = [ + "bitflags 2.13.2", + "bytemuck", + "js-sys", + "log", + "raw-window-handle", + "web-sys", +] [[package]] name = "which" @@ -7194,6 +9267,15 @@ dependencies = [ "rustix 0.38.44", ] +[[package]] +name = "which" +version = "8.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bae2f2b2b816647a1cab1acc91f5bd20812d53cb344382635ec2181940c8034f" +dependencies = [ + "libc", +] + [[package]] name = "wide" version = "0.7.33" @@ -7235,17 +9317,62 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" +dependencies = [ + "windows-core 0.57.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows" version = "0.61.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" dependencies = [ - "windows-collections", - "windows-core", - "windows-future", + "windows-collections 0.2.0", + "windows-core 0.61.2", + "windows-future 0.2.1", "windows-link 0.1.3", - "windows-numerics", + "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-capture" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a4df73e95feddb9ec1a7e9c2ca6323b8c97d5eeeff78d28f1eccdf19c882b24" +dependencies = [ + "parking_lot", + "rayon", + "thiserror 2.0.18", + "windows 0.61.3", + "windows-future 0.2.1", ] [[package]] @@ -7254,7 +9381,41 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" dependencies = [ - "windows-core", + "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.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" +dependencies = [ + "windows-implement 0.57.0", + "windows-interface 0.57.0", + "windows-result 0.1.2", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", + "windows-targets 0.52.6", ] [[package]] @@ -7263,11 +9424,24 @@ version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-implement", - "windows-interface", + "windows-implement 0.60.2", + "windows-interface 0.59.3", "windows-link 0.1.3", - "windows-result", - "windows-strings", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement 0.60.2", + "windows-interface 0.59.3", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", ] [[package]] @@ -7276,9 +9450,42 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ - "windows-core", + "windows-core 0.61.2", "windows-link 0.1.3", - "windows-threading", + "windows-threading 0.1.0", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core 0.62.2", + "windows-link 0.2.1", + "windows-threading 0.2.1", +] + +[[package]] +name = "windows-implement" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] @@ -7292,6 +9499,28 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "windows-interface" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "windows-interface" version = "0.59.3" @@ -7321,10 +9550,60 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" dependencies = [ - "windows-core", + "windows-core 0.61.2", "windows-link 0.1.3", ] +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core 0.62.2", + "windows-link 0.2.1", +] + +[[package]] +name = "windows-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +dependencies = [ + "windows-result 0.3.4", + "windows-strings 0.3.1", + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-result" version = "0.3.4" @@ -7334,6 +9613,34 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result 0.2.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +dependencies = [ + "windows-link 0.1.3", +] + [[package]] name = "windows-strings" version = "0.4.2" @@ -7343,6 +9650,15 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -7354,29 +9670,29 @@ dependencies = [ [[package]] name = "windows-sys" -version = "0.52.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] name = "windows-sys" -version = "0.59.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ "windows-targets 0.52.6", ] [[package]] name = "windows-sys" -version = "0.60.2" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets 0.53.5", + "windows-targets 0.52.6", ] [[package]] @@ -7403,6 +9719,21 @@ dependencies = [ "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +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", +] + [[package]] name = "windows-targets" version = "0.52.6" @@ -7445,6 +9776,15 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-version" version = "0.1.7" @@ -7460,6 +9800,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -7478,6 +9824,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -7496,6 +9848,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -7526,6 +9884,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -7544,6 +9908,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -7562,6 +9932,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -7580,6 +9956,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -7594,29 +9976,39 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.5.40" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" dependencies = [ "memchr", ] [[package]] name = "winnow" -version = "0.7.14" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" dependencies = [ "memchr", ] [[package]] -name = "winnow" -version = "1.0.0" +name = "winreg" +version = "0.55.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" dependencies = [ - "memchr", + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "wio" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5" +dependencies = [ + "winapi", ] [[package]] @@ -7677,7 +10069,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.0", + "bitflags 2.13.2", "indexmap", "log", "serde", @@ -7713,49 +10105,6 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" -[[package]] -name = "wry" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" -dependencies = [ - "base64", - "block2", - "cookie", - "crossbeam-channel", - "dirs", - "dpi", - "dunce", - "gtk", - "html5ever 0.29.1", - "http", - "javascriptcore-rs", - "jni 0.21.1", - "kuchikiki", - "libc", - "ndk", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "objc2-ui-kit", - "objc2-web-kit", - "once_cell", - "percent-encoding", - "raw-window-handle 0.6.2", - "sha2", - "soup3", - "tao-macros", - "thiserror 2.0.18", - "url", - "webkit2gtk", - "webkit2gtk-sys", - "webview2-com", - "windows", - "windows-core", - "windows-version", -] - [[package]] name = "x11" version = "2.21.0" @@ -7767,14 +10116,13 @@ dependencies = [ ] [[package]] -name = "x11-dl" -version = "2.21.0" +name = "x11-clipboard" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +checksum = "662d74b3d77e396b8e5beb00b9cad6a9eccf40b2ef68cc858784b14c41d535a3" dependencies = [ "libc", - "once_cell", - "pkg-config", + "x11rb", ] [[package]] @@ -7783,9 +10131,12 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" dependencies = [ + "as-raw-xcb-connection", "gethostname", + "libc", "rustix 1.1.4", "x11rb-protocol", + "xcursor", ] [[package]] @@ -7804,12 +10155,77 @@ dependencies = [ "rustix 1.1.4", ] +[[package]] +name = "xcb" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6c2ad15e0e922856ee89afe862b8992334bbe7953adad56cd1199358cb30566" +dependencies = [ + "bitflags 2.13.2", + "libc", + "quick-xml 0.41.0", + "x11", +] + +[[package]] +name = "xcursor" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "163b33ed8786455e2fa5d72f554057ce3f3182425434f756cd39c99839d88e23" + +[[package]] +name = "xim-ctext" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ac61a7062c40f3c37b6e82eeeef835d5cc7824b632a72784a89b3963c33284c" +dependencies = [ + "encoding_rs", +] + +[[package]] +name = "xim-parser" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dcee45f89572d5a65180af3a84e7ddb24f5ea690a6d3aa9de231281544dd7b7" +dependencies = [ + "bitflags 2.13.2", +] + +[[package]] +name = "xkbcommon" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d66ca9352cbd4eecbbc40871d8a11b4ac8107cfc528a6e14d7c19c69d0e1ac9" +dependencies = [ + "as-raw-xcb-connection", + "libc", + "memmap2", + "xkeysym", +] + [[package]] name = "xkeysym" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" +[[package]] +name = "xml-rs" +version = "0.8.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e450f9b2ed1dff33c94c12589a87338689467b9c4f5d8a5710bd09a847d2c8a7" + +[[package]] +name = "xml5ever" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bbb26405d8e919bc1547a5aa9abc95cbfa438f04844f5fdd9dc7596b748bf69" +dependencies = [ + "log", + "mac", + "markup5ever 0.12.1", +] + [[package]] name = "xml5ever" version = "0.39.0" @@ -7847,6 +10263,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" +[[package]] +name = "yeslogic-fontconfig-sys" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d8b8abf912b9a29ff112e1671c97c33636903d13a69712037190e6805af4f76" +dependencies = [ + "dlib", + "once_cell", + "pkg-config", +] + [[package]] name = "yoke" version = "0.8.1" @@ -7870,6 +10297,173 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zbus" +version = "5.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5db4be7c075cb421e4b7ee645541604239bd243ba7c357511f4ff3a74b555907" +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", + "ordered-stream", + "rustix 1.1.4", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 1.0.0", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus-lockstep" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6998de05217a084b7578728a9443d04ea4cd80f2a0839b8d78770b76ccd45863" +dependencies = [ + "zbus_xml", + "zvariant", +] + +[[package]] +name = "zbus-lockstep-macros" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10da05367f3a7b7553c8cdf8fa91aee6b64afebe32b51c95177957efc47ca3a0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "zbus-lockstep", + "zbus_xml", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2990635d09ade6df1868f72f8cac69a876a90981e8bd3c40b1be413f8dc88f40" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 3.0.6", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e" +dependencies = [ + "serde", + "winnow 1.0.0", + "zvariant", +] + +[[package]] +name = "zbus_xml" +version = "5.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1586c021a01ca0a9216dcd874e546382e156a5cbab5fab6cb5f10087e22682a" +dependencies = [ + "serde", + "winnow 1.0.0", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zcheapstr" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1afec51604565183aeb5c54c20aeab286120d4e4460f7f76e3e8bb8c0d99473" +dependencies = [ + "serde", +] + +[[package]] +name = "zed-font-kit" +version = "0.14.1-zed" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3898e450f36f852edda72e3f985c34426042c4951790b23b107f93394f9bff5" +dependencies = [ + "bitflags 2.13.2", + "byteorder", + "core-foundation 0.10.1", + "core-graphics 0.24.0", + "core-text", + "dirs 5.0.1", + "dwrote", + "float-ord", + "freetype-sys", + "lazy_static", + "libc", + "log", + "pathfinder_geometry", + "pathfinder_simd", + "walkdir", + "winapi", + "yeslogic-fontconfig-sys", +] + +[[package]] +name = "zed-scap" +version = "0.0.8-zed" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b338d705ae33a43ca00287c11129303a7a0aa57b101b72a1c08c863f698ac8" +dependencies = [ + "anyhow", + "cocoa 0.25.0", + "core-graphics-helmer-fork", + "log", + "objc", + "rand 0.8.6", + "screencapturekit", + "screencapturekit-sys", + "sysinfo", + "tao-core-video-sys", + "windows 0.61.3", + "windows-capture", + "x11", + "xcb", +] + +[[package]] +name = "zed-xim" +version = "0.4.0-zed" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0b46ed118eba34d9ba53d94ddc0b665e0e06a2cf874cfa2dd5dec278148642" +dependencies = [ + "ahash", + "hashbrown 0.14.5", + "log", + "x11rb", + "xim-ctext", + "xim-parser", +] + [[package]] name = "zeno" version = "0.3.3" @@ -7922,6 +10516,20 @@ name = "zeroize" version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] [[package]] name = "zerotrie" @@ -8000,3 +10608,45 @@ checksum = "410e9ecef634c709e3831c2cfdb8d9c32164fae1c67496d5b68fff728eec37fe" dependencies = [ "zune-core 0.5.1", ] + +[[package]] +name = "zvariant" +version = "5.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1d34c27cc6cdd1f458427519dd6b8612f7b7e3f7b9a0b2355d041dda9869147" +dependencies = [ + "endi", + "enumflags2", + "serde", + "serde_bytes", + "winnow 1.0.0", + "zcheapstr", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "864155e69b4352db0c7f374917bf45d1e0c8d17659c8b3dbf9795f3673f8c497" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 3.0.6", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad0294361a320b694a328460dc73add56c306150f5cb6bfafc44446120008a3" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 3.0.6", + "winnow 1.0.0", +] diff --git a/crates/rustmotion-studio/Cargo.toml b/crates/rustmotion-studio/Cargo.toml index 40970e2b..b2ecc592 100644 --- a/crates/rustmotion-studio/Cargo.toml +++ b/crates/rustmotion-studio/Cargo.toml @@ -13,28 +13,16 @@ path = "src/bin/main.rs" [dependencies] rustmotion = { path = "../rustmotion" } - -# Pinned exactly, for two reasons. These are 0.x crates that ship breaking -# changes in patch slots (0.6.2 removed the dock tiles canvas), and 0.7.0 -# removes `Root::render_dialog_layer`/`_sheet_`/`_notification_` with no -# documented replacement — the three calls this app needs, kept isolated in -# `app/overlays.rs` so that migration stays a localised patch. The kit in turn -# pins `gpui-pre` at `=0.3.6`, so the whole graph moves in lockstep anyway; -# saying so here makes it visible rather than surprising. gpui-kit = "=0.6.6" - +gpui-component = "0.6.6" clap = { version = "4", features = ["derive"] } notify = "7" -# Also a *direct* dependency now, not only a transitive one: `RenderImage::new` -# takes an `image::Frame`, and gpui-kit does not re-export `image`, so the types -# only unify if we name the same major version ourselves. image = { version = "0.25", default-features = false, features = ["png", "jpeg", "webp"] } -# Same reason: `RenderImage::new` takes a `SmallVec<[Frame; 1]>`. smallvec = "1" serde_json = { version = "1", features = ["preserve_order"] } tokio = { version = "1", features = ["time"] } rfd = "0.17" rodio = { version = "0.22", default-features = false, features = ["playback"] } dirs = "6.0.0" -palette = { version = "0.7.6", default-features = false } +palette = { version = "0.7.6", default-features = false, features = ["std"] } schemars = "0.8" diff --git a/crates/rustmotion-studio/assets/dx-components-theme.css b/crates/rustmotion-studio/assets/dx-components-theme.css deleted file mode 100644 index 46b1aefe..00000000 --- a/crates/rustmotion-studio/assets/dx-components-theme.css +++ /dev/null @@ -1,70 +0,0 @@ -/* This file contains the theme variables for the styled dioxus-components components. You only - * need to import this file once in your project root. - */ - -html[data-theme="dark"] { - --dark: initial; - --light: ; -} - -html[data-theme="light"] { - --dark: ; - --light: initial; -} - -html[data-theme="dark"] [class~="dxc-system"] { - --dxc-light-on: ; - --dxc-dark-on: initial; -} - -html[data-theme="light"] [class~="dxc-system"] { - --dxc-light-on: initial; - --dxc-dark-on: ; -} - -@media (prefers-color-scheme: dark) { - :root { - --dark: initial; - --light: ; - } -} - -@media (prefers-color-scheme: light) { - :root { - --dark: ; - --light: initial; - } -} - -:root { - /* Primary colors */ - --primary-color: var(--dark, #000) var(--light, #fff); - --primary-color-1: var(--dark, #0e0e0e) var(--light, #fbfbfb); - --primary-color-2: var(--dark, #0a0a0a) var(--light, #fff); - --primary-color-3: var(--dark, #141313) var(--light, #f8f8f8); - --primary-color-4: var(--dark, #1a1a1a) var(--light, #f8f8f8); - --primary-color-5: var(--dark, #262626) var(--light, #f5f5f5); - --primary-color-6: var(--dark, #232323) var(--light, #e5e5e5); - --primary-color-7: var(--dark, #3e3e3e) var(--light, #b0b0b0); - - /* Secondary colors */ - --secondary-color: var(--dark, #fff) var(--light, #000); - --secondary-color-1: var(--dark, #fafafa) var(--light, #000); - --secondary-color-2: var(--dark, #e6e6e6) var(--light, #0d0d0d); - --secondary-color-3: var(--dark, #dcdcdc) var(--light, #2b2b2b); - --secondary-color-4: var(--dark, #d4d4d4) var(--light, #111); - --secondary-color-5: var(--dark, #a1a1a1) var(--light, #848484); - --secondary-color-6: var(--dark, #5d5d5d) var(--light, #d0d0d0); - - /* Highlight colors */ - --focused-border-color: var(--dark, #2b7fff) var(--light, #2b7fff); - --primary-success-color: var(--dark, #02271c) var(--light, #ecfdf5); - --secondary-success-color: var(--dark, #b6fae3) var(--light, #10b981); - --primary-warning-color: var(--dark, #342203) var(--light, #fffbeb); - --secondary-warning-color: var(--dark, #feeac7) var(--light, #f59e0b); - --primary-error-color: var(--dark, #a22e2e) var(--light, #dc2626); - --secondary-error-color: var(--dark, #9b1c1c) var(--light, #ef4444); - --contrast-error-color: var(--dark, var(--secondary-color-3)) var(--light, var(--primary-color)); - --primary-info-color: var(--dark, var(--primary-color-5)) var(--light, var(--primary-color)); - --secondary-info-color: var(--dark, var(--primary-color-7)) var(--light, var(--secondary-color-3)); -} diff --git a/crates/rustmotion-studio/src/app/mod.rs b/crates/rustmotion-studio/src/app/mod.rs index 9ed00827..a321ea77 100644 --- a/crates/rustmotion-studio/src/app/mod.rs +++ b/crates/rustmotion-studio/src/app/mod.rs @@ -1,8 +1,7 @@ -//! The application shell: process entry points, the launch wiring, and the -//! re-targetable file watcher. - +mod overlays; mod root; pub mod state; +mod window; use std::path::PathBuf; use std::sync::mpsc::Sender; @@ -13,15 +12,12 @@ use rustmotion::error::Result; use rustmotion::schema::ResolvedScenario; use crate::library::{LibraryState, SharedLibrary, WatchMsg}; -use crate::scenario::{empty_scenario, Shared, StudioModel}; -use root::StudioRoot; +use crate::scenario::{empty_scenario, Shared, StudioModel, View}; fn default_workspace() -> PathBuf { std::env::current_dir().unwrap_or_else(|_| PathBuf::from(".")) } -/// CLI-facing entry: open a scenario directly into the editor. The library -/// home uses the file's parent directory as the workspace. pub fn run_preview( scenario: ResolvedScenario, input_path: Option, @@ -31,7 +27,6 @@ pub fn run_preview( run_preview_root(scenario, None, input_path, workspace, true, watch) } -/// CLI-facing entry for the error case (file failed to load). pub fn run_preview_with_error( initial_error: String, input_path: Option, @@ -56,8 +51,6 @@ fn workspace_for(input_path: &Option) -> PathBuf { .unwrap_or_else(default_workspace) } -/// Launch the studio root: library home + editor, sharing one model, a library -/// state, and a re-targetable file watcher. pub fn run_preview_root( scenario: ResolvedScenario, initial_error: Option, @@ -66,13 +59,6 @@ pub fn run_preview_root( start_in_editor: bool, watch: bool, ) -> Result<()> { - for view in &scenario.views { - engine::prefetch_icons(&view.scenes); - engine::preextract_video_frames(&view.scenes, scenario.video.fps); - } - // Audio analysis is NOT done here: it belongs to `StudioModel::new`, which - // every load path goes through. Doing it once at launch left a scenario - // opened or reloaded later with the wrong (or no) analysis for the session. if !scenario.fonts.is_empty() { engine::renderer::load_custom_fonts(&scenario.fonts); } @@ -85,6 +71,8 @@ pub fn run_preview_root( let library: SharedLibrary = Arc::new(Mutex::new(LibraryState::new(workspace, start_in_editor))); + spawn_scenario_warmup(shared.clone()); + if watch { let tx = spawn_watcher(shared.clone()); if let Some(p) = input_path.clone() { @@ -93,17 +81,53 @@ pub fn run_preview_root( library.lock().unwrap_or_else(|e| e.into_inner()).watch_tx = Some(tx); } - dioxus::LaunchBuilder::desktop() - .with_context(shared) - .with_context(library) - .launch(StudioRoot); + let view = if start_in_editor { + View::Editor + } else { + View::Library + }; + let theme_pref = crate::theme::persist::load_theme_pref(); + + gpui_kit::application() + .with_assets(gpui_kit::assets::AllAssets::new("")) + .run(move |cx| { + gpui_kit::init(cx); + cx.spawn(async move |cx| { + window::open(shared, library, view, theme_pref, cx); + }) + .detach(); + }); Ok(()) } -/// One long-lived watcher thread owning a single `notify::Watcher`, driven by a -/// channel of [`WatchMsg`]. `Retarget` switches the watched file; `Changed` -/// (from the notify callback) reloads the current file into the shared model. +pub fn spawn_scenario_warmup(shared: Shared) { + std::thread::spawn(move || { + let (scenario, fps) = { + let m = shared.lock().unwrap_or_else(|e| e.into_inner()); + (m.scenario.clone(), m.scenario.video.fps) + }; + for view in &scenario.views { + engine::prefetch_icons(&view.scenes); + engine::preextract_video_frames(&view.scenes, fps); + } + let failures = rustmotion::encode::audio_analysis::analyze_scenario_audio(&scenario); + let audio_error = (!failures.is_empty()).then(|| { + failures + .iter() + .map(|f| f.to_string()) + .collect::>() + .join(" \u{b7} ") + }); + + let mut m = shared.lock().unwrap_or_else(|e| e.into_inner()); + if Arc::ptr_eq(&m.scenario, &scenario) { + m.audio_error = audio_error; + m.generation = m.generation.wrapping_add(1); + } + }); +} + fn spawn_watcher(shared: Shared) -> Sender { use notify::{RecursiveMode, Watcher}; let (tx, rx) = std::sync::mpsc::channel::(); @@ -133,12 +157,6 @@ fn spawn_watcher(shared: Shared) -> Sender { } WatchMsg::Changed => { if let Some(p) = current.clone() { - // Self-write skip: if the disk content is exactly what - // this process last wrote (debounced write, undo), the - // in-memory model is already up to date — and possibly - // NEWER under continuous typing. Reloading would - // clobber it, so skip. External edits hash differently - // and reload normally. if let Ok(content) = std::fs::read_to_string(&p) { if crate::scenario::is_self_write( &crate::scenario::self_write_slot(), @@ -156,6 +174,8 @@ fn spawn_watcher(shared: Shared) -> Sender { let g = m.generation.wrapping_add(1); *m = StudioModel::new(scenario, error, Some(p.clone())); m.generation = g; + drop(m); + spawn_scenario_warmup(shared.clone()); } } } diff --git a/crates/rustmotion-studio/src/app/overlays.rs b/crates/rustmotion-studio/src/app/overlays.rs new file mode 100644 index 00000000..78427291 --- /dev/null +++ b/crates/rustmotion-studio/src/app/overlays.rs @@ -0,0 +1,9 @@ +use gpui_component::Root; +use gpui_kit::*; + +pub fn render(window: &mut Window, cx: &mut App) -> impl IntoElement { + div() + .children(Root::render_sheet_layer(window, cx)) + .children(Root::render_dialog_layer(window, cx)) + .children(Root::render_notification_layer(window, cx)) +} diff --git a/crates/rustmotion-studio/src/app/root.rs b/crates/rustmotion-studio/src/app/root.rs index 918704a8..2e285ae8 100644 --- a/crates/rustmotion-studio/src/app/root.rs +++ b/crates/rustmotion-studio/src/app/root.rs @@ -1,194 +1,46 @@ -use std::sync::Arc; - -use dioxus::desktop::{ - use_asset_handler, wry::http::Response, AssetRequest, RequestAsyncResponder, -}; -use dioxus::prelude::*; - -use crate::editor::StudioApp; -use crate::library::{render_thumbnail, Library, SharedLibrary}; -use crate::scenario::{Shared, Theme, View}; - -/// dx-component CSS, injected globally. `#[css_module]` only injects its compiled -/// stylesheet through the `dx` asset pipeline, which our plain `cargo`-built -/// `rustmotion studio` binary doesn't run — so we bundle the (unscoped) CSS at -/// compile time and inject it as a `