From fd3f8e45dc16380695cd9f88d8a8f45563394368 Mon Sep 17 00:00:00 2001 From: Georg Bauer Date: Sun, 26 Jul 2026 18:45:33 +0200 Subject: [PATCH] Upgrade Iced and render Markdown tables --- Cargo.lock | 1618 +++++++++++++++------------------ Cargo.toml | 3 +- PLAN.md | 3 + src/app.rs | 82 +- src/app/generation.rs | 43 +- src/app/view.rs | 40 +- src/app/view/chat.rs | 17 +- src/app/view/model_manager.rs | 18 +- src/app/view/preferences.rs | 65 +- src/app/view/stats.rs | 35 +- src/main.rs | 15 +- src/native_edit.rs | 56 +- 12 files changed, 932 insertions(+), 1063 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ebc1328..8b553e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,17 +24,6 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" -[[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" @@ -49,10 +38,13 @@ dependencies = [ ] [[package]] -name = "allocator-api2" -version = "0.2.21" +name = "aho-corasick" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] [[package]] name = "android-activity" @@ -68,11 +60,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" @@ -88,15 +89,6 @@ dependencies = [ "libc", ] -[[package]] -name = "approx" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" -dependencies = [ - "num-traits", -] - [[package]] name = "arrayref" version = "0.3.9" @@ -117,11 +109,11 @@ checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" [[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]] @@ -135,7 +127,7 @@ dependencies = [ "enumflags2", "futures-channel", "futures-util", - "rand 0.9.5", + "rand", "raw-window-handle", "serde", "serde_repr", @@ -143,7 +135,7 @@ dependencies = [ "wayland-backend", "wayland-client", "wayland-protocols", - "zbus 5.18.0", + "zbus", ] [[package]] @@ -351,18 +343,18 @@ dependencies = [ [[package]] name = "bit-set" -version = "0.5.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ "bit-vec", ] [[package]] name = "bit-vec" -version = "0.6.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitflags" @@ -385,15 +377,6 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - [[package]] name = "block-buffer" version = "0.12.1" @@ -440,12 +423,6 @@ version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" -[[package]] -name = "by_address" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" - [[package]] name = "bytemuck" version = "1.25.2" @@ -466,6 +443,12 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" version = "1.12.1" @@ -576,12 +559,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" @@ -629,12 +606,13 @@ dependencies = [ [[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]] @@ -643,37 +621,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" -[[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" @@ -709,6 +656,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -722,8 +679,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" dependencies = [ "bitflags 1.3.2", - "core-foundation", - "core-graphics-types", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", "foreign-types", "libc", ] @@ -735,42 +692,54 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "libc", ] +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.13.1", + "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.12.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fd57d82eb4bfe7ffa9b1cec0c05e2fd378155b47f255a67983cb4afe0e80c2" +checksum = "173852283a9a57a3cbe365d86e74dc428a09c50421477d5ad6fe9d9509e37737" dependencies = [ "bitflags 2.13.1", - "fontdb 0.16.2", + "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", "unicode-segmentation", ] -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - [[package]] name = "cpufeatures" version = "0.3.0" @@ -798,25 +767,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "crossbeam-deque" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" -dependencies = [ - "crossbeam-utils", -] - [[package]] name = "crossbeam-utils" version = "0.8.22" @@ -830,13 +780,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] -name = "crypto-common" -version = "0.1.7" +name = "cryoglyph" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +checksum = "08bc795bdbccdbd461736fb163930a009da6597b226d6f6fce33e7a8eb6ec519" dependencies = [ - "generic-array", - "typenum", + "cosmic-text", + "etagere", + "lru", + "rustc-hash 2.1.3", + "wgpu", ] [[package]] @@ -863,33 +816,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" -[[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", - "objc", - "rust-ini", - "web-sys", - "winreg", - "zbus 4.4.0", -] - [[package]] name = "darling" version = "0.21.3" @@ -931,24 +857,12 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" -[[package]] -name = "dconf_rs" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7046468a81e6a002061c01e6a7c83139daf91b11c30e66795b13217c2d885c8b" - [[package]] name = "deranged" version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" -[[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" @@ -995,45 +909,15 @@ dependencies = [ "syn 2.0.119", ] -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "crypto-common 0.1.7", -] - [[package]] name = "digest" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ - "block-buffer 0.12.1", + "block-buffer", "const-oid", - "crypto-common 0.2.2", -] - -[[package]] -name = "dirs" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi", + "crypto-common", ] [[package]] @@ -1071,14 +955,17 @@ 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" +name = "document-features" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] [[package]] name = "downcast-rs" @@ -1098,46 +985,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 = "ds4-server" version = "0.1.0" @@ -1155,6 +1002,7 @@ dependencies = [ "serde_norway", "sha2", "ureq", + "url", ] [[package]] @@ -1273,10 +1121,15 @@ dependencies = [ ] [[package]] -name = "fast-srgb8" -version = "1.0.0" +name = "fancy-regex" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" +checksum = "998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f" +dependencies = [ + "bit-set", + "regex-automata", + "regex-syntax", +] [[package]] name = "fastrand" @@ -1331,6 +1184,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" @@ -1339,9 +1198,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", ] @@ -1357,30 +1225,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]] @@ -1578,16 +1432,6 @@ dependencies = [ "system-deps", ] -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - [[package]] name = "gethostname" version = "1.1.0" @@ -1604,7 +1448,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]] @@ -1749,9 +1593,9 @@ dependencies = [ [[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", @@ -1761,9 +1605,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", ] @@ -1800,33 +1644,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", + "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", ] @@ -1901,26 +1744,30 @@ checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "cfg-if", "crunchy", + "num-traits", "zerocopy", ] [[package]] -name = "hashbrown" -version = "0.12.3" +name = "harfrust" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "92c020db12c71d8a12a3fe7607873cade3a01a6287e29d540c8723276221b9d8" dependencies = [ - "ahash 0.7.8", + "bitflags 2.13.1", + "bytemuck", + "core_maths", + "read-fonts 0.35.0", + "smallvec", ] [[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]] @@ -1929,7 +1776,7 @@ version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ - "foldhash", + "foldhash 0.2.0", ] [[package]] @@ -1938,21 +1785,6 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" -[[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", -] - [[package]] name = "heck" version = "0.4.1" @@ -2010,44 +1842,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_highlighter", "iced_renderer", + "iced_runtime", "iced_widget", "iced_winit", - "thiserror 1.0.69", + "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", @@ -2055,27 +1898,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", - "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", @@ -2084,58 +1914,67 @@ dependencies = [ "iced_core", "iced_futures", "log", - "once_cell", "raw-window-handle", "rustc-hash 2.1.3", - "thiserror 1.0.69", + "thiserror 2.0.19", "unicode-segmentation", ] [[package]] name = "iced_highlighter" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad88b25a1328cd4bb0b72d8e20f8207c0433649dc788f67e911423b9406f45c" +checksum = "cb24e1610502779b4e307c6f95da616ec7e883b67a18108cb0a036b169e50359" dependencies = [ "iced_core", - "once_cell", - "syntect", + "two-face", +] + +[[package]] +name = "iced_program" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dfafec2947cda688d8eb00dac337ba11aa60f9ef6335aed343e189d26e4a673" +dependencies = [ + "iced_graphics", + "iced_runtime", ] [[package]] name = "iced_renderer" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73558208059f9e622df2bf434e044ee2f838ce75201a023cf0ca3e1244f46c2a" +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", @@ -2147,59 +1986,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", - "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_highlighter", "iced_renderer", - "iced_runtime", + "log", "num-traits", - "once_cell", "pulldown-cmark", "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", ] @@ -2314,10 +2150,20 @@ dependencies = [ ] [[package]] -name = "imagesize" -version = "0.12.0" +name = "image-webp" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284" +checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imagesize" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" [[package]] name = "indexmap" @@ -2329,15 +2175,6 @@ dependencies = [ "hashbrown 0.17.1", ] -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - [[package]] name = "itoa" version = "1.0.18" @@ -2412,12 +2249,6 @@ dependencies = [ "libc", ] -[[package]] -name = "jpeg-decoder" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" - [[package]] name = "js-sys" version = "0.3.103" @@ -2447,7 +2278,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" dependencies = [ "libc", - "libloading 0.8.9", + "libloading", "pkg-config", ] @@ -2484,16 +2315,6 @@ version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" -[[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" @@ -2551,6 +2372,21 @@ dependencies = [ "x11", ] +[[package]] +name = "lilt" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f67562e5eff6b20553fa9be1c503356768420994e28f67e3eafe6f41910e57ad" +dependencies = [ + "web-time", +] + +[[package]] +name = "linebender_resource_handle" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4" + [[package]] name = "linked-hash-map" version = "0.5.6" @@ -2563,12 +2399,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" @@ -2581,6 +2411,12 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + [[package]] name = "lock_api" version = "0.4.14" @@ -2598,9 +2434,9 @@ checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[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 = "malloc_buf" @@ -2637,13 +2473,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", @@ -2702,23 +2538,54 @@ dependencies = [ ] [[package]] -name = "naga" -version = "0.19.2" +name = "mundy" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e3524642f53d9af419ab5e8dd29d3ba155708267667c2f3f06c88c9e130843" +checksum = "f32eb0db40f2df2bcfb05c93b8f73938d4c26ce9ac8881f1df0c8d3296921a73" dependencies = [ + "android-build", + "async-io", + "cfg-if", + "dispatch", + "futures-channel", + "futures-lite", + "jni", + "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]] +name = "naga" +version = "27.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" +dependencies = [ + "arrayvec", "bit-set", "bitflags 2.13.1", + "cfg-if", + "cfg_aliases", "codespan-reporting", + "half", + "hashbrown 0.16.1", "hexf-parse", "indexmap", + "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]] @@ -2730,7 +2597,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", @@ -2742,15 +2609,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" @@ -2760,19 +2618,6 @@ dependencies = [ "jni-sys 0.3.1", ] -[[package]] -name = "nix" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" -dependencies = [ - "bitflags 2.13.1", - "cfg-if", - "cfg_aliases 0.2.2", - "libc", - "memoffset", -] - [[package]] name = "num-conv" version = "0.2.2" @@ -2786,6 +2631,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -2817,7 +2663,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", - "objc_exception", ] [[package]] @@ -2855,8 +2700,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", ] @@ -2869,8 +2714,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]] @@ -2886,6 +2740,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" @@ -2909,6 +2774,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" @@ -2945,6 +2821,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" @@ -2957,6 +2843,31 @@ dependencies = [ "objc2-foundation 0.2.2", ] +[[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" @@ -2983,6 +2894,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ "bitflags 2.13.1", + "block2 0.6.2", + "libc", "objc2 0.6.4", "objc2-core-foundation", ] @@ -3066,9 +2979,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", @@ -3102,43 +3015,12 @@ dependencies = [ "objc2-foundation 0.2.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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" -[[package]] -name = "onig" -version = "6.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc3cbf698f9438986c11a880c90a6d04b9de27575afd28bbf45b154b6c709e2" -dependencies = [ - "bitflags 2.13.1", - "libc", - "once_cell", - "onig_sys", -] - -[[package]] -name = "onig_sys" -version = "69.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e68317604e77e53b85896388e1a803c1d21b74c899ec9e5e1112db90735edd7" -dependencies = [ - "cc", - "pkg-config", -] - [[package]] name = "orbclient" version = "0.3.55" @@ -3150,13 +3032,12 @@ dependencies = [ ] [[package]] -name = "ordered-multimap" -version = "0.4.3" +name = "ordered-float" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" +checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" dependencies = [ - "dlv-list", - "hashbrown 0.12.3", + "num-traits", ] [[package]] @@ -3175,31 +3056,7 @@ version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" dependencies = [ - "ttf-parser 0.25.1", -] - -[[package]] -name = "palette" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cbf71184cc5ecc2e4e1baccdb21026c20e5fc3dcf63028a086131b3ab00b6e6" -dependencies = [ - "approx", - "fast-srgb8", - "palette_derive", - "phf", -] - -[[package]] -name = "palette_derive" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5030daf005bface118c096f510ffb781fc28f9ab6a32ab224d8631be6851d30" -dependencies = [ - "by_address", - "proc-macro2", - "quote", - "syn 2.0.119", + "ttf-parser", ] [[package]] @@ -3233,17 +3090,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" @@ -3251,21 +3097,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]] @@ -3293,48 +3125,6 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_macros", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared", - "rand 0.8.7", -] - -[[package]] -name = "phf_macros" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher", -] - [[package]] name = "pico-args" version = "0.5.0" @@ -3442,6 +3232,21 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" +[[package]] +name = "portable-atomic" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +dependencies = [ + "portable-atomic", +] + [[package]] name = "potential_utf" version = "0.1.5" @@ -3542,9 +3347,9 @@ checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" [[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", @@ -3559,6 +3364,12 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae" +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + [[package]] name = "quick-xml" version = "0.39.4" @@ -3598,35 +3409,14 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" -[[package]] -name = "rand" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - [[package]] name = "rand" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", + "rand_chacha", + "rand_core", ] [[package]] @@ -3636,16 +3426,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", + "rand_core", ] [[package]] @@ -3676,42 +3457,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] -name = "rayon" -version = "1.12.0" +name = "read-fonts" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +checksum = "6717cf23b488adf64b9d711329542ba34de147df262370221940dfabc2c91358" dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", + "bytemuck", + "core_maths", + "font-types 0.10.1", ] [[package]] name = "read-fonts" -version = "0.22.7" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69aacb76b5c29acfb7f90155d39759a29496aebb49395830e928a9703d2eec2f" +checksum = "046a7d674daf459825b32f5062056d6882db0d2f5a479fbd76ccfc870ac18709" dependencies = [ "bytemuck", - "font-types", -] - -[[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", + "font-types 0.12.2", + "once_cell", ] [[package]] @@ -3742,14 +3506,14 @@ dependencies = [ ] [[package]] -name = "redox_users" -version = "0.4.6" +name = "regex-automata" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror 1.0.69", + "aho-corasick", + "memchr", + "regex-syntax", ] [[package]] @@ -3766,18 +3530,19 @@ checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" [[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", - "jpeg-decoder", + "image-webp", "log", "pico-args", "rgb", "svgtypes", "tiny-skia", "usvg", + "zune-jpeg", ] [[package]] @@ -3843,16 +3608,6 @@ dependencies = [ "thiserror 2.0.19", ] -[[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 = "rustc-hash" version = "1.1.0" @@ -3943,15 +3698,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", @@ -4096,17 +3852,6 @@ dependencies = [ "serde_core", ] -[[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 = "sha2" version = "0.11.0" @@ -4114,8 +3859,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", - "cpufeatures 0.3.0", - "digest 0.11.3", + "cpufeatures", + "digest", ] [[package]] @@ -4173,12 +3918,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]] @@ -4282,7 +4037,6 @@ checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" dependencies = [ "as-raw-xcb-connection", "bytemuck", - "drm", "fastrand", "js-sys", "memmap2", @@ -4378,11 +4132,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", ] @@ -4394,7 +4148,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", - "quote", "unicode-ident", ] @@ -4438,10 +4191,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "656b45c05d95a5704399aeef6bd0ddec7b2b3531b7c9e900abbf7c4d2190c925" dependencies = [ "bincode", + "fancy-regex", "flate2", "fnv", "once_cell", - "onig", "plist", "regex-syntax", "serde", @@ -4606,7 +4359,7 @@ checksum = "a90a0ca3ee6a69f2ad28fd11621a4c3f03b371f366be500b64df260c4ffbafb4" dependencies = [ "as-raw-xcb-connection", "ctor", - "libloading 0.8.9", + "libloading", "pkg-config", "tracing", ] @@ -4774,23 +4527,25 @@ dependencies = [ "once_cell", ] -[[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 = "two-face" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e51b6e60e545cfdae5a4639ff423818f52372211a8d9a3e892b4b0761f76b2" +dependencies = [ + "serde", + "serde_derive", + "syntect", +] [[package]] name = "typenum" @@ -4823,15 +4578,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" @@ -4869,24 +4624,12 @@ 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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - [[package]] name = "unsafe-libyaml-norway" version = "0.2.15" @@ -4948,14 +4691,14 @@ checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[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", "data-url", "flate2", - "fontdb 0.18.0", + "fontdb", "imagesize", "kurbo 0.11.3", "log", @@ -5095,18 +4838,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]] @@ -5281,17 +5023,21 @@ checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" [[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", @@ -5306,35 +5052,68 @@ 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-set", "bit-vec", "bitflags 2.13.1", - "cfg_aliases 0.1.1", - "codespan-reporting", + "bytemuck", + "cfg_aliases", + "document-features", + "hashbrown 0.16.1", "indexmap", "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", @@ -5342,56 +5121,57 @@ dependencies = [ "bit-set", "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", + "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", ] -[[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" @@ -5425,35 +5205,128 @@ 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", + "thiserror 2.0.19", ] [[package]] name = "windows" -version = "0.52.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "windows-core", + "windows-core 0.58.0", + "windows-targets", +] + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections", + "windows-core 0.62.2", + "windows-future", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core 0.62.2", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", "windows-targets", ] [[package]] name = "windows-core" -version = "0.52.0" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ - "windows-targets", + "windows-implement 0.60.2", + "windows-interface 0.59.3", + "windows-link", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core 0.62.2", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] @@ -5462,6 +5335,53 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core 0.62.2", + "windows-link", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result 0.2.0", + "windows-targets", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -5505,6 +5425,15 @@ dependencies = [ "windows_x86_64_msvc", ] +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -5559,16 +5488,16 @@ 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", + "core-foundation 0.9.4", "core-graphics", "cursor-icon", "dpi", @@ -5629,15 +5558,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 = "wit-bindgen" version = "0.57.1" @@ -5680,7 +5600,7 @@ dependencies = [ "as-raw-xcb-connection", "gethostname", "libc", - "libloading 0.8.9", + "libloading", "once_cell", "rustix 1.1.4", "x11rb-protocol", @@ -5698,16 +5618,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" @@ -5750,9 +5660,9 @@ dependencies = [ [[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" @@ -5777,44 +5687,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", - "ordered-stream", - "rand 0.8.7", - "serde", - "serde_repr", - "sha1", - "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" @@ -5845,22 +5717,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]] @@ -5873,20 +5732,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]] @@ -5897,14 +5745,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" @@ -5993,16 +5841,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" [[package]] -name = "zvariant" -version = "4.2.0" +name = "zune-core" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-jpeg" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" dependencies = [ - "endi", - "enumflags2", - "serde", - "static_assertions", - "zvariant_derive 4.2.0", + "zune-core", ] [[package]] @@ -6016,21 +5866,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]] @@ -6043,18 +5880,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 f12f5c8..eb6b70d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ cc = "1.3.0" [dependencies] diesel = { version = "2.3.11", features = ["sqlite", "returning_clauses_for_sqlite_3_35", "64-column-tables"] } diesel_migrations = "2.3.2" -iced = { version = "0.13.1", features = ["advanced", "highlighter", "markdown", "svg", "tokio"] } +iced = { version = "0.14.0", features = ["advanced", "highlighter", "markdown", "svg", "tokio"] } memmap2 = "0.9.11" png = "0.17.16" rfd = "0.15.4" @@ -23,6 +23,7 @@ serde_json = { version = "1.0.149", features = ["preserve_order", "raw_value"] } serde_norway = "0.9.42" sha2 = "0.11.0" ureq = { version = "3.3.0", default-features = false, features = ["rustls"] } +url = "2.5.8" [target.'cfg(target_os = "macos")'.dependencies] muda = "0.15.3" diff --git a/PLAN.md b/PLAN.md index 033b255..b796fa5 100644 --- a/PLAN.md +++ b/PLAN.md @@ -62,6 +62,9 @@ execution targets one self-contained Mac. - The remaining model-independent execution gaps are fine-grained SSD cache telemetry, the DS4 expert-locality profiler, and resident multi-session server batching/scheduling. +- The native UI is on Iced 0.14. Chat transcripts use its table-aware Markdown + content and viewer path, with a regression for code-styled line-count tables + produced by coding models. ## Delivery order diff --git a/src/app.rs b/src/app.rs index 11d3bed..9b34917 100644 --- a/src/app.rs +++ b/src/app.rs @@ -25,7 +25,7 @@ use crate::settings::{ ReasoningMode, RuntimePreferences, SpeculativePreferences, SsdPreferences, SteeringPreferences, StreamingCacheBudget, }; -use iced::widget::{markdown, scrollable, text_input}; +use iced::widget::{markdown, scrollable}; use iced::{Size, Subscription, Task, keyboard, mouse, window}; use rfd::AsyncFileDialog; use std::collections::{HashMap, HashSet, VecDeque}; @@ -210,7 +210,7 @@ pub(crate) enum Message { DownloadProgressTick, ComposerChanged(String), ToggleReasoning(usize), - OpenLink(markdown::Url), + OpenLink(markdown::Uri), CopyToolText(String), OpenToolOutput(PathBuf), AllowToolOnce, @@ -514,9 +514,11 @@ impl App { self.error = None; } } - Message::FocusNext => return iced::widget::focus_next().chain(reveal_focused()), + Message::FocusNext => { + return iced::widget::operation::focus_next().chain(reveal_focused()); + } Message::FocusPrevious => { - return iced::widget::focus_previous().chain(reveal_focused()); + return iced::widget::operation::focus_previous().chain(reveal_focused()); } Message::ShowChat => self.detail_tab = DetailTab::Chat, Message::ShowStats => { @@ -807,8 +809,9 @@ impl App { message.reasoning_open = !message.reasoning_open; } } - Message::OpenLink(url) => { - if matches!(url.scheme(), "http" | "https") + Message::OpenLink(uri) => { + if let Ok(url) = url::Url::parse(&uri) + && matches!(url.scheme(), "http" | "https") && let Err(error) = std::process::Command::new("open").arg(url.as_str()).spawn() { self.error = Some(format!("Could not open the link: {error}")); @@ -1165,7 +1168,10 @@ impl App { pub(crate) fn subscription(&self) -> Subscription { let mut subscriptions = vec![ - keyboard::on_key_press(shortcut), + keyboard::listen().filter_map(|event| match event { + keyboard::Event::KeyPressed { key, modifiers, .. } => shortcut(key, modifiers), + _ => None, + }), // A focused text field takes escape for itself to drop its own // focus, so a dialog would never see it through `on_key_press`. iced::event::listen_with(|event, _, _| { @@ -1422,16 +1428,16 @@ fn config_path() -> PathBuf { application_support_path().join("config.yaml") } -pub(super) fn chat_scroll_id() -> scrollable::Id { - scrollable::Id::new("chat-transcript") +pub(super) fn chat_scroll_id() -> iced::widget::Id { + iced::widget::Id::new("chat-transcript") } -pub(super) fn composer_id() -> text_input::Id { - text_input::Id::new("chat-composer") +pub(super) fn composer_id() -> iced::widget::Id { + iced::widget::Id::new("chat-composer") } -pub(super) fn preferences_scroll_id() -> scrollable::Id { - scrollable::Id::new("preferences-fields") +pub(super) fn preferences_scroll_id() -> iced::widget::Id { + iced::widget::Id::new("preferences-fields") } /// Scrolls the preferences form so the field that just took focus is inside @@ -1447,24 +1453,34 @@ fn reveal_focused() -> Task { struct Locate { rows: Vec, + next_container: Option, focused: Option, } impl Operation for Locate { - fn container( + fn traverse(&mut self, operate: &mut dyn FnMut(&mut dyn Operation)) { + let container = self.next_container.take(); + if let Some(bounds) = container { + self.rows.push(bounds); + } + operate(self); + if container.is_some() { + self.rows.pop(); + } + } + + fn container(&mut self, _id: Option<&Id>, bounds: Rectangle) { + self.next_container = Some(bounds); + } + + fn focusable( &mut self, _id: Option<&Id>, bounds: Rectangle, - operate_on_children: &mut dyn FnMut(&mut dyn Operation), + state: &mut dyn operation::Focusable, ) { - self.rows.push(bounds); - operate_on_children(self); - self.rows.pop(); - } - - fn focusable(&mut self, state: &mut dyn operation::Focusable, _id: Option<&Id>) { if state.is_focused() { - self.focused = self.rows.last().copied(); + self.focused = self.rows.last().copied().or(Some(bounds)); } } @@ -1480,24 +1496,19 @@ fn reveal_focused() -> Task { } impl Operation for Reveal { - fn container( - &mut self, - _id: Option<&Id>, - _bounds: Rectangle, - operate_on_children: &mut dyn FnMut(&mut dyn Operation), - ) { - operate_on_children(self); + fn traverse(&mut self, operate: &mut dyn FnMut(&mut dyn Operation)) { + operate(self); } fn scrollable( &mut self, - state: &mut dyn operation::Scrollable, id: Option<&Id>, bounds: Rectangle, content_bounds: Rectangle, translation: Vector, + state: &mut dyn operation::Scrollable, ) { - if id != Some(&Id::from(preferences_scroll_id())) { + if id != Some(&preferences_scroll_id()) { return; } let Some(offset) = reveal_offset(self.field, bounds, translation.y) else { @@ -1513,6 +1524,7 @@ fn reveal_focused() -> Task { iced::advanced::widget::operate(Locate { rows: Vec::new(), + next_container: None, focused: None, }) } @@ -1541,11 +1553,11 @@ fn reveal_offset(field: iced::Rectangle, viewport: iced::Rectangle, scrolled: f3 } fn focus_composer() -> Task { - text_input::focus(composer_id()) + iced::widget::operation::focus(composer_id()) } fn scroll_chat_to_end() -> Task { - scrollable::snap_to(chat_scroll_id(), scrollable::RelativeOffset::END) + iced::widget::operation::snap_to(chat_scroll_id(), scrollable::RelativeOffset::END) } /// Deletes session checkpoints whose session is gone. Deleting a session or a @@ -1723,7 +1735,7 @@ mod tests { reasoning_complete: false, reasoning_open: true, content: String::new(), - markdown: Vec::new(), + markdown: markdown::Content::new(), }; message.append(true, "working it out"); message.append(false, "**final answer**"); @@ -1731,6 +1743,6 @@ mod tests { assert_eq!(message.reasoning.as_deref(), Some("working it out")); assert!(message.reasoning_complete); assert_eq!(message.content, "**final answer**"); - assert!(!message.markdown.is_empty()); + assert!(!message.markdown.items().is_empty()); } } diff --git a/src/app/generation.rs b/src/app/generation.rs index 139b62d..306cd61 100644 --- a/src/app/generation.rs +++ b/src/app/generation.rs @@ -47,7 +47,7 @@ pub(super) struct ToolResultCheck { stage: ToolCheckStage, } -#[derive(Clone, Debug)] +#[derive(Debug)] pub(crate) struct ChatMessage { pub(super) id: i32, pub(super) user: bool, @@ -59,7 +59,7 @@ pub(crate) struct ChatMessage { pub(super) reasoning_complete: bool, pub(super) reasoning_open: bool, pub(super) content: String, - pub(super) markdown: Vec, + pub(super) markdown: markdown::Content, } impl ChatMessage { @@ -80,7 +80,7 @@ impl ChatMessage { } else { visible }; - self.markdown = markdown::parse(content).collect(); + self.markdown = markdown::Content::parse(content); } } } @@ -98,7 +98,7 @@ impl From for ChatMessage { reasoning_complete: message.reasoning_complete, reasoning_open: false, content: message.content, - markdown: Vec::new(), + markdown: iced::widget::markdown::Content::new(), }; message.refresh_markdown(); message @@ -1349,6 +1349,37 @@ mod tests { ); } + #[test] + fn assistant_markdown_keeps_llm_tables() { + let mut message = ChatMessage { + id: 1, + user: false, + tool: false, + system: false, + compaction: false, + compaction_tail_start: None, + reasoning: None, + reasoning_complete: true, + reasoning_open: false, + content: "### Core / Setup\n\n| File | Lines |\n|---|---:|\n| `src/app.rs` | **1,750** |\n| `src/engine.rs` | 2,400 |\n\n### Summary\n\nDone." + .to_owned(), + markdown: iced::widget::markdown::Content::new(), + }; + + message.refresh_markdown(); + + let table = message.markdown.items().iter().find_map(|item| { + if let iced::widget::markdown::Item::Table { columns, rows } = item { + Some((columns, rows)) + } else { + None + } + }); + let (columns, rows) = table.expect("the completed Markdown table must remain renderable"); + assert_eq!(columns.len(), 2); + assert_eq!(rows.len(), 2); + } + #[test] fn last_compaction_selects_its_tail_without_hiding_history() { let message = |id: i32, compaction: bool, tail: Option| ChatMessage { @@ -1362,7 +1393,7 @@ mod tests { reasoning_complete: true, reasoning_open: false, content: format!("message {id}"), - markdown: Vec::new(), + markdown: iced::widget::markdown::Content::new(), }; let history = vec![ message(1, false, None), @@ -1394,7 +1425,7 @@ mod tests { reasoning_complete: true, reasoning_open: false, content: format!("message {id}"), - markdown: Vec::new(), + markdown: iced::widget::markdown::Content::new(), }; let mut history = vec![ message(1, true, false, false, false), diff --git a/src/app/view.rs b/src/app/view.rs index 0d7d82e..9ebd59e 100644 --- a/src/app/view.rs +++ b/src/app/view.rs @@ -16,9 +16,8 @@ use crate::model::{ use crate::settings::{GIB, REASONING_MODES}; use iced::theme::{Palette, palette}; use iced::widget::{ - Button, Space, Svg, Tooltip, button, checkbox, column, container, horizontal_rule, markdown, - mouse_area, opaque, pick_list, progress_bar, row, scrollable, stack, svg, text, text_input, - tooltip, + Button, Space, Svg, Tooltip, button, checkbox, column, container, markdown, mouse_area, opaque, + pick_list, progress_bar, row, rule, scrollable, stack, svg, text, text_input, tooltip, }; use iced::{Alignment, Background, Border, Color, Element, Length, Padding, Theme, window}; use std::collections::VecDeque; @@ -87,7 +86,7 @@ impl App { body = body.push(self.sidebar()); body = body.push( mouse_area( - container(Space::with_width(Length::Fill)) + container(Space::new().width(Length::Fill)) .width(5) .height(Length::Fill) .style(divider_style), @@ -107,7 +106,7 @@ impl App { // way to the top edge; the spacer below it lets clicks through. let mut shell = column![stack![ body, - column![self.title_bar(), Space::with_height(Length::Fill)], + column![self.title_bar(), Space::new().height(Length::Fill)], ]]; if let ModelDownload::Active(download) = &self.model_download { shell = shell.push(download_status_bar(download)); @@ -163,7 +162,7 @@ impl App { text("Working directory").size(11).color(muted_text()), text(prompt.working_directory.display().to_string()).size(13), row![ - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), action_button("Deny").on_press(Message::DenyTool), action_button("Allow once").on_press(Message::AllowToolOnce), ] @@ -188,7 +187,7 @@ impl App { let preference_content = row![ icon(ICON_SETTINGS, 17), text("Preferences").size(14), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text("⌘,").size(12), ] .spacing(9) @@ -212,14 +211,14 @@ impl App { }; let header = row![ text("DS4Server").size(20), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text("Local").size(12), ] .align_y(Alignment::Center); let mut projects = column![ row![ text("PROJECTS").size(11), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text("LOCAL").size(10), ], add_project.style(button::text), @@ -275,7 +274,7 @@ impl App { let expanded = self.expanded_archives.contains(&project.id); projects = projects.push( row![ - Space::with_width(26), + Space::new().width(26), button( text(format!( "{} Archived sessions ({})", @@ -302,7 +301,7 @@ impl App { let draft_selected = self.draft_selected(project.id); projects = projects.push( row![ - Space::with_width(26), + Space::new().width(26), button( row![ icon(ICON_CHAT, 15), @@ -363,7 +362,7 @@ impl App { } label = label.push(text(&session.title).size(13)); row![ - Space::with_width(26), + Space::new().width(26), button(label) .width(Length::Fill) .on_press(Message::SelectSession(project_id, session.id)) @@ -404,12 +403,12 @@ impl App { }; stack![ row![ - Space::with_width(detail_offset), + Space::new().width(detail_offset), container(self.detail_tabs()) .center_x(Length::Fill) .center_y(Length::Fill), ], - container(row![Space::with_width(TRAFFIC_LIGHT_WIDTH), toggle]).center_y(Length::Fill), + container(row![Space::new().width(TRAFFIC_LIGHT_WIDTH), toggle]).center_y(Length::Fill), ] .width(Length::Fill) .height(TITLE_BAR_HEIGHT) @@ -463,7 +462,7 @@ impl App { .on_submit(Message::ConfirmProject) .padding(10), row![ - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), action_button("Cancel").on_press(Message::CancelProject), action_button("Add project").on_press(Message::ConfirmProject), ] @@ -547,7 +546,7 @@ impl App { .color(muted_text()), actions, row![ - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), action_button("Close").on_press(Message::DismissPanel), ], ] @@ -576,7 +575,7 @@ impl App { .on_submit(Message::ConfirmRenameSession) .padding(10), row![ - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), action_button("Cancel").on_press(Message::DismissPanel), action_button("Rename").on_press(Message::ConfirmRenameSession), ] @@ -668,9 +667,10 @@ pub(crate) fn app_theme() -> Theme { text: Color::from_rgb8(235, 235, 235), primary: Color::from_rgb8(85, 118, 255), success: Color::from_rgb8(72, 176, 112), + warning: Color::from_rgb8(224, 168, 72), danger: Color::from_rgb8(220, 80, 86), }; - Theme::custom_with_fn("DS4Server".into(), palette, |palette| { + Theme::custom_with_fn("DS4Server", palette, |palette| { let mut extended = palette::Extended::generate(palette); extended.background.weak = palette::Pair::new(Color::from_rgb8(38, 38, 40), palette.text); extended.background.strong = palette::Pair::new(Color::from_rgb8(58, 58, 61), palette.text); @@ -714,7 +714,7 @@ fn metric_card(label: &'static str, value: String, detail: String) -> Element<'s fn metric_row(label: &'static str, value: impl ToString) -> Element<'static, Message> { row![ text(label).size(12).color(muted_text()), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(value.to_string()).size(12), ] .spacing(12) @@ -750,7 +750,7 @@ fn mini_chart( 1.0 }; bars = bars.push( - container(Space::new(Length::Fill, height)) + container(Space::new().width(Length::Fill).height(height)) .width(Length::FillPortion(1)) .style(move |_| chart_bar_style(color)), ); diff --git a/src/app/view/chat.rs b/src/app/view/chat.rs index 963c85e..34ed772 100644 --- a/src/app/view/chat.rs +++ b/src/app/view/chat.rs @@ -17,7 +17,7 @@ impl App { icon(ICON_SPARK, 36), text("Start a local coding session").size(28), text("Choose a project folder to create your first session.").size(14), - Space::with_height(10), + Space::new().height(10), open_project, ] .spacing(10) @@ -40,7 +40,7 @@ impl App { ); } let header = header - .push(Space::with_width(Length::Fill)) + .push(Space::new().width(Length::Fill)) .spacing(10) .align_y(Alignment::Center); @@ -124,7 +124,7 @@ impl App { } } if !message.content.is_empty() { - if message.user || message.tool || message.markdown.is_empty() { + if message.user || message.tool || message.markdown.items().is_empty() { let content = if message.reasoning.is_some() { crate::agent::visible_content(&message.content).trim_start() } else { @@ -134,9 +134,8 @@ impl App { } else { body = body.push( markdown::view( - &message.markdown, - markdown::Settings::with_text_size(14), - markdown_style, + message.markdown.items(), + markdown::Settings::with_text_size(14, markdown_style), ) .map(Message::OpenLink), ); @@ -283,7 +282,7 @@ impl App { )) .size(11) .color(muted_text()), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), icon(ICON_MODEL, 16), text(self.config.model.to_string()).size(12), action, @@ -339,7 +338,7 @@ fn tool_cards(cards: Vec) -> Element<'static, Message> { let mut rows = column![].spacing(0); for (index, card) in cards.into_iter().enumerate() { if index > 0 { - rows = rows.push(horizontal_rule(1)); + rows = rows.push(rule::horizontal(1)); } let parameters = crate::agent::tool_parameters(&card.call); let call = crate::agent::tool_call_text(&card.call); @@ -391,7 +390,7 @@ fn tool_cards(cards: Vec) -> Element<'static, Message> { let mut content = column![ row![ text(card.call.name).size(13), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(card.state.label()).size(11).color(muted_text()), actions, ] diff --git a/src/app/view/model_manager.rs b/src/app/view/model_manager.rs index 9226356..ab1b734 100644 --- a/src/app/view/model_manager.rs +++ b/src/app/view/model_manager.rs @@ -7,7 +7,7 @@ impl App { let mut artifacts = column![]; for (index, artifact) in model::managed_artifacts(&models_path()).iter().enumerate() { if index > 0 { - artifacts = artifacts.push(horizontal_rule(1)); + artifacts = artifacts.push(rule::horizontal(1)); } artifacts = artifacts.push(model_artifact_row(artifact, busy)); } @@ -29,7 +29,7 @@ impl App { if let Some(error) = &self.error { content = content.push(text(error).style(iced::widget::text::danger)); } - content = content.push(Space::with_height(8)).push( + content = content.push(Space::new().height(8)).push( container(scrollable(artifacts).height(Length::Fill)) .height(Length::Fill) .style(overview_style), @@ -51,7 +51,7 @@ impl App { )) .size(13), row![ - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), action_button("Cancel").on_press(Message::CancelDeleteArtifact), danger_button("Delete").on_press(Message::ConfirmDeleteArtifact), ] @@ -119,7 +119,7 @@ fn model_artifact_row(artifact: &ManagedArtifact, busy: bool) -> Element<'static .color(muted_text()), ] .spacing(5), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), row![download, validate, delete] .spacing(8) .align_y(Alignment::Center), @@ -167,11 +167,11 @@ pub(super) fn download_status_bar(download: &ActiveDownload) -> Element<'_, Mess row![ text(phase_text(progress.phase)).size(12), progress_bar(0.0..=1.0, progress.fraction()) - .width(180) - .height(7), + .length(180) + .girth(7), text(measurement).size(12), text(transfer).size(12), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), stop, ] .spacing(12) @@ -234,7 +234,7 @@ fn model_download_status(download: &ModelDownload) -> Element<'_, Message> { } else { text(heading).size(12) }; - let mut heading_row = row![heading, Space::with_width(Length::Fill)] + let mut heading_row = row![heading, Space::new().width(Length::Fill)] .align_y(Alignment::Center) .spacing(8); if let ModelDownload::Active(active) = download { @@ -246,7 +246,7 @@ fn model_download_status(download: &ModelDownload) -> Element<'_, Message> { } let mut status = column![ heading_row, - progress_bar(0.0..=1.0, progress.fraction()).height(8), + progress_bar(0.0..=1.0, progress.fraction()).girth(8), text(measurement).size(12), ] .spacing(6); diff --git a/src/app/view/preferences.rs b/src/app/view/preferences.rs index fbf9650..fc69217 100644 --- a/src/app/view/preferences.rs +++ b/src/app/view/preferences.rs @@ -9,11 +9,9 @@ impl App { .supports_dspark() .then_some(Message::PreferenceLegacyMtpChanged); let legacy_mtp = hint( - checkbox( - "Enable legacy MTP for this model", - self.preference_draft.legacy_mtp_enabled, - ) - .on_toggle_maybe(legacy_mtp_toggle), + checkbox(self.preference_draft.legacy_mtp_enabled) + .label("Enable legacy MTP for this model") + .on_toggle_maybe(legacy_mtp_toggle), "Uses the managed one-stage MTP support GGUF. The target model verifies every drafted token; it is mutually exclusive with DSpark.", ); let dspark_toggle: Option Message> = self @@ -22,11 +20,9 @@ impl App { .supports_dspark() .then_some(Message::PreferenceDsparkChanged); let dspark = hint( - checkbox( - "Enable DSpark for this model", - self.preference_draft.dspark_enabled, - ) - .on_toggle_maybe(dspark_toggle), + checkbox(self.preference_draft.dspark_enabled) + .label("Enable DSpark for this model") + .on_toggle_maybe(dspark_toggle), "Speculative decoding with the managed DSpark draft artifact: a small model proposes tokens that the main model verifies in one pass. Usually a large speedup; the target model may also stream routed experts from SSD.", ); let glm_mtp_toggle: Option Message> = (self.preference_draft.model @@ -130,10 +126,8 @@ impl App { "LOCAL ENDPOINT", column![ hint( - checkbox( - "Enable OpenAI-compatible endpoint", - self.preference_draft.endpoint_enabled, - ) + checkbox(self.preference_draft.endpoint_enabled) + .label("Enable OpenAI-compatible endpoint") .on_toggle(Message::PreferenceEndpointEnabledChanged), "Serves the loaded model over an OpenAI-style HTTP API, so editors, scripts and agents on this machine can use it. Turned off, only this window can generate.", ), @@ -144,10 +138,8 @@ impl App { .on_input(Message::PreferenceEndpointPortChanged), ), hint( - checkbox( - "Allow browser clients (CORS)", - self.preference_draft.endpoint_cors, - ) + checkbox(self.preference_draft.endpoint_cors) + .label("Allow browser clients (CORS)") .on_toggle(Message::PreferenceEndpointCorsChanged), "Answers with permissive CORS headers so JavaScript running in a web page may call the endpoint. Leave it off when only native tools connect.", ), @@ -181,7 +173,7 @@ impl App { ) .on_input(Message::PreferenceSystemPromptChanged) .padding(9), - Space::with_height(4), + Space::new().height(4), text("SAMPLING & REASONING").size(11).color(muted_text()), preference_input_row( "Temperature", @@ -261,12 +253,14 @@ impl App { prefill, ), hint( - checkbox("Prefer exact quality kernels", self.preference_draft.quality) + checkbox(self.preference_draft.quality) + .label("Prefer exact quality kernels") .on_toggle(Message::PreferenceQualityChanged), "Runs the exact Metal kernels instead of the fast approximations. Slightly slower, and it removes the small numeric differences those approximations introduce.", ), hint( - checkbox("Warm mapped weights at load time", self.preference_draft.warm_weights) + checkbox(self.preference_draft.warm_weights) + .label("Warm mapped weights at load time") .on_toggle(Message::PreferenceWarmWeightsChanged), "Reads every mapped weight page once at load, so the first reply is not interrupted by page faults from disk. Loading takes longer and memory pressure rises immediately.", ), @@ -312,15 +306,14 @@ impl App { .on_input(Message::PreferenceMtpMarginChanged), ), hint( - checkbox("Enable integrated GLM MTP", self.preference_draft.glm_mtp) + checkbox(self.preference_draft.glm_mtp) + .label("Enable integrated GLM MTP") .on_toggle_maybe(glm_mtp_toggle), "Uses the prediction head built into GLM 5.2 for speculative decoding, so no separate draft model is loaded. Available for GLM 5.2 only.", ), hint( - checkbox( - "Log GLM MTP timing counters", - self.preference_draft.glm_mtp_timing, - ) + checkbox(self.preference_draft.glm_mtp_timing) + .label("Log GLM MTP timing counters") .on_toggle_maybe(glm_mtp_timing_toggle), "Records per-stage timings of the speculative path to the log, to show where the acceleration actually goes. A diagnostic aid that costs a little throughput.", ), @@ -332,10 +325,8 @@ impl App { dspark_confidence, ), hint( - checkbox( - "DSpark target-only decode", - self.preference_draft.dspark_strict, - ) + checkbox(self.preference_draft.dspark_strict) + .label("DSpark target-only decode") .on_toggle_maybe(dspark_strict_toggle), "Lets the draft model only propose, never decide: every token is sampled by the full model. Gives up some of the speedup in exchange for output identical to non-speculative decoding.", ), @@ -367,15 +358,17 @@ impl App { }, )) .size(12), - Space::with_height(6), + Space::new().height(6), text("SSD STREAMING").size(11).color(muted_text()), hint( - checkbox("Enable SSD-backed model streaming", self.preference_draft.ssd_streaming) + checkbox(self.preference_draft.ssd_streaming) + .label("Enable SSD-backed model streaming") .on_toggle(Message::PreferenceSsdChanged), "Leaves the routed expert weights on disk and pages them in as they are needed, so a model larger than this machine's memory still runs. Every cache miss waits for the SSD; speculative support weights remain resident while target experts stream.", ), hint( - checkbox("Skip automatic expert preload", self.preference_draft.ssd_streaming_cold) + checkbox(self.preference_draft.ssd_streaming_cold) + .label("Skip automatic expert preload") .on_toggle(Message::PreferenceSsdColdChanged), "Starts with an empty expert cache instead of reading the likely experts up front. The model is ready sooner and uses less memory, at the price of slow first replies.", ), @@ -461,7 +454,7 @@ impl App { ), )) .size(12), - Space::with_height(6), + Space::new().height(6), text("ADVANCED DIAGNOSTICS").size(11).color(muted_text()), preference_input_row( "Simulated used memory (GiB)", @@ -561,14 +554,14 @@ impl App { let header = row![ icon(ICON_SETTINGS, 22), text("Preferences").size(24), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text("⌘,").size(12), ] .spacing(10) .align_y(Alignment::Center); let footer = row![ action_button("Reset DS4 defaults").on_press(Message::ResetPreferences), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), action_button("Cancel").on_press(Message::DismissPanel), action_button("Save").on_press(Message::SavePreferences), ] diff --git a/src/app/view/stats.rs b/src/app/view/stats.rs index 3e977e4..1de29f0 100644 --- a/src/app/view/stats.rs +++ b/src/app/view/stats.rs @@ -47,7 +47,7 @@ impl App { .color(muted_text()), ] .spacing(5), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), container(text(stats.phase.label()).size(12).color(phase_color)) .padding([7, 11]) .style(move |_| status_badge_style(phase_color)), @@ -109,7 +109,7 @@ impl App { text("Decode") .size(12) .color(Color::from_rgb8(84, 170, 255)), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(format!("{:.1} tok/s", stats.decode_tokens_per_second)) .size(12) .color(muted_text()), @@ -123,7 +123,7 @@ impl App { text("Prefill") .size(12) .color(Color::from_rgb8(157, 119, 255)), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(format!("{:.1} tok/s", stats.prefill_tokens_per_second)) .size(12) .color(muted_text()), @@ -142,7 +142,7 @@ impl App { ), row![ text(format!("{} requests", format_count(stats.http_requests))).size(12), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(format!( "{} errors · {} streaming", stats.http_errors, stats.http_streaming_requests @@ -171,7 +171,7 @@ impl App { }) .size(12) .color(Color::from_rgb8(67, 194, 203)), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(format_rate(latest.kv_read_bytes_per_second)) .size(12) .color(muted_text()), @@ -189,7 +189,7 @@ impl App { }) .size(12) .color(Color::from_rgb8(240, 180, 70)), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(format_rate(latest.kv_write_bytes_per_second)) .size(12) .color(muted_text()), @@ -210,7 +210,7 @@ impl App { text("Selected loads") .size(12) .color(Color::from_rgb8(240, 180, 70)), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(format!("{:.1}/s", latest.ssd_requests_per_second)) .size(12) .color(muted_text()), @@ -224,7 +224,7 @@ impl App { text("Requested expert data") .size(12) .color(Color::from_rgb8(67, 194, 203)), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(format_rate(latest.ssd_bytes_per_second)) .size(12) .color(muted_text()), @@ -238,7 +238,7 @@ impl App { text("Inference wait") .size(12) .color(Color::from_rgb8(220, 80, 86)), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(format!("{:.0} ms/s", latest.ssd_wait_ms_per_second)) .size(12) .color(muted_text()), @@ -443,7 +443,7 @@ impl App { format_milliseconds(stats.last_kv_write_ms), ), ), - progress_bar(0.0..=1.0, cache_fraction.min(1.0)).height(4), + progress_bar(0.0..=1.0, cache_fraction.min(1.0)).girth(4), ] .spacing(9) .into(), @@ -522,15 +522,16 @@ impl App { continue; } bar = bar.push( - container(Space::new(Length::Fill, Length::Fill)) + container(Space::new().width(Length::Fill).height(Length::Fill)) .width(Length::FillPortion(portion(bytes, capacity))) .style(move |_| chart_bar_style(color)), ); legend = legend.push( row![ - container(Space::new(9, 9)).style(move |_| chart_bar_style(color)), + container(Space::new().width(9).height(9)) + .style(move |_| chart_bar_style(color)), text(label).size(12).color(muted_text()), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(format!( "{} · {:.0}%", format_bytes(bytes), @@ -544,7 +545,7 @@ impl App { } if total == 0 { bar = bar.push( - container(Space::new(Length::Fill, Length::Fill)) + container(Space::new().width(Length::Fill).height(Length::Fill)) .style(|_| chart_bar_style(muted_text().scale_alpha(0.25))), ); } @@ -562,7 +563,7 @@ impl App { rows = rows.push( row![ text(label).size(12), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), text(format!( "{} · {} old", format_bytes(entry.bytes), @@ -607,7 +608,7 @@ impl App { usage.transient_bytes as f32 / usage.budget_bytes.max(1) as f32 * 100.0, ), ), - Space::with_height(2), + Space::new().height(2), text(if usage.entries.is_empty() { "No checkpoints stored yet." } else { @@ -620,7 +621,7 @@ impl App { text("Discarding a checkpoint costs one prefill to rebuild it.") .size(11) .color(muted_text()), - Space::with_width(Length::Fill), + Space::new().width(Length::Fill), action_button(text("Clear transient cache").size(12)) .on_press(Message::ClearTransientCache), ] diff --git a/src/main.rs b/src/main.rs index e12304d..97211e4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -25,10 +25,8 @@ fn main() -> iced::Result { if let Err(error) = engine::configure_metal_sources() { eprintln!("DS4Server: {error}"); } - iced::daemon(App::title, App::update, App::view) - .subscription(App::subscription) - .theme(|_, _| app_theme()) - .run_with(|| { + iced::daemon( + || { let (main_window, open) = window::open(window::Settings { size: Size::new(1120.0, 720.0), min_size: Some(Size::new(760.0, 480.0)), @@ -44,5 +42,12 @@ fn main() -> iced::Result { ..Default::default() }); (App::load(main_window), open.map(Message::WindowOpened)) - }) + }, + App::update, + App::view, + ) + .title(App::title) + .subscription(App::subscription) + .theme(app_theme()) + .run() } diff --git a/src/native_edit.rs b/src/native_edit.rs index 7fb4ba9..71f7904 100644 --- a/src/native_edit.rs +++ b/src/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}; @@ -95,9 +94,12 @@ fn command_events(command: EditCommand) -> [Event; 4] { location: Location::Standard, modifiers, text: None, + repeat: false, }), Event::Keyboard(keyboard::Event::KeyReleased { key, + modified_key: Key::Character(modified_character.into()), + physical_key: key::Physical::Code(physical_key), location: Location::Standard, modifiers, }), @@ -131,67 +133,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, @@ -201,7 +199,7 @@ where ); } - if self.content.as_widget_mut().on_event( + self.content.as_widget_mut().update( &mut tree.children[0], event, layout, @@ -210,12 +208,7 @@ where clipboard, shell, viewport, - ) == event::Status::Captured - { - event::Status::Captured - } else { - status - } + ); } fn mouse_interaction( @@ -259,13 +252,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, + ) } }