From 6122474f9e50696fc330099be1816d3eb09a76ee Mon Sep 17 00:00:00 2001 From: Ren Amamiya Date: Wed, 21 Oct 2026 13:57:01 +0700 Subject: [PATCH] Follow the OS native theme on macOS, Windows and Linux --- CHANGELOG.md | 2 + Cargo.lock | 818 +++++++++++++++--- Cargo.toml | 15 +- crates/dock/src/dock_area.rs | 3 +- .../src/views/sidebar/settings_dialog.rs | 352 +------- desktop/Cargo.toml | 1 + desktop/src/main.rs | 68 +- docs/NATIVE-THEME-MIGRATION.md | 51 +- 8 files changed, 797 insertions(+), 513 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d23cde3..c68172d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ ### Added +- Follow the operating system's native theme on macOS, Windows and Linux (KDE, GNOME) via `native-theme`, applying the OS colors, fonts, radii and accessibility preferences; the bundled themes remain as the fallback when the OS theme cannot be read - Add an identity import dialog, importing an existing identity by pasting its `nsec` secret key (encrypted with a new passphrase), NIP-49 `ncryptsec` (unlocked with its passphrase), or `bunker://` NIP-46 URI - Add a dropdown menu on the signed-in user button in the sidebar - Add sign-out feature, confirmed by an alert dialog before deleting the stored session credential @@ -41,6 +42,7 @@ ### Removed +- Remove the light/dark theme pickers and the font size, corner radius, focus ring and shadow settings from the settings dialog; colors and geometry now come from the native theme - Remove dead code: the unused `login`/`logout` family, the unwired `SyncProgress` pipeline, `merge_pull_request`, inbox mark-read/archive APIs and the wasm32-only code paths ### Deprecated diff --git a/Cargo.lock b/Cargo.lock index 1ad687b..a790525 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -318,6 +318,18 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-compression" +version = "0.4.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5755640120b24961f8231e05892e4a4f7e0d04e8aeca161508c9c397946970" +dependencies = [ + "compression-codecs", + "compression-core", + "futures-io", + "pin-project-lite", +] + [[package]] name = "async-executor" version = "1.14.0" @@ -562,7 +574,7 @@ dependencies = [ "anyhow", "arrayvec", "log", - "nom", + "nom 8.0.0", "num-rational", "v_frame", ] @@ -638,6 +650,26 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efbd3e1070bbdf4cd88a75264e18e8a26f7cb5c6949eadf0ceb85fb159cf08f8" +[[package]] +name = "bindgen" +version = "0.72.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" +dependencies = [ + "bitflags 2.13.2", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 2.1.3", + "shlex 1.3.0", + "syn 2.0.119", +] + [[package]] name = "bip39" version = "2.2.2" @@ -855,6 +887,15 @@ dependencies = [ "syn 3.0.9", ] +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + [[package]] name = "bstr" version = "1.13.1" @@ -916,6 +957,15 @@ version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" +[[package]] +name = "bzip2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a53fac24f34a81bc9954b5d6cfce0c21e18ec6959f44f56e8e90e4bb7c346c" +dependencies = [ + "libbz2-rs-sys", +] + [[package]] name = "calloop" version = "0.14.5" @@ -956,7 +1006,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eadd868a2ce9ca38de7eeafdcec9c7065ef89b42b32f0839278d55f35c54d1ff" dependencies = [ "heck 0.4.1", - "indexmap", + "indexmap 2.14.2", "log", "proc-macro2", "quote", @@ -976,7 +1026,16 @@ dependencies = [ "find-msvc-tools", "jobserver", "libc", - "shlex", + "shlex 2.0.1", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom 7.1.3", ] [[package]] @@ -991,6 +1050,15 @@ 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 = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + [[package]] name = "chacha20" version = "0.9.1" @@ -1062,6 +1130,17 @@ dependencies = [ "inout 0.2.5", ] +[[package]] +name = "clang-sys" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "157a8ba7b480713b56f4c09fd13fc3e0a22a5dfab8097ba61cbc5feef950788a" +dependencies = [ + "glob", + "libc", + "libloading", +] + [[package]] name = "clru" version = "0.6.3" @@ -1172,6 +1251,24 @@ dependencies = [ "memchr", ] +[[package]] +name = "compression-codecs" +version = "0.4.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cae36683101b2899f48bd31f8db9839437356188e3b1ff23096e73dab09ba8fe" +dependencies = [ + "bzip2", + "compression-core", + "flate2", + "memchr", +] + +[[package]] +name = "compression-core" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ebdda89edc534bf8d5dd2857562633b6495557e5846552ade994b99ed13c36a" + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -1181,6 +1278,12 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "configparser" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031ad3d167622974ed636505ae4556267ed4aa2aea0464122fa6bc9698a32825" + [[package]] name = "console_error_panic_hook" version = "0.1.7" @@ -1322,6 +1425,19 @@ dependencies = [ "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" @@ -1334,6 +1450,20 @@ dependencies = [ "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]] name = "core_detect" version = "1.0.0" @@ -1487,6 +1617,40 @@ dependencies = [ "cmov", ] +[[package]] +name = "darling" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed17f5901b6630b993ca003def43f2f8ef4014fc13b047b57aad617ff32bc2ec" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6837e2cf7485aaae18f86181d2f0e9a7ed297a025e220aeabf63fdebd3a2ddff" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 3.0.9", +] + +[[package]] +name = "darling_macro" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" +dependencies = [ + "darling_core", + "quote", + "syn 3.0.9", +] + [[package]] name = "dashmap" version = "6.2.1" @@ -1558,6 +1722,9 @@ name = "deranged" version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e9de72ce2ad1f90dc62fa25f0f430ef85eb4b0d8fa0be4f30373bc40a21d28e" +dependencies = [ + "serde_core", +] [[package]] name = "derive_more" @@ -1579,6 +1746,7 @@ dependencies = [ "quote", "rustc_version", "syn 2.0.119", + "unicode-xid", ] [[package]] @@ -1669,6 +1837,7 @@ checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ "bitflags 2.13.2", "block2 0.6.2", + "libc", "objc2 0.6.5", ] @@ -1878,6 +2047,17 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826" +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + [[package]] name = "errno" version = "0.3.14" @@ -3421,9 +3601,9 @@ dependencies = [ [[package]] name = "gpui-base" -version = "0.8.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5cd7de73d5b2d3d18b94a928abf343922091fa77bc472f77b7d2e7e8b1823a7" +checksum = "3cf698677b253118459f552fe15513858c669d79a25837a94e480db2ae330050" dependencies = [ "aho-corasick", "anyhow", @@ -3448,7 +3628,7 @@ dependencies = [ "raw-window-handle", "regex", "ropey", - "schemars", + "schemars 1.2.3", "serde", "serde_json", "smallvec", @@ -3462,9 +3642,9 @@ dependencies = [ [[package]] name = "gpui-component" -version = "0.8.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4097e161cc81e86323b439664be0cdd4f7c56148e867ed6f67fd72b966b6c2d1" +checksum = "bc8b7def8e74b0d822d3e96f6b28fb5a2c20eb7a83d30d22fa59ca8088d1159b" dependencies = [ "anyhow", "chrono", @@ -3493,11 +3673,10 @@ dependencies = [ "resvg 0.45.1", "ropey", "rust-i18n", - "schemars", + "schemars 1.2.3", "serde", "serde_json", "serde_repr", - "similar", "smallvec", "smol", "tracing", @@ -3536,17 +3715,15 @@ dependencies = [ "tree-sitter-typescript", "tree-sitter-yaml", "tree-sitter-zig", - "unicode-segmentation", - "unicode-width", "uuid", "windows 0.58.0", ] [[package]] name = "gpui-component-macros" -version = "0.8.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b98496748463b60ad69eab80cd91fc9b3807fed9a0e01ab4d5c159c949fd814" +checksum = "5c0c9398aaf99e595d450e38eb44ff0c500df8c332b4783d5b72022e69525359" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3556,9 +3733,9 @@ dependencies = [ [[package]] name = "gpui-kit-assets" -version = "0.8.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b037e2fa43d53a567a8aa5be6b1a8931f416cbd010ceee8d4a3727a71e9b1d05" +checksum = "cb5fd2b154c96abe8ac49d8c431a24a764977128fce6a72a5f9f1e8802f64fe7" dependencies = [ "anyhow", "gpui-pre", @@ -3571,17 +3748,19 @@ dependencies = [ [[package]] name = "gpui-pre" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34f61c1cfd36fc9c436af09308c963822ae27a45a84feb21a77ba5c9e051f1c0" +checksum = "d7f0bc3ebba070f8981b3f8e905a12f47d27794a30d029e59cdb9edf7a4b3360" dependencies = [ "accesskit", "anyhow", "async-channel", "async-task", "backtrace", + "bindgen", "bitflags 2.13.2", "chrono", + "core-video", "ctor", "derive_more", "embed-resource", @@ -3597,6 +3776,7 @@ dependencies = [ "gpui-pre-shared-string", "gpui-pre-sum-tree", "gpui-pre-util", + "gpui-pre-util-macros", "heapless 0.9.3", "image", "inventory", @@ -3618,7 +3798,7 @@ dependencies = [ "raw-window-handle", "regex", "resvg 0.46.0", - "schemars", + "schemars 1.2.3", "seahash", "serde", "serde_json", @@ -3635,30 +3815,28 @@ dependencies = [ "waker-fn", "web-time", "windows 0.62.2", + "zed-font-kit", "zed-scap", ] [[package]] name = "gpui-pre-apple" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b52f58893fe1a0836464428dfad2b5eaf42c9c303a9638f4c2aced5a69072a15" +checksum = "bfdd914311cd12894367c8b9908947bb0c27fd42f8b9a5ff7a0730551a83fa4c" dependencies = [ "anyhow", "async-task", "block2 0.6.2", "cbindgen", "core-foundation 0.10.1", - "core-foundation-sys", "core-graphics 0.24.0", - "core-text", + "core-video", "derive_more", "dispatch2", "etagere", "foreign-types", - "futures", "gpui-pre", - "gpui-pre-collections", "gpui-pre-util", "image", "libc", @@ -3666,36 +3844,27 @@ dependencies = [ "mach2", "metal", "objc2 0.6.5", - "objc2-core-foundation", - "objc2-core-text", - "objc2-core-video", "objc2-foundation 0.3.2", - "objc2-metal 0.3.2", "objc2-quartz-core 0.3.2", - "objc2-security", "parking_lot", - "pathfinder_geometry", - "smallvec", - "thiserror 2.0.21", - "zed-font-kit", ] [[package]] name = "gpui-pre-collections" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "920c2f5b2f1a7813114d89f4841f26f6060d9c35d7c8a852a4205d1a767a7ce0" +checksum = "2c060863025dc3b8e90febad2d1f4ffd23a5d0dcedba39d3f6b7820ea2fdd3a0" dependencies = [ "gpui-pre-util", - "indexmap", + "indexmap 2.14.2", "rustc-hash 2.1.3", ] [[package]] name = "gpui-pre-derive-refineable" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "947395f26228296c0c79fb889d3687b205e552c25bbcdece216fb2394ea9bcd1" +checksum = "bc834f30f5f49791e214f1fde01a009c7de91c9cd0a9f31dabfed130ba39e6cf" dependencies = [ "proc-macro2", "quote", @@ -3704,12 +3873,14 @@ dependencies = [ [[package]] name = "gpui-pre-http-client" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c56cdaa3f1a271162b7fede1d4557879eedb056e293cedbb82743600650b755e" +checksum = "5d2935cf82333da3f41774e5757837756408f01356197b41c817ad2666034453" dependencies = [ "anyhow", + "async-compression", "bytes", + "derive_more", "futures", "http", "http-body", @@ -3723,9 +3894,9 @@ dependencies = [ [[package]] name = "gpui-pre-http-client-tls" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7616a90ec92c9832bbc80ddab34e10fdf8d23520d5cbb0b432b73e4e9f6c812" +checksum = "9bbac58d44e80c2bfdd736cacd334e5c9446d5847cd584193ee3c8634c729c2b" dependencies = [ "log", "rustls", @@ -3735,9 +3906,9 @@ dependencies = [ [[package]] name = "gpui-pre-linux" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28213c3fde6f13e91ba0b74b90cbaadec9373e36a031eda98561d31059870f3" +checksum = "b1131746fad5c87b5de74dc9c73105655b0c820a2dd4bb247586573e7cf5720e" dependencies = [ "accesskit", "accesskit_unix", @@ -3780,9 +3951,9 @@ dependencies = [ [[package]] name = "gpui-pre-macos" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c988b7e49775cc8542dbe48d5a10e073d8e898a023ef3ff3d24f33363e9863" +checksum = "0d756813ff1cd741a502af60fd18869e0677795936d7349642b41c49f43120c0" dependencies = [ "accesskit", "accesskit_macos", @@ -3792,6 +3963,8 @@ dependencies = [ "core-foundation 0.10.1", "core-foundation-sys", "core-graphics 0.24.0", + "core-text", + "core-video", "ctor", "dispatch2", "foreign-types", @@ -3807,22 +3980,26 @@ dependencies = [ "objc", "objc2 0.6.5", "objc2-app-kit 0.3.2", - "objc2-core-video", + "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", "uuid", + "zed-font-kit", ] [[package]] name = "gpui-pre-macros" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb80dac5e1f6b8cde1d2740389e77dfc0071bfcc81fba5526d5dc90f68171cc" +checksum = "d2ad26ca759364694cb55487bebff4c1b7dd6accab49990ff3cda6f7a818a9f4" dependencies = [ "heck 0.5.0", "proc-macro-crate", @@ -3832,10 +4009,21 @@ dependencies = [ ] [[package]] -name = "gpui-pre-platform" -version = "0.3.9" +name = "gpui-pre-perf" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbdbdac421178313fed8929fe95b42634a266a735079fcf03ff231bc2ccb2c5e" +checksum = "2fcb288a506a476b6cbf97e6ec1cc0118db43f0ca91087588afa1c2d8cd4f842" +dependencies = [ + "gpui-pre-collections", + "serde", + "serde_json", +] + +[[package]] +name = "gpui-pre-platform" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e200b7b78836f1a0fc70767d971768e88f29d8b91b697285c15fb8e373635a3e" dependencies = [ "anyhow", "console_error_panic_hook", @@ -3848,9 +4036,9 @@ dependencies = [ [[package]] name = "gpui-pre-refineable" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "237703b3b219d11adb50dd33bb0fcca3d34fc001623b3143e72cb051d0fb3777" +checksum = "4042345bb5bd3ecbc5d15b21ed128154f462a992058d7038cd397631f5462338" dependencies = [ "gpui-pre-derive-refineable", ] @@ -3907,9 +4095,9 @@ dependencies = [ [[package]] name = "gpui-pre-reqwest-client" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92c2e70dc8550d60324b1eb3f3d08b4ccf20a8b577a9a42732dd3bafb2363bc0" +checksum = "894b8d8618c92cbd4da28a04dd3fcf3c0e0607074fa99416a864ac9b63b18aae" dependencies = [ "anyhow", "bytes", @@ -3925,9 +4113,9 @@ dependencies = [ [[package]] name = "gpui-pre-scheduler" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83f342555282a59ed8dd58dd7e0a920524fa8ef6aa8c8f30e2edb7019a8f72cb" +checksum = "f4acd73345bc3c09f1b98c1b21eb4459ad8336f89bb2edcef619e11c5a08456e" dependencies = [ "async-task", "backtrace", @@ -3942,32 +4130,33 @@ dependencies = [ [[package]] name = "gpui-pre-shared-string" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71f488bf4780735f6b2dad24f8db1e3d9e2593de0ec298e3574c788f571b81c4" +checksum = "477529fd5aa90bff969785ee9a3938484d94aa5101cdf7b84719629c0345f98a" dependencies = [ - "schemars", + "schemars 1.2.3", "serde", "smol_str", ] [[package]] name = "gpui-pre-sum-tree" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aadb3bd3da22617e2158b1842f5a9c29c1626c926ad0686163ced1a009963ff3" +checksum = "9ec0ec176d576b82aed716cf47185856b54ea9528caaf9d01787024689bfd824" dependencies = [ "gpui-pre-ztracing", "heapless 0.9.3", + "log", "rayon", "tracing", ] [[package]] name = "gpui-pre-util" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a04ec9abd7a87ac05a221f4629403831c44c17123bc33cb5d271a6303259b340" +checksum = "e1635ae7d0b05400bfa211ddef6c67dc8d9f223c463022c2b3bf2c1c14c6044f" dependencies = [ "anyhow", "log", @@ -3975,13 +4164,23 @@ dependencies = [ ] [[package]] -name = "gpui-pre-web" -version = "0.3.9" +name = "gpui-pre-util-macros" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedd55b99dc77e28df8202b0ea868aa5c90fda4aefff539ea21087d7c2ff4bfb" +checksum = "01486fce7722e5d7d7e7bb71c719dfdcc6ed917112bdc7c56d0556fdb60d10ab" +dependencies = [ + "gpui-pre-perf", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "gpui-pre-web" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "184776d0763e6889dd2842dcb1204c15055945f2bdfe926b5ef57bdbd1952a65" dependencies = [ "anyhow", - "async-channel", "console_error_panic_hook", "futures", "gpui-pre", @@ -4006,9 +4205,9 @@ dependencies = [ [[package]] name = "gpui-pre-wgpu" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b1cdb26c1503bf9662ee8fbc5ab0b44b2deeee4b5c12dc67491ba6fb5fc544b" +checksum = "439c5421cafe1a7cf68d0c0ae5cc82b26fad6b0e6345ac98d20acaf1f2463914" dependencies = [ "anyhow", "bytemuck", @@ -4033,9 +4232,9 @@ dependencies = [ [[package]] name = "gpui-pre-windows" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "513d4f0fc7d596d3bdef2a73a524ffb83dabc95bf484f2855a698e7f431290a9" +checksum = "371f9bb13f97e3bea2f8b8e5e81232bb74d735153c244ae67f7400e743925b1c" dependencies = [ "accesskit", "accesskit_windows", @@ -4062,20 +4261,34 @@ dependencies = [ ] [[package]] -name = "gpui-pre-ztracing" -version = "0.3.9" +name = "gpui-pre-zlog" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17bfd6bd1f77ba5c58181fa6f82fc7a63015a1c58bef94a76e5acb9f8e42572" +checksum = "3bbe5b98630ef4bfed5a7105ec1062e78d571912bc491388f07ea22f2457c18b" dependencies = [ + "anyhow", + "chrono", + "gpui-pre-collections", + "log", +] + +[[package]] +name = "gpui-pre-ztracing" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f806400f6bda1fdd9fc627e158c0e44fb0c4b7767582a3621efcf92f4a850db7" +dependencies = [ + "gpui-pre-zlog", "gpui-pre-ztracing-macro", "tracing", + "tracing-subscriber", ] [[package]] name = "gpui-pre-ztracing-macro" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0d73e1bc02eef886a5947f41b8512708792e9e5d3053d181843311a487f96f" +checksum = "d337c9acf058238e45ce0570d8a5958439242889492f91ae2d8e324211a61ccd" [[package]] name = "granit-parser" @@ -4099,7 +4312,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap", + "indexmap 2.14.2", "slab", "tokio", "tokio-util", @@ -4140,6 +4353,12 @@ dependencies = [ "byteorder", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.14.5" @@ -4536,6 +4755,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "1.1.0" @@ -4624,6 +4849,17 @@ version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e44b0a4eaa4c82f441d50a963f2d5f05a787240aeee097597033e72accfd22f" +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + [[package]] name = "indexmap" version = "2.14.2" @@ -4717,6 +4953,18 @@ dependencies = [ "winapi", ] +[[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" @@ -4974,12 +5222,33 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20870f649af7073d53e38067b2a84312175d56ea15217e1b15bc83506ec50afb" +[[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 = "lebe" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" +[[package]] +name = "libbz2-rs-sys" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b357333733e8260735ba5894eb928c02ecc69c78715f01a8019e7fa7f2db4c" + [[package]] name = "libc" version = "0.2.191" @@ -5084,6 +5353,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" dependencies = [ "serde_core", + "value-bag", ] [[package]] @@ -5194,9 +5464,12 @@ dependencies = [ [[package]] name = "mach2" -version = "0.6.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dae608c151f68243f2b000364e1f7b186d9c29845f7d2d85bd31b9ad77ad552b" +checksum = "6a1b95cd5421ec55b445b5ae102f5ea0e768de1f82bd3001e11f426c269c3aea" +dependencies = [ + "libc", +] [[package]] name = "malloc_buf" @@ -5332,6 +5605,12 @@ dependencies = [ "unicase", ] +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -5395,7 +5674,7 @@ dependencies = [ "half", "hashbrown 0.16.1", "hexf-parse", - "indexmap", + "indexmap 2.14.2", "libm", "log", "num-traits", @@ -5406,6 +5685,58 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "native-theme" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea89548b5c74493eeda312d5b1dad2c3c5f3bb35076dfef7c9a5b85c5cf140bf" +dependencies = [ + "arc-swap", + "ashpd", + "async-trait", + "block2 0.6.2", + "configparser", + "fontdb", + "inventory", + "native-theme-derive", + "objc2 0.6.5", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-core-text", + "objc2-foundation 0.3.2", + "pollster 1.0.1", + "serde", + "serde_with", + "toml 1.1.8+spec-1.1.0", + "unicase", + "windows 0.62.2", + "zbus", +] + +[[package]] +name = "native-theme-derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cddcfe1cc7b75a3ef362b242343aabf8fd9053ed9b4c72bcf4af4a45989b4d1" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "native-theme-gpui" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5002c99b80209a2da63224a8ffa6a6b95feb836a1098c1189de47f69f3a40053" +dependencies = [ + "gpui-base", + "gpui-component", + "gpui-pre", + "image", + "native-theme", +] + [[package]] name = "ndk-context" version = "0.1.1" @@ -5448,6 +5779,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "nom" version = "8.0.0" @@ -5540,7 +5881,7 @@ name = "nostr-gossip-memory" version = "0.45.1" source = "git+https://github.com/rust-nostr/nostr#20096765b95f4840dd3df66cad49db35e9634462" dependencies = [ - "indexmap", + "indexmap 2.14.2", "lru", "nostr", "nostr-gossip", @@ -5855,6 +6196,28 @@ dependencies = [ "objc2-foundation 0.3.2", ] +[[package]] +name = "objc2-core-audio" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1eebcea8b0dbff5f7c8504f3107c68fc061a3eb44932051c8cf8a68d969c3b2" +dependencies = [ + "dispatch2", + "objc2 0.6.5", + "objc2-core-audio-types", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-core-audio-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a89f2ec274a0cf4a32642b2991e8b351a404d290da87bb6a9a9d8632490bd1c" +dependencies = [ + "bitflags 2.13.2", + "objc2 0.6.5", +] + [[package]] name = "objc2-core-data" version = "0.2.2" @@ -5885,7 +6248,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ "bitflags 2.13.2", + "block2 0.6.2", "dispatch2", + "libc", "objc2 0.6.5", ] @@ -5924,6 +6289,31 @@ dependencies = [ "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.5", + "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.5", + "objc2-core-audio", + "objc2-core-audio-types", + "objc2-core-foundation", + "objc2-core-video", +] + [[package]] name = "objc2-core-text" version = "0.3.2" @@ -5931,6 +6321,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" dependencies = [ "bitflags 2.13.2", + "block2 0.6.2", + "libc", "objc2 0.6.5", "objc2-core-foundation", "objc2-core-graphics", @@ -5947,7 +6339,6 @@ dependencies = [ "objc2-core-foundation", "objc2-core-graphics", "objc2-io-surface", - "objc2-metal 0.3.2", ] [[package]] @@ -6043,12 +6434,17 @@ dependencies = [ ] [[package]] -name = "objc2-security" +name = "objc2-screen-capture-kit" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" +checksum = "74b7c5390f477482f001bc354d6571a70db7e4f8d5288e860c45521fbce11394" dependencies = [ - "objc2-core-foundation", + "block2 0.6.2", + "dispatch2", + "objc2 0.6.5", + "objc2-core-graphics", + "objc2-core-media", + "objc2-foundation 0.3.2", ] [[package]] @@ -6060,6 +6456,7 @@ dependencies = [ "bitflags 2.13.2", "block2 0.6.2", "objc2 0.6.5", + "objc2-core-location", "objc2-foundation 0.3.2", ] @@ -6483,6 +6880,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" +[[package]] +name = "pollster" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6355899e1c9462875b6757c79f3caa011a1fdae12bbb1a2e72dd1f234f8336" + [[package]] name = "poly1305" version = "0.8.0" @@ -6526,6 +6929,8 @@ checksum = "af3fb618632874fb76937c2361a7f22afd393c982a2165595407edc75b06d3c1" dependencies = [ "atomic", "crossbeam-queue", + "futures", + "log", "parking_lot", "pin-project", "pollster 0.2.5", @@ -6569,6 +6974,16 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.119", +] + [[package]] name = "proc-macro-crate" version = "3.5.0" @@ -7503,6 +7918,18 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + [[package]] name = "schemars" version = "1.2.3" @@ -7510,7 +7937,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab508826f74a77ca9d5aba6ff19b522583ee3eaf28a19384ff3d0e5835fadf6e" dependencies = [ "dyn-clone", - "indexmap", + "indexmap 2.14.2", "ref-cast", "schemars_derive", "serde", @@ -7709,6 +8136,15 @@ dependencies = [ "syn 3.0.9", ] +[[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.154" @@ -7716,7 +8152,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" dependencies = [ "foldhash 0.2.0", - "indexmap", + "indexmap 2.14.2", "itoa", "memchr", "serde", @@ -7765,6 +8201,39 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9adc193c780ef8f159aee8b61e2d5801aaa555e6eb0947fe45530ec506296f" +dependencies = [ + "base64 0.23.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.2", + "jiff", + "schemars 0.9.0", + "schemars 1.2.3", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e17bbc68e28663bbbb90df47e058aa7eda4fb445b89fe70457bb94fbccf6e49" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 3.0.9", +] + [[package]] name = "settings" version = "0.2.0-alpha" @@ -7840,6 +8309,12 @@ dependencies = [ "dirs 6.0.0", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "shlex" version = "2.0.1" @@ -7867,6 +8342,7 @@ dependencies = [ "gpui-pre-platform", "gpui-pre-reqwest-client", "metadata", + "native-theme-gpui", "paths", "settings", "signed_state", @@ -7982,16 +8458,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" -[[package]] -name = "similar" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" -dependencies = [ - "bstr", - "unicode-segmentation", -] - [[package]] name = "simplecss" version = "0.2.2" @@ -8169,6 +8635,12 @@ dependencies = [ "quote", ] +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "strum" version = "0.28.0" @@ -8196,6 +8668,85 @@ 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 = "sval_dynamic" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048ca293b998d9a45659159f94a64063791e74cdc670164943dbb434405573d" +dependencies = [ + "sval", +] + +[[package]] +name = "sval_fmt" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +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" @@ -8470,6 +9021,7 @@ dependencies = [ "powerfmt", "serde_core", "time-core", + "time-macros", ] [[package]] @@ -8478,6 +9030,16 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + [[package]] name = "tiny-keccak" version = "2.0.2" @@ -8646,7 +9208,7 @@ version = "1.1.8+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20489e00e4d8741d6be680764cc12e270655e375a20d1011e844a9c3379e678d" dependencies = [ - "indexmap", + "indexmap 2.14.2", "serde_core", "serde_spanned 1.1.2", "toml_datetime 1.1.2+spec-1.1.0", @@ -8679,7 +9241,7 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap", + "indexmap 2.14.2", "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.11", @@ -8693,7 +9255,7 @@ version = "0.25.17+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3641d5bbb5349a79e1020a242d251efbc546ad8048d133958323ce9c40a9c9c" dependencies = [ - "indexmap", + "indexmap 2.14.2", "toml_datetime 1.1.2+spec-1.1.0", "toml_parser", "winnow 1.0.4", @@ -9228,6 +9790,12 @@ dependencies = [ "utf-8", ] +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + [[package]] name = "typenum" version = "1.20.1" @@ -9338,6 +9906,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "universal-hash" version = "0.5.1" @@ -9476,6 +10050,42 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[package]] +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 = "839752af8179287d27eb2b94164641b1ede9e60ab7424163388dc21ebd0508cd" +dependencies = [ + "sval", + "sval_buffer", + "sval_dynamic", + "sval_fmt", + "sval_json", + "sval_ref", + "sval_serde", +] + [[package]] name = "version_check" version = "0.9.5" @@ -9844,7 +10454,7 @@ dependencies = [ "cfg_aliases", "document-features", "hashbrown 0.16.1", - "indexmap", + "indexmap 2.14.2", "log", "naga", "once_cell", diff --git a/Cargo.toml b/Cargo.toml index 83a1907..0050ba5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,13 +9,16 @@ edition = "2024" publish = false [workspace.dependencies] -gpui = { package = "gpui-pre", version = "0.3.9" } -gpui_platform = { package = "gpui-pre-platform", version = "0.3.9", features = ["font-kit", "x11", "wayland"] } -reqwest_client = { package = "gpui-pre-reqwest-client", version = "0.3.9" } +gpui = { package = "gpui-pre", version = "0.3.8" } +gpui_platform = { package = "gpui-pre-platform", version = "0.3.8", features = ["font-kit", "x11", "wayland"] } +reqwest_client = { package = "gpui-pre-reqwest-client", version = "0.3.8" } -# GPUI Kit -gpui-component = { version = "0.8", features = ["tree-sitter-languages"] } -gpui-base = "0.8" +# GPUI Kit; exact pins keep the graph on the gpui-pre 0.3.8 closure that +# native-theme-gpui 0.6.1 is verified against (0.7.3 and 0.8 pin 0.3.9). +gpui-component = { version = "=0.7.1", features = ["tree-sitter-languages"] } +gpui-base = "=0.7.1" + +native-theme-gpui = { version = "0.6.1", default-features = false, features = ["system-fonts"] } dock = { path = "crates/dock" } settings = { path = "crates/settings" } diff --git a/crates/dock/src/dock_area.rs b/crates/dock/src/dock_area.rs index 67617c1..b3c3176 100644 --- a/crates/dock/src/dock_area.rs +++ b/crates/dock/src/dock_area.rs @@ -1,4 +1,5 @@ use std::cell::Cell; +use std::ops::Deref as _; use std::rc::Rc; use std::sync::Arc; @@ -172,7 +173,7 @@ impl SignedDockSkin { .on_drag(ResizePanel, move |info, _, _, cx| { cx.stop_propagation(); shared.resizing_dock().set(Some(placement)); - cx.new(|_| info.clone()) + cx.new(|_| info.deref().clone()) }) } } diff --git a/crates/workspace/src/views/sidebar/settings_dialog.rs b/crates/workspace/src/views/sidebar/settings_dialog.rs index e986a3c..2518277 100644 --- a/crates/workspace/src/views/sidebar/settings_dialog.rs +++ b/crates/workspace/src/views/sidebar/settings_dialog.rs @@ -1,22 +1,15 @@ -use std::cell::Cell; use std::path::PathBuf; use std::rc::Rc; use gpui::prelude::*; -use gpui::{ - AnyWindowHandle, App, Entity, PathPromptOptions, SharedString, Subscription, Window, div, px, -}; +use gpui::{App, Entity, PathPromptOptions, SharedString, Subscription, Window, div, px}; use gpui_component::button::{Button, ButtonVariants}; -use gpui_component::input::{ - Input, InputEvent, InputState, NumberInput, NumberInputEvent, StepAction, -}; +use gpui_component::input::{Input, InputState}; use gpui_component::select::{Select, SelectEvent, SelectState}; use gpui_component::separator::Separator; -use gpui_component::setting::NumberFieldOptions; use gpui_component::switch::Switch; use gpui_component::{ - ActiveTheme, IconName, IndexPath, Sizable, Theme, ThemeMode, ThemeRegistry, WindowExt, h_flex, - v_flex, + ActiveTheme, IconName, IndexPath, Sizable, Theme, ThemeMode, WindowExt, h_flex, v_flex, }; use settings::{AppearanceMode, EventFetchingStrategy, Settings, SettingsStore}; use signed_ui::{SelectOption, setting_block, setting_row}; @@ -31,34 +24,10 @@ fn selected_index(options: &[SelectOption], value: &str) -> Option { .map(|row| IndexPath::default().row(row)) } -/// Registered themes split into light and dark options, light first. -fn theme_options(cx: &App) -> (Vec, Vec) { - let registry = ThemeRegistry::global(cx); - let mut light = Vec::new(); - let mut dark = Vec::new(); - for config in registry.themes().values() { - let name = config.name.clone(); - if config.mode.is_dark() { - dark.push(SelectOption::new(name.clone(), name)); - } else { - light.push(SelectOption::new(name.clone(), name)); - } - } - light.sort_by(|a, b| a.label().as_ref().cmp(b.label().as_ref())); - dark.sort_by(|a, b| a.label().as_ref().cmp(b.label().as_ref())); - (light, dark) -} - /// Created once when the dialog opens, so control state survives re-renders. struct SettingsControls { appearance: Entity>>, event_fetching: Entity>>, - light_theme: Entity>>, - dark_theme: Entity>>, - font_size: Entity, - mono_font_size: Entity, - radius: Entity, - radius_lg: Entity, grasp_server_input: Entity, /// The effective create-repository folder, shown in a disabled input. default_folder: Entity, @@ -107,38 +76,9 @@ impl SettingsControls { ) }); - let (light_options, dark_options) = theme_options(cx); - let light_theme = cx.new(|cx| { - SelectState::new( - light_options.clone(), - selected_index(&light_options, &settings.theme.light_theme), - window, - cx, - ) - }); - let dark_theme = cx.new(|cx| { - SelectState::new( - dark_options.clone(), - selected_index(&dark_options, &settings.theme.dark_theme), - window, - cx, - ) - }); - - let font_size = cx.new(|cx| { - InputState::new(window, cx).default_value(settings.theme.font_size.to_string()) - }); - let mono_font_size = cx.new(|cx| { - InputState::new(window, cx).default_value(settings.theme.mono_font_size.to_string()) - }); - let radius = cx - .new(|cx| InputState::new(window, cx).default_value(settings.theme.radius.to_string())); - let radius_lg = cx.new(|cx| { - InputState::new(window, cx).default_value(settings.theme.radius_lg.to_string()) - }); - let grasp_server_input = cx.new(|cx| InputState::new(window, cx).placeholder("wss://relay.example.com")); + let default_folder = cx.new(|cx| { let folder = settings .create_repository @@ -178,118 +118,9 @@ impl SettingsControls { } })); - subscriptions.push(cx.subscribe(&light_theme, |_, event, cx| { - if let SelectEvent::Confirm(Some(value)) = event { - let store = SettingsStore::global(cx); - store.update(cx, |store, cx| { - store.edit( - |settings| settings.theme.light_theme = value.to_string(), - cx, - ); - }); - apply_theme(cx); - } - })); - - subscriptions.push(cx.subscribe(&dark_theme, |_, event, cx| { - if let SelectEvent::Confirm(Some(value)) = event { - let store = SettingsStore::global(cx); - store.update(cx, |store, cx| { - store.edit(|settings| settings.theme.dark_theme = value.to_string(), cx); - }); - apply_theme(cx); - } - })); - - wire_number_input( - &font_size, - &mut subscriptions, - window.window_handle(), - cx, - NumberFieldOptions { - min: 10., - max: 32., - ..Default::default() - }, - settings.theme.font_size as f64, - |value, cx| { - let store = SettingsStore::global(cx); - store.update(cx, |store, cx| { - store.edit(|settings| settings.theme.font_size = value as f32, cx); - }); - apply_theme(cx); - }, - ); - - wire_number_input( - &mono_font_size, - &mut subscriptions, - window.window_handle(), - cx, - NumberFieldOptions { - min: 8., - max: 32., - ..Default::default() - }, - settings.theme.mono_font_size as f64, - |value, cx| { - let store = SettingsStore::global(cx); - store.update(cx, |store, cx| { - store.edit(|settings| settings.theme.mono_font_size = value as f32, cx); - }); - apply_theme(cx); - }, - ); - - wire_number_input( - &radius, - &mut subscriptions, - window.window_handle(), - cx, - NumberFieldOptions { - min: 0., - max: 24., - ..Default::default() - }, - settings.theme.radius as f64, - |value, cx| { - let store = SettingsStore::global(cx); - store.update(cx, |store, cx| { - store.edit(|settings| settings.theme.radius = value as f32, cx); - }); - apply_theme(cx); - }, - ); - - wire_number_input( - &radius_lg, - &mut subscriptions, - window.window_handle(), - cx, - NumberFieldOptions { - min: 0., - max: 24., - ..Default::default() - }, - settings.theme.radius_lg as f64, - |value, cx| { - let store = SettingsStore::global(cx); - store.update(cx, |store, cx| { - store.edit(|settings| settings.theme.radius_lg = value as f32, cx); - }); - apply_theme(cx); - }, - ); - Self { appearance, event_fetching, - light_theme, - dark_theme, - font_size, - mono_font_size, - radius, - radius_lg, grasp_server_input, default_folder, _subscriptions: subscriptions, @@ -320,8 +151,6 @@ fn settings_view(controls: &SettingsControls, cx: &mut App) -> impl IntoElement .w_full() .child(appearance_section(controls, cx)) .child(Separator::horizontal()) - .child(theme_section(&settings, controls, cx)) - .child(Separator::horizontal()) .child(tab_bar_section(&settings, cx)) .child(Separator::horizontal()) .child(grasp_servers_section(&settings, controls, cx)) @@ -350,76 +179,6 @@ fn event_fetching_section(controls: &SettingsControls, cx: &App) -> impl IntoEle )) } -fn theme_section(settings: &Settings, controls: &SettingsControls, cx: &App) -> impl IntoElement { - v_flex() - .gap_3() - .w_full() - .child(setting_row( - cx, - "Light Theme", - "The theme to use when the appearance is light.", - Select::new(&controls.light_theme).w_full(), - )) - .child(setting_row( - cx, - "Dark Theme", - "The theme to use when the appearance is dark.", - Select::new(&controls.dark_theme).w_full(), - )) - .child(setting_row( - cx, - "UI Font Size", - "Font size for the UI.", - NumberInput::new(&controls.font_size).w_full(), - )) - .child(setting_row( - cx, - "Editor Font Size", - "Font size for editor text.", - NumberInput::new(&controls.mono_font_size).w_full(), - )) - .child(setting_row( - cx, - "Corner Radius", - "The corner radius for UI elements.", - NumberInput::new(&controls.radius).w_full(), - )) - .child(setting_row( - cx, - "Large Corner Radius", - "The corner radius for large UI elements (dialogs, notifications).", - NumberInput::new(&controls.radius_lg).w_full(), - )) - .child(setting_row( - cx, - "Focus Ring", - "Draw a ring around focused controls.", - Switch::new("focus-ring") - .checked(settings.theme.focus_ring) - .on_click(move |checked: &bool, _window, cx| { - let store = SettingsStore::global(cx); - store.update(cx, |store, cx| { - store.edit(|settings| settings.theme.focus_ring = *checked, cx); - }); - apply_theme(cx); - }), - )) - .child(setting_row( - cx, - "Shadows", - "The shadow effect for UI elements.", - Switch::new("shadows") - .checked(settings.theme.shadow) - .on_click(move |checked: &bool, _window, cx| { - let store = SettingsStore::global(cx); - store.update(cx, |store, cx| { - store.edit(|settings| settings.theme.shadow = *checked, cx); - }); - apply_theme(cx); - }), - )) -} - /// Tab bar chrome, such as its next/previous tab buttons. fn tab_bar_section(settings: &Settings, cx: &App) -> impl IntoElement { v_flex().w_full().gap_3().child(setting_row( @@ -724,79 +483,6 @@ fn choose_default_folder(default_folder: &Entity, window: &mut Windo .detach(); } -/// Step actions clamp and persist the value; typed changes parse, clamp and persist. -fn wire_number_input( - state: &Entity, - subscriptions: &mut Vec, - window_handle: AnyWindowHandle, - cx: &mut App, - options: NumberFieldOptions, - initial: f64, - on_change: impl Fn(f64, &mut App) + 'static, -) { - let on_change = Rc::new(on_change); - let initial_value = Rc::new(Cell::new(initial)); - let (min, max, step) = (options.min, options.max, options.step); - - subscriptions.push(cx.subscribe(&state.clone(), { - let state = state.clone(); - let initial_value = initial_value.clone(); - let on_change = on_change.clone(); - move |_, event: &NumberInputEvent, cx| { - let NumberInputEvent::Step(action) = event; - let value = state.read(cx).value(); - if let Ok(value) = value.parse::() { - let new_value = match action { - StepAction::Increment => value + step, - StepAction::Decrement => value - step, - }; - let clamped = new_value.clamp(min, max); - window_handle - .update(cx, |_, window, cx| { - state.update(cx, |input, cx| { - input.set_value(SharedString::from(clamped.to_string()), window, cx); - }); - }) - .ok(); - initial_value.set(clamped); - on_change(clamped, cx); - } - } - })); - - subscriptions.push(cx.subscribe(&state.clone(), { - let state = state.clone(); - let initial_value = initial_value.clone(); - let on_change = on_change.clone(); - move |_, event: &InputEvent, cx| { - if matches!(event, InputEvent::Change) { - let value = state.read(cx).value(); - if value == initial_value.get().to_string() { - return; - } - if let Ok(parsed) = value.parse::() { - let clamped = parsed.clamp(min, max); - initial_value.set(clamped); - on_change(clamped, cx); - if clamped != parsed { - window_handle - .update(cx, |_, window, cx| { - state.update(cx, |input, cx| { - input.set_value( - SharedString::from(clamped.to_string()), - window, - cx, - ); - }); - }) - .ok(); - } - } - } - } - })); -} - fn apply_appearance(appearance: AppearanceMode, cx: &mut App) { match appearance { AppearanceMode::System => Theme::sync_system_appearance(None, cx), @@ -804,33 +490,3 @@ fn apply_appearance(appearance: AppearanceMode, cx: &mut App) { AppearanceMode::Dark => Theme::change(ThemeMode::Dark, None, cx), } } - -fn apply_theme(cx: &mut App) { - let store = SettingsStore::global(cx); - let settings = store.read(cx).settings().theme.clone(); - - let registry = ThemeRegistry::global(cx); - let light_config = registry - .themes() - .get(settings.light_theme.as_str()) - .cloned(); - let dark_config = registry.themes().get(settings.dark_theme.as_str()).cloned(); - let mode = Theme::global(cx).mode; - - let theme = Theme::global_mut(cx); - theme.radius = px(settings.radius); - theme.radius_lg = px(settings.radius_lg); - theme.focus_ring = settings.focus_ring; - theme.shadow = settings.shadow; - theme.font_size = px(settings.font_size); - theme.mono_font_size = px(settings.mono_font_size); - if let Some(config) = light_config { - theme.light_theme = config; - } - if let Some(config) = dark_config { - theme.dark_theme = config; - } - - // Re-apply the active mode so the updated configs take effect. - Theme::change(mode, None, cx); -} diff --git a/desktop/Cargo.toml b/desktop/Cargo.toml index 92623b9..045883d 100644 --- a/desktop/Cargo.toml +++ b/desktop/Cargo.toml @@ -38,6 +38,7 @@ gpui.workspace = true gpui_platform.workspace = true dock = { workspace = true } gpui-component.workspace = true +native-theme-gpui.workspace = true reqwest_client.workspace = true tracing.workspace = true tracing-subscriber.workspace = true diff --git a/desktop/src/main.rs b/desktop/src/main.rs index c732e4a..3130afc 100644 --- a/desktop/src/main.rs +++ b/desktop/src/main.rs @@ -5,6 +5,7 @@ use dock::TAB_BAR_HEIGHT; use gpui::*; use gpui_component::{Theme, ThemeMode, ThemeRegistry, theme}; use gpui_platform::application; +use native_theme_gpui::{SystemTheme, apply_system_theme}; use settings::{AppearanceMode, SettingsStore}; actions!(signed, [Quit]); @@ -25,47 +26,51 @@ fn main() { // The persisted settings must load before the theme is applied. let store = cx.new(|cx| SettingsStore::new(paths::settings_file(), cx)); SettingsStore::set_global(store.clone(), cx); - let settings = store.read(cx).settings().clone(); + let settings = store.read(cx).settings().clone(); let registry = ThemeRegistry::global_mut(cx); + for (name, content) in Assets.themes() { if let Err(err) = registry.load_themes_from_str(&content) { tracing::error!("Failed to load theme {name}: {err}"); } } - let light_theme = registry - .themes() - .get(settings.theme.light_theme.as_str()) - .cloned(); - let dark_theme = registry - .themes() - .get(settings.theme.dark_theme.as_str()) - .cloned(); - let theme = Theme::global_mut(cx); - theme.radius = px(settings.theme.radius); - theme.radius_lg = px(settings.theme.radius_lg); - theme.focus_ring = settings.theme.focus_ring; - theme.shadow = settings.theme.shadow; - theme.font_size = px(settings.theme.font_size); - theme.mono_font_size = px(settings.theme.mono_font_size); + match SystemTheme::from_system() { + Ok(system) => apply_system_theme(&system, cx), + Err(error) => { + tracing::warn!("native theme unavailable ({error})"); - if let Some(light) = light_theme { - theme.light_theme = light; - } else { - tracing::warn!( - "{} theme is missing from the registry", - settings.theme.light_theme - ); - } + let light_theme = registry + .themes() + .get(settings.theme.light_theme.as_str()) + .cloned(); - if let Some(dark) = dark_theme { - theme.dark_theme = dark; - } else { - tracing::warn!( - "{} theme is missing from the registry", - settings.theme.dark_theme - ); + let dark_theme = registry + .themes() + .get(settings.theme.dark_theme.as_str()) + .cloned(); + + let theme = Theme::global_mut(cx); + theme.radius = px(settings.theme.radius); + theme.radius_lg = px(settings.theme.radius_lg); + theme.focus_ring = settings.theme.focus_ring; + theme.shadow = settings.theme.shadow; + theme.font_size = px(settings.theme.font_size); + theme.mono_font_size = px(settings.theme.mono_font_size); + + if let Some(light) = light_theme { + theme.light_theme = light; + } else { + tracing::warn!("{} theme is missing", settings.theme.light_theme); + } + + if let Some(dark) = dark_theme { + theme.dark_theme = dark; + } else { + tracing::warn!("{} theme is missing", settings.theme.dark_theme); + } + } } match settings.appearance { @@ -76,6 +81,7 @@ fn main() { std::fs::create_dir_all(paths::nostr_dir()).ok(); std::fs::create_dir_all(paths::repos_dir()).ok(); + signed_state::init( paths::nostr_dir(), paths::repos_dir().clone(), diff --git a/docs/NATIVE-THEME-MIGRATION.md b/docs/NATIVE-THEME-MIGRATION.md index 4136611..072e3a5 100644 --- a/docs/NATIVE-THEME-MIGRATION.md +++ b/docs/NATIVE-THEME-MIGRATION.md @@ -58,7 +58,8 @@ Verified against crates.io and the upstream repo on 2026-10-21: | --- | --- | | Latest connector | `native-theme-gpui` 0.6.1 (2026-10-09); upstream `main` is the same | | Connector requires | `gpui-component ^0.7.1`, `gpui-base ^0.7.1`, `gpui-pre ^0.3.8`, Rust ≥ 1.95 | -| `gpui-component` 0.7.x pins | `gpui-pre =0.3.8` | +| `gpui-component`/`gpui-base` 0.7.1 pin | `gpui-pre =0.3.8` | +| `gpui-component`/`gpui-base` 0.7.3 pin | `gpui-pre =0.3.9` | | `gpui-component` 0.8.0 pins | `gpui-pre =0.3.9` (0.8.0 published 2026-10-19) | | This branch | moved 0.7.1 / 0.3.8 → 0.8 / 0.3.9 in `eb4fbb0` ("chore: update deps") | @@ -79,23 +80,25 @@ gpui = { package = "gpui-pre", version = "0.3.8" } gpui_platform = { package = "gpui-pre-platform", version = "0.3.8", features = ["font-kit", "x11", "wayland"] } reqwest_client = { package = "gpui-pre-reqwest-client", version = "0.3.8" } -gpui-component = { version = "0.7.1", features = ["tree-sitter-languages"] } -gpui-base = "0.7.1" +gpui-component = { version = "=0.7.1", features = ["tree-sitter-languages"] } +gpui-base = "=0.7.1" -native-theme = "0.6.1" -native-theme-gpui = "0.6.1" +native-theme-gpui = { version = "0.6.1", default-features = false, features = ["system-fonts"] } ``` -- This is exactly the state of `master` before `eb4fbb0`, which is also the - version set the connector was verified against (2026-10-08 stamp) and that - its nightly dependency canary exercises. `"0.7.1"` is a caret requirement; - it resolves the newest 0.7.x (currently 0.7.3). Pin `=0.7.1` instead if - strict reproducibility is preferred. -- The three `gpui-pre-*` family crates are published in lockstep; all three - move back to 0.3.8 together. +- This is the state of `master` before `eb4fbb0`, the version set the + connector was verified against (2026-10-08 stamp). The exact `=0.7.1` + pins are required, not a style choice: a caret `"0.7.1"` resolves 0.7.3, + whose `gpui-pre =0.3.9` pin drags the graph onto 0.3.9, outside the + closure the connector is verified against. The three `gpui-pre-*` family + crates are published in lockstep; all three move back to 0.3.8 together. +- The connector re-exports the `native-theme` types that appear in its + public signatures (`SystemTheme`, `AccessibilityPreferences`, …), so the + app does **not** need `native-theme` as a direct dependency. - The cost of the revert is the two one-line tweaks `eb4fbb0` made for 0.8 - (the `Deref` removal in `crates/dock/src/dock_area.rs`; verify it compiles - either way). The nostr changes in that commit are unrelated and stay. + (the `Deref` removal in `crates/dock/src/dock_area.rs` is restored; the + 0.7.1 `ResizeHandle::on_drag` hands the closure an `Rc` and requires + `E: Render`). The nostr changes in that commit are unrelated and stay. - When `native-theme-gpui` releases gpui-component 0.8 support (upstream has bumped within days of each gpui-component release so far), bump both sides together in one commit. @@ -128,8 +131,8 @@ Order is load-bearing: 4. Apply the native theme: ```rust -let prefs = native_theme_gpui::AccessibilityPreferences::from_system(); -match native_theme::SystemTheme::from_system() { +// native_theme_gpui re-exports SystemTheme from native-theme. +match native_theme_gpui::SystemTheme::from_system() { Ok(system) => native_theme_gpui::apply_system_theme(&system, cx), Err(error) => { tracing::warn!("native theme unavailable ({error}); using bundled themes"); @@ -182,9 +185,11 @@ Remove (the native theme now owns all of these): size. Keeping manual overrides would require re-applying them after every upstream rebuild, a permanent fight with the connector. -`apply_theme()` shrinks to the fallback-only body (registry lookups + global -field setup), called only when native detection failed at startup and by the -Appearance handler's fallback branch. +`apply_theme()` and `theme_options()` are deleted outright: with the pickers +and number fields gone they have no remaining callers. The fallback logic +lives only in `main.rs`'s `Err` branch; the Appearance handler keeps working +through `apply_appearance()` alone (`Theme::change` picks up whatever configs +are installed, bundled or native). `ThemeSettings` keeps its fields and serde shape — the fallback branch still reads them, existing settings files keep parsing, and the tests in @@ -224,8 +229,8 @@ Adopting any of them is a separate, deliberate follow-up. | File | Change | | --- | --- | -| `Cargo.toml` | Revert gpui-side pins to 0.3.8 / 0.7.1 (Gate 0); add `native-theme` and `native-theme-gpui` workspace deps | -| `desktop/Cargo.toml` | Add `native-theme`, `native-theme-gpui` | +| `Cargo.toml` | Revert gpui-side pins to 0.3.8 / `=0.7.1` (Gate 0); add the `native-theme-gpui` workspace dep | +| `desktop/Cargo.toml` | Add `native-theme-gpui` | | `desktop/src/main.rs` | Native apply with bundled fallback (§4.2); move the settings-field setup into the fallback branch | | `crates/workspace/src/views/sidebar/settings_dialog.rs` | Remove theme picker + font/radius/focus/shadow rows; shrink `apply_theme` to fallback-only (§4.4) | | `CHANGELOG.md` | Added: native OS theme via `native-theme`; Removed: manual theme/font/radius settings | @@ -240,8 +245,8 @@ Unchanged: ## 6. Validation -1. `cargo check`, `cargo test`, `cargo clippy` across the workspace (toolchain - 1.96 satisfies the connector's 1.95 MSRV). +1. `cargo check`, `cargo test --workspace`, `cargo clippy` across the workspace + (toolchain 1.96 satisfies the connector's 1.95 MSRV). 2. Manual matrix, per platform available (macOS first; KDE and GNOME Linux; Windows): - cold start matches the OS theme and accent; radius, fonts and controls