diff --git a/Cargo.lock b/Cargo.lock index 8feb42f..c496965 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -76,7 +76,7 @@ dependencies = [ "derive_more", "encoding_rs", "flate2", - "foldhash", + "foldhash 0.2.0", "futures-core", "h2", "http 0.2.12", @@ -89,7 +89,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rand 0.10.2", - "sha1 0.11.0", + "sha1", "smallvec", "tokio", "tokio-util", @@ -190,7 +190,7 @@ dependencies = [ "cookie 0.16.2", "derive_more", "encoding_rs", - "foldhash", + "foldhash 0.2.0", "futures-core", "futures-util", "impl-more", @@ -267,17 +267,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom 0.2.17", - "once_cell", - "version_check", -] - [[package]] name = "ahash" version = "0.8.12" @@ -354,11 +343,20 @@ dependencies = [ "log", "ndk", "ndk-context", - "ndk-sys 0.6.0+11769913", + "ndk-sys", "num_enum", "thiserror 2.0.19", ] +[[package]] +name = "android-build" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fc9904ad2ad097c3c1cfe2eacaaf0fc24710936fa9ed941cb310b7c6ed2ab7" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "android-properties" version = "0.2.2" @@ -503,11 +501,11 @@ dependencies = [ [[package]] name = "ash" -version = "0.37.3+1.3.251" +version = "0.38.0+1.3.281" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" dependencies = [ - "libloading 0.7.4", + "libloading", ] [[package]] @@ -529,7 +527,7 @@ dependencies = [ "wayland-backend", "wayland-client", "wayland-protocols", - "zbus 5.18.0", + "zbus", ] [[package]] @@ -934,7 +932,7 @@ dependencies = [ "fluent-syntax", "hpvcd", "htmd", - "image 0.25.10", + "image", "keyring", "libsqlite3-sys", "liquid", @@ -944,7 +942,7 @@ dependencies = [ "ort", "pagefind", "pulldown-cmark 0.13.4", - "quick-xml 0.41.0", + "quick-xml", "rayon", "regex", "reqwest", @@ -997,7 +995,7 @@ dependencies = [ "bds-editor", "chrono", "dirs 5.0.1", - "image 0.25.10", + "image", "ratatui", "ratatui-image", "russh", @@ -1444,12 +1442,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - [[package]] name = "cfg_aliases" version = "0.2.2" @@ -1592,12 +1584,13 @@ checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" [[package]] name = "codespan-reporting" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" dependencies = [ + "serde", "termcolor", - "unicode-width 0.1.14", + "unicode-width", ] [[package]] @@ -1608,7 +1601,7 @@ checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" dependencies = [ "serde", "termcolor", - "unicode-width 0.2.2", + "unicode-width", ] [[package]] @@ -1623,37 +1616,6 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" -[[package]] -name = "com" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6" -dependencies = [ - "com_macros", -] - -[[package]] -name = "com_macros" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5" -dependencies = [ - "com_macros_support", - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "com_macros_support" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "combine" version = "4.6.7" @@ -1725,7 +1687,7 @@ checksum = "4fe5f465a4f6fee88fad41b85d990f84c835335e85b5d9e6e63e0d06d28cba7c" dependencies = [ "encode_unicode", "libc", - "unicode-width 0.2.2", + "unicode-width", "windows-sys 0.61.2", ] @@ -1848,7 +1810,7 @@ checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" dependencies = [ "bitflags 1.3.2", "core-foundation 0.9.4", - "core-graphics-types", + "core-graphics-types 0.1.3", "foreign-types", "libc", ] @@ -1865,22 +1827,43 @@ dependencies = [ ] [[package]] -name = "cosmic-text" -version = "0.12.1" +name = "core-graphics-types" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fd57d82eb4bfe7ffa9b1cec0c05e2fd378155b47f255a67983cb4afe0e80c2" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ "bitflags 2.13.1", - "fontdb 0.16.2", + "core-foundation 0.10.1", + "libc", +] + +[[package]] +name = "core_maths" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" +dependencies = [ + "libm", +] + +[[package]] +name = "cosmic-text" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173852283a9a57a3cbe365d86e74dc428a09c50421477d5ad6fe9d9509e37737" +dependencies = [ + "bitflags 2.13.1", + "fontdb", + "harfrust", + "linebender_resource_handle", "log", "rangemap", - "rayon", "rustc-hash 1.1.0", - "rustybuzz", "self_cell", + "skrifa 0.37.0", + "smol_str", "swash", "sys-locale", - "ttf-parser 0.21.1", "unicode-bidi", "unicode-linebreak", "unicode-script", @@ -1971,7 +1954,7 @@ dependencies = [ "derive_more", "document-features", "mio", - "parking_lot 0.12.5", + "parking_lot", "rustix 1.1.4", "signal-hook", "signal-hook-mio", @@ -1993,6 +1976,19 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" +[[package]] +name = "cryoglyph" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc795bdbccdbd461736fb163930a009da6597b226d6f6fce33e7a8eb6ec519" +dependencies = [ + "cosmic-text", + "etagere", + "lru 0.16.4", + "rustc-hash 2.1.3", + "wgpu", +] + [[package]] name = "crypto-bigint" version = "0.7.5" @@ -2057,7 +2053,20 @@ version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" dependencies = [ - "cssparser-macros", + "cssparser-macros 0.6.1", + "dtoa-short", + "itoa", + "phf 0.13.1", + "smallvec", +] + +[[package]] +name = "cssparser" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9cdaae01d5ed7882b04d795e7f752f46ff52d2fa3b50a20d28c464510bba98" +dependencies = [ + "cssparser-macros 0.7.0", "dtoa-short", "itoa", "phf 0.13.1", @@ -2074,6 +2083,16 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "cssparser-macros" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a2a99df6e410a8ff4245aa2006499ea662245f967cc7c0a38c83ef8eb44dbf" +dependencies = [ + "quote", + "syn 2.0.119", +] + [[package]] name = "ctor" version = "0.10.1" @@ -2110,15 +2129,16 @@ checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" [[package]] name = "curve25519-dalek" -version = "5.0.0-rc.1" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c906a87e53a36ff795d72e06e8162a83c5436e3ea89e942a9cb9fc083f0a384f" +checksum = "b5eed333089e2e1c1ac8c6c0398e5e2497b4c9926ca6d0365ed1e099afa5bc23" dependencies = [ "cfg-if", "cpufeatures 0.3.0", "curve25519-dalek-derive", "digest 0.11.3", "fiat-crypto", + "rand_core 0.10.1", "rustc_version", "subtle", "zeroize", @@ -2146,7 +2166,7 @@ dependencies = [ "cxxbridge-cmd", "cxxbridge-flags", "cxxbridge-macro", - "foldhash", + "foldhash 0.2.0", "link-cplusplus", ] @@ -2197,33 +2217,6 @@ dependencies = [ "syn 3.0.2", ] -[[package]] -name = "d3d12" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e3d747f100290a1ca24b752186f61f6637e1deffe3bf6320de6fcb29510a307" -dependencies = [ - "bitflags 2.13.1", - "libloading 0.8.9", - "winapi", -] - -[[package]] -name = "dark-light" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a76fa97167fa740dcdbfe18e8895601e1bc36525f09b044e00916e717c03a3c" -dependencies = [ - "dconf_rs", - "detect-desktop-environment", - "dirs 4.0.0", - "objc", - "rust-ini", - "web-sys", - "winreg", - "zbus 4.4.0", -] - [[package]] name = "darling" version = "0.20.11" @@ -2370,12 +2363,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "dconf_rs" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7046468a81e6a002061c01e6a7c83139daf91b11c30e66795b13217c2d885c8b" - [[package]] name = "delegate" version = "0.13.5" @@ -2473,12 +2460,6 @@ dependencies = [ "cipher", ] -[[package]] -name = "detect-desktop-environment" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21d8ad60dd5b13a4ee6bd8fa2d5d88965c597c67bce32b5fc49c94f55cb50810" - [[package]] name = "diesel" version = "2.3.11" @@ -2553,15 +2534,6 @@ dependencies = [ "ctutils", ] -[[package]] -name = "dirs" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" -dependencies = [ - "dirs-sys 0.3.7", -] - [[package]] name = "dirs" version = "5.0.1" @@ -2580,17 +2552,6 @@ dependencies = [ "dirs-sys 0.5.0", ] -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users 0.4.6", - "winapi", -] - [[package]] name = "dirs-sys" version = "0.4.1" @@ -2650,15 +2611,9 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" dependencies = [ - "libloading 0.8.9", + "libloading", ] -[[package]] -name = "dlv-list" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" - [[package]] name = "document-features" version = "0.2.12" @@ -2670,16 +2625,16 @@ dependencies = [ [[package]] name = "dom_query" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" +checksum = "fac5fca71e65e94cc718a6e2af65d6e0f9c6027751c2aa562fbb5087fda639bc" dependencies = [ "bit-set 0.8.0", - "cssparser", - "foldhash", - "html5ever", + "cssparser 0.37.0", + "foldhash 0.2.0", + "html5ever 0.39.0", "precomputed-hash", - "selectors 0.36.1", + "selectors 0.38.0", "tendril", ] @@ -2701,46 +2656,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" -[[package]] -name = "drm" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80bc8c5c6c2941f70a55c15f8d9f00f9710ebda3ffda98075f996a0e6c92756f" -dependencies = [ - "bitflags 2.13.1", - "bytemuck", - "drm-ffi", - "drm-fourcc", - "libc", - "rustix 0.38.44", -] - -[[package]] -name = "drm-ffi" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51a91c9b32ac4e8105dec255e849e0d66e27d7c34d184364fb93e469db08f690" -dependencies = [ - "drm-sys", - "rustix 1.1.4", -] - -[[package]] -name = "drm-fourcc" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4" - -[[package]] -name = "drm-sys" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8e1361066d91f5ffccff060a3c3be9c3ecde15be2959c1937595f7a82a9f8" -dependencies = [ - "libc", - "linux-raw-sys 0.9.4", -] - [[package]] name = "dsl_auto_type" version = "0.2.0" @@ -2809,9 +2724,9 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "3.0.0-rc.1" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1685663e23882cd8517dcbcb1c23a6ebff4433c22dfb681d760219b62cd1b849" +checksum = "6ebaa1a2bf1290ab3bfe5a7b771d050ebffab2711c19a81691c683a5144a25de" dependencies = [ "curve25519-dalek", "ed25519", @@ -3003,11 +2918,10 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.4.1" +version = "5.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" dependencies = [ - "concurrent-queue", "parking", "pin-project-lite", ] @@ -3221,6 +3135,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "foldhash" version = "0.2.0" @@ -3229,9 +3149,18 @@ checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] name = "font-types" -version = "0.7.3" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3971f9a5ca983419cdc386941ba3b9e1feba01a0ab888adf78739feb2798492" +checksum = "39a654f404bbcbd48ea58c617c2993ee91d1cb63727a37bf2323a4edeed1b8c5" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "font-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a7299a780854a6d391be2ae1c8521c9368471b559dbfd6a8dbd9f407eaff100" dependencies = [ "bytemuck", ] @@ -3247,30 +3176,16 @@ dependencies = [ [[package]] name = "fontdb" -version = "0.16.2" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0299020c3ef3f60f526a4f64ab4a3d4ce116b1acbf24cdd22da0068e5d81dc3" +checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905" dependencies = [ "fontconfig-parser", "log", "memmap2", "slotmap", "tinyvec", - "ttf-parser 0.20.0", -] - -[[package]] -name = "fontdb" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e32eac81c1135c1df01d4e6d4233c47ba11f6a6d07f33e0bba09d18797077770" -dependencies = [ - "fontconfig-parser", - "log", - "memmap2", - "slotmap", - "tinyvec", - "ttf-parser 0.21.1", + "ttf-parser", ] [[package]] @@ -3550,7 +3465,7 @@ version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe4fbac503b8d1f88e6676011885f34b7174f46e59956bba534ba83abded4df" dependencies = [ - "unicode-width 0.2.2", + "unicode-width", ] [[package]] @@ -3725,9 +3640,9 @@ checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "glow" -version = "0.13.1" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" +checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" dependencies = [ "js-sys", "slotmap", @@ -3737,9 +3652,9 @@ dependencies = [ [[package]] name = "glutin_wgl_sys" -version = "0.5.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8098adac955faa2d31079b65dc48841251f69efd3ac25477903fc424362ead" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" dependencies = [ "gl_generator", ] @@ -3776,33 +3691,32 @@ dependencies = [ [[package]] name = "gpu-allocator" -version = "0.25.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f56f6318968d03c18e1bcf4857ff88c61157e9da8e47c5f29055d60e1228884" +checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" dependencies = [ "log", "presser", "thiserror 1.0.69", - "winapi", - "windows 0.52.0", + "windows 0.58.0", ] [[package]] name = "gpu-descriptor" -version = "0.2.4" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" +checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ "bitflags 2.13.1", "gpu-descriptor-types", - "hashbrown 0.14.5", + "hashbrown 0.15.5", ] [[package]] name = "gpu-descriptor-types" -version = "0.1.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ "bitflags 2.13.1", ] @@ -3907,26 +3821,36 @@ checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "cfg-if", "crunchy", + "num-traits", "zerocopy", ] +[[package]] +name = "harfrust" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c020db12c71d8a12a3fe7607873cade3a01a6287e29d540c8723276221b9d8" +dependencies = [ + "bitflags 2.13.1", + "bytemuck", + "core_maths", + "read-fonts 0.35.0", + "smallvec", +] + [[package]] name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "ahash 0.8.12", - "allocator-api2", + "foldhash 0.1.5", ] [[package]] @@ -3937,7 +3861,7 @@ checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ "allocator-api2", "equivalent", - "foldhash", + "foldhash 0.2.0", "serde", "serde_core", ] @@ -3950,22 +3874,7 @@ checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" dependencies = [ "allocator-api2", "equivalent", - "foldhash", -] - -[[package]] -name = "hassle-rs" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" -dependencies = [ - "bitflags 2.13.1", - "com", - "libc", - "libloading 0.8.9", - "thiserror 1.0.69", - "widestring", - "winapi", + "foldhash 0.2.0", ] [[package]] @@ -4060,7 +3969,7 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7eee9b00ee2e599b4f86507157e3db786e7a3319fc225f0e9584151dbea2291d" dependencies = [ - "html5ever", + "html5ever 0.38.0", "markup5ever_rcdom", "phf 0.13.1", ] @@ -4078,7 +3987,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" dependencies = [ "log", - "markup5ever", + "markup5ever 0.38.0", +] + +[[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]] @@ -4241,44 +4160,55 @@ dependencies = [ [[package]] name = "iced" -version = "0.13.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88acfabc84ec077eaf9ede3457ffa3a104626d79022a9bf7f296093b1d60c73f" +checksum = "000e01026c93ba643f8357a3db3ada0e6555265a377f6f9291c472f6dd701fb3" dependencies = [ "iced_core", + "iced_debug", "iced_futures", "iced_renderer", + "iced_runtime", "iced_widget", "iced_winit", - "image 0.24.9", - "thiserror 1.0.69", + "image", + "thiserror 2.0.19", ] [[package]] name = "iced_core" -version = "0.13.2" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0013a238275494641bf8f1732a23a808196540dc67b22ff97099c044ae4c8a1c" +checksum = "91ab1937d699403e7e69252ae743a902bcee9f4ab2052cc4c9a46fcf34729d85" dependencies = [ "bitflags 2.13.1", "bytes", - "dark-light", "glam", + "lilt", "log", "num-traits", - "once_cell", - "palette", "rustc-hash 2.1.3", "smol_str", - "thiserror 1.0.69", + "thiserror 2.0.19", "web-time", ] [[package]] -name = "iced_futures" -version = "0.13.2" +name = "iced_debug" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c04a6745ba2e80f32cf01e034fd00d853aa4f4cd8b91888099cb7aaee0d5d7c" +checksum = "25035ab0215a620e53f4103e36fc4e59a1fb2817e4bfc38a30ad27b4202ea0be" +dependencies = [ + "iced_core", + "iced_futures", + "log", +] + +[[package]] +name = "iced_futures" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c0c85ccad42dfbec7293c36c018af0ea0dbcc52d137a4a9a0b0f6822a3fdf0a" dependencies = [ "futures", "iced_core", @@ -4286,27 +4216,14 @@ dependencies = [ "rustc-hash 2.1.3", "tokio", "wasm-bindgen-futures", - "wasm-timer", -] - -[[package]] -name = "iced_glyphon" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41c3bb56f1820ca252bc1d0994ece33d233a55657c0c263ea7cb16895adbde82" -dependencies = [ - "cosmic-text", - "etagere", - "lru 0.12.5", - "rustc-hash 2.1.3", - "wgpu", + "wasmtimer", ] [[package]] name = "iced_graphics" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba25a18cfa6d5cc160aca7e1b34f73ccdff21680fa8702168c09739767b6c66f" +checksum = "234ca1c2cec4155055f68fa5fad1b5242c496ac8238d80a259bca382fb44a102" dependencies = [ "bitflags 2.13.1", "bytemuck", @@ -4314,51 +4231,61 @@ dependencies = [ "half", "iced_core", "iced_futures", - "image 0.24.9", + "image", "kamadak-exif", "log", "lyon_path", - "once_cell", "raw-window-handle", "rustc-hash 2.1.3", - "thiserror 1.0.69", + "thiserror 2.0.19", "unicode-segmentation", ] [[package]] -name = "iced_renderer" -version = "0.13.0" +name = "iced_program" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73558208059f9e622df2bf434e044ee2f838ce75201a023cf0ca3e1244f46c2a" +checksum = "6dfafec2947cda688d8eb00dac337ba11aa60f9ef6335aed343e189d26e4a673" +dependencies = [ + "iced_graphics", + "iced_runtime", +] + +[[package]] +name = "iced_renderer" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250cc0802408e8c077986ec56c7d07c65f423ee658a4b9fd795a1f2aae5dac05" dependencies = [ "iced_graphics", "iced_tiny_skia", "iced_wgpu", "log", - "thiserror 1.0.69", + "thiserror 2.0.19", ] [[package]] name = "iced_runtime" -version = "0.13.2" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "348b5b2c61c934d88ca3b0ed1ed913291e923d086a66fa288ce9669da9ef62b5" +checksum = "d1889b819ce4c06674183242e336c8d49465665441396914dc07cc86f44fa8d4" dependencies = [ "bytes", "iced_core", "iced_futures", "raw-window-handle", - "thiserror 1.0.69", + "thiserror 2.0.19", ] [[package]] name = "iced_tiny_skia" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c625d368284fcc43b0b36b176f76eff1abebe7959dd58bd8ce6897d641962a50" +checksum = "fe0acf8b75a3bc914aff5f2329fdffc1b36eeaea29dda0e4bd232f1c62e9cc3d" dependencies = [ "bytemuck", "cosmic-text", + "iced_debug", "iced_graphics", "kurbo 0.10.4", "log", @@ -4370,59 +4297,56 @@ dependencies = [ [[package]] name = "iced_wgpu" -version = "0.13.5" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15708887133671d2bcc6c1d01d1f176f43a64d6cdc3b2bf893396c3ee498295f" +checksum = "ff144a999b0ca0f8a10257934500060240825c42e950ec0ebee9c8ae30561c13" dependencies = [ "bitflags 2.13.1", "bytemuck", + "cryoglyph", "futures", "glam", "guillotiere", - "iced_glyphon", + "iced_debug", "iced_graphics", "log", "lyon", - "once_cell", "resvg", "rustc-hash 2.1.3", - "thiserror 1.0.69", + "thiserror 2.0.19", "wgpu", ] [[package]] name = "iced_widget" -version = "0.13.4" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81429e1b950b0e4bca65be4c4278fea6678ea782030a411778f26fa9f8983e1d" +checksum = "b1596afa0d3109c2618e8bc12bae6c11d3064df8f95c42dfce570397dbe957ab" dependencies = [ "iced_renderer", - "iced_runtime", + "log", "num-traits", - "once_cell", - "pulldown-cmark 0.11.3", + "pulldown-cmark 0.12.2", "rustc-hash 2.1.3", - "thiserror 1.0.69", + "thiserror 2.0.19", "unicode-segmentation", - "url", ] [[package]] name = "iced_winit" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f44cd4e1c594b6334f409282937bf972ba14d31fedf03c23aa595d982a2fda28" +checksum = "8b7dbedc47562d1de3b9707d939f678b88c382004b7ab5a18f7a7dd723162d75" dependencies = [ - "iced_futures", - "iced_graphics", - "iced_runtime", + "iced_debug", + "iced_program", "log", + "mundy", "rustc-hash 2.1.3", - "thiserror 1.0.69", + "thiserror 2.0.19", "tracing", "wasm-bindgen-futures", "web-sys", - "winapi", "window_clipboard", "winit", ] @@ -4546,24 +4470,6 @@ dependencies = [ "icu_properties", ] -[[package]] -name = "image" -version = "0.24.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" -dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "exr", - "gif 0.13.3", - "jpeg-decoder", - "num-traits", - "png 0.17.16", - "qoi", - "tiff 0.9.1", -] - [[package]] name = "image" version = "0.25.10" @@ -4583,9 +4489,9 @@ dependencies = [ "ravif", "rayon", "rgb", - "tiff 0.11.3", - "zune-core", - "zune-jpeg", + "tiff", + "zune-core 0.5.1", + "zune-jpeg 0.5.15", ] [[package]] @@ -4600,9 +4506,9 @@ dependencies = [ [[package]] name = "imagesize" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284" +checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" [[package]] name = "imgref" @@ -4663,7 +4569,7 @@ checksum = "9433806cd6b4ec1aba79c021c7e4c58fb4c3b9977c085062e611ac929998fb0c" dependencies = [ "console", "portable-atomic", - "unicode-width 0.2.2", + "unicode-width", "unit-prefix", "web-time", ] @@ -4700,15 +4606,6 @@ dependencies = [ "syn 2.0.119", ] -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - [[package]] name = "internal-russh-num-bigint" version = "0.5.0" @@ -4913,15 +4810,6 @@ dependencies = [ "libc", ] -[[package]] -name = "jpeg-decoder" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" -dependencies = [ - "rayon", -] - [[package]] name = "js-sys" version = "0.3.103" @@ -4935,9 +4823,9 @@ dependencies = [ [[package]] name = "kamadak-exif" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4fc70d0ab7e5b6bafa30216a6b48705ea964cdfc29c050f2412295eba58077" +checksum = "1130d80c7374efad55a117d715a3af9368f0fa7a2c54573afc15a188cd984837" dependencies = [ "mutate_once", ] @@ -5006,7 +4894,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" dependencies = [ "libc", - "libloading 0.8.9", + "libloading", "pkg-config", ] @@ -5168,16 +5056,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" @@ -5246,6 +5124,15 @@ dependencies = [ "x11", ] +[[package]] +name = "lilt" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "337d4c256f7d9f2dbd633891d48ace853efa5b1554122d9220b172ad9c03c3a9" +dependencies = [ + "web-time", +] + [[package]] name = "line-clipping" version = "0.3.7" @@ -5255,6 +5142,12 @@ dependencies = [ "bitflags 2.13.1", ] +[[package]] +name = "linebender_resource_handle" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4" + [[package]] name = "link-cplusplus" version = "1.0.12" @@ -5276,12 +5169,6 @@ version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" -[[package]] -name = "linux-raw-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" - [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -5394,9 +5281,9 @@ checksum = "00aad58f6ec3990e795943872f13651e7a5fa59dca2c8f31a74faf8a0e0fb652" dependencies = [ "bitflags 2.13.1", "cfg-if", - "cssparser", + "cssparser 0.36.0", "encoding_rs", - "foldhash", + "foldhash 0.2.0", "hashbrown 0.17.1", "memchr", "mime", @@ -5416,9 +5303,9 @@ dependencies = [ [[package]] name = "lru" -version = "0.12.5" +version = "0.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" [[package]] name = "lru" @@ -5558,14 +5445,25 @@ dependencies = [ "web_atoms", ] +[[package]] +name = "markup5ever" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7122d987ec5f704ee56f6e5b41a7d93722e9aae27ae07cafa4036c4d3f9757de" +dependencies = [ + "log", + "tendril", + "web_atoms", +] + [[package]] name = "markup5ever_rcdom" version = "0.38.0+unofficial" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "333171ccdf66e915257740d44e38ea5b1b19ce7b45d33cc35cb6f118fbd981ff" dependencies = [ - "html5ever", - "markup5ever", + "html5ever 0.38.0", + "markup5ever 0.38.0", "tendril", "xml5ever", ] @@ -5634,13 +5532,13 @@ dependencies = [ [[package]] name = "metal" -version = "0.27.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" +checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" dependencies = [ "bitflags 2.13.1", "block", - "core-graphics-types", + "core-graphics-types 0.2.0", "foreign-types", "log", "objc", @@ -5752,7 +5650,7 @@ dependencies = [ "module-lattice", "pkcs8", "rand_core 0.10.1", - "sha3", + "sha3 0.11.0", ] [[package]] @@ -5767,7 +5665,7 @@ dependencies = [ "libc", "mlua-sys", "num-traits", - "parking_lot 0.12.5", + "parking_lot", "rustc-hash 2.1.3", "serde", "serde-value", @@ -5832,22 +5730,48 @@ dependencies = [ [[package]] name = "muda" -version = "0.15.3" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdae9c00e61cc0579bcac625e8ad22104c60548a025bfc972dc83868a28e1484" +checksum = "1dd04e60bc0b07438a6771710ee1698f98f6ebbc7f89b61264af1563b8aeb878" dependencies = [ "crossbeam-channel", "dpi", "gtk", "keyboard-types", "libxdo", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-foundation 0.3.2", "once_cell", - "png 0.17.16", - "thiserror 1.0.69", - "windows-sys 0.59.0", + "png 0.18.1", + "thiserror 2.0.19", + "windows-sys 0.61.2", +] + +[[package]] +name = "mundy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f32eb0db40f2df2bcfb05c93b8f73938d4c26ce9ac8881f1df0c8d3296921a73" +dependencies = [ + "android-build", + "async-io", + "cfg-if", + "dispatch", + "futures-channel", + "futures-lite", + "jni 0.22.4", + "ndk-context", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", + "pin-project-lite", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.62.2", + "zbus", ] [[package]] @@ -5858,22 +5782,28 @@ checksum = "13d2233c9842d08cfe13f9eac96e207ca6a2ea10b80259ebe8ad0268be27d2af" [[package]] name = "naga" -version = "0.19.2" +version = "27.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e3524642f53d9af419ab5e8dd29d3ba155708267667c2f3f06c88c9e130843" +checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" dependencies = [ - "bit-set 0.5.3", + "arrayvec", + "bit-set 0.8.0", "bitflags 2.13.1", - "codespan-reporting 0.11.1", + "cfg-if", + "cfg_aliases", + "codespan-reporting 0.12.0", + "half", + "hashbrown 0.16.1", "hexf-parse", "indexmap 2.14.0", + "libm", "log", "num-traits", + "once_cell", "rustc-hash 1.1.0", "spirv", - "termcolor", - "thiserror 1.0.69", - "unicode-xid", + "thiserror 2.0.19", + "unicode-ident", ] [[package]] @@ -5900,7 +5830,7 @@ dependencies = [ "bitflags 2.13.1", "jni-sys 0.3.1", "log", - "ndk-sys 0.6.0+11769913", + "ndk-sys", "num_enum", "raw-window-handle", "thiserror 1.0.69", @@ -5912,15 +5842,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" -[[package]] -name = "ndk-sys" -version = "0.5.0+25.2.9519653" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" -dependencies = [ - "jni-sys 0.3.1", -] - [[package]] name = "ndk-sys" version = "0.6.0+11769913" @@ -5944,7 +5865,7 @@ checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ "bitflags 2.13.1", "cfg-if", - "cfg_aliases 0.2.2", + "cfg_aliases", "libc", "memoffset", ] @@ -5957,7 +5878,7 @@ checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" dependencies = [ "bitflags 2.13.1", "cfg-if", - "cfg_aliases 0.2.2", + "cfg_aliases", "libc", ] @@ -6109,7 +6030,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", - "objc_exception", ] [[package]] @@ -6148,8 +6068,8 @@ dependencies = [ "block2 0.5.1", "libc", "objc2 0.5.2", - "objc2-core-data", - "objc2-core-image", + "objc2-core-data 0.2.2", + "objc2-core-image 0.2.2", "objc2-foundation 0.2.2", "objc2-quartz-core 0.2.2", ] @@ -6162,9 +6082,17 @@ checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ "bitflags 2.13.1", "block2 0.6.2", + "libc", "objc2 0.6.4", + "objc2-cloud-kit 0.3.2", + "objc2-core-data 0.3.2", "objc2-core-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]] @@ -6180,6 +6108,17 @@ dependencies = [ "objc2-foundation 0.2.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.1", + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + [[package]] name = "objc2-contacts" version = "0.2.2" @@ -6203,6 +6142,17 @@ dependencies = [ "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.1", + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + [[package]] name = "objc2-core-foundation" version = "0.3.2" @@ -6239,6 +6189,16 @@ dependencies = [ "objc2-metal", ] +[[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.2.2" @@ -6263,6 +6223,31 @@ dependencies = [ "objc2-security", ] +[[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.1", + "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.1", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-io-surface", +] + [[package]] name = "objc2-encode" version = "4.1.0" @@ -6395,9 +6380,9 @@ dependencies = [ "bitflags 2.13.1", "block2 0.5.1", "objc2 0.5.2", - "objc2-cloud-kit", - "objc2-core-data", - "objc2-core-image", + "objc2-cloud-kit 0.2.2", + "objc2-core-data 0.2.2", + "objc2-core-image 0.2.2", "objc2-core-location", "objc2-foundation 0.2.2", "objc2-link-presentation", @@ -6457,15 +6442,6 @@ dependencies = [ "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]] name = "once_cell" version = "1.21.4" @@ -6553,16 +6529,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "ordered-multimap" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" -dependencies = [ - "dlv-list", - "hashbrown 0.12.3", -] - [[package]] name = "ordered-stream" version = "0.2.0" @@ -6609,14 +6575,14 @@ version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" dependencies = [ - "ttf-parser 0.25.1", + "ttf-parser", ] [[package]] name = "p256" -version = "0.14.0-rc.15" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bb40a5099e2c38a09dd29321a7a7f045f165a54317679c7cdfb0cbaf8f6b1e" +checksum = "d2c9239b2dbc807adbbe147e8cf72ea7450c3a0aabe62cb8e75ff4ec22e1f72a" dependencies = [ "ecdsa", "elliptic-curve", @@ -6627,9 +6593,9 @@ dependencies = [ [[package]] name = "p384" -version = "0.14.0-rc.15" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "492f329d7eb11d22dadc988626b9ea1f503b4ab043a8b1e4e2cc4ae45dabdd70" +checksum = "d17b851e6b3e378ab4ecb07fa2ed23f4d15f075735f8fec9fa1e7bdce5f8301f" dependencies = [ "ecdsa", "elliptic-curve", @@ -6641,9 +6607,9 @@ dependencies = [ [[package]] name = "p521" -version = "0.14.0-rc.15" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff42e4ace5424e3b6d7cb82514be89866b85af87015f80341e37dcc21a66ce6e" +checksum = "4ad64cc32c2dc466317c12ee5853e61f159f9eab1fe7efade0395dc2e7b43449" dependencies = [ "base16ct", "ecdsa", @@ -6735,7 +6701,6 @@ dependencies = [ "fast-srgb8", "libm", "palette_derive", - "phf 0.11.3", ] [[package]] @@ -6781,17 +6746,6 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - [[package]] name = "parking_lot" version = "0.12.5" @@ -6799,21 +6753,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", - "parking_lot_core 0.9.12", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", + "parking_lot_core", ] [[package]] @@ -7146,7 +7086,7 @@ checksum = "7da1d65da6dd5d1e44199ac0f58712d241c0f439f80adea8924d832384087f85" dependencies = [ "base64 0.22.1", "indexmap 2.14.0", - "quick-xml 0.41.0", + "quick-xml", "serde", "time", ] @@ -7408,9 +7348,9 @@ dependencies = [ [[package]] name = "pulldown-cmark" -version = "0.11.3" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "679341d22c78c6c649893cbd6c3278dcbe9fc4faa62fea3a9296ae2b50c14625" +checksum = "f86ba2052aebccc42cbbb3ed234b8b13ce76f75c3551a303cb2bcffcff12bb14" dependencies = [ "bitflags 2.13.1", "getopts", @@ -7490,7 +7430,7 @@ checksum = "c98fecda8b16396ff9adac67644a523dd1778c42b58606a29df5c31ca925d174" dependencies = [ "bitvec", "bytemuck", - "image 0.25.10", + "image", "libm", "num-traits", "ordered-float 5.3.0", @@ -7508,15 +7448,6 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" -[[package]] -name = "quick-xml" -version = "0.39.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" -dependencies = [ - "memchr", -] - [[package]] name = "quick-xml" version = "0.41.0" @@ -7533,7 +7464,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" dependencies = [ "bytes", - "cfg_aliases 0.2.2", + "cfg_aliases", "pin-project-lite", "quinn-proto", "quinn-udp", @@ -7574,7 +7505,7 @@ version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" dependencies = [ - "cfg_aliases 0.2.2", + "cfg_aliases", "libc", "once_cell", "socket2 0.6.5", @@ -7750,7 +7681,7 @@ dependencies = [ "thiserror 2.0.19", "unicode-segmentation", "unicode-truncate", - "unicode-width 0.2.2", + "unicode-width", ] [[package]] @@ -7773,7 +7704,7 @@ checksum = "e000b7a22eae639460bc6ec8bb1cc689ecae5b0ed21935cd7d7dd52d38270c86" dependencies = [ "base64-simd", "icy_sixel", - "image 0.25.10", + "image", "rand 0.8.7", "ratatui", "rustix 0.38.44", @@ -7830,7 +7761,7 @@ dependencies = [ "strum", "time", "unicode-segmentation", - "unicode-width 0.2.2", + "unicode-width", ] [[package]] @@ -7937,12 +7868,24 @@ dependencies = [ [[package]] name = "read-fonts" -version = "0.22.7" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69aacb76b5c29acfb7f90155d39759a29496aebb49395830e928a9703d2eec2f" +checksum = "6717cf23b488adf64b9d711329542ba34de147df262370221940dfabc2c91358" dependencies = [ "bytemuck", - "font-types", + "core_maths", + "font-types 0.10.1", +] + +[[package]] +name = "read-fonts" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046a7d674daf459825b32f5062056d6882db0d2f5a479fbd76ccfc870ac18709" +dependencies = [ + "bytemuck", + "font-types 0.12.2", + "once_cell", ] [[package]] @@ -7951,15 +7894,6 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.4.1" @@ -8120,18 +8054,19 @@ dependencies = [ [[package]] name = "resvg" -version = "0.42.0" +version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "944d052815156ac8fa77eaac055220e95ba0b01fa8887108ca710c03805d9051" +checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43" dependencies = [ "gif 0.13.3", - "jpeg-decoder", + "image-webp", "log", "pico-args", "rgb", "svgtypes", "tiny-skia", "usvg", + "zune-jpeg 0.4.21", ] [[package]] @@ -8267,9 +8202,9 @@ dependencies = [ [[package]] name = "russh" -version = "0.62.2" +version = "0.62.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6c3c1dd0a9ad3a9915a2f6e907d158f9a7e9ac32ddc772b003faafc027d9a8" +checksum = "da7c230e0ed9cbeb92fbad6c8848985d6df2a1464c0dc247a021abd666e9005e" dependencies = [ "aes", "aws-lc-rs", @@ -8322,9 +8257,9 @@ dependencies = [ "salsa20", "scrypt", "sec1", - "sha1 0.11.0", + "sha1", "sha2 0.11.0", - "sha3", + "sha3 0.12.0", "signature", "spki", "ssh-encoding", @@ -8361,16 +8296,6 @@ dependencies = [ "wasm-bindgen-futures", ] -[[package]] -name = "rust-ini" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df" -dependencies = [ - "cfg-if", - "ordered-multimap", -] - [[package]] name = "rust-patch" version = "0.1.3" @@ -8493,15 +8418,16 @@ checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "rustybuzz" -version = "0.14.1" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" +checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" dependencies = [ "bitflags 2.13.1", "bytemuck", - "libm", + "core_maths", + "log", "smallvec", - "ttf-parser 0.21.1", + "ttf-parser", "unicode-bidi-mirroring", "unicode-ccc", "unicode-properties", @@ -8650,12 +8576,12 @@ dependencies = [ [[package]] name = "selectors" -version = "0.36.1" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" +checksum = "2cfaaa6035167f0e604e42723c7650d59ee269ef220d7bbe0565602c8a0173b9" dependencies = [ "bitflags 2.13.1", - "cssparser", + "cssparser 0.36.0", "derive_more", "log", "new_debug_unreachable", @@ -8669,12 +8595,12 @@ dependencies = [ [[package]] name = "selectors" -version = "0.37.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cfaaa6035167f0e604e42723c7650d59ee269ef220d7bbe0565602c8a0173b9" +checksum = "8adfa1c298912827b8a28b223b3b874357397ae706e6190acd9bf28cee99114d" dependencies = [ "bitflags 2.13.1", - "cssparser", + "cssparser 0.37.0", "derive_more", "log", "new_debug_unreachable", @@ -8858,17 +8784,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "sha1" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "digest 0.10.7", -] - [[package]] name = "sha1" version = "0.11.0" @@ -8912,6 +8827,17 @@ dependencies = [ "keccak", ] +[[package]] +name = "sha3" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc9bad02c26382724b2d2692c6f179285e4b54eeecd7968f52a50059c3c11759" +dependencies = [ + "digest 0.11.3", + "keccak", + "sponge-cursor", +] + [[package]] name = "shlex" version = "2.0.1" @@ -9007,12 +8933,22 @@ checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] name = "skrifa" -version = "0.22.3" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1c44ad1f6c5bdd4eefed8326711b7dbda9ea45dfd36068c427d332aa382cbe" +checksum = "8c31071dedf532758ecf3fed987cdb4bd9509f900e026ab684b4ecb81ea49841" dependencies = [ "bytemuck", - "read-fonts", + "read-fonts 0.35.0", +] + +[[package]] +name = "skrifa" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819ab7d62b1d3e72d9d9dea5650bac30424f9111364bb94928dbf5ecad1baa68" +dependencies = [ + "bytemuck", + "read-fonts 0.41.0", ] [[package]] @@ -9147,7 +9083,6 @@ checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" dependencies = [ "as-raw-xcb-connection", "bytemuck", - "drm", "fastrand", "js-sys", "memmap2", @@ -9228,6 +9163,12 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "sponge-cursor" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a0219bd7d979d58245a4f41f695e1ac9f8befdffadd7f61f1bae9e39abc6620" + [[package]] name = "sqlite-wasm-rs" version = "0.5.5" @@ -9291,7 +9232,7 @@ dependencies = [ "rand_core 0.10.1", "rsa", "sec1", - "sha1 0.11.0", + "sha1", "sha2 0.11.0", "signature", "ssh-cipher", @@ -9333,7 +9274,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" dependencies = [ "new_debug_unreachable", - "parking_lot 0.12.5", + "parking_lot", "phf_shared 0.13.1", "precomputed-hash", "serde", @@ -9402,11 +9343,11 @@ dependencies = [ [[package]] name = "swash" -version = "0.1.19" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbd59f3f359ddd2c95af4758c18270eddd9c730dde98598023cdabff472c2ca2" +checksum = "6c2499c2d826531388872b2268718aed907a39bd785ab0dcfe57fab26283f92e" dependencies = [ - "skrifa", + "skrifa 0.44.0", "yazi", "zeno", ] @@ -9509,9 +9450,9 @@ dependencies = [ [[package]] name = "tao-macros" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +checksum = "5f7eeb6d99155545da6150a1795945f16ac9c178deb2a5f2e74d776107bd5849" dependencies = [ "proc-macro2", "quote", @@ -9568,7 +9509,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9048a889effe34a5cddee0af7f53285198b16dca3be510858d38dfdb3e62a04e" dependencies = [ "bitflags 2.13.1", - "parking_lot 0.12.5", + "parking_lot", "rustix 1.1.4", "signal-hook", "windows-sys 0.61.2", @@ -9677,17 +9618,6 @@ dependencies = [ "syn 3.0.2", ] -[[package]] -name = "tiff" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" -dependencies = [ - "flate2", - "jpeg-decoder", - "weezl", -] - [[package]] name = "tiff" version = "0.11.3" @@ -9699,7 +9629,7 @@ dependencies = [ "half", "quick-error", "weezl", - "zune-jpeg", + "zune-jpeg 0.5.15", ] [[package]] @@ -9788,7 +9718,7 @@ checksum = "a90a0ca3ee6a69f2ad28fd11621a4c3f03b371f366be500b64df260c4ffbafb4" dependencies = [ "as-raw-xcb-connection", "ctor", - "libloading 0.8.9", + "libloading", "pkg-config", "tracing", ] @@ -9825,7 +9755,7 @@ version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b238e22d44a15349529690fb07bd645cf58149a1b1e44d6cb5bd1641ff1a6223" dependencies = [ - "ahash 0.8.12", + "ahash", "aho-corasick", "compact_str", "dary_heap", @@ -9861,7 +9791,7 @@ dependencies = [ "bytes", "libc", "mio", - "parking_lot 0.12.5", + "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2 0.6.5", @@ -10114,23 +10044,14 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "ttf-parser" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" - -[[package]] -name = "ttf-parser" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8" - [[package]] name = "ttf-parser" version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" +dependencies = [ + "core_maths", +] [[package]] name = "tui-markdown" @@ -10253,15 +10174,15 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-bidi-mirroring" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cb788ffebc92c5948d0e997106233eeb1d8b9512f93f41651f52b6c5f5af86" +checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe" [[package]] name = "unicode-ccc" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df77b101bcc4ea3d78dafc5ad7e4f58ceffe0b2b16bf446aeb50b6cb4157656" +checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" [[package]] name = "unicode-ident" @@ -10319,7 +10240,7 @@ checksum = "16b380a1238663e5f8a691f9039c73e1cdae598a30e9855f541d29b08b53e9a5" dependencies = [ "itertools 0.14.0", "unicode-segmentation", - "unicode-width 0.2.2", + "unicode-width", ] [[package]] @@ -10328,12 +10249,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - [[package]] name = "unicode-width" version = "0.2.2" @@ -10451,14 +10366,14 @@ dependencies = [ [[package]] name = "usvg" -version = "0.42.0" +version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b84ea542ae85c715f07b082438a4231c3760539d902e11d093847a0b22963032" +checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" dependencies = [ "base64 0.22.1", "data-url", "flate2", - "fontdb 0.18.0", + "fontdb", "imagesize", "kurbo 0.11.3", "log", @@ -10660,18 +10575,17 @@ dependencies = [ ] [[package]] -name = "wasm-timer" -version = "0.2.5" +name = "wasmtimer" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" +checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" dependencies = [ "futures", "js-sys", - "parking_lot 0.11.2", + "parking_lot", "pin-utils", + "slab", "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", ] [[package]] @@ -10803,12 +10717,12 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.10" +version = "0.31.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c324a910fd86ebdc364a3e61ec1f11737d3b1d6c273c0239ee8ff4bc0d24b4a" +checksum = "338e30461b3a2b67d70eb30a6d89f8e0c93a833e07d2ae89085cd070c4a00ac0" dependencies = [ "proc-macro2", - "quick-xml 0.39.4", + "quick-xml", "quote", ] @@ -11034,17 +10948,21 @@ dependencies = [ [[package]] name = "wgpu" -version = "0.19.4" +version = "27.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbd7311dbd2abcfebaabf1841a2824ed7c8be443a0f29166e5d3c6a53a762c01" +checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77" dependencies = [ "arrayvec", + "bitflags 2.13.1", "cfg-if", - "cfg_aliases 0.1.1", + "cfg_aliases", + "document-features", + "hashbrown 0.16.1", "js-sys", "log", "naga", - "parking_lot 0.12.5", + "parking_lot", + "portable-atomic", "profiling", "raw-window-handle", "smallvec", @@ -11059,83 +10977,123 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "0.19.4" +version = "27.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b94525fc99ba9e5c9a9e24764f2bc29bad0911a7446c12f446a8277369bf3a" +checksum = "27a75de515543b1897b26119f93731b385a19aea165a1ec5f0e3acecc229cae7" dependencies = [ "arrayvec", - "bit-vec 0.6.3", + "bit-set 0.8.0", + "bit-vec 0.8.0", "bitflags 2.13.1", - "cfg_aliases 0.1.1", - "codespan-reporting 0.11.1", + "bytemuck", + "cfg_aliases", + "document-features", + "hashbrown 0.16.1", "indexmap 2.14.0", "log", "naga", "once_cell", - "parking_lot 0.12.5", + "parking_lot", + "portable-atomic", "profiling", "raw-window-handle", "rustc-hash 1.1.0", "smallvec", - "thiserror 1.0.69", - "web-sys", + "thiserror 2.0.19", + "wgpu-core-deps-apple", + "wgpu-core-deps-emscripten", + "wgpu-core-deps-windows-linux-android", "wgpu-hal", "wgpu-types", ] [[package]] -name = "wgpu-hal" -version = "0.19.5" +name = "wgpu-core-deps-apple" +version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfabcfc55fd86611a855816326b2d54c3b2fd7972c27ce414291562650552703" +checksum = "0772ae958e9be0c729561d5e3fd9a19679bcdfb945b8b1a1969d9bfe8056d233" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-emscripten" +version = "27.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06ac3444a95b0813ecfd81ddb2774b66220b264b3e2031152a4a29fda4da6b5" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-windows-linux-android" +version = "27.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71197027d61a71748e4120f05a9242b2ad142e3c01f8c1b47707945a879a03c3" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-hal" +version = "27.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b21cb61c57ee198bc4aff71aeadff4cbb80b927beb912506af9c780d64313ce" dependencies = [ "android_system_properties", "arrayvec", "ash", - "bit-set 0.5.3", + "bit-set 0.8.0", "bitflags 2.13.1", "block", - "cfg_aliases 0.1.1", - "core-graphics-types", - "d3d12", + "bytemuck", + "cfg-if", + "cfg_aliases", + "core-graphics-types 0.2.0", "glow", "glutin_wgl_sys", "gpu-alloc", "gpu-allocator", "gpu-descriptor", - "hassle-rs", + "hashbrown 0.16.1", "js-sys", "khronos-egl", "libc", - "libloading 0.8.9", + "libloading", "log", "metal", "naga", - "ndk-sys 0.5.0+25.2.9519653", + "ndk-sys", "objc", "once_cell", - "parking_lot 0.12.5", + "ordered-float 5.3.0", + "parking_lot", + "portable-atomic", + "portable-atomic-util", "profiling", "range-alloc", "raw-window-handle", "renderdoc-sys", - "rustc-hash 1.1.0", "smallvec", - "thiserror 1.0.69", + "thiserror 2.0.19", "wasm-bindgen", "web-sys", "wgpu-types", - "winapi", + "windows 0.58.0", + "windows-core 0.58.0", ] [[package]] name = "wgpu-types" -version = "0.19.2" +version = "27.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b671ff9fb03f78b46ff176494ee1ebe7d603393f42664be55b64dc8d53969805" +checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" dependencies = [ "bitflags 2.13.1", + "bytemuck", "js-sys", + "log", + "thiserror 2.0.19", "web-sys", ] @@ -11158,12 +11116,6 @@ dependencies = [ "safe_arch", ] -[[package]] -name = "widestring" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" - [[package]] name = "winapi" version = "0.3.9" @@ -11197,26 +11149,16 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "window_clipboard" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6d692d46038c433f9daee7ad8757e002a4248c20b0a3fbc991d99521d3bcb6d" +checksum = "d5654226305eaf2dde8853fb482861d28e5dcecbbd40cb88e8393d94bb80d733" dependencies = [ "clipboard-win", "clipboard_macos", "clipboard_wayland", "clipboard_x11", "raw-window-handle", - "thiserror 1.0.69", -] - -[[package]] -name = "windows" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" -dependencies = [ - "windows-core 0.52.0", - "windows-targets 0.52.6", + "thiserror 2.0.19", ] [[package]] @@ -11272,15 +11214,6 @@ dependencies = [ "windows-core 0.62.2", ] -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-core" version = "0.58.0" @@ -11803,14 +11736,14 @@ version = "0.30.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6755fa58a9f8350bd1e472d4c3fcc25f824ec358933bba33306d0b63df5978d" dependencies = [ - "ahash 0.8.12", + "ahash", "android-activity", "atomic-waker", "bitflags 2.13.1", "block2 0.5.1", "bytemuck", "calloop 0.13.0", - "cfg_aliases 0.2.2", + "cfg_aliases", "concurrent-queue", "core-foundation 0.9.4", "core-graphics", @@ -11873,15 +11806,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -dependencies = [ - "winapi", -] - [[package]] name = "winresource" version = "0.1.31" @@ -11917,9 +11841,9 @@ checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "wry" -version = "0.55.1" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186f9871daa55fd9c016578b810d149de58367113db7fb72b462d2323ce19514" +checksum = "1730ab21a962e7ff44df17d20804572beee66d998afc7fcbc3f846a3a12dbda7" dependencies = [ "base64 0.22.1", "block2 0.6.2", @@ -11998,7 +11922,7 @@ dependencies = [ "as-raw-xcb-connection", "gethostname", "libc", - "libloading 0.8.9", + "libloading", "once_cell", "rustix 1.1.4", "x11rb-protocol", @@ -12016,16 +11940,6 @@ version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" -[[package]] -name = "xdg-home" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - [[package]] name = "xkbcommon-dl" version = "0.4.2" @@ -12058,7 +11972,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3dc9559429edf0cd3f327cc0afd9d6b36fa8cec6d93107b7fbe64f806b5f2d9" dependencies = [ "log", - "markup5ever", + "markup5ever 0.38.0", ] [[package]] @@ -12090,9 +12004,9 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "yazi" -version = "0.1.6" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c94451ac9513335b5e23d7a8a2b61a7102398b8cca5160829d313e84c9d98be1" +checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" [[package]] name = "yoke" @@ -12117,44 +12031,6 @@ dependencies = [ "synstructure", ] -[[package]] -name = "zbus" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" -dependencies = [ - "async-broadcast", - "async-executor", - "async-fs", - "async-io", - "async-lock", - "async-process", - "async-recursion", - "async-task", - "async-trait", - "blocking", - "enumflags2", - "event-listener", - "futures-core", - "futures-sink", - "futures-util", - "hex", - "nix 0.29.0", - "ordered-stream", - "rand 0.8.7", - "serde", - "serde_repr", - "sha1 0.10.7", - "static_assertions", - "tracing", - "uds_windows", - "windows-sys 0.52.0", - "xdg-home", - "zbus_macros 4.4.0", - "zbus_names 3.0.0", - "zvariant 4.2.0", -] - [[package]] name = "zbus" version = "5.18.0" @@ -12185,22 +12061,9 @@ dependencies = [ "uuid", "windows-sys 0.61.2", "winnow 1.0.4", - "zbus_macros 5.18.0", - "zbus_names 4.3.4", - "zvariant 5.13.1", -] - -[[package]] -name = "zbus_macros" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" -dependencies = [ - "proc-macro-crate 3.5.0", - "proc-macro2", - "quote", - "syn 2.0.119", - "zvariant_utils 2.1.0", + "zbus_macros", + "zbus_names", + "zvariant", ] [[package]] @@ -12213,20 +12076,9 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.119", - "zbus_names 4.3.4", - "zvariant 5.13.1", - "zvariant_utils 3.5.0", -] - -[[package]] -name = "zbus_names" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" -dependencies = [ - "serde", - "static_assertions", - "zvariant 4.2.0", + "zbus_names", + "zvariant", + "zvariant_utils", ] [[package]] @@ -12237,14 +12089,14 @@ checksum = "d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e" dependencies = [ "serde", "winnow 1.0.4", - "zvariant 5.13.1", + "zvariant", ] [[package]] name = "zeno" -version = "0.2.3" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd15f8e0dbb966fd9245e7498c7e9e5055d9e5c8b676b95bd67091cd11a1e697" +checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" [[package]] name = "zerocopy" @@ -12375,6 +12227,12 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + [[package]] name = "zune-core" version = "0.5.1" @@ -12390,26 +12248,22 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "zune-jpeg" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" +dependencies = [ + "zune-core 0.4.12", +] + [[package]] name = "zune-jpeg" version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" dependencies = [ - "zune-core", -] - -[[package]] -name = "zvariant" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" -dependencies = [ - "endi", - "enumflags2", - "serde", - "static_assertions", - "zvariant_derive 4.2.0", + "zune-core 0.5.1", ] [[package]] @@ -12423,21 +12277,8 @@ dependencies = [ "serde", "url", "winnow 1.0.4", - "zvariant_derive 5.13.1", - "zvariant_utils 3.5.0", -] - -[[package]] -name = "zvariant_derive" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" -dependencies = [ - "proc-macro-crate 3.5.0", - "proc-macro2", - "quote", - "syn 2.0.119", - "zvariant_utils 2.1.0", + "zvariant_derive", + "zvariant_utils", ] [[package]] @@ -12450,18 +12291,7 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.119", - "zvariant_utils 3.5.0", -] - -[[package]] -name = "zvariant_utils" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", + "zvariant_utils", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 1ed0322..831a1a4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -61,21 +61,21 @@ url = "2.5" fastembed = { version = "5.17.3", default-features = false, features = ["hf-hub-rustls-tls", "ort-download-binaries-rustls-tls"] } usearch = "2.26" ort = { version = "=2.0.0-rc.12", default-features = false, features = ["std", "api-24", "coreml", "directml"] } -russh = "0.62.2" +russh = "0.62.5" ratatui = "0.30.2" ratatui-image = { version = "11.0.6", default-features = false, features = ["crossterm", "image-defaults"] } tui-markdown = { version = "0.3.8", default-features = false } # UI framework -iced = { version = "0.13", features = ["wgpu", "advanced", "canvas", "image", "svg", "tokio", "markdown"] } +iced = { version = "0.14", features = ["wgpu", "advanced", "canvas", "image", "svg", "tokio", "markdown"] } # Editor widget -cosmic-text = "0.12" +cosmic-text = "0.15" ropey = "1" syntect = { version = "5", default-features = false, features = ["default-fancy"] } # Platform integration (cross-platform) -muda = "0.15" +muda = "0.19.3" rfd = "0.15" # Internal crates diff --git a/crates/bds-editor/src/widget.rs b/crates/bds-editor/src/widget.rs index e6598a1..c006ac8 100644 --- a/crates/bds-editor/src/widget.rs +++ b/crates/bds-editor/src/widget.rs @@ -7,7 +7,6 @@ use iced::advanced::renderer; use iced::advanced::text; use iced::advanced::widget::{self, Widget}; use iced::advanced::{Clipboard, Shell}; -use iced::event::Status; use iced::keyboard; use iced::mouse; use iced::{Color, Element, Event, Length, Pixels, Point, Rectangle, Shadow, Size, Theme, Vector}; @@ -54,8 +53,9 @@ pub fn mono_metrics() -> &'static MonoMetrics { buffer.set_text( &mut font_system, "M", - Attrs::new().family(Family::Monospace), + &Attrs::new().family(Family::Monospace), Shaping::Advanced, + None, ); buffer.shape_until_scroll(&mut font_system, false); @@ -313,7 +313,7 @@ where } fn layout( - &self, + &mut self, _tree: &mut widget::Tree, _renderer: &Renderer, limits: &layout::Limits, @@ -350,6 +350,7 @@ where offset: Vector::new(0.0, 3.0), blur_radius: 14.0, }, + snap: true, }, theme.palette().background, ); @@ -365,6 +366,7 @@ where }, border: iced::Border::default(), shadow: iced::Shadow::default(), + snap: true, }, Color::from_rgb8(0x2B, 0x2B, 0x2B), ); @@ -465,6 +467,7 @@ where }, border: iced::Border::default(), shadow: iced::Shadow::default(), + snap: true, }, SELECTION_BG, ); @@ -489,8 +492,8 @@ where metrics.line_height, )), font, - horizontal_alignment: iced::alignment::Horizontal::Right, - vertical_alignment: iced::alignment::Vertical::Top, + align_x: iced::alignment::Horizontal::Right.into(), + align_y: iced::alignment::Vertical::Top, shaping: iced::widget::text::Shaping::Basic, wrapping: iced::widget::text::Wrapping::None, }, @@ -546,8 +549,8 @@ where metrics.line_height, )), font, - horizontal_alignment: iced::alignment::Horizontal::Left, - vertical_alignment: iced::alignment::Vertical::Top, + align_x: iced::alignment::Horizontal::Left.into(), + align_y: iced::alignment::Vertical::Top, shaping: iced::widget::text::Shaping::Advanced, wrapping: iced::widget::text::Wrapping::None, }, @@ -577,8 +580,8 @@ where metrics.line_height, )), font, - horizontal_alignment: iced::alignment::Horizontal::Left, - vertical_alignment: iced::alignment::Vertical::Top, + align_x: iced::alignment::Horizontal::Left.into(), + align_y: iced::alignment::Vertical::Top, shaping: iced::widget::text::Shaping::Advanced, wrapping: iced::widget::text::Wrapping::None, }, @@ -603,6 +606,7 @@ where }, border: iced::Border::default(), shadow: iced::Shadow::default(), + snap: true, }, CURSOR_COLOR, ); @@ -622,6 +626,7 @@ where }, border: iced::Border::default(), shadow: iced::Shadow::default(), + snap: true, }, CURSOR_COLOR, ); @@ -656,6 +661,7 @@ where }, border: iced::Border::default(), shadow: iced::Shadow::default(), + snap: true, }, SCROLLBAR_TRACK, ); @@ -674,6 +680,7 @@ where ..iced::Border::default() }, shadow: iced::Shadow::default(), + snap: true, }, if is_hover { SCROLLBAR_THUMB_HOVER @@ -684,17 +691,17 @@ where } } - fn on_event( + fn update( &mut self, tree: &mut widget::Tree, - event: Event, + event: &Event, layout: Layout<'_>, cursor: mouse::Cursor, _renderer: &Renderer, clipboard: &mut dyn Clipboard, shell: &mut Shell<'_, Message>, _viewport: &Rectangle, - ) -> Status { + ) { let state = tree.state.downcast_mut::(); let bounds = layout.bounds(); let metrics = mono_metrics(); @@ -734,11 +741,13 @@ where let new_scroll = (ratio * max_scroll as f32).round() as usize; self.buffer.borrow_mut().set_scroll(new_scroll, max_scroll); } - return Status::Captured; + shell.capture_event(); + return; } Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Left)) => { state.scrollbar_drag = None; - return Status::Captured; + shell.capture_event(); + return; } _ => {} } @@ -771,7 +780,8 @@ where state.scrollbar_drag = Some(thumb_height / 2.0); } state.is_focused = true; - return Status::Captured; + shell.capture_event(); + return; } } @@ -811,7 +821,8 @@ where state.last_click_col = col; } } - return Status::Captured; + shell.capture_event(); + return; } else { state.is_focused = false; } @@ -859,7 +870,8 @@ where buf.set_selection(anchor_line, anchor_col, clamped_line, clamped_col); buf.set_cursor(clamped_line, clamped_col); } - return Status::Captured; + shell.capture_event(); + return; } } Event::Mouse(mouse::Event::WheelScrolled { delta }) if cursor.is_over(bounds) => { @@ -872,7 +884,8 @@ where let total = total_visual_lines(&buf, cpl); let max_scroll = total.saturating_sub(vis); buf.scroll_by_clamped(lines, max_scroll); - return Status::Captured; + shell.capture_event(); + return; } Event::Keyboard(keyboard::Event::KeyPressed { key, @@ -900,7 +913,7 @@ where match key { // Cmd+Z = undo, Cmd+Shift+Z = redo - keyboard::Key::Character(ref c) if is_cmd && c.as_str() == "z" => { + keyboard::Key::Character(c) if is_cmd && c.as_str() == "z" => { { let mut buf = self.buffer.borrow_mut(); if is_shift { @@ -913,7 +926,7 @@ where self.emit_change(shell); } // Cmd+Y = redo (Windows convention) - keyboard::Key::Character(ref c) if is_cmd && c.as_str() == "y" => { + keyboard::Key::Character(c) if is_cmd && c.as_str() == "y" => { { let mut buf = self.buffer.borrow_mut(); buf.redo(); @@ -922,18 +935,18 @@ where self.emit_change(shell); } // Cmd+A = select all - keyboard::Key::Character(ref c) if is_cmd && c.as_str() == "a" => { + keyboard::Key::Character(c) if is_cmd && c.as_str() == "a" => { self.buffer.borrow_mut().select_all(); } // Cmd+C = copy - keyboard::Key::Character(ref c) if is_cmd && c.as_str() == "c" => { + keyboard::Key::Character(c) if is_cmd && c.as_str() == "c" => { let text = self.buffer.borrow().selected_text(); if !text.is_empty() { clipboard.write(iced::advanced::clipboard::Kind::Standard, text); } } // Cmd+X = cut - keyboard::Key::Character(ref c) if is_cmd && c.as_str() == "x" => { + keyboard::Key::Character(c) if is_cmd && c.as_str() == "x" => { let text = self.buffer.borrow().selected_text(); if !text.is_empty() { clipboard.write(iced::advanced::clipboard::Kind::Standard, text); @@ -942,7 +955,7 @@ where } } // Cmd+V = paste - keyboard::Key::Character(ref c) if is_cmd && c.as_str() == "v" => { + keyboard::Key::Character(c) if is_cmd && c.as_str() == "v" => { if let Some(text) = clipboard.read(iced::advanced::clipboard::Kind::Standard) { @@ -954,7 +967,7 @@ where } } // Cmd+S = save - keyboard::Key::Character(ref c) if is_cmd && c.as_str() == "s" => { + keyboard::Key::Character(c) if is_cmd && c.as_str() == "s" => { if let Some(ref on_change) = self.on_change { shell.publish((on_change)(EditorMessage::SaveRequested)); } @@ -1083,13 +1096,13 @@ where } self.emit_change(shell); } - _ => return Status::Ignored, + _ => return, } - return Status::Captured; + shell.capture_event(); + return; } _ => {} } - Status::Ignored } } diff --git a/crates/bds-ui/Cargo.toml b/crates/bds-ui/Cargo.toml index cd5bf8b..536481e 100644 --- a/crates/bds-ui/Cargo.toml +++ b/crates/bds-ui/Cargo.toml @@ -21,7 +21,7 @@ anyhow = { workspace = true } tokio = { workspace = true } uuid = { workspace = true } futures = { workspace = true } -wry = "0.55.1" +wry = "0.56.0" [target.'cfg(target_os = "macos")'.dependencies] objc2 = "0.6" diff --git a/crates/bds-ui/src/app.rs b/crates/bds-ui/src/app.rs index 6301b54..9279aff 100644 --- a/crates/bds-ui/src/app.rs +++ b/crates/bds-ui/src/app.rs @@ -1229,7 +1229,7 @@ impl BdsApp { let init_task = Task::batch([ init_task, Task::done(Message::InitMenuBar), - window::get_oldest().map(Message::MainWindowLoaded), + window::oldest().map(Message::MainWindowLoaded), ]); registry.set_enabled(MenuAction::Save, false); registry.set_enabled(MenuAction::PublishSelected, false); @@ -1459,8 +1459,12 @@ impl BdsApp { pub fn update(&mut self, message: Message) -> Task { match message { Message::KeyboardNavigation(navigation) => match navigation { - crate::components::keyboard::Navigation::Next => iced::widget::focus_next(), - crate::components::keyboard::Navigation::Previous => iced::widget::focus_previous(), + crate::components::keyboard::Navigation::Next => { + iced::widget::operation::focus_next() + } + crate::components::keyboard::Navigation::Previous => { + iced::widget::operation::focus_previous() + } }, Message::WindowCloseRequested => { self.persist_project_ui_state(); @@ -2639,7 +2643,7 @@ impl BdsApp { } else if let Some(anchor) = url.strip_prefix("https://ruds.invalid/document#") { if let Some(offset) = self.documentation_state(kind).parsed.anchors.get(anchor) { - return iced::widget::scrollable::snap_to( + return iced::widget::operation::snap_to( crate::views::documentation::scroll_id(kind), iced::widget::scrollable::RelativeOffset { x: 0.0, y: *offset }, ); @@ -10102,7 +10106,7 @@ impl BdsApp { } let Some(window_id) = self.main_window_id else { - return window::get_oldest().map(Message::MainWindowLoaded); + return window::oldest().map(Message::MainWindowLoaded); }; if let Some(preview) = &mut self.embedded_style_preview && should_start_embedded_preview_creation( @@ -10157,7 +10161,7 @@ impl BdsApp { } let Some(window_id) = self.main_window_id else { - return window::get_oldest().map(Message::MainWindowLoaded); + return window::oldest().map(Message::MainWindowLoaded); }; if let Some(preview) = &mut self.embedded_preview @@ -14551,7 +14555,7 @@ mod tests { app.settings_state .as_ref() .map(|state| state.project_description.text()), - Some("Description from project.json\n".to_string()) + Some("Description from project.json".to_string()) ); } diff --git a/crates/bds-ui/src/components/inputs.rs b/crates/bds-ui/src/components/inputs.rs index 3e12fab..0c429ed 100644 --- a/crates/bds-ui/src/components/inputs.rs +++ b/crates/bds-ui/src/components/inputs.rs @@ -39,6 +39,7 @@ pub fn app_theme() -> Theme { text: Color::from_rgb8(0xCC, 0xCC, 0xCC), primary: PRIMARY_BG, success: Color::from_rgb8(0x2E, 0x7D, 0x32), + warning: Color::from_rgb8(0xC9, 0x8A, 0x20), danger: DANGER_BG, }, ) @@ -67,12 +68,12 @@ pub fn compact_scrollbar() -> scrollable::Scrollbar { } /// Muted overlay-like scrollbar chrome that gains contrast only while interacting. -pub fn scrollable_style(_theme: &Theme, status: scrollable::Status) -> scrollable::Style { +pub fn scrollable_style(theme: &Theme, status: scrollable::Status) -> scrollable::Style { let rail = |opacity| scrollable::Rail { background: None, border: Border::default(), scroller: scrollable::Scroller { - color: Color::from_rgba(0.72, 0.74, 0.80, opacity), + background: Background::Color(Color::from_rgba(0.72, 0.74, 0.80, opacity)), border: Border { radius: 999.0.into(), ..Border::default() @@ -80,10 +81,11 @@ pub fn scrollable_style(_theme: &Theme, status: scrollable::Status) -> scrollabl }, }; let (horizontal_opacity, vertical_opacity) = match status { - scrollable::Status::Active => (0.24, 0.24), + scrollable::Status::Active { .. } => (0.24, 0.24), scrollable::Status::Hovered { is_horizontal_scrollbar_hovered, is_vertical_scrollbar_hovered, + .. } => ( if is_horizontal_scrollbar_hovered { 0.55 @@ -99,6 +101,7 @@ pub fn scrollable_style(_theme: &Theme, status: scrollable::Status) -> scrollabl scrollable::Status::Dragged { is_horizontal_scrollbar_dragged, is_vertical_scrollbar_dragged, + .. } => ( if is_horizontal_scrollbar_dragged { 0.75 @@ -117,12 +120,13 @@ pub fn scrollable_style(_theme: &Theme, status: scrollable::Status) -> scrollabl vertical_rail: rail(vertical_opacity), horizontal_rail: rail(horizontal_opacity), gap: None, + auto_scroll: scrollable::default(theme, status).auto_scroll, } } pub fn field_style(_theme: &Theme, status: text_input::Status) -> text_input::Style { let border_color = match status { - text_input::Status::Focused => FOCUS_COLOR, + text_input::Status::Focused { .. } => FOCUS_COLOR, text_input::Status::Hovered => Color::from_rgb8(0x5A, 0x5A, 0x5A), _ => BORDER_COLOR, }; @@ -143,7 +147,7 @@ pub fn field_style(_theme: &Theme, status: text_input::Status) -> text_input::St /// Multi-line editor style matching the standard form fields. pub fn text_editor_style(_theme: &Theme, status: text_editor::Status) -> text_editor::Style { let border_color = match status { - text_editor::Status::Focused => FOCUS_COLOR, + text_editor::Status::Focused { .. } => FOCUS_COLOR, text_editor::Status::Hovered => Color::from_rgb8(0x5A, 0x5A, 0x5A), _ => BORDER_COLOR, }; @@ -154,7 +158,6 @@ pub fn text_editor_style(_theme: &Theme, status: text_editor::Status) -> text_ed width: 1.0, radius: 6.0.into(), }, - icon: SECTION_COLOR, placeholder: Color::from_rgb8(0x7D, 0x7D, 0x7D), value: Color::from_rgb8(0xE4, 0xE4, 0xE4), selection: Color::from_rgba8(0x26, 0x4F, 0x78, 0.8), @@ -163,7 +166,7 @@ pub fn text_editor_style(_theme: &Theme, status: text_editor::Status) -> text_ed pub(crate) fn select_style(_theme: &Theme, status: pick_list::Status) -> pick_list::Style { let border_color = match status { - pick_list::Status::Hovered | pick_list::Status::Opened => FOCUS_COLOR, + pick_list::Status::Hovered | pick_list::Status::Opened { .. } => FOCUS_COLOR, pick_list::Status::Active => BORDER_COLOR, }; pick_list::Style { @@ -265,7 +268,8 @@ pub fn labeled_checkbox<'a, Message: Clone + 'a>( on_toggle: impl Fn(bool) -> Message + 'a, ) -> Element<'a, Message> { keyboard::focusable( - checkbox(label, is_checked) + checkbox(is_checked) + .label(label.to_string()) .on_toggle(on_toggle) .size(16) .text_size(14), @@ -476,7 +480,7 @@ mod tests { ); assert_ne!( field_style(&theme, text_input::Status::Active).border.color, - field_style(&theme, text_input::Status::Focused) + field_style(&theme, text_input::Status::Focused { is_hovered: false }) .border .color ); @@ -484,7 +488,7 @@ mod tests { text_editor_style(&theme, text_editor::Status::Active) .border .color, - text_editor_style(&theme, text_editor::Status::Focused) + text_editor_style(&theme, text_editor::Status::Focused { is_hovered: false },) .border .color ); @@ -511,16 +515,30 @@ mod tests { .scroller_width(3) ); let theme = app_theme(); - let active = scrollable_style(&theme, scrollable::Status::Active); + let active = scrollable_style( + &theme, + scrollable::Status::Active { + is_horizontal_scrollbar_disabled: false, + is_vertical_scrollbar_disabled: false, + }, + ); let hovered = scrollable_style( &theme, scrollable::Status::Hovered { is_horizontal_scrollbar_hovered: false, is_vertical_scrollbar_hovered: true, + is_horizontal_scrollbar_disabled: false, + is_vertical_scrollbar_disabled: false, }, ); assert!(active.vertical_rail.background.is_none()); - assert!(active.vertical_rail.scroller.color.a < 0.5); - assert!(hovered.vertical_rail.scroller.color.a > active.vertical_rail.scroller.color.a); + let Background::Color(active_color) = active.vertical_rail.scroller.background else { + panic!("scrollbar scroller must use a solid color"); + }; + let Background::Color(hovered_color) = hovered.vertical_rail.scroller.background else { + panic!("scrollbar scroller must use a solid color"); + }; + assert!(active_color.a < 0.5); + assert!(hovered_color.a > active_color.a); } } diff --git a/crates/bds-ui/src/components/keyboard.rs b/crates/bds-ui/src/components/keyboard.rs index 8fcaafa..5d9bfc6 100644 --- a/crates/bds-ui/src/components/keyboard.rs +++ b/crates/bds-ui/src/components/keyboard.rs @@ -70,9 +70,9 @@ mod tests { ..State::default() }; let mut inventory = AccessKeyInventory::default(); - inventory.custom(&mut visible, None); - inventory.custom(&mut offscreen, None); - inventory.custom(&mut disabled, None); + inventory.custom(None, Rectangle::default(), &mut visible); + inventory.custom(None, Rectangle::default(), &mut offscreen); + inventory.custom(None, Rectangle::default(), &mut disabled); assert_eq!(inventory.control_count, 1); assert_eq!(inventory.generic_count, 1); } @@ -115,8 +115,8 @@ mod tests { count: 0, exact: None, }; - prefix.custom(&mut first, None); - prefix.custom(&mut second, None); + prefix.custom(None, Rectangle::default(), &mut first); + prefix.custom(None, Rectangle::default(), &mut second); assert_eq!(prefix.count, 2); assert_eq!(prefix.exact, None); @@ -125,8 +125,8 @@ mod tests { count: 0, exact: None, }; - complete.custom(&mut first, None); - complete.custom(&mut second, None); + complete.custom(None, Rectangle::default(), &mut first); + complete.custom(None, Rectangle::default(), &mut second); assert_eq!(complete.count, 1); assert_eq!(complete.exact.as_deref(), Some("AA")); } @@ -280,13 +280,6 @@ impl Focusable for State { } } -fn visit_children( - operation: &mut dyn Operation, - operate_on_children: &mut dyn FnMut(&mut dyn Operation), -) { - operate_on_children(operation); -} - #[derive(Default)] struct AccessKeyInventory { generic_count: usize, @@ -295,16 +288,11 @@ struct AccessKeyInventory { } impl Operation for AccessKeyInventory { - fn container( - &mut self, - _id: Option<&Id>, - _bounds: Rectangle, - operate_on_children: &mut dyn FnMut(&mut dyn Operation), - ) { - visit_children(self, operate_on_children); + fn traverse(&mut self, operate: &mut dyn FnMut(&mut dyn Operation)) { + operate(self); } - fn custom(&mut self, state: &mut dyn Any, _id: Option<&Id>) { + fn custom(&mut self, _id: Option<&Id>, _bounds: Rectangle, state: &mut dyn Any) { let Some(state) = state.downcast_ref::() else { return; }; @@ -327,16 +315,11 @@ struct AssignAccessKeys { } impl Operation for AssignAccessKeys { - fn container( - &mut self, - _id: Option<&Id>, - _bounds: Rectangle, - operate_on_children: &mut dyn FnMut(&mut dyn Operation), - ) { - visit_children(self, operate_on_children); + fn traverse(&mut self, operate: &mut dyn FnMut(&mut dyn Operation)) { + operate(self); } - fn custom(&mut self, state: &mut dyn Any, _id: Option<&Id>) { + fn custom(&mut self, _id: Option<&Id>, _bounds: Rectangle, state: &mut dyn Any) { let Some(state) = state.downcast_mut::() else { return; }; @@ -359,16 +342,11 @@ struct SetAccessPrefix<'a> { } impl Operation for SetAccessPrefix<'_> { - fn container( - &mut self, - _id: Option<&Id>, - _bounds: Rectangle, - operate_on_children: &mut dyn FnMut(&mut dyn Operation), - ) { - visit_children(self, operate_on_children); + fn traverse(&mut self, operate: &mut dyn FnMut(&mut dyn Operation)) { + operate(self); } - fn custom(&mut self, state: &mut dyn Any, _id: Option<&Id>) { + fn custom(&mut self, _id: Option<&Id>, _bounds: Rectangle, state: &mut dyn Any) { if let Some(state) = state.downcast_mut::() && state.access_mode { @@ -381,16 +359,11 @@ impl Operation for SetAccessPrefix<'_> { struct CancelAccessKeys; impl Operation for CancelAccessKeys { - fn container( - &mut self, - _id: Option<&Id>, - _bounds: Rectangle, - operate_on_children: &mut dyn FnMut(&mut dyn Operation), - ) { - visit_children(self, operate_on_children); + fn traverse(&mut self, operate: &mut dyn FnMut(&mut dyn Operation)) { + operate(self); } - fn custom(&mut self, state: &mut dyn Any, _id: Option<&Id>) { + fn custom(&mut self, _id: Option<&Id>, _bounds: Rectangle, state: &mut dyn Any) { if let Some(state) = state.downcast_mut::() { state.access_mode = false; state.prefix.clear(); @@ -405,16 +378,11 @@ struct AccessKeyMatches<'a> { } impl Operation for AccessKeyMatches<'_> { - fn container( - &mut self, - _id: Option<&Id>, - _bounds: Rectangle, - operate_on_children: &mut dyn FnMut(&mut dyn Operation), - ) { - visit_children(self, operate_on_children); + fn traverse(&mut self, operate: &mut dyn FnMut(&mut dyn Operation)) { + operate(self); } - fn custom(&mut self, state: &mut dyn Any, _id: Option<&Id>) { + fn custom(&mut self, _id: Option<&Id>, _bounds: Rectangle, state: &mut dyn Any) { let Some(state) = state.downcast_ref::() else { return; }; @@ -439,16 +407,11 @@ struct FocusAccessKey<'a> { } impl Operation for FocusAccessKey<'_> { - fn container( - &mut self, - _id: Option<&Id>, - _bounds: Rectangle, - operate_on_children: &mut dyn FnMut(&mut dyn Operation), - ) { - visit_children(self, operate_on_children); + fn traverse(&mut self, operate: &mut dyn FnMut(&mut dyn Operation)) { + operate(self); } - fn custom(&mut self, state: &mut dyn Any, _id: Option<&Id>) { + fn custom(&mut self, _id: Option<&Id>, _bounds: Rectangle, state: &mut dyn Any) { let Some(state) = state.downcast_mut::() else { self.next_is_target = false; return; @@ -457,7 +420,7 @@ impl Operation for FocusAccessKey<'_> { state.pending_activation = self.next_is_target; } - fn focusable(&mut self, state: &mut dyn Focusable, _id: Option<&Id>) { + fn focusable(&mut self, _id: Option<&Id>, _bounds: Rectangle, state: &mut dyn Focusable) { if self.next_is_target { state.focus(); } else { @@ -474,20 +437,15 @@ struct FocusedEditable { } impl Operation for FocusedEditable { - fn container( - &mut self, - _id: Option<&Id>, - _bounds: Rectangle, - operate_on_children: &mut dyn FnMut(&mut dyn Operation), - ) { - visit_children(self, operate_on_children); + fn traverse(&mut self, operate: &mut dyn FnMut(&mut dyn Operation)) { + operate(self); } - fn custom(&mut self, state: &mut dyn Any, _id: Option<&Id>) { + fn custom(&mut self, _id: Option<&Id>, _bounds: Rectangle, state: &mut dyn Any) { self.next_is_control = state.is::(); } - fn focusable(&mut self, state: &mut dyn Focusable, _id: Option<&Id>) { + fn focusable(&mut self, _id: Option<&Id>, _bounds: Rectangle, state: &mut dyn Focusable) { self.found |= state.is_focused() && !self.next_is_control; self.next_is_control = false; } @@ -535,9 +493,9 @@ impl<'a, Message> FocusableControl<'a, Message> { Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)), Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Left)), ] { - let _ = self.content.as_widget_mut().on_event( + self.content.as_widget_mut().update( &mut tree.children[0], - event, + &event, layout, cursor, renderer, @@ -574,18 +532,18 @@ impl Widget for FocusableControl<'_, Me } fn layout( - &self, + &mut self, tree: &mut Tree, renderer: &iced::Renderer, limits: &layout::Limits, ) -> layout::Node { self.content - .as_widget() + .as_widget_mut() .layout(&mut tree.children[0], renderer, limits) } fn operate( - &self, + &mut self, tree: &mut Tree, layout: Layout<'_>, renderer: &iced::Renderer, @@ -594,30 +552,34 @@ impl Widget for FocusableControl<'_, Me let state = tree.state.downcast_mut::(); state.enabled = self.enabled; state.direct_key = self.hotkey; - operation.custom(state, None); + operation.custom(None, layout.bounds(), state); if self.enabled { - operation.focusable(state, None); + operation.focusable(None, layout.bounds(), state); } else { state.unfocus(); } - operation.container(None, layout.bounds(), &mut |operation| { - self.content - .as_widget() - .operate(&mut tree.children[0], layout, renderer, operation); + operation.container(None, layout.bounds()); + operation.traverse(&mut |operation| { + self.content.as_widget_mut().operate( + &mut tree.children[0], + layout, + renderer, + operation, + ); }); } - fn on_event( + fn update( &mut self, tree: &mut Tree, - event: Event, + event: &Event, layout: Layout<'_>, cursor: mouse::Cursor, renderer: &iced::Renderer, clipboard: &mut dyn Clipboard, shell: &mut Shell<'_, Message>, viewport: &Rectangle, - ) -> event::Status { + ) { let pending_activation = { let state = tree.state.downcast_mut::(); let pending = state.pending_activation; @@ -626,11 +588,12 @@ impl Widget for FocusableControl<'_, Me }; if pending_activation && self.enabled { self.activate(tree, layout, renderer, clipboard, shell, viewport); - return event::Status::Captured; + shell.capture_event(); + return; } - let child_status = self.content.as_widget_mut().on_event( + self.content.as_widget_mut().update( &mut tree.children[0], - event.clone(), + event, layout, cursor, renderer, @@ -639,8 +602,8 @@ impl Widget for FocusableControl<'_, Me viewport, ); let state = tree.state.downcast_mut::(); - if child_status == event::Status::Captured || !self.enabled { - return child_status; + if shell.is_event_captured() || !self.enabled { + return; } let activate = state.focused && matches!( @@ -652,9 +615,7 @@ impl Widget for FocusableControl<'_, Me ); if activate { self.activate(tree, layout, renderer, clipboard, shell, viewport); - event::Status::Captured - } else { - child_status + shell.capture_event(); } } @@ -743,8 +704,8 @@ impl Widget for FocusableControl<'_, Me size: Pixels(9.0), line_height: text::LineHeight::Relative(1.0), bounds: badge.size(), - horizontal_alignment: alignment::Horizontal::Center, - vertical_alignment: alignment::Vertical::Center, + align_x: alignment::Horizontal::Center.into(), + align_y: alignment::Vertical::Center, shaping: text::Shaping::Advanced, wrapping: text::Wrapping::None, }, @@ -758,13 +719,18 @@ impl Widget for FocusableControl<'_, Me fn overlay<'b>( &'b mut self, tree: &'b mut Tree, - layout: Layout<'_>, + layout: Layout<'b>, renderer: &iced::Renderer, + viewport: &Rectangle, translation: Vector, ) -> Option> { - self.content - .as_widget_mut() - .overlay(&mut tree.children[0], layout, renderer, translation) + self.content.as_widget_mut().overlay( + &mut tree.children[0], + layout, + renderer, + viewport, + translation, + ) } } @@ -802,18 +768,18 @@ impl<'a, Message> AccessKeyScope<'a, Message> { } fn operate( - &self, + &mut self, tree: &mut Tree, layout: Layout<'_>, renderer: &iced::Renderer, operation: &mut dyn Operation, ) { self.content - .as_widget() + .as_widget_mut() .operate(&mut tree.children[0], layout, renderer, operation); } - fn begin(&self, tree: &mut Tree, layout: Layout<'_>, renderer: &iced::Renderer) -> bool { + fn begin(&mut self, tree: &mut Tree, layout: Layout<'_>, renderer: &iced::Renderer) -> bool { let mut focused_editable = FocusedEditable::default(); self.operate(tree, layout, renderer, &mut focused_editable); if focused_editable.found { @@ -834,7 +800,7 @@ impl<'a, Message> AccessKeyScope<'a, Message> { true } - fn cancel(&self, tree: &mut Tree, layout: Layout<'_>, renderer: &iced::Renderer) { + fn cancel(&mut self, tree: &mut Tree, layout: Layout<'_>, renderer: &iced::Renderer) { self.operate(tree, layout, renderer, &mut CancelAccessKeys); } } @@ -861,41 +827,45 @@ impl Widget for AccessKeyScope<'_, Mess } fn layout( - &self, + &mut self, tree: &mut Tree, renderer: &iced::Renderer, limits: &layout::Limits, ) -> layout::Node { self.content - .as_widget() + .as_widget_mut() .layout(&mut tree.children[0], renderer, limits) } fn operate( - &self, + &mut self, tree: &mut Tree, layout: Layout<'_>, renderer: &iced::Renderer, operation: &mut dyn Operation, ) { - operation.container(None, layout.bounds(), &mut |operation| { - self.content - .as_widget() - .operate(&mut tree.children[0], layout, renderer, operation); + operation.container(None, layout.bounds()); + operation.traverse(&mut |operation| { + self.content.as_widget_mut().operate( + &mut tree.children[0], + layout, + renderer, + operation, + ); }); } - fn on_event( + fn update( &mut self, tree: &mut Tree, - event: Event, + event: &Event, layout: Layout<'_>, cursor: mouse::Cursor, renderer: &iced::Renderer, clipboard: &mut dyn Clipboard, shell: &mut Shell<'_, Message>, viewport: &Rectangle, - ) -> event::Status { + ) { let modifier_update = match &event { Event::Keyboard(keyboard::Event::ModifiersChanged(modifiers)) | Event::Keyboard(keyboard::Event::KeyPressed { modifiers, .. }) @@ -939,7 +909,8 @@ impl Widget for AccessKeyScope<'_, Mess state.active = false; state.prefix.clear(); state.cancelled_until_modifiers_release = true; - return event::Status::Captured; + shell.capture_event(); + return; } if let Event::Keyboard(keyboard::Event::KeyPressed { key, modifiers, .. }) = &event @@ -955,12 +926,13 @@ impl Widget for AccessKeyScope<'_, Mess ) }; if cancelled { - return event::Status::Captured; + shell.capture_event(); + return; } if !active { active = self.begin(tree, layout, renderer); if !active { - return self.content.as_widget_mut().on_event( + self.content.as_widget_mut().update( &mut tree.children[0], event, layout, @@ -970,6 +942,7 @@ impl Widget for AccessKeyScope<'_, Mess shell, viewport, ); + return; } let state = tree.state.downcast_mut::(); state.active = true; @@ -987,7 +960,8 @@ impl Widget for AccessKeyScope<'_, Mess let exact = matches.exact.take(); drop(matches); if count == 0 { - return event::Status::Captured; + shell.capture_event(); + return; } self.operate( @@ -1008,7 +982,7 @@ impl Widget for AccessKeyScope<'_, Mess next_is_target: false, }, ); - let _ = self.content.as_widget_mut().on_event( + self.content.as_widget_mut().update( &mut tree.children[0], event, layout, @@ -1024,7 +998,8 @@ impl Widget for AccessKeyScope<'_, Mess state.prefix.clear(); state.cancelled_until_modifiers_release = true; } - return event::Status::Captured; + shell.capture_event(); + return; } if matches!(event, Event::Mouse(mouse::Event::ButtonPressed(_))) @@ -1036,7 +1011,7 @@ impl Widget for AccessKeyScope<'_, Mess state.prefix.clear(); } - self.content.as_widget_mut().on_event( + self.content.as_widget_mut().update( &mut tree.children[0], event, layout, @@ -1045,7 +1020,7 @@ impl Widget for AccessKeyScope<'_, Mess clipboard, shell, viewport, - ) + ); } fn mouse_interaction( @@ -1089,13 +1064,18 @@ impl Widget for AccessKeyScope<'_, Mess fn overlay<'b>( &'b mut self, tree: &'b mut Tree, - layout: Layout<'_>, + layout: Layout<'b>, renderer: &iced::Renderer, + viewport: &Rectangle, translation: Vector, ) -> Option> { - self.content - .as_widget_mut() - .overlay(&mut tree.children[0], layout, renderer, translation) + self.content.as_widget_mut().overlay( + &mut tree.children[0], + layout, + renderer, + viewport, + translation, + ) } } @@ -1130,18 +1110,18 @@ impl Widget for SuspendedKeyboard<'_, M } fn layout( - &self, + &mut self, tree: &mut Tree, renderer: &iced::Renderer, limits: &layout::Limits, ) -> layout::Node { self.content - .as_widget() + .as_widget_mut() .layout(&mut tree.children[0], renderer, limits) } fn operate( - &self, + &mut self, _tree: &mut Tree, _layout: Layout<'_>, _renderer: &iced::Renderer, @@ -1149,21 +1129,21 @@ impl Widget for SuspendedKeyboard<'_, M ) { } - fn on_event( + fn update( &mut self, tree: &mut Tree, - event: Event, + event: &Event, layout: Layout<'_>, cursor: mouse::Cursor, renderer: &iced::Renderer, clipboard: &mut dyn Clipboard, shell: &mut Shell<'_, Message>, viewport: &Rectangle, - ) -> event::Status { + ) { if matches!(event, Event::Keyboard(_)) { - event::Status::Captured + shell.capture_event(); } else { - self.content.as_widget_mut().on_event( + self.content.as_widget_mut().update( &mut tree.children[0], event, layout, @@ -1172,7 +1152,7 @@ impl Widget for SuspendedKeyboard<'_, M clipboard, shell, viewport, - ) + ); } } @@ -1217,13 +1197,18 @@ impl Widget for SuspendedKeyboard<'_, M fn overlay<'b>( &'b mut self, tree: &'b mut Tree, - layout: Layout<'_>, + layout: Layout<'b>, renderer: &iced::Renderer, + viewport: &Rectangle, translation: Vector, ) -> Option> { - self.content - .as_widget_mut() - .overlay(&mut tree.children[0], layout, renderer, translation) + self.content.as_widget_mut().overlay( + &mut tree.children[0], + layout, + renderer, + viewport, + translation, + ) } } diff --git a/crates/bds-ui/src/components/native_edit.rs b/crates/bds-ui/src/components/native_edit.rs index 22df604..b208a19 100644 --- a/crates/bds-ui/src/components/native_edit.rs +++ b/crates/bds-ui/src/components/native_edit.rs @@ -6,7 +6,6 @@ use iced::advanced::overlay; use iced::advanced::renderer; use iced::advanced::widget::{Operation, Tree, tree}; use iced::advanced::{Clipboard, Layout, Shell, Widget}; -use iced::event; use iced::keyboard::{self, Key, Location, Modifiers, key}; use iced::mouse; use iced::{Element, Event, Length, Rectangle, Size, Vector}; @@ -103,9 +102,12 @@ fn command_events(command: EditCommand) -> [Event; 4] { location: Location::Standard, modifiers, text: None, + repeat: false, }), Event::Keyboard(keyboard::Event::KeyReleased { - key, + key: key.clone(), + modified_key: Key::Character(modified_character.into()), + physical_key: key::Physical::Code(physical_key), location: Location::Standard, modifiers, }), @@ -139,68 +141,63 @@ where } fn layout( - &self, + &mut self, tree: &mut Tree, renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { self.content - .as_widget() + .as_widget_mut() .layout(&mut tree.children[0], renderer, limits) } fn operate( - &self, + &mut self, tree: &mut Tree, layout: Layout<'_>, renderer: &Renderer, operation: &mut dyn Operation, ) { self.content - .as_widget() + .as_widget_mut() .operate(&mut tree.children[0], layout, renderer, operation); } - fn on_event( + fn update( &mut self, tree: &mut Tree, - event: Event, + event: &Event, layout: Layout<'_>, cursor: mouse::Cursor, renderer: &Renderer, clipboard: &mut dyn Clipboard, shell: &mut Shell<'_, Message>, viewport: &Rectangle, - ) -> event::Status { - let mut status = event::Status::Ignored; - + ) { if matches!( event, Event::Window(iced::window::Event::RedrawRequested(_)) ) { while let Some(command) = pop_command(&self.commands) { for command_event in command_events(command) { - if self.content.as_widget_mut().on_event( + self.content.as_widget_mut().update( &mut tree.children[0], - command_event, + &command_event, layout, cursor, renderer, clipboard, shell, viewport, - ) == event::Status::Captured - { - status = event::Status::Captured; - } + ); } } } - if let Some(sync_event) = modifier_sync_event(&event) { - let _ = self.content.as_widget_mut().on_event( + if let Some(sync_event) = modifier_sync_event(event) { + self.content.as_widget_mut().update( &mut tree.children[0], - sync_event, + &sync_event, layout, cursor, renderer, @@ -210,7 +207,7 @@ where ); } - if self.content.as_widget_mut().on_event( + self.content.as_widget_mut().update( &mut tree.children[0], event, layout, @@ -219,12 +216,7 @@ where clipboard, shell, viewport, - ) == event::Status::Captured - { - event::Status::Captured - } else { - status - } + ); } fn mouse_interaction( @@ -268,13 +260,18 @@ where fn overlay<'b>( &'b mut self, tree: &'b mut Tree, - layout: Layout<'_>, + layout: Layout<'b>, renderer: &Renderer, + viewport: &Rectangle, translation: Vector, ) -> Option> { - self.content - .as_widget_mut() - .overlay(&mut tree.children[0], layout, renderer, translation) + self.content.as_widget_mut().overlay( + &mut tree.children[0], + layout, + renderer, + viewport, + translation, + ) } } @@ -311,6 +308,7 @@ mod tests { location: Location::Standard, modifiers, text: Some("v".into()), + repeat: false, }); assert_eq!( diff --git a/crates/bds-ui/src/components/popover.rs b/crates/bds-ui/src/components/popover.rs index ca9977e..f19ee01 100644 --- a/crates/bds-ui/src/components/popover.rs +++ b/crates/bds-ui/src/components/popover.rs @@ -3,7 +3,6 @@ use iced::advanced::overlay; use iced::advanced::renderer; use iced::advanced::widget::{Operation, Tree}; use iced::advanced::{Clipboard, Layout, Shell, Widget}; -use iced::event; use iced::keyboard::{self, Key, key}; use iced::mouse; use iced::{Element, Event, Length, Point, Rectangle, Size, Vector}; @@ -84,40 +83,40 @@ where } fn layout( - &self, + &mut self, tree: &mut Tree, renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { self.trigger - .as_widget() + .as_widget_mut() .layout(&mut tree.children[0], renderer, limits) } fn operate( - &self, + &mut self, tree: &mut Tree, layout: Layout<'_>, renderer: &Renderer, operation: &mut dyn Operation, ) { self.trigger - .as_widget() + .as_widget_mut() .operate(&mut tree.children[0], layout, renderer, operation); } - fn on_event( + fn update( &mut self, tree: &mut Tree, - event: Event, + event: &Event, layout: Layout<'_>, cursor: mouse::Cursor, renderer: &Renderer, clipboard: &mut dyn Clipboard, shell: &mut Shell<'_, Message>, viewport: &Rectangle, - ) -> event::Status { - self.trigger.as_widget_mut().on_event( + ) { + self.trigger.as_widget_mut().update( &mut tree.children[0], event, layout, @@ -126,7 +125,7 @@ where clipboard, shell, viewport, - ) + ); } fn mouse_interaction( @@ -170,8 +169,9 @@ where fn overlay<'b>( &'b mut self, tree: &'b mut Tree, - layout: Layout<'_>, + layout: Layout<'b>, renderer: &Renderer, + viewport: &Rectangle, translation: Vector, ) -> Option> { let (trigger_tree, popup_tree) = tree.children.split_at_mut(1); @@ -179,6 +179,7 @@ where &mut trigger_tree[0], layout, renderer, + viewport, translation, ); let popup_overlay = self.is_open.then(|| { @@ -233,7 +234,7 @@ where Renderer: renderer::Renderer, { fn layout(&mut self, renderer: &Renderer, bounds: Size) -> layout::Node { - let popup = self.popup.as_widget().layout( + let popup = self.popup.as_widget_mut().layout( self.state, renderer, &layout::Limits::new(Size::ZERO, bounds), @@ -264,12 +265,12 @@ where style, layout.children().next().expect("popover child layout"), cursor, - &Rectangle::with_size(Size::INFINITY), + &Rectangle::INFINITE, ); } fn operate(&mut self, layout: Layout<'_>, renderer: &Renderer, operation: &mut dyn Operation) { - self.popup.as_widget().operate( + self.popup.as_widget_mut().operate( self.state, layout.children().next().expect("popover child layout"), renderer, @@ -277,28 +278,28 @@ where ); } - fn on_event( + fn update( &mut self, - event: Event, + event: &Event, layout: Layout<'_>, cursor: mouse::Cursor, renderer: &Renderer, clipboard: &mut dyn Clipboard, shell: &mut Shell<'_, Message>, - ) -> event::Status { + ) { let popup_layout = layout.children().next().expect("popover child layout"); - let status = self.popup.as_widget_mut().on_event( + self.popup.as_widget_mut().update( self.state, - event.clone(), + event, popup_layout, cursor, renderer, clipboard, shell, - &Rectangle::with_size(Size::INFINITY), + &Rectangle::INFINITE, ); - if status == event::Status::Captured { - return status; + if shell.is_event_captured() { + return; } let escape = matches!( @@ -315,9 +316,7 @@ where ) && !cursor.is_over(layout.bounds()); if escape || outside_press { shell.publish(self.on_dismiss.clone()); - event::Status::Captured - } else { - status + shell.capture_event(); } } @@ -325,27 +324,27 @@ where &self, layout: Layout<'_>, cursor: mouse::Cursor, - viewport: &Rectangle, renderer: &Renderer, ) -> mouse::Interaction { self.popup.as_widget().mouse_interaction( self.state, layout.children().next().expect("popover child layout"), cursor, - viewport, + &Rectangle::INFINITE, renderer, ) } fn overlay<'b>( &'b mut self, - layout: Layout<'_>, + layout: Layout<'b>, renderer: &Renderer, ) -> Option> { self.popup.as_widget_mut().overlay( self.state, layout.children().next().expect("popover child layout"), renderer, + &Rectangle::INFINITE, Vector::ZERO, ) } diff --git a/crates/bds-ui/src/components/webview.rs b/crates/bds-ui/src/components/webview.rs index 35aca04..7b776ca 100644 --- a/crates/bds-ui/src/components/webview.rs +++ b/crates/bds-ui/src/components/webview.rs @@ -7,7 +7,6 @@ use iced::advanced::layout::{self, Node}; use iced::advanced::renderer; use iced::advanced::widget::Tree; use iced::advanced::{Clipboard, Layout, Shell, Widget}; -use iced::event; use iced::mouse; use iced::{Element, Event, Length, Rectangle, Size, Task, window}; use wry::dpi::{LogicalPosition, LogicalSize}; @@ -120,7 +119,7 @@ impl WebViewController { let transparent = self.config.transparent; let devtools = self.config.devtools; - window::run_with_handle(window_id, move |handle| { + window::run(window_id, move |handle| { build_webview(id, handle, content, transparent, devtools) }) .map(on_result) @@ -165,11 +164,12 @@ impl WebViewController { fn build_webview( id: u64, - handle: window::raw_window_handle::WindowHandle<'_>, + handle: &dyn window::Window, content: Content, transparent: bool, devtools: bool, ) -> Result<(), String> { + let handle = handle.window_handle().map_err(|error| error.to_string())?; let mut builder = WebViewBuilder::new() .with_transparent(transparent) .with_devtools(devtools) @@ -251,7 +251,7 @@ where Size::new(self.width, self.height) } - fn layout(&self, _tree: &mut Tree, _renderer: &Renderer, limits: &layout::Limits) -> Node { + fn layout(&mut self, _tree: &mut Tree, _renderer: &Renderer, limits: &layout::Limits) -> Node { Node::new(limits.resolve(self.width, self.height, Size::ZERO)) } @@ -267,19 +267,19 @@ where ) { } - fn on_event( + fn update( &mut self, tree: &mut Tree, - event: Event, + event: &Event, layout: Layout<'_>, cursor: mouse::Cursor, _renderer: &Renderer, _clipboard: &mut dyn Clipboard, _shell: &mut Shell<'_, Message>, _viewport: &Rectangle, - ) -> event::Status { + ) { let Some(tx) = &self.bounds_tx else { - return event::Status::Ignored; + return; }; let state = tree.state.downcast_mut::(); @@ -295,8 +295,6 @@ where { tx.refocus_parent(); } - - event::Status::Ignored } } diff --git a/crates/bds-ui/src/main.rs b/crates/bds-ui/src/main.rs index ef33127..de78509 100644 --- a/crates/bds-ui/src/main.rs +++ b/crates/bds-ui/src/main.rs @@ -27,14 +27,19 @@ fn main() -> anyhow::Result<()> { iced::window::icon::from_file_data(include_bytes!("../assets/app-icons/bds.png"), None) .expect("bundled application icon must be valid"); - iced::application("bDS", BdsApp::update, BdsApp::view) + iced::application(BdsApp::new, BdsApp::update, BdsApp::view) + .title("bDS") .subscription(BdsApp::subscription) - .theme(|_| inputs::app_theme()) + .theme(app_theme) .window(desktop_window_settings(Some(icon))) - .run_with(BdsApp::new)?; + .run()?; Ok(()) } +fn app_theme(_: &BdsApp) -> iced::Theme { + inputs::app_theme() +} + fn desktop_window_settings(icon: Option) -> iced::window::Settings { iced::window::Settings { size: iced::Size::new(1200.0, 800.0), diff --git a/crates/bds-ui/src/platform/menu.rs b/crates/bds-ui/src/platform/menu.rs index 7014374..3c685e7 100644 --- a/crates/bds-ui/src/platform/menu.rs +++ b/crates/bds-ui/src/platform/menu.rs @@ -1,8 +1,6 @@ use std::collections::HashMap; -use iced::widget::{ - Column, column, container, horizontal_space, mouse_area, row, scrollable, text, -}; +use iced::widget::{Column, column, container, mouse_area, row, scrollable, space, text}; use iced::{ Alignment, Background, Border, Color, Element, Length, Shadow, Subscription, Theme, Vector, }; @@ -633,7 +631,7 @@ fn window_menu_popup<'a>( let shortcut = shortcut_hint(action).unwrap_or_default(); let content = row![ text(translate(locale, action.i18n_key())).size(12), - horizontal_space(), + space::horizontal(), text(shortcut) .size(11) .color(Color::from_rgb8(0x9D, 0xA5, 0xB4)), @@ -653,7 +651,7 @@ fn window_menu_popup<'a>( } Separator => { entries = entries.push( - container(horizontal_space()) + container(space::horizontal()) .height(Length::Fixed(1.0)) .width(Length::Fill) .style(|_| iced::widget::container::Style { diff --git a/crates/bds-ui/src/views/activity_bar.rs b/crates/bds-ui/src/views/activity_bar.rs index 11efd03..a4ea042 100644 --- a/crates/bds-ui/src/views/activity_bar.rs +++ b/crates/bds-ui/src/views/activity_bar.rs @@ -142,7 +142,7 @@ pub fn view( // Active indicator: 2px left border (like bDS/VS Code) let btn_row: Element<'static, Message> = if is_active { - let indicator = container(Space::new(0, 0)) + let indicator = container(Space::new()) .width(Length::Fixed(2.0)) .height(Length::Fixed(48.0)) .style(|_theme: &Theme| container::Style { @@ -151,7 +151,7 @@ pub fn view( }); iced::widget::row![indicator, btn].into() } else { - let spacer = Space::with_width(2.0); + let spacer = Space::new().width(2.0); iced::widget::row![spacer, btn].into() }; @@ -182,7 +182,7 @@ pub fn view( let bottom = Column::with_children(bottom_items).spacing(0); container( - column![top, Space::with_height(Length::Fill), bottom,] + column![top, Space::new().height(Length::Fill), bottom,] .width(Length::Fixed(50.0)) .height(Length::Fill) .padding([4, 0]), diff --git a/crates/bds-ui/src/views/chat_surfaces.rs b/crates/bds-ui/src/views/chat_surfaces.rs index fd3e6a9..d648de3 100644 --- a/crates/bds-ui/src/views/chat_surfaces.rs +++ b/crates/bds-ui/src/views/chat_surfaces.rs @@ -60,7 +60,7 @@ fn surface_view<'a>( &format!("chat.surface.type.{}", surface.kind.as_str()), ) }); - let mut header = row![text(title).size(14), Space::with_width(Length::Fill),] + let mut header = row![text(title).size(14), Space::new().width(Length::Fill),] .spacing(8) .align_y(Alignment::Center); if has_title { @@ -196,7 +196,8 @@ fn form<'a>( let key = field.key.clone(); let control: Element<'a, Message> = match field.input_type { FormInputType::Checkbox => keyboard::focusable( - checkbox(label, field.value.as_bool().unwrap_or(false)) + checkbox(field.value.as_bool().unwrap_or(false)) + .label(label.to_string()) .on_toggle(move |value| Message::ChatSurfaceFieldChanged { surface_id: surface_id.clone(), field: key.clone(), @@ -355,7 +356,7 @@ fn mindmap<'a>(surface: &'a InlineSurface, locale: UiLocale) -> Element<'a, Mess rows.into_iter() .map(|(depth, label)| { row![ - Space::with_width(Length::Fixed(depth as f32 * 18.0)), + Space::new().width(Length::Fixed(depth as f32 * 18.0)), text(if depth == 0 { "◆" } else { "└" }) .size(11) .color(inputs::SECTION_COLOR), diff --git a/crates/bds-ui/src/views/chat_view.rs b/crates/bds-ui/src/views/chat_view.rs index ff4f6af..301f59c 100644 --- a/crates/bds-ui/src/views/chat_view.rs +++ b/crates/bds-ui/src/views/chat_view.rs @@ -390,7 +390,7 @@ pub fn view<'a>( text(t(locale, "chat.input.hint")) .size(11) .color(inputs::SECTION_COLOR), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), send_button, ] .align_y(Alignment::Center), @@ -442,8 +442,9 @@ fn message_view<'a>( let body: Element<'a, Message> = if let Some(items) = rendered_markdown { markdown::view( items, - markdown::Settings::default(), - markdown::Style::from_palette(crate::components::inputs::app_theme().palette()), + markdown::Settings::with_style(markdown::Style::from_palette( + crate::components::inputs::app_theme().palette(), + )), ) .map(|url| Message::ChatLinkClicked(url.to_string())) } else { @@ -500,8 +501,9 @@ fn tool_markers_view<'a>( fn assistant_card<'a>(items: &'a [markdown::Item], label: String) -> Element<'a, Message> { let body = markdown::view( items, - markdown::Settings::default(), - markdown::Style::from_palette(crate::components::inputs::app_theme().palette()), + markdown::Settings::with_style(markdown::Style::from_palette( + crate::components::inputs::app_theme().palette(), + )), ) .map(|url| Message::ChatLinkClicked(url.to_string())); inputs::card(column![text(label).size(11).color(inputs::SECTION_COLOR), body,].spacing(6)) diff --git a/crates/bds-ui/src/views/dashboard.rs b/crates/bds-ui/src/views/dashboard.rs index 094976f..07c007b 100644 --- a/crates/bds-ui/src/views/dashboard.rs +++ b/crates/bds-ui/src/views/dashboard.rs @@ -147,29 +147,30 @@ pub fn view<'a>(state: &'a DashboardState, locale: UiLocale) -> Element<'a, Mess ] .spacing(16); - let mut content = column![header, project_label, Space::with_height(16), counts_row].spacing(8); + let mut content = + column![header, project_label, Space::new().height(16), counts_row].spacing(8); if !state.timeline.is_empty() { content = content - .push(Space::with_height(20)) + .push(Space::new().height(20)) .push(inputs::section_header(&t(locale, "dashboard.timeline"))) .push(timeline_chart(&state.timeline, locale)); } if !state.tag_cloud.is_empty() { content = content - .push(Space::with_height(20)) + .push(Space::new().height(20)) .push(inputs::section_header(&t(locale, "dashboard.tags"))) .push(tag_cloud(&state.tag_cloud, locale)); } if !state.category_cloud.is_empty() { content = content - .push(Space::with_height(20)) + .push(Space::new().height(20)) .push(inputs::section_header(&t(locale, "dashboard.categories"))) .push(category_cloud(&state.category_cloud, locale)); } if !state.recent_posts.is_empty() { content = content - .push(Space::with_height(20)) + .push(Space::new().height(20)) .push(inputs::section_header(&t(locale, "dashboard.recentPosts"))) .push(recent_posts(&state.recent_posts, locale)); } @@ -238,7 +239,7 @@ fn timeline_chart<'a>( container( column![ text(month.count.to_string()).size(12).color(Color::WHITE), - container(Space::with_height(height)) + container(Space::new().height(height)) .width(Length::Fill) .style(|_: &Theme| container::Style { background: Some(Background::Color(Color::from_rgb(0.25, 0.48, 0.80))), diff --git a/crates/bds-ui/src/views/documentation.rs b/crates/bds-ui/src/views/documentation.rs index b3df131..a27e8f3 100644 --- a/crates/bds-ui/src/views/documentation.rs +++ b/crates/bds-ui/src/views/documentation.rs @@ -137,8 +137,8 @@ impl DocumentationState { } } -pub fn scroll_id(kind: DocumentationKind) -> scrollable::Id { - scrollable::Id::new(match kind { +pub fn scroll_id(kind: DocumentationKind) -> iced::widget::Id { + iced::widget::Id::new(match kind { DocumentationKind::Guide => "user-documentation", DocumentationKind::Api => "api-documentation", DocumentationKind::Cli => "cli-documentation", @@ -200,8 +200,10 @@ pub fn view(state: &DocumentationState, locale: UiLocale) -> Element<'_, Message content = content.push(match block { DocumentBlock::Markdown(items) => markdown::view( items, - markdown::Settings::with_text_size(14), - markdown::Style::from_palette(inputs::app_theme().palette()), + markdown::Settings::with_text_size( + 14, + markdown::Style::from_palette(inputs::app_theme().palette()), + ), ) .map({ let kind = state.kind; diff --git a/crates/bds-ui/src/views/duplicates.rs b/crates/bds-ui/src/views/duplicates.rs index daac409..3ee7117 100644 --- a/crates/bds-ui/src/views/duplicates.rs +++ b/crates/bds-ui/src/views/duplicates.rs @@ -122,7 +122,8 @@ pub fn view(state: &DuplicatesState, locale: UiLocale) -> Element<'_, Message> { pairs = pairs.push(inputs::card( row![ keyboard::focusable( - checkbox("", checked) + checkbox(checked) + .label("") .on_toggle({ let a = pair.post_id_a.clone(); let b = pair.post_id_b.clone(); @@ -148,7 +149,7 @@ pub fn view(state: &DuplicatesState, locale: UiLocale) -> Element<'_, Message> { .on_press(Message::DuplicatesOpenPost(pair.post_id_b.clone())) .padding([5, 8]) .style(inputs::disclosure_button), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(badge).size(12).color(if pair.exact_match { Color::from_rgb(0.96, 0.68, 0.28) } else { diff --git a/crates/bds-ui/src/views/git.rs b/crates/bds-ui/src/views/git.rs index e9852f9..73d1643 100644 --- a/crates/bds-ui/src/views/git.rs +++ b/crates/bds-ui/src/views/git.rs @@ -310,7 +310,7 @@ fn status_button(file: &GitFileStatus) -> Element<'static, Message> { keyboard::button( row![ text(path.clone()).size(11), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(file.kind.code()).size(11), ] .spacing(6), @@ -364,7 +364,7 @@ fn sync_legend_item(status: SyncStatus, locale: UiLocale) -> Element<'static, Me fn sync_status_dot(status: SyncStatus) -> Element<'static, Message> { let color = sync_status_color(status); - container(Space::new(8, 8)) + container(Space::new().width(8).height(8)) .style(move |_: &iced::Theme| container::Style { background: Some(Background::Color(color)), border: iced::Border { diff --git a/crates/bds-ui/src/views/import_editor.rs b/crates/bds-ui/src/views/import_editor.rs index bff917a..861c8f6 100644 --- a/crates/bds-ui/src/views/import_editor.rs +++ b/crates/bds-ui/src/views/import_editor.rs @@ -385,7 +385,7 @@ fn progress_view<'a>(state: &ImportEditorState, locale: UiLocale) -> Element<'a, column![ row![ text(phase).size(13), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(format!("{current} / {total}")) .size(12) .color(inputs::LABEL_COLOR), @@ -778,7 +778,7 @@ fn macro_rows<'a>(report: &'a ImportReport, locale: UiLocale) -> Element<'a, Mes column![ row![ text(format!("[[{}]]", usage.name)).size(13), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(tw( locale, "import.macroUses", diff --git a/crates/bds-ui/src/views/media_editor.rs b/crates/bds-ui/src/views/media_editor.rs index e066421..b8f24bd 100644 --- a/crates/bds-ui/src/views/media_editor.rs +++ b/crates/bds-ui/src/views/media_editor.rs @@ -314,7 +314,7 @@ pub fn view<'a>( // Translation flags bar let flags = state.translation_flags(); let flags_bar: Element<'a, Message> = if flags.is_empty() { - Space::new(0, 0).into() + Space::new().into() } else { let flag_buttons: Vec> = flags .iter() @@ -430,7 +430,7 @@ pub fn view<'a>( text(t(locale, "editor.linkedPosts")) .size(12) .color(Color::from_rgb(0.55, 0.58, 0.65)), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), keyboard::button(text(t(locale, "editor.linkToPost")).size(12)) .on_press(Message::MediaEditor(MediaEditorMsg::TogglePostPicker)) .style(inputs::secondary_button) @@ -484,7 +484,7 @@ pub fn view<'a>( }) .into() } else { - Space::new(0, 0).into() + Space::new().into() }; let linked_posts_list: Element<'a, Message> = if state.linked_posts.is_empty() { @@ -503,7 +503,7 @@ pub fn view<'a>( post.post_id.clone() ))) .padding([4, 0]), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), keyboard::button(text(t(locale, "editor.unlinkMedia")).size(11)) .on_press(Message::MediaEditor(MediaEditorMsg::UnlinkPost( post.post_id.clone() @@ -522,7 +522,7 @@ pub fn view<'a>( // Footer let footer = row![ inputs::date_label(&t(locale, "editor.createdAt"), state.created_at), - Space::with_width(Length::Fixed(24.0)), + Space::new().width(Length::Fixed(24.0)), inputs::date_label(&t(locale, "editor.updatedAt"), state.updated_at), ] .padding(8); diff --git a/crates/bds-ui/src/views/menu_editor.rs b/crates/bds-ui/src/views/menu_editor.rs index 5ed05dc..5381304 100644 --- a/crates/bds-ui/src/views/menu_editor.rs +++ b/crates/bds-ui/src/views/menu_editor.rs @@ -869,10 +869,10 @@ fn tree_item<'a>( .style(secondary_button) .into() } else { - Space::new(Length::Fixed(28.0), 0).into() + Space::new().width(Length::Fixed(28.0)).into() }; let drag: Element<'_, Message> = if item.id == HOME_ID { - Space::new(Length::Fixed(24.0), 0).into() + Space::new().width(Length::Fixed(24.0)).into() } else { tooltip( mouse_area(text("⠿").width(Length::Fixed(24.0))) @@ -893,7 +893,7 @@ fn tree_item<'a>( row![ kind_icon(&item.kind), text(label).size(14), - Space::new(Length::Fill, 0), + Space::new().width(Length::Fill), text(kind_label(locale, &item.kind)) .size(11) .color(Color::from_rgb8(0x9D, 0xA5, 0xB4)) @@ -913,7 +913,7 @@ fn tree_item<'a>( ..button::Style::default() }); let row_content = row![ - Space::new(Length::Fixed(depth as f32 * 22.0), 0), + Space::new().width(Length::Fixed(depth as f32 * 22.0)), toggle, drag, label_button @@ -985,8 +985,8 @@ fn tree_item<'a>( fn drop_indicator(depth: usize) -> Element<'static, Message> { row![ - Space::new(Length::Fixed(depth as f32 * 22.0 + 60.0), 0), - container(Space::new(Length::Fill, Length::Fixed(2.0))).style(|_theme| { + Space::new().width(Length::Fixed(depth as f32 * 22.0 + 60.0)), + container(Space::new().width(Length::Fill).height(Length::Fixed(2.0))).style(|_theme| { container::Style { background: Some(Background::Color(Color::from_rgb8(0x00, 0x7F, 0xD4))), ..container::Style::default() @@ -1069,7 +1069,7 @@ fn draft_editor<'a>( ); } container(row![ - Space::new(Length::Fixed(depth as f32 * 22.0 + 60.0), 0), + Space::new().width(Length::Fixed(depth as f32 * 22.0 + 60.0)), editor.width(Length::Fill) ]) .padding([8, 8]) diff --git a/crates/bds-ui/src/views/metadata_diff.rs b/crates/bds-ui/src/views/metadata_diff.rs index afc6554..29218d2 100644 --- a/crates/bds-ui/src/views/metadata_diff.rs +++ b/crates/bds-ui/src/views/metadata_diff.rs @@ -32,7 +32,7 @@ pub fn view<'a>(state: &'a MetadataDiffState, locale: UiLocale) -> Element<'a, M .size(24) .shaping(Shaping::Advanced) .color(Color::from_rgb(0.88, 0.88, 0.92)), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), run, ] .align_y(iced::Alignment::Center), @@ -113,7 +113,7 @@ pub fn view<'a>(state: &'a MetadataDiffState, locale: UiLocale) -> Element<'a, M &[("reason", &orphan.reason), ("path", &orphan.file_path)], )) .size(12), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), ] .align_y(iced::Alignment::Center); if orphan.reason == "file_without_db_entry" { diff --git a/crates/bds-ui/src/views/modal.rs b/crates/bds-ui/src/views/modal.rs index ed52465..26e38a6 100644 --- a/crates/bds-ui/src/views/modal.rs +++ b/crates/bds-ui/src/views/modal.rs @@ -254,7 +254,7 @@ pub fn view( .size(12) .shaping(Shaping::Advanced) .color(Color::from_rgb(0.70, 0.70, 0.75)), - Space::with_height(8.0), + Space::new().height(8.0), text(t(locale, "remoteConnection.target")) .size(12) .color(Color::from_rgb(0.80, 0.80, 0.85)), @@ -271,7 +271,7 @@ pub fn view( } if !projects.is_empty() { - content = content.push(Space::with_height(6.0)); + content = content.push(Space::new().height(6.0)); content = content.push( text(t(locale, "remoteConnection.projects")) .size(13) @@ -286,7 +286,7 @@ pub fn view( row![ text(marker).size(12), text(project.name.clone()).size(13), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(project.description.unwrap_or_default()) .size(11) .color(Color::from_rgb(0.65, 0.65, 0.70)), @@ -337,8 +337,8 @@ pub fn view( button } }; - content = content.push(Space::with_height(8.0)).push( - row![cancel, Space::with_width(Length::Fill), action].align_y(Alignment::Center), + content = content.push(Space::new().height(8.0)).push( + row![cancel, Space::new().width(Length::Fill), action].align_y(Alignment::Center), ); container(content.padding(20)) .width(Length::Fixed(500.0)) @@ -371,8 +371,8 @@ pub fn view( .color(Color::from_rgb(0.70, 0.70, 0.75)); let mut content_col = column![ - row![warning_icon, Space::with_width(8.0), title].align_y(Alignment::Center), - Space::with_height(12.0), + row![warning_icon, Space::new().width(8.0), title].align_y(Alignment::Center), + Space::new().height(12.0), entity_label, warning_text, ] @@ -380,7 +380,7 @@ pub fn view( // Reference section if !references.is_empty() { - content_col = content_col.push(Space::with_height(8.0)); + content_col = content_col.push(Space::new().height(8.0)); for r in references { content_col = content_col.push( text(format!("\u{2022} {r}")) @@ -401,7 +401,7 @@ pub fn view( .on_press(Message::DismissModal) .padding([6, 16]) .style(cancel_button_style), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), keyboard::button( text(t(locale, "modal.confirmDelete.delete")) .size(13) @@ -412,7 +412,7 @@ pub fn view( .style(danger_button_style), ]; - content_col = content_col.push(Space::with_height(16.0)); + content_col = content_col.push(Space::new().height(16.0)); content_col = content_col.push(buttons); container(content_col.padding(20)) @@ -446,7 +446,7 @@ pub fn view( .on_press(Message::DismissModal) .padding([6, 16]) .style(cancel_button_style), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), keyboard::button( text(t(locale, "modal.confirm.confirm")) .size(13) @@ -459,9 +459,9 @@ pub fn view( let content_col = column![ title, - Space::with_height(12.0), + Space::new().height(12.0), msg, - Space::with_height(16.0), + Space::new().height(16.0), buttons, ] .spacing(4); @@ -478,7 +478,7 @@ pub fn view( .on_press(Message::DismissModal) .padding([6, 16]) .style(cancel_button_style), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), keyboard::button(text(t(locale, "searchIndexRepair.rebuildNow")).size(13)) .on_press(Message::ConfirmModal(ConfirmAction::RebuildSearchIndex)) .padding([6, 16]) @@ -489,12 +489,12 @@ pub fn view( .size(16) .shaping(Shaping::Advanced) .color(Color::WHITE), - Space::with_height(12.0), + Space::new().height(12.0), text(t(locale, "searchIndexRepair.message")) .size(13) .shaping(Shaping::Advanced) .color(Color::from_rgb(0.80, 0.80, 0.85)), - Space::with_height(16.0), + Space::new().height(16.0), buttons, ]; container(content.padding(20)) @@ -566,22 +566,22 @@ pub fn view( .size(16) .shaping(Shaping::Advanced) .color(Color::WHITE), - Space::with_height(12.0), + Space::new().height(12.0), text(t(locale, "searchIndexRepair.rebuildingMessage")) .size(13) .shaping(Shaping::Advanced) .color(Color::from_rgb(0.80, 0.80, 0.85)), ]; content = if cancellation_requested { - content.push(Space::with_height(16.0)).push( + content.push(Space::new().height(16.0)).push( text(t(locale, "tasks.status.cancelling")) .size(13) .shaping(Shaping::Advanced) .color(Color::from_rgb(0.80, 0.80, 0.85)), ) } else { - content.push(Space::with_height(16.0)).push(row![ - Space::with_width(Length::Fill), + content.push(Space::new().height(16.0)).push(row![ + Space::new().width(Length::Fill), keyboard::button(text(t(locale, "tasks.cancelTask")).size(13)) .on_press(Message::CancelTask( crate::state::navigation::TaskSource::Local, @@ -654,7 +654,7 @@ pub fn view( let internal_content: Element<'static, Message> = if results.is_empty() { column![ search_input, - Space::with_height(12.0), + Space::new().height(12.0), text(t(locale, "modal.postInsertLink.emptyState")) .size(12) .shaping(Shaping::Advanced) @@ -663,7 +663,7 @@ pub fn view( .spacing(4) .into() } else { - let mut column = column![search_input, Space::with_height(12.0)]; + let mut column = column![search_input, Space::new().height(12.0)]; for link in results { column = column.push( keyboard::button( @@ -746,9 +746,9 @@ pub fn view( .padding([6, 10]) .width(Length::Fill) .style(inputs::field_style), - Space::with_height(12.0), + Space::new().height(12.0), row![ - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), keyboard::button(text(t(locale, "modal.postInsertLink.insert"))) .on_press(Message::PostEditor( PostEditorMsg::PostInsertLinkExternalInsert @@ -788,7 +788,7 @@ pub fn view( if active_tab == PostInsertLinkTab::Internal { create_post_btn } else { - Space::with_width(0.0).into() + Space::new().width(0.0).into() }; let buttons = row![ @@ -796,20 +796,20 @@ pub fn view( .on_press(Message::DismissModal) .padding([6, 16]) .style(cancel_button_style), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), trailing_button, ] .spacing(8); let content = column![ tabs, - Space::with_height(12.0), + Space::new().height(12.0), if active_tab == PostInsertLinkTab::Internal { internal_content } else { external_content }, - Space::with_height(16.0), + Space::new().height(16.0), buttons, ] .spacing(4); @@ -896,7 +896,7 @@ pub fn view( }, ..container::Style::default() }), - Space::with_height(8.0), + Space::new().height(8.0), media_title, media_name, ] @@ -939,7 +939,7 @@ pub fn view( let media_list_col: Element<'static, Message> = if media_list.is_empty() { column![ search_input, - Space::with_height(12.0), + Space::new().height(12.0), text(t(locale, "modal.postInsertLink.emptyState")) .size(12) .shaping(Shaping::Advanced) @@ -950,7 +950,7 @@ pub fn view( } else { column![ search_input, - Space::with_height(16.0), + Space::new().height(16.0), container(grid).width(Length::Fill).center_x(Length::Fill), ] .spacing(8) @@ -971,9 +971,9 @@ pub fn view( let content = column![ title, - Space::with_height(12.0), + Space::new().height(12.0), media_list_col, - Space::with_height(16.0), + Space::new().height(16.0), buttons, ] .spacing(4) @@ -1039,7 +1039,7 @@ pub fn view( }, ..container::Style::default() }), - Space::with_height(8.0), + Space::new().height(8.0), media_title, ] .spacing(4) @@ -1110,16 +1110,16 @@ pub fn view( .on_press(Message::PostEditor(PostEditorMsg::PostGalleryPrevious)) .padding([6, 12]) .style(cancel_button_style), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(format!("{} / {}", index + 1, image_media.len())) .size(12) .shaping(Shaping::Advanced), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), keyboard::button(text(">")) .on_press(Message::PostEditor(PostEditorMsg::PostGalleryNext)) .padding([6, 12]) .style(cancel_button_style), - Space::with_width(12.0), + Space::new().width(12.0), keyboard::button(text(t(locale, "modal.postGallery.backToGrid"))) .on_press(Message::PostEditor( PostEditorMsg::PostGalleryCloseLightbox @@ -1132,10 +1132,10 @@ pub fn view( .spacing(12) .into() } else { - Space::with_height(0.0).into() + Space::new().height(0.0).into() } } else { - Space::with_height(0.0).into() + Space::new().height(0.0).into() }; let content = column![ @@ -1144,7 +1144,7 @@ pub fn view( } else { container(grid).center_x(Length::Fill).into() }, - Space::with_height(16.0), + Space::new().height(16.0), close_button, ] .spacing(4); @@ -1167,7 +1167,8 @@ pub fn view( .enumerate() .map(|(index, field)| { let toggle = keyboard::focusable( - checkbox(field.label.clone(), field.accepted) + checkbox(field.accepted) + .label(field.label.clone()) .on_toggle_maybe((!field.locked).then_some(move |value| { Message::ToggleAiSuggestionField(index, value) })) @@ -1217,7 +1218,7 @@ pub fn view( .on_press(Message::DismissModal) .padding([6, 16]) .style(cancel_button_style), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), keyboard::button(text(t(locale, "modal.aiSuggestions.applySelected")).size(13)) .on_press(Message::ApplyAiSuggestions(target, fields)) .padding([6, 16]) @@ -1226,12 +1227,12 @@ pub fn view( let content = column![ title, - Space::with_height(12.0), + Space::new().height(12.0), scrollable(column(rows).spacing(8)) .direction(scrollable::Direction::Vertical(inputs::compact_scrollbar())) .style(inputs::scrollable_style) .height(Length::Fixed(320.0)), - Space::with_height(16.0), + Space::new().height(16.0), buttons, ] .spacing(4); @@ -1283,7 +1284,7 @@ pub fn view( .size(13) .shaping(Shaping::Advanced) .color(Color::WHITE), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(status) .size(11) .color(Color::from_rgb(0.60, 0.60, 0.68)), @@ -1301,9 +1302,9 @@ pub fn view( let content = column![ title, subtitle, - Space::with_height(12.0), + Space::new().height(12.0), column(rows).spacing(6), - Space::with_height(16.0), + Space::new().height(16.0), keyboard::button(text(t(locale, "common.cancel")).size(13)) .on_press(Message::DismissModal) .padding([6, 16]) diff --git a/crates/bds-ui/src/views/panel.rs b/crates/bds-ui/src/views/panel.rs index c2f663d..a91561b 100644 --- a/crates/bds-ui/src/views/panel.rs +++ b/crates/bds-ui/src/views/panel.rs @@ -40,7 +40,7 @@ fn task_row( weight: iced::font::Weight::Semibold, ..Font::DEFAULT }), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(status) .size(10) .shaping(Shaping::Advanced) @@ -67,7 +67,7 @@ fn task_row( rows.push( row![ progress_bar(0.0..=1.0, progress.clamp(0.0, 1.0)) - .height(Length::Fixed(6.0)) + .girth(Length::Fixed(6.0)) .style(task_progress_style), text(format!("{:.0}%", progress * 100.0)) .size(10) @@ -81,7 +81,7 @@ fn task_row( if snapshot.is_cancellable { rows.push( row![ - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), keyboard::button(text(t(locale, "tasks.cancelTask")).size(10)) .on_press(Message::CancelTask(snapshot.source, snapshot.id)) .padding([3, 8]) @@ -102,7 +102,7 @@ fn task_row( .into(); if is_group_child { - row![Space::with_width(Length::Fixed(16.0)), card] + row![Space::new().width(Length::Fixed(16.0)), card] .width(Length::Fill) .into() } else { @@ -334,7 +334,7 @@ pub fn view( tab_row.push(git_log_btn.into()); } - tab_row.push(Space::with_width(Length::Fill).into()); + tab_row.push(Space::new().width(Length::Fill).into()); tab_row.push(close_btn.into()); let tab_header = iced::widget::Row::with_children(tab_row) @@ -477,7 +477,7 @@ pub fn view( } } - items.push(Space::with_height(8.0).into()); + items.push(Space::new().height(8.0).into()); items.push( text(t(locale, "editor.backlinks")) .size(12) @@ -530,7 +530,7 @@ pub fn view( row![ text(short).size(11).font(iced::Font::MONOSPACE), text(subject.clone()).size(11), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(commit.date.clone().unwrap_or_default()).size(10), ] .spacing(8), diff --git a/crates/bds-ui/src/views/post_editor.rs b/crates/bds-ui/src/views/post_editor.rs index 381adfc..57bff8b 100644 --- a/crates/bds-ui/src/views/post_editor.rs +++ b/crates/bds-ui/src/views/post_editor.rs @@ -748,7 +748,7 @@ pub fn view<'a>( &state.tags_input, ); let semantic_tags: Element<'a, Message> = if semantic_suggestions.is_empty() { - Space::new(0, 0).into() + Space::new().into() } else { let mut chips = row![ text(t(locale, "editor.semanticTagSuggestions")) @@ -776,7 +776,7 @@ pub fn view<'a>( let matching_tags: Element<'a, Message> = if state.tags_input.trim().is_empty() || (matching_suggestions.is_empty() && !query_addable) { - Space::new(0, 0).into() + Space::new().into() } else { let mut chips = row![ text(t(locale, "editor.matchingTags")) @@ -822,7 +822,7 @@ pub fn view<'a>( // Post links sections let outlinks_section: Element<'a, Message> = if state.outlinks.is_empty() { - Space::new(0, 0).into() + Space::new().into() } else { let mut items: Vec> = vec![ text(t(locale, "editor.outlinks")) @@ -844,7 +844,7 @@ pub fn view<'a>( }; let backlinks_section: Element<'a, Message> = if state.backlinks.is_empty() { - Space::new(0, 0).into() + Space::new().into() } else { let mut items: Vec> = vec![ text(t(locale, "editor.backlinks")) @@ -880,7 +880,7 @@ pub fn view<'a>( .size(12) .color(inputs::LABEL_COLOR) .shaping(Shaping::Advanced), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), link_existing_button, ] .align_y(iced::Alignment::Center) @@ -977,7 +977,7 @@ pub fn view<'a>( ) .into() } else { - Space::new(0, 0).into() + Space::new().into() }; // ── Collapsible Excerpt Section ── @@ -1008,7 +1008,7 @@ pub fn view<'a>( )) .into() } else { - Space::new(0, 0).into() + Space::new().into() }; // ── Content section (fills remaining space) ── @@ -1034,7 +1034,7 @@ pub fn view<'a>( vec![ row![ content_label, - Space::with_width(Length::Fixed(12.0)), + Space::new().width(Length::Fixed(12.0)), mode_toggle ] .align_y(iced::Alignment::Center) @@ -1052,7 +1052,7 @@ pub fn view<'a>( .style(inputs::secondary_button) .into() } else { - Space::new(0, 0).into() + Space::new().into() }, if show_content_actions { keyboard::button( @@ -1065,7 +1065,7 @@ pub fn view<'a>( .style(inputs::secondary_button) .into() } else { - Space::new(0, 0).into() + Space::new().into() }, if show_content_actions { keyboard::button( @@ -1078,7 +1078,7 @@ pub fn view<'a>( .style(inputs::secondary_button) .into() } else { - Space::new(0, 0).into() + Space::new().into() }, ], ); @@ -1108,19 +1108,19 @@ pub fn view<'a>( // ── Footer ── let published_gap: Element<'a, Message> = if state.published_at.is_some() { - Space::with_width(Length::Fixed(24.0)).into() + Space::new().width(Length::Fixed(24.0)).into() } else { - Space::new(0, 0).into() + Space::new().into() }; let published_label: Element<'a, Message> = if let Some(published_at) = state.published_at { inputs::date_label(&t(locale, "editor.publishedAt"), published_at) } else { - Space::new(0, 0).into() + Space::new().into() }; let footer = row![ inputs::date_label(&t(locale, "editor.createdAt"), state.created_at), - Space::with_width(Length::Fixed(24.0)), + Space::new().width(Length::Fixed(24.0)), inputs::date_label(&t(locale, "editor.updatedAt"), state.updated_at), published_gap, published_label, diff --git a/crates/bds-ui/src/views/project_selector.rs b/crates/bds-ui/src/views/project_selector.rs index 22d47dc..d0aa205 100644 --- a/crates/bds-ui/src/views/project_selector.rs +++ b/crates/bds-ui/src/views/project_selector.rs @@ -134,7 +134,7 @@ pub fn view( .spacing(6) } else { row![ - Space::with_width(Length::Fixed(14.0)), + Space::new().width(Length::Fixed(14.0)), text(name) .size(12) .shaping(Shaping::Advanced) @@ -161,7 +161,7 @@ pub fn view( // Separator items.push( - container(Space::new(Length::Fill, Length::Fixed(1.0))) + container(Space::new().width(Length::Fill).height(Length::Fixed(1.0))) .style(|_theme: &Theme| container::Style { background: Some(Background::Color(Color::from_rgb(0.30, 0.30, 0.35))), ..container::Style::default() diff --git a/crates/bds-ui/src/views/script_editor.rs b/crates/bds-ui/src/views/script_editor.rs index 9206ecf..19535c8 100644 --- a/crates/bds-ui/src/views/script_editor.rs +++ b/crates/bds-ui/src/views/script_editor.rs @@ -243,13 +243,13 @@ pub fn view<'a>(state: &'a ScriptEditorState, locale: UiLocale) -> Element<'a, M .padding(8) .into() } else { - Space::new(0, 0).into() + Space::new().into() }; // Footer let footer = row![ inputs::date_label(&t(locale, "editor.createdAt"), state.created_at), - Space::with_width(Length::Fixed(24.0)), + Space::new().width(Length::Fixed(24.0)), inputs::date_label(&t(locale, "editor.updatedAt"), state.updated_at), ] .padding(8); diff --git a/crates/bds-ui/src/views/settings_view.rs b/crates/bds-ui/src/views/settings_view.rs index 76dcb3e..359c571 100644 --- a/crates/bds-ui/src/views/settings_view.rs +++ b/crates/bds-ui/src/views/settings_view.rs @@ -936,7 +936,8 @@ fn section_mcp<'a>(state: &'a SettingsViewState, locale: UiLocale) -> Element<'a }; let server = column![ keyboard::focusable( - iced::widget::checkbox(t(locale, "settings.mcpEnable"), state.mcp_enabled) + iced::widget::checkbox(state.mcp_enabled) + .label(t(locale, "settings.mcpEnable")) .on_toggle(|value| Message::Settings(SettingsMsg::McpEnabledChanged(value))), true, ), @@ -1003,10 +1004,12 @@ fn section_mcp<'a>(state: &'a SettingsViewState, locale: UiLocale) -> Element<'a let configured = agent.configured; column![ keyboard::focusable( - iced::widget::checkbox(agent.label.clone(), configured).on_toggle({ - let agent = agent.agent; - move |_| Message::Settings(SettingsMsg::McpAgentToggled(agent)) - }), + iced::widget::checkbox(configured) + .label(agent.label.clone()) + .on_toggle({ + let agent = agent.agent; + move |_| Message::Settings(SettingsMsg::McpAgentToggled(agent)) + }), true, ), text(agent.config_path.clone()) diff --git a/crates/bds-ui/src/views/sidebar.rs b/crates/bds-ui/src/views/sidebar.rs index ba32bae..921d640 100644 --- a/crates/bds-ui/src/views/sidebar.rs +++ b/crates/bds-ui/src/views/sidebar.rs @@ -516,7 +516,7 @@ fn post_filter_panel( Message::SetPostStatusFilter, locale, )); - sections.push(Space::with_height(4.0).into()); + sections.push(Space::new().height(4.0).into()); if !filter.available_languages.is_empty() { let languages = filter @@ -531,7 +531,7 @@ fn post_filter_panel( Message::SetPostLanguageFilter, locale, )); - sections.push(Space::with_height(4.0).into()); + sections.push(Space::new().height(4.0).into()); } // Calendar archive @@ -544,7 +544,7 @@ fn post_filter_panel( Message::SetPostCalendarMonth, locale, )); - sections.push(Space::with_height(4.0).into()); + sections.push(Space::new().height(4.0).into()); } // Tag chips @@ -556,7 +556,7 @@ fn post_filter_panel( Message::TogglePostTagFilter, locale, )); - sections.push(Space::with_height(4.0).into()); + sections.push(Space::new().height(4.0).into()); } // Category chips (not shown for Pages since Pages IS a category filter) @@ -568,7 +568,7 @@ fn post_filter_panel( Message::TogglePostCategoryFilter, locale, )); - sections.push(Space::with_height(4.0).into()); + sections.push(Space::new().height(4.0).into()); } sections.push( @@ -596,7 +596,7 @@ fn post_filter_panel( .spacing(2) .into(), ); - sections.push(Space::with_height(4.0).into()); + sections.push(Space::new().height(4.0).into()); // Clear all filters button if filter.has_active_filters() { @@ -631,7 +631,7 @@ fn media_filter_panel(filter: &MediaFilter, locale: UiLocale) -> Element<'static Message::SetMediaCalendarMonth, locale, )); - sections.push(Space::with_height(4.0).into()); + sections.push(Space::new().height(4.0).into()); } if !filter.available_tags.is_empty() { @@ -642,7 +642,7 @@ fn media_filter_panel(filter: &MediaFilter, locale: UiLocale) -> Element<'static Message::ToggleMediaTagFilter, locale, )); - sections.push(Space::with_height(4.0).into()); + sections.push(Space::new().height(4.0).into()); } if filter.has_active_filters() { @@ -712,7 +712,7 @@ pub fn view( let header_row: Element<'static, Message> = if let Some(action) = create_action { row![ header, - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), keyboard::button( text(t(locale, "common.add")) .size(11) @@ -764,9 +764,9 @@ pub fn view( // Filter panel (collapsible) if filter.filter_panel_visible { - top_items.push(Space::with_height(4.0).into()); + top_items.push(Space::new().height(4.0).into()); top_items.push(post_filter_panel(filter, is_pages, locale)); - top_items.push(Space::with_height(4.0).into()); + top_items.push(Space::new().height(4.0).into()); } // Post list @@ -848,7 +848,7 @@ pub fn view( for p in &drafts { top_items.push(make_post_item(p)); } - top_items.push(Space::with_height(6.0).into()); + top_items.push(Space::new().height(6.0).into()); } // Published section @@ -861,7 +861,7 @@ pub fn view( for p in &published { top_items.push(make_post_item(p)); } - top_items.push(Space::with_height(6.0).into()); + top_items.push(Space::new().height(6.0).into()); } // Archived section @@ -914,9 +914,9 @@ pub fn view( // Filter panel (collapsible) if filter.filter_panel_visible { - top_items.push(Space::with_height(4.0).into()); + top_items.push(Space::new().height(4.0).into()); top_items.push(media_filter_panel(filter, locale)); - top_items.push(Space::with_height(4.0).into()); + top_items.push(Space::new().height(4.0).into()); } if media.is_empty() { @@ -1308,7 +1308,7 @@ pub fn view( SidebarView::Git => crate::views::git::sidebar_view(git_state, offline_mode, locale), }; - let content = column![header_row, Space::with_height(8.0), body,] + let content = column![header_row, Space::new().height(8.0), body,] .spacing(4) .padding(12); diff --git a/crates/bds-ui/src/views/status_bar.rs b/crates/bds-ui/src/views/status_bar.rs index 07176b0..44db091 100644 --- a/crates/bds-ui/src/views/status_bar.rs +++ b/crates/bds-ui/src/views/status_bar.rs @@ -176,7 +176,7 @@ pub fn view( .color(label_color) .into() } else { - Space::with_width(0).into() + Space::new().width(0).into() }; let left = row![project_trigger, task_indicator] @@ -199,7 +199,7 @@ pub fn view( .color(color) .into() } else { - Space::with_width(0).into() + Space::new().width(0).into() }; // Post + media counts @@ -226,7 +226,7 @@ pub fn view( ) }); let chat_tokens_el: Element<'static, Message> = chat_token_label.map_or_else( - || Space::with_width(0).into(), + || Space::new().width(0).into(), |label| { text(label) .size(11) @@ -282,7 +282,7 @@ pub fn view( .align_y(Alignment::Center); container( - row![left, Space::with_width(Length::Fill), right,] + row![left, Space::new().width(Length::Fill), right,] .align_y(Alignment::Center) .padding([0, 8]), ) diff --git a/crates/bds-ui/src/views/style_view.rs b/crates/bds-ui/src/views/style_view.rs index 4c12590..133a366 100644 --- a/crates/bds-ui/src/views/style_view.rs +++ b/crates/bds-ui/src/views/style_view.rs @@ -204,7 +204,7 @@ fn theme_accent_background(theme: &StyleTheme) -> Background { } fn swatch(background: Background, width_portion: u16) -> Element<'static, Message> { - container(Space::new(Length::Fill, Length::Fill)) + container(Space::new().width(Length::Fill).height(Length::Fill)) .width(Length::FillPortion(width_portion)) .height(Length::Fixed(30.0)) .style(move |_: &Theme| container::Style { @@ -270,7 +270,7 @@ pub fn view<'a>( .map(|theme| theme_button(theme, &state.selected_theme)) .collect::>(); while children.len() < 4 { - children.push(Space::with_width(Length::FillPortion(1)).into()); + children.push(Space::new().width(Length::FillPortion(1)).into()); } iced::widget::Row::with_children(children) .spacing(8) diff --git a/crates/bds-ui/src/views/tab_bar.rs b/crates/bds-ui/src/views/tab_bar.rs index 1841840..65c3810 100644 --- a/crates/bds-ui/src/views/tab_bar.rs +++ b/crates/bds-ui/src/views/tab_bar.rs @@ -125,7 +125,7 @@ fn build_tooltip_text(tab: &Tab, locale: UiLocale) -> String { pub fn view(tabs: &[Tab], active_tab: Option<&str>, locale: UiLocale) -> Element<'static, Message> { // Per tabs.allium: "Hidden when no tabs exist." if tabs.is_empty() { - return Space::with_height(0).into(); + return Space::new().height(0).into(); } let tab_buttons: Vec> = tabs diff --git a/crates/bds-ui/src/views/tags_view.rs b/crates/bds-ui/src/views/tags_view.rs index 43ea225..659891e 100644 --- a/crates/bds-ui/src/views/tags_view.rs +++ b/crates/bds-ui/src/views/tags_view.rs @@ -250,12 +250,14 @@ fn view_categories<'a>(state: &'a SettingsViewState, locale: UiLocale) -> Elemen let name = category.name.clone(); cells.push( container(keyboard::focusable( - checkbox("", category.render_in_lists).on_toggle(move |value| { - Message::Settings(SettingsMsg::CategoryRenderInListsChanged( - name.clone(), - value, - )) - }), + checkbox(category.render_in_lists) + .label("") + .on_toggle(move |value| { + Message::Settings(SettingsMsg::CategoryRenderInListsChanged( + name.clone(), + value, + )) + }), true, )) .width(Length::Fixed(TOGGLE_WIDTH)) @@ -264,9 +266,14 @@ fn view_categories<'a>(state: &'a SettingsViewState, locale: UiLocale) -> Elemen let name = category.name.clone(); cells.push( container(keyboard::focusable( - checkbox("", category.show_title).on_toggle(move |value| { - Message::Settings(SettingsMsg::CategoryShowTitleChanged(name.clone(), value)) - }), + checkbox(category.show_title) + .label("") + .on_toggle(move |value| { + Message::Settings(SettingsMsg::CategoryShowTitleChanged( + name.clone(), + value, + )) + }), true, )) .width(Length::Fixed(TOGGLE_WIDTH)) @@ -587,19 +594,21 @@ fn view_manage<'a>(state: &'a TagsViewState, locale: UiLocale) -> Element<'a, Me .unwrap_or(0); keyboard::button( row![ - container(Space::new(12, 12)).style(move |_: &Theme| container::Style { - background: Some(Background::Color(color)), - border: iced::Border { - radius: 6.0.into(), - ..iced::Border::default() - }, - ..container::Style::default() + container(Space::new().width(12).height(12)).style(move |_: &Theme| { + container::Style { + background: Some(Background::Color(color)), + border: iced::Border { + radius: 6.0.into(), + ..iced::Border::default() + }, + ..container::Style::default() + } }), text(&tag.name).size(14), text(format!("({count})")) .size(12) .color(Color::from_rgb(0.55, 0.58, 0.65)), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), ] .spacing(8) .align_y(Alignment::Center), @@ -748,7 +757,7 @@ fn view_merge<'a>(state: &'a TagsViewState, locale: UiLocale) -> Element<'a, Mes |choice| Message::Tags(TagsMsg::SetMergeTarget(choice)), ), if merge_preview.is_empty() { - Element::from(Space::new(0, 0)) + Element::from(Space::new()) } else { container( text(tw(locale, "tags.mergePreview", &[("tags", &merge_preview)])).size(12), @@ -831,7 +840,7 @@ fn color_swatches<'a>(locale: UiLocale, create_mode: bool) -> Element<'a, Messag } else { TagsMsg::EditTagColor((*hex).to_string()) }; - keyboard::button(Space::new(18, 18)) + keyboard::button(Space::new().width(18).height(18)) .on_press(Message::Tags(msg)) .padding(0) .style(move |_theme: &Theme, _status| button::Style { diff --git a/crates/bds-ui/src/views/template_editor.rs b/crates/bds-ui/src/views/template_editor.rs index 458b554..73ae1c5 100644 --- a/crates/bds-ui/src/views/template_editor.rs +++ b/crates/bds-ui/src/views/template_editor.rs @@ -207,13 +207,13 @@ pub fn view<'a>(state: &'a TemplateEditorState, locale: UiLocale) -> Element<'a, .padding(8) .into() } else { - Space::new(0, 0).into() + Space::new().into() }; // Footer let footer = row![ inputs::date_label(&t(locale, "editor.createdAt"), state.created_at), - Space::with_width(Length::Fixed(24.0)), + Space::new().width(Length::Fixed(24.0)), inputs::date_label(&t(locale, "editor.updatedAt"), state.updated_at), ] .padding(8); diff --git a/crates/bds-ui/src/views/toast.rs b/crates/bds-ui/src/views/toast.rs index a0e0bef..fa23fcb 100644 --- a/crates/bds-ui/src/views/toast.rs +++ b/crates/bds-ui/src/views/toast.rs @@ -75,7 +75,7 @@ pub fn view(toasts: &[Toast]) -> Option> { .size(12) .shaping(Shaping::Advanced) .color(Color::WHITE), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), dismiss, ] .spacing(8) diff --git a/crates/bds-ui/src/views/translation_validation.rs b/crates/bds-ui/src/views/translation_validation.rs index 4bc6f75..cc4c675 100644 --- a/crates/bds-ui/src/views/translation_validation.rs +++ b/crates/bds-ui/src/views/translation_validation.rs @@ -30,7 +30,7 @@ pub fn view<'a>(state: &'a TranslationValidationState, locale: UiLocale) -> Elem .size(24) .shaping(Shaping::Advanced) .color(Color::from_rgb(0.88, 0.88, 0.92)), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), run, ] .align_y(iced::Alignment::Center), @@ -77,7 +77,7 @@ fn issue_section<'a>( locale: UiLocale, ) -> Element<'a, Message> { if issues.is_empty() { - return Space::new(0, 0).into(); + return Space::new().into(); } let rows = issues.iter().fold(column!().spacing(6), |column, issue| { let location = issue.file_path.as_deref().unwrap_or(issue.post_id.as_str()); diff --git a/crates/bds-ui/src/views/workspace.rs b/crates/bds-ui/src/views/workspace.rs index 05cb6f1..9706ef5 100644 --- a/crates/bds-ui/src/views/workspace.rs +++ b/crates/bds-ui/src/views/workspace.rs @@ -60,7 +60,7 @@ fn drag_handle_style(_theme: &Theme) -> container::Style { /// Horizontal line separator (full width). fn separator_h<'a>() -> Element<'a, Message> { - container(Space::new(0, 0)) + container(Space::new()) .width(Length::Fill) .height(Length::Fixed(1.0)) .style(|_theme: &Theme| container::Style { @@ -245,7 +245,7 @@ pub fn view<'a>( )); // Resize drag handle: 4px wide strip between sidebar and content - let handle = container(Space::new(0, 0)) + let handle = container(Space::new()) .width(Length::Fixed(4.0)) .height(Length::Fill) .style(drag_handle_style); @@ -325,9 +325,9 @@ pub fn view<'a>( Some( container( container(row![ - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), dropdown_menu, - Space::with_width(Length::Fixed(40.0)), + Space::new().width(Length::Fixed(40.0)), ]) .width(Length::Fill) .align_y(Alignment::End) @@ -350,9 +350,9 @@ pub fn view<'a>( Some( container( container(row![ - Space::with_width(Length::Fixed(8.0)), + Space::new().width(Length::Fixed(8.0)), dropdown, - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), ]) .width(Length::Fill) .align_y(Alignment::End)