diff options
49 files changed, 3269 insertions, 1426 deletions
diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..c91c3f3 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,2 @@ +[net] +git-fetch-with-cli = true @@ -1,3 +1,4 @@ /target .vscode macaw.db +filamento.db diff --git a/.helix/languages.toml b/.helix/languages.toml index 8742aed..b6ba885 100644 --- a/.helix/languages.toml +++ b/.helix/languages.toml @@ -1,4 +1,4 @@ [language-server.rust-analyzer] command = "rust-analyzer" -environment = { "DATABASE_URL" = "sqlite://luz.db" } -config = { cargo.features = "all" } +# environment = { "DATABASE_URL" = "sqlite://filamento.db" } +# config = { cargo.features = ["stanza/rfc_6121", "stanza/xep_0203", "stanza/xep_0030", "stanza/xep_0060", "stanza/xep_0172", "stanza/xep_0390", "stanza/xep_0128", "stanza/xep_0115", "stanza/xep_0084", "sqlx/sqlite", "sqlx/runtime-tokio", "sqlx/uuid", "sqlx/chrono", "jid/sqlx", "uuid/v4", "tokio/full", "rsasl/provider_base64", "rsasl/plain", "rsasl/config_builder", "rsasl/scram-sha-1"] } @@ -19,6 +19,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" [[package]] +name = "accessory" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb3791c4beae5b827e93558ac83a88e63a841aad61759a05d9b577ef16030470" +dependencies = [ + "macroific", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] name = "addr2line" version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -35,6 +47,17 @@ checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.15", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" @@ -43,10 +66,16 @@ dependencies = [ "getrandom 0.2.15", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + +[[package]] name = "allocator-api2" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -59,7 +88,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" dependencies = [ "android-properties", - "bitflags 2.8.0", + "bitflags 2.9.0", "cc", "cesu8", "jni", @@ -95,6 +124,12 @@ dependencies = [ ] [[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] name = "approx" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -104,6 +139,23 @@ dependencies = [ ] [[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] name = "arrayref" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -123,29 +175,11 @@ checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" [[package]] name = "ash" -version = "0.38.0+1.3.281" +version = "0.37.3+1.3.251" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" dependencies = [ - "libloading", -] - -[[package]] -name = "ashpd" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9c39d707614dbcc6bed00015539f488d8e3fe3e66ed60961efc0c90f4b380b3" -dependencies = [ - "async-fs", - "async-net", - "enumflags2", - "futures-channel", - "futures-util", - "rand", - "serde", - "serde_repr", - "url", - "zbus", + "libloading 0.7.4", ] [[package]] @@ -154,7 +188,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ - "event-listener 5.4.0", + "event-listener", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -162,17 +196,6 @@ dependencies = [ [[package]] name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", -] - -[[package]] -name = "async-channel" version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" @@ -208,21 +231,6 @@ dependencies = [ ] [[package]] -name = "async-global-executor" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" -dependencies = [ - "async-channel 2.3.1", - "async-executor", - "async-io", - "async-lock", - "blocking", - "futures-lite", - "once_cell", -] - -[[package]] name = "async-io" version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -235,7 +243,7 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix", + "rustix 0.38.44", "slab", "tracing", "windows-sys 0.59.0", @@ -247,38 +255,27 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 5.4.0", + "event-listener", "event-listener-strategy", "pin-project-lite", ] [[package]] -name = "async-net" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" -dependencies = [ - "async-io", - "blocking", - "futures-lite", -] - -[[package]] name = "async-process" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" dependencies = [ - "async-channel 2.3.1", + "async-channel", "async-io", "async-lock", "async-signal", "async-task", "blocking", "cfg-if", - "event-listener 5.4.0", + "event-listener", "futures-lite", - "rustix", + "rustix 0.38.44", "tracing", ] @@ -290,7 +287,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -305,39 +302,13 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix", + "rustix 0.38.44", "signal-hook-registry", "slab", "windows-sys 0.59.0", ] [[package]] -name = "async-std" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c634475f29802fde2b8f0b505b1bd00dfe4df7d4a000f0b36f7671197d5c3615" -dependencies = [ - "async-channel 1.9.0", - "async-global-executor", - "async-io", - "async-lock", - "crossbeam-utils", - "futures-channel", - "futures-core", - "futures-io", - "futures-lite", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "once_cell", - "pin-project-lite", - "pin-utils", - "slab", - "wasm-bindgen-futures", -] - -[[package]] name = "async-task" version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -345,22 +316,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.86" +version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", -] - -[[package]] -name = "atoi" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" -dependencies = [ - "num-traits", + "syn 2.0.100", ] [[package]] @@ -376,6 +338,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98922d6a4cfbcb08820c69d8eeccc05bb1f29bfa06b4f5b1dbfe9a868bd7608e" +dependencies = [ + "arrayvec", +] + +[[package]] name = "backtrace" version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -397,25 +382,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] name = "bit-set" -version = "0.8.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" dependencies = [ "bit-vec", ] [[package]] name = "bit-vec" -version = "0.8.0" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" [[package]] name = "bitflags" @@ -425,12 +410,15 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" -dependencies = [ - "serde", -] +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "bitstream-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" [[package]] name = "block" @@ -462,7 +450,7 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" dependencies = [ - "async-channel 2.3.1", + "async-channel", "async-task", "futures-io", "futures-lite", @@ -470,6 +458,12 @@ dependencies = [ ] [[package]] +name = "built" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" + +[[package]] name = "bumpalo" version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -483,22 +477,22 @@ checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" [[package]] name = "bytemuck" -version = "1.21.0" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" +checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.8.1" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" +checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -508,10 +502,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[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.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "calloop" @@ -519,10 +519,10 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "log", "polling", - "rustix", + "rustix 0.38.44", "slab", "thiserror 1.0.69", ] @@ -534,16 +534,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" dependencies = [ "calloop", - "rustix", + "rustix 0.38.44", "wayland-backend", "wayland-client", ] [[package]] name = "cc" -version = "1.2.13" +version = "1.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7777341816418c02e033934a09f20dc0ccaf65a5201ef8a450ae0105a573fda" +checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" dependencies = [ "jobserver", "libc", @@ -557,6 +557,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -600,6 +610,7 @@ dependencies = [ [[package]] name = "circular" version = "0.3.0" +source = "git+https://bunny.garden/forks/circular#0a9c9ab1e2f4e3eb912ad9fe91e3ea953e066453" dependencies = [ "bytes", ] @@ -654,6 +665,43 @@ dependencies = [ ] [[package]] +name = "color_quant" +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" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -685,12 +733,6 @@ dependencies = [ ] [[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] name = "core-foundation" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -735,7 +777,7 @@ version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "core-foundation 0.10.0", "core-graphics-types 0.2.0", "foreign-types 0.5.0", @@ -759,7 +801,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "core-foundation 0.10.0", "libc", ] @@ -779,8 +821,8 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59fd57d82eb4bfe7ffa9b1cec0c05e2fd378155b47f255a67983cb4afe0e80c2" dependencies = [ - "bitflags 2.8.0", - "fontdb", + "bitflags 2.9.0", + "fontdb 0.16.2", "log", "rangemap", "rayon", @@ -806,21 +848,6 @@ dependencies = [ ] [[package]] -name = "crc" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - -[[package]] name = "crc32fast" version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -849,15 +876,6 @@ dependencies = [ ] [[package]] -name = "crossbeam-queue" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" -dependencies = [ - "crossbeam-utils", -] - -[[package]] name = "crossbeam-utils" version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -892,24 +910,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" [[package]] +name = "d3d12" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e3d747f100290a1ca24b752186f61f6637e1deffe3bf6320de6fcb29510a307" +dependencies = [ + "bitflags 2.9.0", + "libloading 0.8.6", + "winapi", +] + +[[package]] name = "dark-light" -version = "2.0.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e1a09f280e29a8b00bc7e81eca5ac87dca0575639c9422a5fa25a07bb884b8" +checksum = "2a76fa97167fa740dcdbfe18e8895601e1bc36525f09b044e00916e717c03a3c" dependencies = [ - "ashpd", - "async-std", - "objc2", - "objc2-foundation", + "dconf_rs", + "detect-desktop-environment", + "dirs 4.0.0", + "objc", + "rust-ini", "web-sys", - "winreg 0.52.0", + "winreg 0.10.1", + "zbus", ] [[package]] name = "data-encoding" -version = "2.8.0" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + +[[package]] +name = "data-url" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" +checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" [[package]] name = "dbus" @@ -936,24 +973,59 @@ dependencies = [ ] [[package]] -name = "der" -version = "0.7.9" +name = "dconf_rs" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "7046468a81e6a002061c01e6a7c83139daf91b11c30e66795b13217c2d885c8b" + +[[package]] +name = "delegate-display" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9926686c832494164c33a36bf65118f4bd6e704000b58c94681bf62e9ad67a74" dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", + "impartial-ord", + "itoa", + "macroific", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", ] [[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "unicode-xid", +] + +[[package]] +name = "detect-desktop-environment" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21d8ad60dd5b13a4ee6bd8fa2d5d88965c597c67bce32b5fc49c94f55cb50810" + +[[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", - "const-oid", "crypto-common", "subtle", ] @@ -969,6 +1041,15 @@ dependencies = [ [[package]] name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys 0.3.7", +] + +[[package]] +name = "dirs" version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" @@ -978,6 +1059,17 @@ dependencies = [ [[package]] name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users 0.4.6", + "winapi", +] + +[[package]] +name = "dirs-sys" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" @@ -1014,7 +1106,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -1023,23 +1115,14 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" dependencies = [ - "libloading", -] - -[[package]] -name = "document-features" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" -dependencies = [ - "litrs", + "libloading 0.8.6", ] [[package]] -name = "dotenvy" -version = "0.15.7" +name = "dlv-list" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" +checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" [[package]] name = "downcast-rs" @@ -1050,7 +1133,8 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dpi" version = "0.1.1" -source = "git+https://github.com/iced-rs/winit.git?rev=11414b6aa45699f038114e61b4ddf5102b2d3b4b#11414b6aa45699f038114e61b4ddf5102b2d3b4b" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" [[package]] name = "drm" @@ -1058,11 +1142,11 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98888c4bbd601524c11a7ed63f814b8825f420514f78e96f752c437ae9cbb5d1" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "bytemuck", "drm-ffi", "drm-fourcc", - "rustix", + "rustix 0.38.44", ] [[package]] @@ -1072,7 +1156,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97c98727e48b7ccb4f4aea8cfe881e5b07f702d17b7875991881b41af7278d53" dependencies = [ "drm-sys", - "rustix", + "rustix 0.38.44", ] [[package]] @@ -1093,12 +1177,9 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" -dependencies = [ - "serde", -] +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "endi" @@ -1136,20 +1217,20 @@ checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" dependencies = [ "libc", "windows-sys 0.59.0", @@ -1172,17 +1253,6 @@ dependencies = [ ] [[package]] -name = "etcetera" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" -dependencies = [ - "cfg-if", - "home", - "windows-sys 0.48.0", -] - -[[package]] name = "euclid" version = "0.22.11" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1193,12 +1263,6 @@ dependencies = [ [[package]] name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" @@ -1210,15 +1274,54 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "event-listener 5.4.0", + "event-listener", "pin-project-lite", ] [[package]] +name = "exr" +version = "1.73.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + +[[package]] +name = "fancy_constructor" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fac0fd7f4636276b4bd7b3148d0ba2c1c3fbede2b5214e47e7fedb70b02cde44" +dependencies = [ + "macroific", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] name = "fast-srgb8" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1240,31 +1343,51 @@ dependencies = [ ] [[package]] +name = "filamento" +version = "0.1.0" +dependencies = [ + "base64", + "chrono", + "futures", + "hex", + "image 0.25.6", + "jid", + "lampada", + "rusqlite", + "sha1", + "sha2", + "sha3", + "stanza", + "thiserror 2.0.12", + "tokio", + "tokio_with_wasm", + "tracing", + "uuid", + "wasm-bindgen", + "wasm-bindgen-futures", +] + +[[package]] name = "flate2" -version = "1.0.35" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" dependencies = [ "crc32fast", "miniz_oxide", ] [[package]] -name = "flume" -version = "0.11.1" +name = "float-cmp" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" -dependencies = [ - "futures-core", - "futures-sink", - "spin", -] +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" [[package]] name = "foldhash" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "font-types" @@ -1299,6 +1422,20 @@ dependencies = [ ] [[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", +] + +[[package]] name = "foreign-types" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1325,7 +1462,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -1350,6 +1487,12 @@ dependencies = [ ] [[package]] +name = "fragile" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dd6caf6059519a65843af8fe2a3ae298b14b80179855aeb4adc2c1934ee619" + +[[package]] name = "futures" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1393,17 +1536,6 @@ dependencies = [ ] [[package]] -name = "futures-intrusive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" -dependencies = [ - "futures-core", - "lock_api", - "parking_lot", -] - -[[package]] name = "futures-io" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1430,7 +1562,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -1490,20 +1622,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" dependencies = [ "cfg-if", "libc", - "wasi 0.13.3+wasi-0.2.2", - "windows-targets 0.52.6", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "gif" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +dependencies = [ + "color_quant", + "weezl", ] [[package]] @@ -1530,22 +1674,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" [[package]] -name = "gloo-timers" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] name = "glow" -version = "0.14.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51fa363f025f5c111e03f13eda21162faeacb6911fe8caa0c0349f9cf0c4483" +checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" dependencies = [ "js-sys", "slotmap", @@ -1555,32 +1687,20 @@ dependencies = [ [[package]] name = "glutin_wgl_sys" -version = "0.6.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" +checksum = "6c8098adac955faa2d31079b65dc48841251f69efd3ac25477903fc424362ead" dependencies = [ "gl_generator", ] [[package]] -name = "glyphon" -version = "0.5.0" -source = "git+https://github.com/hecrj/glyphon.git?rev=09712a70df7431e9a3b1ac1bbd4fb634096cb3b4#09712a70df7431e9a3b1ac1bbd4fb634096cb3b4" -dependencies = [ - "cosmic-text", - "etagere", - "lru", - "rustc-hash 2.1.1", - "wgpu", -] - -[[package]] name = "gpu-alloc" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "gpu-alloc-types", ] @@ -1590,39 +1710,40 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", ] [[package]] name = "gpu-allocator" -version = "0.27.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" +checksum = "6f56f6318968d03c18e1bcf4857ff88c61157e9da8e47c5f29055d60e1228884" dependencies = [ "log", "presser", "thiserror 1.0.69", + "winapi", "windows", ] [[package]] name = "gpu-descriptor" -version = "0.3.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" +checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "gpu-descriptor-types", - "hashbrown", + "hashbrown 0.14.5", ] [[package]] name = "gpu-descriptor-types" -version = "0.2.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", ] [[package]] @@ -1637,9 +1758,9 @@ dependencies = [ [[package]] name = "half" -version = "2.4.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ "cfg-if", "crunchy", @@ -1647,12 +1768,29 @@ dependencies = [ [[package]] name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash 0.8.11", + "allocator-api2", +] + +[[package]] +name = "hashbrown" version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ - "allocator-api2", - "equivalent", "foldhash", ] @@ -1662,7 +1800,22 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown", + "hashbrown 0.15.2", +] + +[[package]] +name = "hassle-rs" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" +dependencies = [ + "bitflags 2.9.0", + "com", + "libc", + "libloading 0.8.6", + "thiserror 1.0.69", + "widestring", + "winapi", ] [[package]] @@ -1702,15 +1855,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" [[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] name = "hmac" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1720,37 +1864,29 @@ dependencies = [ ] [[package]] -name = "home" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] name = "hostname" -version = "0.3.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" dependencies = [ + "cfg-if", "libc", - "match_cfg", - "winapi", + "windows-link", ] [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows-core 0.52.0", + "windows-core 0.61.0", ] [[package]] @@ -1764,29 +1900,32 @@ dependencies = [ [[package]] name = "iced" -version = "0.14.0-dev" -source = "git+https://github.com/iced-rs/iced#beddf49c76f3b43e7b33452831e1293cad28fd89" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88acfabc84ec077eaf9ede3457ffa3a104626d79022a9bf7f296093b1d60c73f" dependencies = [ "iced_core", "iced_futures", "iced_renderer", "iced_widget", "iced_winit", + "image 0.24.9", "thiserror 1.0.69", ] [[package]] name = "iced_core" -version = "0.14.0-dev" -source = "git+https://github.com/iced-rs/iced#beddf49c76f3b43e7b33452831e1293cad28fd89" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0013a238275494641bf8f1732a23a808196540dc67b22ff97099c044ae4c8a1c" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "bytes", "dark-light", "glam", - "lilt", "log", "num-traits", + "once_cell", "palette", "rustc-hash 2.1.1", "smol_str", @@ -1796,8 +1935,9 @@ dependencies = [ [[package]] name = "iced_futures" -version = "0.14.0-dev" -source = "git+https://github.com/iced-rs/iced#beddf49c76f3b43e7b33452831e1293cad28fd89" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c04a6745ba2e80f32cf01e034fd00d853aa4f4cd8b91888099cb7aaee0d5d7c" dependencies = [ "futures", "iced_core", @@ -1805,21 +1945,38 @@ dependencies = [ "rustc-hash 2.1.1", "tokio", "wasm-bindgen-futures", - "wasmtimer", + "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.1", + "wgpu", ] [[package]] name = "iced_graphics" -version = "0.14.0-dev" -source = "git+https://github.com/iced-rs/iced#beddf49c76f3b43e7b33452831e1293cad28fd89" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba25a18cfa6d5cc160aca7e1b34f73ccdff21680fa8702168c09739767b6c66f" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "bytemuck", "cosmic-text", "half", "iced_core", "iced_futures", + "image 0.24.9", + "kamadak-exif", "log", + "once_cell", "raw-window-handle", "rustc-hash 2.1.1", "thiserror 1.0.69", @@ -1828,8 +1985,9 @@ dependencies = [ [[package]] name = "iced_renderer" -version = "0.14.0-dev" -source = "git+https://github.com/iced-rs/iced#beddf49c76f3b43e7b33452831e1293cad28fd89" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73558208059f9e622df2bf434e044ee2f838ce75201a023cf0ca3e1244f46c2a" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -1840,27 +1998,29 @@ dependencies = [ [[package]] name = "iced_runtime" -version = "0.14.0-dev" -source = "git+https://github.com/iced-rs/iced#beddf49c76f3b43e7b33452831e1293cad28fd89" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "348b5b2c61c934d88ca3b0ed1ed913291e923d086a66fa288ce9669da9ef62b5" dependencies = [ "bytes", "iced_core", "iced_futures", "raw-window-handle", - "sipper", "thiserror 1.0.69", ] [[package]] name = "iced_tiny_skia" -version = "0.14.0-dev" -source = "git+https://github.com/iced-rs/iced#beddf49c76f3b43e7b33452831e1293cad28fd89" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c625d368284fcc43b0b36b176f76eff1abebe7959dd58bd8ce6897d641962a50" dependencies = [ "bytemuck", "cosmic-text", "iced_graphics", - "kurbo", + "kurbo 0.10.4", "log", + "resvg", "rustc-hash 2.1.1", "softbuffer", "tiny-skia", @@ -1868,17 +2028,20 @@ dependencies = [ [[package]] name = "iced_wgpu" -version = "0.14.0-dev" -source = "git+https://github.com/iced-rs/iced#beddf49c76f3b43e7b33452831e1293cad28fd89" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15708887133671d2bcc6c1d01d1f176f43a64d6cdc3b2bf893396c3ee498295f" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "bytemuck", "futures", "glam", - "glyphon", "guillotiere", + "iced_glyphon", "iced_graphics", "log", + "once_cell", + "resvg", "rustc-hash 2.1.1", "thiserror 1.0.69", "wgpu", @@ -1886,13 +2049,14 @@ dependencies = [ [[package]] name = "iced_widget" -version = "0.14.0-dev" -source = "git+https://github.com/iced-rs/iced#beddf49c76f3b43e7b33452831e1293cad28fd89" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81429e1b950b0e4bca65be4c4278fea6678ea782030a411778f26fa9f8983e1d" dependencies = [ "iced_renderer", "iced_runtime", - "log", "num-traits", + "once_cell", "rustc-hash 2.1.1", "thiserror 1.0.69", "unicode-segmentation", @@ -1900,8 +2064,9 @@ dependencies = [ [[package]] name = "iced_winit" -version = "0.14.0-dev" -source = "git+https://github.com/iced-rs/iced#beddf49c76f3b43e7b33452831e1293cad28fd89" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f44cd4e1c594b6334f409282937bf972ba14d31fedf03c23aa595d982a2fda28" dependencies = [ "iced_futures", "iced_graphics", @@ -1912,6 +2077,7 @@ dependencies = [ "tracing", "wasm-bindgen-futures", "web-sys", + "winapi", "window_clipboard", "winit", ] @@ -1957,9 +2123,9 @@ dependencies = [ [[package]] name = "icu_locid_transform_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" [[package]] name = "icu_normalizer" @@ -1981,9 +2147,9 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" [[package]] name = "icu_properties" @@ -2002,9 +2168,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" [[package]] name = "icu_provider" @@ -2031,7 +2197,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -2067,13 +2233,141 @@ dependencies = [ ] [[package]] +name = "image" +version = "0.24.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "exr", + "gif", + "jpeg-decoder", + "num-traits", + "png", + "qoi", + "tiff", +] + +[[package]] +name = "image" +version = "0.25.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" +dependencies = [ + "bytemuck", + "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", + "num-traits", + "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b77d01e822461baa8409e156015a1d91735549f0f2c17691bd2d996bef238f7f" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imagesize" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284" + +[[package]] +name = "imgref" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" + +[[package]] +name = "impartial-ord" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab604ee7085efba6efc65e4ebca0e9533e3aff6cb501d7d77b211e3a781c6d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "indexed_db_futures" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94eebf0199c01a1560770d964efb1fb09183a3afc0b1c1397fac1bfdbfa7d6cf" +dependencies = [ + "accessory", + "cfg-if", + "delegate-display", + "derive_more", + "fancy_constructor", + "indexed_db_futures_macros_internal", + "js-sys", + "sealed", + "smallvec", + "thiserror 2.0.12", + "tokio", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "indexed_db_futures_macros_internal" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caeba94923b68f254abef921cea7e7698bf4675fdd89d7c58bf1ed885b49a27d" +dependencies = [ + "macroific", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] name = "indexmap" -version = "2.7.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.15.2", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", ] [[package]] @@ -2095,40 +2389,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] -name = "itoa" -version = "1.0.14" +name = "itertools" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" - -[[package]] -name = "jabber" -version = "0.1.0" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ - "async-recursion", - "async-trait", - "futures", - "jid", - "lazy_static", - "nanoid", - "peanuts", - "pin-project", - "pin-project-lite", - "rsasl", - "stanza", - "take_mut", - "thiserror 2.0.11", - "tokio", - "tokio-native-tls", - "tracing", - "trust-dns-resolver", - "try_map", + "either", ] [[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] name = "jid" version = "0.1.0" dependencies = [ - "sqlx", + "rusqlite", ] [[package]] @@ -2155,14 +2434,24 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ + "getrandom 0.3.2", "libc", ] [[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" +dependencies = [ + "rayon", +] + +[[package]] name = "js-sys" version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2173,10 +2462,28 @@ dependencies = [ ] [[package]] +name = "kamadak-exif" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4fc70d0ab7e5b6bafa30216a6b48705ea964cdfc29c050f2412295eba58077" +dependencies = [ + "mutate_once", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] name = "keyring" -version = "3.6.1" +version = "3.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f8fe839464d4e4b37d756d7e910063696af79a7e877282cb1825e4ec5f10833" +checksum = "1961983669d57bdfe6c0f3ef8e4c229b5ef751afcc7d87e4271d2f71f6ccfa8b" dependencies = [ "byteorder", "dbus-secret-service", @@ -2193,7 +2500,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" dependencies = [ "libc", - "libloading", + "libloading 0.8.6", "pkg-config", ] @@ -2214,12 +2521,28 @@ dependencies = [ ] [[package]] -name = "kv-log-macro" -version = "1.0.7" +name = "kurbo" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +checksum = "89234b2cc610a7dd927ebde6b41dd1a5d4214cffaef4cf1fb2195d592f92518f" dependencies = [ - "log", + "arrayvec", + "smallvec", +] + +[[package]] +name = "lampada" +version = "0.1.0" +dependencies = [ + "futures", + "jid", + "luz", + "peanuts", + "stanza", + "thiserror 2.0.12", + "tokio", + "tokio_with_wasm", + "tracing", ] [[package]] @@ -2227,15 +2550,18 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] + +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.169" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libdbus-sys" @@ -2247,6 +2573,26 @@ dependencies = [ ] [[package]] +name = "libfuzzer-sys" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" +dependencies = [ + "arbitrary", + "cc", +] + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] name = "libloading" version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2268,32 +2614,21 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "libc", - "redox_syscall 0.5.8", + "redox_syscall 0.5.11", ] [[package]] name = "libsqlite3-sys" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +version = "0.32.0" +source = "git+https://github.com/Spxg/rusqlite.git?branch=wasm-demo#4820de79e45d0604e0596641cbb5dd86aa53f0ed" dependencies = [ - "cc", "pkg-config", "vcpkg", ] [[package]] -name = "lilt" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ab94c7e69044511f79ce4b4201a49324b7f5b35410f862264e044690b950a67" -dependencies = [ - "web-time", -] - -[[package]] name = "linked-hash-map" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2312,16 +2647,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f27f6063d7" [[package]] -name = "litemap" -version = "0.7.4" +name = "linux-raw-sys" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] -name = "litrs" -version = "0.4.1" +name = "litemap" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" [[package]] name = "lock_api" @@ -2335,11 +2670,17 @@ dependencies = [ [[package]] name = "log" -version = "0.4.25" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" dependencies = [ - "value-bag", + "imgref", ] [[package]] @@ -2361,20 +2702,27 @@ dependencies = [ name = "luz" version = "0.1.0" dependencies = [ - "chrono", + "async-recursion", + "async-trait", "futures", - "jabber", + "getrandom 0.2.15", "jid", + "lazy_static", "peanuts", - "sqlx", + "pin-project", + "pin-project-lite", + "rsasl", "stanza", - "thiserror 2.0.11", + "take_mut", + "thiserror 2.0.12", "tokio", - "tokio-stream", - "tokio-util", + "tokio-native-tls", "tracing", - "tracing-subscriber", + "trust-dns-resolver", + "try_map", "uuid", + "wasm-bindgen", + "web-sys", ] [[package]] @@ -2384,14 +2732,14 @@ dependencies = [ "chrono", "chrono-humanize", "confy", - "dirs", + "dirs 6.0.0", + "filamento", "iced", "indexmap", "jid", "keyring", - "luz", "serde", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tokio-stream", "toml", @@ -2401,6 +2749,54 @@ dependencies = [ ] [[package]] +name = "macroific" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89f276537b4b8f981bf1c13d79470980f71134b7bdcc5e6e911e910e556b0285" +dependencies = [ + "macroific_attr_parse", + "macroific_core", + "macroific_macro", +] + +[[package]] +name = "macroific_attr_parse" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad4023761b45fcd36abed8fb7ae6a80456b0a38102d55e89a57d9a594a236be9" +dependencies = [ + "proc-macro2", + "quote", + "sealed", + "syn 2.0.100", +] + +[[package]] +name = "macroific_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a7594d3c14916fa55bef7e9d18c5daa9ed410dd37504251e4b75bbdeec33e3" +dependencies = [ + "proc-macro2", + "quote", + "sealed", + "syn 2.0.100", +] + +[[package]] +name = "macroific_macro" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4da6f2ed796261b0a74e2b52b42c693bb6dee1effba3a482c49592659f824b3b" +dependencies = [ + "macroific_attr_parse", + "macroific_core", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] name = "malloc_buf" version = "0.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2410,25 +2806,19 @@ dependencies = [ ] [[package]] -name = "match_cfg" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" - -[[package]] name = "matches" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] -name = "md-5" -version = "0.10.6" +name = "maybe-rayon" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" dependencies = [ "cfg-if", - "digest", + "rayon", ] [[package]] @@ -2457,11 +2847,11 @@ dependencies = [ [[package]] name = "metal" -version = "0.29.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "block", "core-graphics-types 0.1.3", "foreign-types 0.5.0", @@ -2478,9 +2868,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.4" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" dependencies = [ "adler2", "simd-adler32", @@ -2498,19 +2888,24 @@ dependencies = [ ] [[package]] +name = "mutate_once" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16cf681a23b4d0a43fc35024c176437f9dcd818db34e0f42ab456a0ee5ad497b" + +[[package]] name = "naga" -version = "23.1.0" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "364f94bc34f61332abebe8cad6f6cd82a5b65cff22c828d05d0968911462ca4f" +checksum = "50e3524642f53d9af419ab5e8dd29d3ba155708267667c2f3f06c88c9e130843" dependencies = [ - "arrayvec", "bit-set", - "bitflags 2.8.0", - "cfg_aliases 0.1.1", + "bitflags 2.9.0", "codespan-reporting", "hexf-parse", "indexmap", "log", + "num-traits", "rustc-hash 1.1.0", "spirv", "termcolor", @@ -2519,19 +2914,10 @@ dependencies = [ ] [[package]] -name = "nanoid" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ffa00dec017b5b1a8b7cf5e2c008bfda1aa7e0697ac1508b491fdf2622fb4d8" -dependencies = [ - "rand", -] - -[[package]] name = "native-tls" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ "libc", "log", @@ -2550,7 +2936,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "jni-sys", "log", "ndk-sys 0.6.0+11769913", @@ -2584,12 +2970,18 @@ dependencies = [ ] [[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] name = "nix" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "cfg-if", "cfg_aliases 0.2.1", "libc", @@ -2607,6 +2999,12 @@ dependencies = [ ] [[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] name = "nu-ansi-term" version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2641,29 +3039,23 @@ dependencies = [ ] [[package]] -name = "num-bigint-dig" -version = "0.8.4" +name = "num-complex" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ - "byteorder", - "lazy_static", - "libm", - "num-integer", - "num-iter", "num-traits", - "rand", - "smallvec", - "zeroize", ] [[package]] -name = "num-complex" -version = "0.4.6" +name = "num-derive" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ - "num-traits", + "proc-macro2", + "quote", + "syn 2.0.100", ] [[package]] @@ -2704,7 +3096,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", - "libm", ] [[package]] @@ -2735,7 +3126,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -2745,6 +3136,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", + "objc_exception", ] [[package]] @@ -2769,7 +3161,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "block2", "libc", "objc2", @@ -2785,7 +3177,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "block2", "objc2", "objc2-core-location", @@ -2809,7 +3201,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "block2", "objc2", "objc2-foundation", @@ -2851,7 +3243,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "block2", "dispatch", "libc", @@ -2876,7 +3268,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "block2", "objc2", "objc2-foundation", @@ -2888,7 +3280,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "block2", "objc2", "objc2-foundation", @@ -2911,7 +3303,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "block2", "objc2", "objc2-cloud-kit", @@ -2943,7 +3335,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "block2", "objc2", "objc2-core-location", @@ -2951,6 +3343,15 @@ dependencies = [ ] [[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] name = "object" version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2961,17 +3362,17 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.3" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "openssl" -version = "0.10.70" +version = "0.10.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "cfg-if", "foreign-types 0.3.2", "libc", @@ -2988,7 +3389,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -2999,9 +3400,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.105" +version = "0.9.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" +checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" dependencies = [ "cc", "libc", @@ -3025,6 +3426,16 @@ dependencies = [ ] [[package]] +name = "ordered-multimap" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" +dependencies = [ + "dlv-list", + "hashbrown 0.12.3", +] + +[[package]] name = "ordered-stream" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3070,7 +3481,7 @@ dependencies = [ "by_address", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -3081,12 +3492,37 @@ 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.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", - "parking_lot_core", + "parking_lot_core 0.9.10", +] + +[[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", ] [[package]] @@ -3097,7 +3533,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.8", + "redox_syscall 0.5.11", "smallvec", "windows-targets 0.52.6", ] @@ -3120,24 +3556,20 @@ dependencies = [ [[package]] name = "peanuts" version = "0.1.0" +source = "git+https://bunny.garden/peanuts#a0cc279551267dfa7a17fe4b449dd1a1fcd3526f" dependencies = [ "async-recursion", "circular", "futures", "futures-util", + "js-sys", "nom", - "thiserror 2.0.11", + "pin-project", + "thiserror 2.0.12", "tokio", "tracing", -] - -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", + "wasm-bindgen", + "web-sys", ] [[package]] @@ -3176,7 +3608,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -3189,23 +3621,29 @@ dependencies = [ ] [[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + +[[package]] name = "pin-project" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -3232,31 +3670,10 @@ dependencies = [ ] [[package]] -name = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der", - "pkcs8", - "spki", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "png" @@ -3281,18 +3698,18 @@ dependencies = [ "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite", - "rustix", + "rustix 0.38.44", "tracing", "windows-sys 0.59.0", ] [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy", + "zerocopy 0.8.24", ] [[package]] @@ -3303,18 +3720,18 @@ checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" [[package]] name = "proc-macro-crate" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ "toml_edit", ] [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -3324,32 +3741,60 @@ name = "profiling" version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" +dependencies = [ + "quote", + "syn 2.0.100", +] + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] [[package]] name = "quick-error" -version = "1.2.3" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" -version = "0.37.2" +version = "0.37.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "165859e9e55f79d67b96c5d96f4e88b6f2695a1972849c15a6a3f5c59fc2c003" +checksum = "a4ce8c88de324ff838700f36fb6ab86c96df0e3c4ab6ef3a9b2044465cce1369" dependencies = [ "memchr", ] [[package]] name = "quote" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] [[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] name = "rand" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3392,6 +3837,56 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" [[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror 1.0.69", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6a5f31fcf7500f9401fea858ea4ab5525c99f2322cfcee732c0e6c74208c0c6" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + +[[package]] name = "raw-window-handle" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3429,6 +3924,15 @@ dependencies = [ [[package]] name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" @@ -3438,11 +3942,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.8" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", ] [[package]] @@ -3464,7 +3968,7 @@ checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" dependencies = [ "getrandom 0.2.15", "libredox", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] @@ -3475,41 +3979,45 @@ checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" [[package]] name = "resolv-conf" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +checksum = "48375394603e3dd4b2d64371f7148fd8c7baa2680e28741f2cb8d23b59e3d4c4" dependencies = [ "hostname", - "quick-error", ] [[package]] -name = "roxmltree" -version = "0.20.0" +name = "resvg" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" +checksum = "944d052815156ac8fa77eaac055220e95ba0b01fa8887108ca710c03805d9051" +dependencies = [ + "gif", + "jpeg-decoder", + "log", + "pico-args", + "rgb", + "svgtypes", + "tiny-skia", + "usvg", +] [[package]] -name = "rsa" -version = "0.9.7" +name = "rgb" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" dependencies = [ - "const-oid", - "digest", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core", - "signature", - "spki", - "subtle", - "zeroize", + "bytemuck", ] [[package]] +name = "roxmltree" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" + +[[package]] name = "rsasl" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3528,6 +4036,32 @@ dependencies = [ ] [[package]] +name = "rusqlite" +version = "0.34.0" +source = "git+https://github.com/Spxg/rusqlite.git?branch=wasm-demo#4820de79e45d0604e0596641cbb5dd86aa53f0ed" +dependencies = [ + "bitflags 2.9.0", + "chrono", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", + "sqlite-wasm-rs", + "uuid", +] + +[[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-demangle" version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3551,7 +4085,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -3559,10 +4093,23 @@ dependencies = [ ] [[package]] +name = "rustix" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys 0.9.4", + "windows-sys 0.59.0", +] + +[[package]] name = "rustversion" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "rustybuzz" @@ -3570,7 +4117,7 @@ version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "bytemuck", "libm", "smallvec", @@ -3583,9 +4130,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "same-file" @@ -3631,12 +4178,23 @@ dependencies = [ ] [[package]] +name = "sealed" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f968c5ea23d555e670b449c1c5e7b2fc399fdaec1d304a17cd48e288abc107" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] name = "security-framework" version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -3649,7 +4207,7 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "core-foundation 0.10.0", "core-foundation-sys", "libc", @@ -3668,35 +4226,35 @@ dependencies = [ [[package]] name = "self_cell" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2fdfc24bc566f839a2da4c4295b82db7d25a24253867d5c64355abb5799bdbe" +checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" [[package]] name = "serde" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "serde_json" -version = "1.0.138" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -3706,13 +4264,13 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -3725,18 +4283,6 @@ dependencies = [ ] [[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] name = "sha1" version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3759,6 +4305,16 @@ dependencies = [ ] [[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + +[[package]] name = "sharded-slab" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3783,38 +4339,36 @@ dependencies = [ ] [[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest", - "rand_core", -] - -[[package]] name = "simd-adler32" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] -name = "siphasher" -version = "1.0.1" +name = "simd_helpers" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] [[package]] -name = "sipper" -version = "0.1.0" +name = "simplecss" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bccb4192828b3d9a08e0b5a73f17795080dfb278b50190216e3ae2132cf4f95" +checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c" dependencies = [ - "futures", - "pin-project-lite", + "log", ] [[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] name = "skrifa" version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3844,12 +4398,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" -dependencies = [ - "serde", -] +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" [[package]] name = "smithay-client-toolkit" @@ -3857,14 +4408,14 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "calloop", "calloop-wayland-source", "cursor-icon", "libc", "log", "memmap2", - "rustix", + "rustix 0.38.44", "thiserror 1.0.69", "wayland-backend", "wayland-client", @@ -3898,9 +4449,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ "libc", "windows-sys 0.52.0", @@ -3926,8 +4477,8 @@ dependencies = [ "objc2-foundation", "objc2-quartz-core", "raw-window-handle", - "redox_syscall 0.5.8", - "rustix", + "redox_syscall 0.5.11", + "rustix 0.38.44", "tiny-xlib", "wasm-bindgen", "wayland-backend", @@ -3939,226 +4490,30 @@ dependencies = [ ] [[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[package]] name = "spirv" version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 2.8.0", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "sqlx" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f" -dependencies = [ - "sqlx-core", - "sqlx-macros", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", -] - -[[package]] -name = "sqlx-core" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0" -dependencies = [ - "bytes", - "chrono", - "crc", - "crossbeam-queue", - "either", - "event-listener 5.4.0", - "futures-core", - "futures-intrusive", - "futures-io", - "futures-util", - "hashbrown", - "hashlink", - "indexmap", - "log", - "memchr", - "once_cell", - "percent-encoding", - "serde", - "serde_json", - "sha2", - "smallvec", - "thiserror 2.0.11", - "tokio", - "tokio-stream", - "tracing", - "url", - "uuid", -] - -[[package]] -name = "sqlx-macros" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310" -dependencies = [ - "proc-macro2", - "quote", - "sqlx-core", - "sqlx-macros-core", - "syn 2.0.98", + "bitflags 2.9.0", ] [[package]] -name = "sqlx-macros-core" -version = "0.8.3" +name = "sqlite-wasm-rs" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad" +checksum = "a46f82f6a905a1fdc5abe7ee0869bee63f5320344c593fe55554f443b178bd75" dependencies = [ - "dotenvy", - "either", - "heck 0.5.0", - "hex", + "fragile", + "indexed_db_futures", + "js-sys", "once_cell", - "proc-macro2", - "quote", - "serde", - "serde_json", - "sha2", - "sqlx-core", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", - "syn 2.0.98", - "tempfile", + "parking_lot 0.12.3", + "thiserror 2.0.12", "tokio", - "url", -] - -[[package]] -name = "sqlx-mysql" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233" -dependencies = [ - "atoi", - "base64", - "bitflags 2.8.0", - "byteorder", - "bytes", - "chrono", - "crc", - "digest", - "dotenvy", - "either", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "generic-array", - "hex", - "hkdf", - "hmac", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "percent-encoding", - "rand", - "rsa", - "serde", - "sha1", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror 2.0.11", - "tracing", - "uuid", - "whoami", -] - -[[package]] -name = "sqlx-postgres" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" -dependencies = [ - "atoi", - "base64", - "bitflags 2.8.0", - "byteorder", - "chrono", - "crc", - "dotenvy", - "etcetera", - "futures-channel", - "futures-core", - "futures-util", - "hex", - "hkdf", - "hmac", - "home", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "rand", - "serde", - "serde_json", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror 2.0.11", - "tracing", - "uuid", - "whoami", -] - -[[package]] -name = "sqlx-sqlite" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540" -dependencies = [ - "atoi", - "chrono", - "flume", - "futures-channel", - "futures-core", - "futures-executor", - "futures-intrusive", - "futures-util", - "libsqlite3-sys", - "log", - "percent-encoding", - "serde", - "serde_urlencoded", - "sqlx-core", - "tracing", - "url", - "uuid", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", ] [[package]] @@ -4174,7 +4529,7 @@ dependencies = [ "chrono", "jid", "peanuts", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] @@ -4188,6 +4543,9 @@ name = "strict-num" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" +dependencies = [ + "float-cmp", +] [[package]] name = "stringprep" @@ -4208,9 +4566,19 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "svg_fmt" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce5d813d71d82c4cbc1742135004e4a79fd870214c155443451c139c9470a0aa" +checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" + +[[package]] +name = "svgtypes" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" +dependencies = [ + "kurbo 0.11.1", + "siphasher", +] [[package]] name = "swash" @@ -4236,9 +4604,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.98" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -4253,7 +4621,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -4266,22 +4634,40 @@ dependencies = [ ] [[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] name = "take_mut" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" [[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] name = "tempfile" -version = "3.16.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" dependencies = [ - "cfg-if", "fastrand", - "getrandom 0.3.1", + "getrandom 0.3.2", "once_cell", - "rustix", + "rustix 1.0.5", "windows-sys 0.59.0", ] @@ -4305,11 +4691,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl 2.0.11", + "thiserror-impl 2.0.12", ] [[package]] @@ -4320,18 +4706,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "thiserror-impl" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -4345,6 +4731,17 @@ dependencies = [ ] [[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + +[[package]] name = "tiny-skia" version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4378,7 +4775,7 @@ checksum = "0324504befd01cab6e0c994f34b2ffa257849ee019d3fb3b64fb2c858887d89e" dependencies = [ "as-raw-xcb-connection", "ctor-lite", - "libloading", + "libloading 0.8.6", "pkg-config", "tracing", ] @@ -4395,9 +4792,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] @@ -4410,17 +4807,15 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.43.0" +version = "1.44.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" dependencies = [ "backtrace", "bytes", "libc", "mio", - "parking_lot", "pin-project-lite", - "signal-hook-registry", "socket2", "tokio-macros", "windows-sys 0.52.0", @@ -4434,7 +4829,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -4459,16 +4854,27 @@ dependencies = [ ] [[package]] -name = "tokio-util" -version = "0.7.13" +name = "tokio_with_wasm" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "e42d20f41cbfe26740d0c2fb320d44ce7dfa716be135cb663e99a48248a0e897" dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", + "js-sys", "tokio", + "tokio_with_wasm_proc", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "tokio_with_wasm_proc" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee80eb7e23abaa636caa9afe6042c6d8a8c0686165b8165f4fbf2988f0dd347f" +dependencies = [ + "quote", + "syn 2.0.100", ] [[package]] @@ -4511,7 +4917,6 @@ version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -4525,7 +4930,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] @@ -4599,7 +5004,7 @@ dependencies = [ "ipconfig", "lazy_static", "lru-cache", - "parking_lot", + "parking_lot 0.12.3", "resolv-conf", "smallvec", "thiserror 1.0.69", @@ -4634,9 +5039,9 @@ checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "uds_windows" @@ -4669,9 +5074,9 @@ checksum = "1df77b101bcc4ea3d78dafc5ad7e4f58ceffe0b2b16bf446aeb50b6cb4157656" [[package]] name = "unicode-ident" -version = "1.0.16" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-linebreak" @@ -4707,6 +5112,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] +name = "unicode-vo" +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" @@ -4727,7 +5138,33 @@ dependencies = [ "form_urlencoded", "idna 1.0.3", "percent-encoding", - "serde", +] + +[[package]] +name = "usvg" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b84ea542ae85c715f07b082438a4231c3760539d902e11d093847a0b22963032" +dependencies = [ + "base64", + "data-url", + "flate2", + "fontdb 0.18.0", + "imagesize", + "kurbo 0.11.1", + "log", + "pico-args", + "roxmltree", + "rustybuzz", + "simplecss", + "siphasher", + "strict-num", + "svgtypes", + "tiny-skia-path", + "unicode-bidi", + "unicode-script", + "unicode-vo", + "xmlwriter", ] [[package]] @@ -4744,24 +5181,31 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.14.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d59ca99a559661b96bf898d8fce28ed87935fd2bea9f05983c1464dd6c71b1" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" dependencies = [ - "getrandom 0.3.1", + "getrandom 0.3.2", + "js-sys", + "wasm-bindgen", ] [[package]] -name = "valuable" -version = "0.1.1" +name = "v_frame" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] [[package]] -name = "value-bag" -version = "1.10.0" +name = "valuable" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "vcpkg" @@ -4770,6 +5214,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + +[[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4793,20 +5243,14 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi" -version = "0.13.3+wasi-0.2.2" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" dependencies = [ "wit-bindgen-rt", ] [[package]] -name = "wasite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" - -[[package]] name = "wasm-bindgen" version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4828,7 +5272,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "wasm-bindgen-shared", ] @@ -4863,7 +5307,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4878,17 +5322,18 @@ dependencies = [ ] [[package]] -name = "wasmtimer" -version = "0.4.1" +name = "wasm-timer" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" +checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" dependencies = [ "futures", "js-sys", - "parking_lot", + "parking_lot 0.11.2", "pin-utils", - "slab", "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", ] [[package]] @@ -4899,7 +5344,7 @@ checksum = "b7208998eaa3870dad37ec8836979581506e0c5c64c20c9e79e9d2a10d6f47bf" dependencies = [ "cc", "downcast-rs", - "rustix", + "rustix 0.38.44", "scoped-tls", "smallvec", "wayland-sys", @@ -4911,8 +5356,8 @@ version = "0.31.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f" dependencies = [ - "bitflags 2.8.0", - "rustix", + "bitflags 2.9.0", + "rustix 0.38.44", "wayland-backend", "wayland-scanner", ] @@ -4923,7 +5368,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "cursor-icon", "wayland-backend", ] @@ -4934,7 +5379,7 @@ version = "0.31.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a93029cbb6650748881a00e4922b076092a6a08c11e7fbdb923f064b23968c5d" dependencies = [ - "rustix", + "rustix 0.38.44", "wayland-client", "xcursor", ] @@ -4945,7 +5390,7 @@ version = "0.32.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0781cf46869b37e36928f7b432273c0995aa8aed9552c556fb18754420541efc" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "wayland-backend", "wayland-client", "wayland-scanner", @@ -4957,7 +5402,7 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ccaacc76703fefd6763022ac565b590fcade92202492381c95b2edfdf7d46b3" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -4970,7 +5415,7 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "248a02e6f595aad796561fa82d25601bd2c8c3b145b1c7453fc8f94c1a58f8b2" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -5021,18 +5466,24 @@ dependencies = [ ] [[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + +[[package]] name = "wgpu" -version = "23.0.1" +version = "0.19.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80f70000db37c469ea9d67defdc13024ddf9a5f1b89cb2941b812ad7cde1735a" +checksum = "cbd7311dbd2abcfebaabf1841a2824ed7c8be443a0f29166e5d3c6a53a762c01" dependencies = [ "arrayvec", + "cfg-if", "cfg_aliases 0.1.1", - "document-features", "js-sys", "log", "naga", - "parking_lot", + "parking_lot 0.12.3", "profiling", "raw-window-handle", "smallvec", @@ -5047,60 +5498,62 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "23.0.1" +version = "0.19.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d63c3c478de8e7e01786479919c8769f62a22eec16788d8c2ac77ce2c132778a" +checksum = "28b94525fc99ba9e5c9a9e24764f2bc29bad0911a7446c12f446a8277369bf3a" dependencies = [ "arrayvec", "bit-vec", - "bitflags 2.8.0", + "bitflags 2.9.0", "cfg_aliases 0.1.1", - "document-features", + "codespan-reporting", "indexmap", "log", "naga", "once_cell", - "parking_lot", + "parking_lot 0.12.3", "profiling", "raw-window-handle", "rustc-hash 1.1.0", "smallvec", "thiserror 1.0.69", + "web-sys", "wgpu-hal", "wgpu-types", ] [[package]] name = "wgpu-hal" -version = "23.0.1" +version = "0.19.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89364b8a0b211adc7b16aeaf1bd5ad4a919c1154b44c9ce27838213ba05fd821" +checksum = "bfabcfc55fd86611a855816326b2d54c3b2fd7972c27ce414291562650552703" dependencies = [ "android_system_properties", "arrayvec", "ash", "bit-set", - "bitflags 2.8.0", + "bitflags 2.9.0", "block", - "bytemuck", "cfg_aliases 0.1.1", "core-graphics-types 0.1.3", + "d3d12", "glow", "glutin_wgl_sys", "gpu-alloc", "gpu-allocator", "gpu-descriptor", + "hassle-rs", "js-sys", "khronos-egl", "libc", - "libloading", + "libloading 0.8.6", "log", "metal", "naga", "ndk-sys 0.5.0+25.2.9519653", "objc", "once_cell", - "parking_lot", + "parking_lot 0.12.3", "profiling", "range-alloc", "raw-window-handle", @@ -5111,36 +5564,25 @@ dependencies = [ "wasm-bindgen", "web-sys", "wgpu-types", - "windows", - "windows-core 0.58.0", + "winapi", ] [[package]] name = "wgpu-types" -version = "23.0.0" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "610f6ff27778148c31093f3b03abc4840f9636d58d597ca2f5977433acfe0068" +checksum = "b671ff9fb03f78b46ff176494ee1ebe7d603393f42664be55b64dc8d53969805" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "js-sys", "web-sys", ] [[package]] -name = "whoami" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" -dependencies = [ - "redox_syscall 0.5.8", - "wasite", -] - -[[package]] name = "widestring" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" [[package]] name = "winapi" @@ -5189,11 +5631,11 @@ dependencies = [ [[package]] name = "windows" -version = "0.58.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ - "windows-core 0.58.0", + "windows-core 0.52.0", "windows-targets 0.52.6", ] @@ -5208,62 +5650,61 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.58.0" +version = "0.61.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" dependencies = [ "windows-implement", "windows-interface", + "windows-link", "windows-result", "windows-strings", - "windows-targets 0.52.6", ] [[package]] name = "windows-implement" -version = "0.58.0" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "windows-interface" -version = "0.58.0" +version = "0.59.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", ] [[package]] name = "windows-link" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" [[package]] name = "windows-result" -version = "0.2.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" dependencies = [ - "windows-targets 0.52.6", + "windows-link", ] [[package]] name = "windows-strings" -version = "0.1.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" dependencies = [ - "windows-result", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -5482,13 +5923,14 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winit" -version = "0.30.8" -source = "git+https://github.com/iced-rs/winit.git?rev=11414b6aa45699f038114e61b4ddf5102b2d3b4b#11414b6aa45699f038114e61b4ddf5102b2d3b4b" +version = "0.30.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a809eacf18c8eca8b6635091543f02a5a06ddf3dad846398795460e6e0ae3cc0" dependencies = [ - "ahash", + "ahash 0.8.11", "android-activity", "atomic-waker", - "bitflags 2.8.0", + "bitflags 2.9.0", "block2", "bytemuck", "calloop", @@ -5511,7 +5953,7 @@ dependencies = [ "pin-project", "raw-window-handle", "redox_syscall 0.4.1", - "rustix", + "rustix 0.38.44", "sctk-adwaita", "smithay-client-toolkit", "smol_str", @@ -5533,28 +5975,27 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.2" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59690dea168f2198d1a3b0cac23b8063efcd11012f10ae4698f284808c8ef603" +checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10" dependencies = [ "memchr", ] [[package]] name = "winreg" -version = "0.50.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" dependencies = [ - "cfg-if", - "windows-sys 0.48.0", + "winapi", ] [[package]] name = "winreg" -version = "0.52.0" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ "cfg-if", "windows-sys 0.48.0", @@ -5562,11 +6003,11 @@ dependencies = [ [[package]] name = "wit-bindgen-rt" -version = "0.33.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", ] [[package]] @@ -5601,9 +6042,9 @@ dependencies = [ "as-raw-xcb-connection", "gethostname", "libc", - "libloading", + "libloading 0.8.6", "once_cell", - "rustix", + "rustix 0.38.44", "x11rb-protocol", ] @@ -5635,7 +6076,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "dlib", "log", "once_cell", @@ -5650,9 +6091,15 @@ checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" [[package]] name = "xml-rs" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" +checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" + +[[package]] +name = "xmlwriter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" [[package]] name = "yazi" @@ -5680,15 +6127,15 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "synstructure", ] [[package]] name = "zbus" -version = "5.5.0" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59c333f648ea1b647bc95dc1d34807c8e25ed7a6feff3394034dc4776054b236" +checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" dependencies = [ "async-broadcast", "async-executor", @@ -5701,19 +6148,21 @@ dependencies = [ "async-trait", "blocking", "enumflags2", - "event-listener 5.4.0", + "event-listener", "futures-core", - "futures-lite", + "futures-sink", + "futures-util", "hex", "nix", "ordered-stream", + "rand", "serde", "serde_repr", + "sha1", "static_assertions", "tracing", "uds_windows", - "windows-sys 0.59.0", - "winnow", + "windows-sys 0.52.0", "xdg-home", "zbus_macros", "zbus_names", @@ -5722,28 +6171,25 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.5.0" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f325ad10eb0d0a3eb060203494c3b7ec3162a01a59db75d2deee100339709fc0" +checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.98", - "zbus_names", - "zvariant", + "syn 2.0.100", "zvariant_utils", ] [[package]] name = "zbus_names" -version = "4.2.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" +checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" dependencies = [ "serde", "static_assertions", - "winnow", "zvariant", ] @@ -5759,8 +6205,16 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +dependencies = [ + "zerocopy-derive 0.8.24", ] [[package]] @@ -5771,37 +6225,42 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", ] [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "synstructure", ] [[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" - -[[package]] name = "zerovec" version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -5820,48 +6279,66 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", +] + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" +dependencies = [ + "zune-core", ] [[package]] name = "zvariant" -version = "5.4.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2df9ee044893fcffbdc25de30546edef3e32341466811ca18421e3cd6c5a3ac" +checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" dependencies = [ "endi", "enumflags2", "serde", "static_assertions", - "url", - "winnow", "zvariant_derive", - "zvariant_utils", ] [[package]] name = "zvariant_derive" -version = "5.4.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74170caa85b8b84cc4935f2d56a57c7a15ea6185ccdd7eadb57e6edd90f94b2f" +checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.100", "zvariant_utils", ] [[package]] name = "zvariant_utils" -version = "3.2.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" +checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" dependencies = [ "proc-macro2", "quote", - "serde", - "static_assertions", - "syn 2.0.98", - "winnow", + "syn 2.0.100", ] @@ -1,11 +1,14 @@ +[workspace] +resolver = "2" + [package] name = "macaw" version = "0.1.0" edition = "2021" [dependencies] -iced = { git = "https://github.com/iced-rs/iced", features = ["tokio"] } -luz = { version = "0.1.0", path = "../luz/luz" } +iced = { version = "0.13.0", features = ["tokio", "image", "svg", "advanced"] } +filamento = { version = "0.1.0", path = "../luz/filamento" } jid = { version = "0.1.0", path = "../luz/jid" } tokio = "1.43.0" tokio-stream = "0.1.17" @@ -0,0 +1,11 @@ +- each thing that references something holds a reference to it, guaranteeing that it is stored in the cache. +- if all the references are dropped, it is removed from the cache. +- if you query the cache with an id you should be able to get a reference. +- but the issue is that the underlying data can change when the value in the cache changes. therefore, the reference must be a reference to a mutex. + - so then use generational thing +- the cache also needs to be in a mutex, because the cache must be modifiable through the drop function and the main logic. + - the drop function doesn't have to be able to modify the cache, it can just let the program know it's time to delete something from the cache. + - the generational thing means that it will be auto-dropped. + + +arena that has a hashmap along with it. the hashmap has the id and the generation index. if the generation thing is fucked, then it falls back to the hashmap to change the index. changing the hashmap unfortunately requires mutex. the key is self referential to the macaw struct. diff --git a/assets/fonts/Diolce-Regular.otf b/assets/fonts/Diolce-Regular.otf Binary files differnew file mode 100644 index 0000000..562e749 --- /dev/null +++ b/assets/fonts/Diolce-Regular.otf diff --git a/assets/fonts/Diolce-Regular.ttf b/assets/fonts/Diolce-Regular.ttf Binary files differnew file mode 100644 index 0000000..a7f0fd6 --- /dev/null +++ b/assets/fonts/Diolce-Regular.ttf diff --git a/assets/fonts/K2D-Bold.ttf b/assets/fonts/K2D-Bold.ttf Binary files differnew file mode 100644 index 0000000..6c07a9a --- /dev/null +++ b/assets/fonts/K2D-Bold.ttf diff --git a/assets/fonts/K2D-BoldItalic.ttf b/assets/fonts/K2D-BoldItalic.ttf Binary files differnew file mode 100644 index 0000000..be68508 --- /dev/null +++ b/assets/fonts/K2D-BoldItalic.ttf diff --git a/assets/fonts/K2D-ExtraBold.ttf b/assets/fonts/K2D-ExtraBold.ttf Binary files differnew file mode 100644 index 0000000..1065611 --- /dev/null +++ b/assets/fonts/K2D-ExtraBold.ttf diff --git a/assets/fonts/K2D-ExtraBoldItalic.ttf b/assets/fonts/K2D-ExtraBoldItalic.ttf Binary files differnew file mode 100644 index 0000000..fbd4804 --- /dev/null +++ b/assets/fonts/K2D-ExtraBoldItalic.ttf diff --git a/assets/fonts/K2D-ExtraLight.ttf b/assets/fonts/K2D-ExtraLight.ttf Binary files differnew file mode 100644 index 0000000..21273c3 --- /dev/null +++ b/assets/fonts/K2D-ExtraLight.ttf diff --git a/assets/fonts/K2D-ExtraLightItalic.ttf b/assets/fonts/K2D-ExtraLightItalic.ttf Binary files differnew file mode 100644 index 0000000..75a3ca3 --- /dev/null +++ b/assets/fonts/K2D-ExtraLightItalic.ttf diff --git a/assets/fonts/K2D-Italic.ttf b/assets/fonts/K2D-Italic.ttf Binary files differnew file mode 100644 index 0000000..ae77b56 --- /dev/null +++ b/assets/fonts/K2D-Italic.ttf diff --git a/assets/fonts/K2D-Light.ttf b/assets/fonts/K2D-Light.ttf Binary files differnew file mode 100644 index 0000000..48bf67d --- /dev/null +++ b/assets/fonts/K2D-Light.ttf diff --git a/assets/fonts/K2D-LightItalic.ttf b/assets/fonts/K2D-LightItalic.ttf Binary files differnew file mode 100644 index 0000000..8086fd7 --- /dev/null +++ b/assets/fonts/K2D-LightItalic.ttf diff --git a/assets/fonts/K2D-Medium.ttf b/assets/fonts/K2D-Medium.ttf Binary files differnew file mode 100644 index 0000000..667fefe --- /dev/null +++ b/assets/fonts/K2D-Medium.ttf diff --git a/assets/fonts/K2D-MediumItalic.ttf b/assets/fonts/K2D-MediumItalic.ttf Binary files differnew file mode 100644 index 0000000..177f863 --- /dev/null +++ b/assets/fonts/K2D-MediumItalic.ttf diff --git a/assets/fonts/K2D-Regular.ttf b/assets/fonts/K2D-Regular.ttf Binary files differnew file mode 100644 index 0000000..dce2033 --- /dev/null +++ b/assets/fonts/K2D-Regular.ttf diff --git a/assets/fonts/K2D-SemiBold.ttf b/assets/fonts/K2D-SemiBold.ttf Binary files differnew file mode 100644 index 0000000..d448629 --- /dev/null +++ b/assets/fonts/K2D-SemiBold.ttf diff --git a/assets/fonts/K2D-SemiBoldItalic.ttf b/assets/fonts/K2D-SemiBoldItalic.ttf Binary files differnew file mode 100644 index 0000000..8ec3713 --- /dev/null +++ b/assets/fonts/K2D-SemiBoldItalic.ttf diff --git a/assets/fonts/K2D-Thin.ttf b/assets/fonts/K2D-Thin.ttf Binary files differnew file mode 100644 index 0000000..4d68740 --- /dev/null +++ b/assets/fonts/K2D-Thin.ttf diff --git a/assets/fonts/K2D-ThinItalic.ttf b/assets/fonts/K2D-ThinItalic.ttf Binary files differnew file mode 100644 index 0000000..64191d8 --- /dev/null +++ b/assets/fonts/K2D-ThinItalic.ttf diff --git a/assets/icons/addcontact24.svg b/assets/icons/addcontact24.svg new file mode 100644 index 0000000..3324996 --- /dev/null +++ b/assets/icons/addcontact24.svg @@ -0,0 +1,5 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M16.0004 11C16.6281 10.1643 17 9.12561 17 8C17 5.23858 14.7614 3 12 3C9.23858 3 7 5.23858 7 8C7 9.12561 7.37194 10.1643 7.99963 11" stroke="black" stroke-width="2"/> +<path d="M7 14.0014C3.60117 15.6755 3.00884 19.0504 3 21H21.0264C21.0264 19.2423 20.4151 15.7748 17 14.0399" stroke="black" stroke-width="2"/> +<path d="M12 13H15M12 13H9M12 13V10M12 13V16" stroke="black" stroke-width="2"/> +</svg> diff --git a/assets/icons/attachment24.svg b/assets/icons/attachment24.svg new file mode 100644 index 0000000..ee808e6 --- /dev/null +++ b/assets/icons/attachment24.svg @@ -0,0 +1,3 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M21 13.3329C16.6369 19.9724 12.4124 20.8255 9.33666 20.8255C5.60908 20.8255 3 17.7955 3 15.1645C3 9.12539 9.09537 3.30998 15.6733 3.30998C19.1978 3.30998 22.3753 8.59036 15.5935 15.0402C11.6522 18.7886 8.39541 17.6137 7.57871 16.3206C5.87141 13.6174 9.33666 10.3925 12.0841 8.87491" stroke="black" stroke-width="2"/> +</svg> diff --git a/assets/icons/away16.svg b/assets/icons/away16.svg new file mode 100644 index 0000000..5d78da1 --- /dev/null +++ b/assets/icons/away16.svg @@ -0,0 +1,10 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_204_583)"> +<path d="M12.3949 3.68876C14.4905 5.78437 14.3985 9.52573 11.8703 12.0539C9.3422 14.582 5.60084 14.674 3.50523 12.5784C2.7029 11.7761 2.22277 10.747 2.07449 9.63325C2.10824 9.63849 2.14189 9.64327 2.17541 9.64762C2.83698 9.73336 3.54898 9.66529 4.21793 9.51478C5.52363 9.22102 6.93329 8.5485 7.73555 7.67748C8.50721 6.83967 9.11302 5.50754 9.35486 4.24412C9.47772 3.60222 9.51846 2.91991 9.40702 2.28141C9.4053 2.27156 9.40354 2.2617 9.40175 2.25184C10.5339 2.39262 11.5812 2.87506 12.3949 3.68876Z" stroke="black" stroke-width="2"/> +</g> +<defs> +<clipPath id="clip0_204_583"> +<rect width="16" height="16" fill="white"/> +</clipPath> +</defs> +</svg> diff --git a/assets/icons/away16color.svg b/assets/icons/away16color.svg new file mode 100644 index 0000000..e35da57 --- /dev/null +++ b/assets/icons/away16color.svg @@ -0,0 +1,10 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_204_583)"> +<path d="M12.3949 3.68876C14.4905 5.78437 14.3985 9.52573 11.8703 12.0539C9.3422 14.582 5.60084 14.674 3.50523 12.5784C2.7029 11.7761 2.22277 10.747 2.07449 9.63325C2.10824 9.63849 2.14189 9.64327 2.17541 9.64762C2.83698 9.73336 3.54898 9.66529 4.21793 9.51478C5.52363 9.22102 6.93329 8.5485 7.73555 7.67748C8.50721 6.83967 9.11302 5.50754 9.35486 4.24412C9.47772 3.60222 9.51846 2.91991 9.40702 2.28141C9.4053 2.27156 9.40354 2.2617 9.40175 2.25184C10.5339 2.39262 11.5812 2.87506 12.3949 3.68876Z" fill="#FFCE07" stroke="black" stroke-width="2"/> +</g> +<defs> +<clipPath id="clip0_204_583"> +<rect width="16" height="16" fill="white"/> +</clipPath> +</defs> +</svg> diff --git a/assets/icons/bubble16.svg b/assets/icons/bubble16.svg new file mode 100644 index 0000000..8775127 --- /dev/null +++ b/assets/icons/bubble16.svg @@ -0,0 +1,3 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M8.82231 12.4711L8.5106 11.499C8.70361 11.4713 8.89168 11.4358 9.07333 11.3943C10.1138 11.1566 11.0459 10.7001 11.6435 10.2423C13.6639 8.69425 14.4 6.1447 12.9614 4.2671C12.0904 3.13031 10.6908 2.71605 9.30488 2.79833C7.91203 2.88103 6.41494 3.45992 5.1034 4.46482C3.79187 5.46971 2.84338 6.76461 2.40112 8.08797C1.96106 9.40473 1.99689 10.8639 2.86789 12.0007C3.719 13.1115 5.83101 13.9667 8.82231 12.4711Z" stroke="black" stroke-width="2" stroke-miterlimit="1.41421"/> +</svg> diff --git a/assets/icons/bubble16color.svg b/assets/icons/bubble16color.svg new file mode 100644 index 0000000..c3c01d8 --- /dev/null +++ b/assets/icons/bubble16color.svg @@ -0,0 +1,3 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M8.82231 12.4711L8.5106 11.499C8.70361 11.4713 8.89168 11.4358 9.07333 11.3943C10.1138 11.1566 11.0459 10.7001 11.6435 10.2423C13.6639 8.69425 14.4 6.1447 12.9614 4.2671C12.0904 3.13031 10.6908 2.71605 9.30488 2.79833C7.91203 2.88103 6.41494 3.45992 5.1034 4.46482C3.79187 5.46971 2.84338 6.76461 2.40112 8.08797C1.96106 9.40473 1.99689 10.8639 2.86789 12.0007C3.719 13.1115 5.83101 13.9667 8.82231 12.4711Z" fill="#52CF6E" stroke="black" stroke-width="2" stroke-miterlimit="1.41421"/> +</svg> diff --git a/assets/icons/bubble24.svg b/assets/icons/bubble24.svg new file mode 100644 index 0000000..b9e9414 --- /dev/null +++ b/assets/icons/bubble24.svg @@ -0,0 +1,3 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M13.1661 18.7474L12.6411 17.1101C13.0131 17.0644 13.376 16.9992 13.7259 16.9192C15.3587 16.5462 16.8089 15.8307 17.7144 15.1369C20.8619 12.7253 21.8527 8.91393 19.7675 6.19249C18.5016 4.54019 16.4353 3.89603 14.2909 4.02335C12.1395 4.15109 9.79196 5.04995 7.71792 6.63908C5.64387 8.2282 4.16516 10.261 3.48204 12.305C2.80113 14.3425 2.88548 16.5052 4.15146 18.1575C5.3258 19.6902 8.44768 21.1066 13.1661 18.7474Z" stroke="black" stroke-width="2" stroke-miterlimit="1.41421"/> +</svg> diff --git a/assets/icons/contact24.svg b/assets/icons/contact24.svg new file mode 100644 index 0000000..da03215 --- /dev/null +++ b/assets/icons/contact24.svg @@ -0,0 +1,4 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<circle cx="12.0678" cy="8" r="5" stroke="black" stroke-width="2"/> +<path d="M12 13C4.11584 13 3.01209 18.3333 3 21H21.0264C21.0264 18.5973 19.8842 13 12 13Z" stroke="black" stroke-width="2"/> +</svg> diff --git a/assets/icons/delivered16.svg b/assets/icons/delivered16.svg new file mode 100644 index 0000000..feec0c2 --- /dev/null +++ b/assets/icons/delivered16.svg @@ -0,0 +1,4 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M14.1667 7.00724C12.9795 8.54119 10.9029 9.18264 10.0046 9.18264C9.88343 9.18264 9.27537 9.13373 9.21829 9.07586" stroke="black" stroke-width="2"/> +<path d="M2.13982 7.66744C2.51405 8.66834 3.48325 9.1754 4.49578 9.1754C5.39405 9.1754 7.47067 8.53395 8.6579 7" stroke="black" stroke-width="2"/> +</svg> diff --git a/assets/icons/dnd16.svg b/assets/icons/dnd16.svg new file mode 100644 index 0000000..d13d54b --- /dev/null +++ b/assets/icons/dnd16.svg @@ -0,0 +1,3 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M6 14L2 10V6L6 2H10L14 6V10L10 14H6Z" stroke="black" stroke-width="2"/> +</svg> diff --git a/assets/icons/dnd16color.svg b/assets/icons/dnd16color.svg new file mode 100644 index 0000000..e69cbe3 --- /dev/null +++ b/assets/icons/dnd16color.svg @@ -0,0 +1,3 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M6 14L2 10V6L6 2H10L14 6V10L10 14H6Z" fill="#C1173C" stroke="black" stroke-width="2"/> +</svg> diff --git a/assets/icons/error16color.svg b/assets/icons/error16color.svg new file mode 100644 index 0000000..21e28fc --- /dev/null +++ b/assets/icons/error16color.svg @@ -0,0 +1,10 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_204_962)"> +<path d="M2.80385 12.6928L8 3.6928L13.1962 12.6928H2.80385Z" fill="#C1173C" stroke="black" stroke-width="2"/> +</g> +<defs> +<clipPath id="clip0_204_962"> +<rect width="16" height="16" fill="white"/> +</clipPath> +</defs> +</svg> diff --git a/assets/icons/forward24.svg b/assets/icons/forward24.svg new file mode 100644 index 0000000..a2fdaba --- /dev/null +++ b/assets/icons/forward24.svg @@ -0,0 +1,10 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_204_235)"> +<path d="M15.674 3.11258L15.674 9M15.674 3.11258L8.5 3.11258M15.674 3.11258C14.4547 3.63965 13.2902 4.34718 12.1355 5.23196C6.92147 9.22691 4.88415 15.323 7.58502 18.8481C8.26848 19.7401 9.84336 20.6926 12.1355 20.8434" stroke="black" stroke-width="2" stroke-miterlimit="16"/> +</g> +<defs> +<clipPath id="clip0_204_235"> +<rect width="24" height="24" fill="white"/> +</clipPath> +</defs> +</svg> diff --git a/assets/icons/heart24.svg b/assets/icons/heart24.svg new file mode 100644 index 0000000..dd63532 --- /dev/null +++ b/assets/icons/heart24.svg @@ -0,0 +1,3 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M11.4455 5.90719L12.0788 6.42557L12.7122 5.90719C14.9006 4.11609 16.6254 3.44822 17.8564 3.39835C19.0193 3.35124 19.8258 3.84682 20.342 4.6883C20.8877 5.57785 21.1387 6.92101 20.9232 8.51425C20.7097 10.0929 20.0454 11.8434 18.8646 13.4786C17.0975 15.9258 15.7674 17.3884 14.6372 18.3999C13.6976 19.2408 12.8806 19.7855 12.0015 20.3471C11.1396 19.79 10.3533 19.2443 9.44622 18.4039C8.35343 17.3914 7.06118 15.9272 5.29303 13.4786C4.11223 11.8434 3.4479 10.0929 3.2344 8.51425C3.01893 6.92101 3.26991 5.57785 3.81561 4.6883C4.33182 3.84682 5.13833 3.35124 6.30121 3.39835C7.53222 3.44822 9.25705 4.11609 11.4455 5.90719Z" stroke="black" stroke-width="2"/> +</svg> diff --git a/assets/icons/newbubble24.svg b/assets/icons/newbubble24.svg new file mode 100644 index 0000000..b1d72fd --- /dev/null +++ b/assets/icons/newbubble24.svg @@ -0,0 +1,4 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M13.1661 18.7474L12.6411 17.1101C13.0131 17.0644 13.376 16.9992 13.7259 16.9192C15.3587 16.5462 16.8089 15.8307 17.7144 15.1369C20.8619 12.7253 21.8527 8.91393 19.7675 6.19249C18.5016 4.54019 16.4353 3.89603 14.2909 4.02335C12.1395 4.15109 9.79196 5.04995 7.71792 6.63908C5.64387 8.2282 4.16516 10.261 3.48204 12.305C2.80113 14.3425 2.88548 16.5052 4.15146 18.1575C5.3258 19.6902 8.44768 21.1066 13.1661 18.7474Z" stroke="black" stroke-width="2" stroke-miterlimit="1.41421"/> +<path d="M12 8.05864V14.0586M15 11.0586H9" stroke="black" stroke-width="2"/> +</svg> diff --git a/assets/icons/reply24.svg b/assets/icons/reply24.svg new file mode 100644 index 0000000..7136614 --- /dev/null +++ b/assets/icons/reply24.svg @@ -0,0 +1,10 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_204_246)"> +<path d="M2.96446 13.4001L8.69828 13.4001M2.96446 13.4001L2.96446 7.25968M2.96446 13.4001C3.79279 12.3092 4.8179 11.2726 6.01902 10.3523C11.0135 6.5255 17.1596 6.16059 19.7468 9.5372C21.8385 12.2673 20.7102 16.0351 18.5396 18.6512" stroke="black" stroke-width="2" stroke-miterlimit="16"/> +</g> +<defs> +<clipPath id="clip0_204_246"> +<rect width="24" height="24" fill="white"/> +</clipPath> +</defs> +</svg> diff --git a/assets/icons/sending16.svg b/assets/icons/sending16.svg new file mode 100644 index 0000000..a74179a --- /dev/null +++ b/assets/icons/sending16.svg @@ -0,0 +1,5 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<circle cx="3" cy="8" r="2" fill="black"/> +<circle cx="8" cy="8" r="2" fill="black"/> +<circle cx="13" cy="8" r="2" fill="black"/> +</svg> diff --git a/assets/icons/sent16.svg b/assets/icons/sent16.svg new file mode 100644 index 0000000..5b7f3fa --- /dev/null +++ b/assets/icons/sent16.svg @@ -0,0 +1,3 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M2.13982 7.66744C2.51405 8.66834 3.48325 9.1754 4.49578 9.1754C5.39405 9.1754 7.47067 8.53395 8.6579 7" stroke="black" stroke-width="2"/> +</svg> diff --git a/icons.md b/icons.md new file mode 100644 index 0000000..9c3dd89 --- /dev/null +++ b/icons.md @@ -0,0 +1,24 @@ +# icons + +- [x] online +- [x] away +- [x] dnd +- [x] xa +- [x] person +- [ ] settings +- [x] sending +- [x] failure +- [x] sent tick +- [x] delivered two ticks +- [x] new message +- [x] heart +- [x] message bubble +- [x] reply +- [x] forward +- [x] attachment +- [ ] (re)send (up arrow) +- [ ] mobile phone +- [ ] default avatar +- [ ] call + +- [ ] add @@ -12,6 +12,10 @@ - voice channels - video streaming - broadcast rooms +- request message sync between devices (chat and global level) and with particular contacts (on a chat level) +- pass the aux + - when on call, can start an aux session to share application audio in high quality, and pass around with audio status shared (track etc.) in call. +- (when mobile is good): proper location sharing map - theme parts - main application style (component styles) done through setting variables to do with components - may include assets for borders, backgrounds, etc. @@ -77,6 +81,9 @@ - guilds at guild@guilds.example.org, channels at guild#channel@guilds.example.org or channel#guild@guilds.example.org or #channel%guild@guilds.example.org - guilds as a special type of mix channel, guild@mix.example.org, rest of channels at channel@mix.example.org - guilds at guild@guilds.example.org, channels at channel@mix.example.org (probably won't work) +- maybe guilds should be split from spaces + - guilds as guild.example.org, query items and get channels channel@guild.example.org. easy shared permissions and roles. just an extended mix service, so people can still join channels individually. only annoying in terms of creating new guilds now requires dns and tls annoyances, but could maybe have a fallback by either using a different format, or specifying a node in the disco things(?). i guess people could just put wildcards as like *.guilds.example.org too. + - spaces as spaces.example.org, or just as a pubsub item in a particular namespace, so people can have private (or public) spaces organising channels, guilds and people together. - proper rtl, ttb and bbt text rendering which switches depending on xml message language. - xmpp as a desktop service - xmpp gateways forwarding other xmpp accounts diff --git a/old_code.md b/old_code.md new file mode 100644 index 0000000..acf7bfa --- /dev/null +++ b/old_code.md @@ -0,0 +1,460 @@ +// pub struct State<'a> { +// // open_chat: Option<OpenChat<'a>>, +// chats: Vec<BorrowedChat<'a>>, +// roster: Vec<BorrowedContact<'a>>, +// } + +// impl Macaw { +// pub fn state(&self) -> State { +// let chats = self +// .chats +// .iter() +// .map(|(_, chat)| { +// let user = chat.user.as_ref().borrow(); +// let contact = self.roster.get(&user.inner.jid); +// let latest_message = match &chat.message { +// Some(the_message) => { +// let message: Ref<'_, OwnedMessage> = the_message.as_ref().borrow(); +// let user = { +// let user = message.user.as_ref().borrow(); +// let contact = self.roster.get(&user.inner.jid); + +// BorrowedUser { +// inner: user, +// contact, +// } +// }; +// Some(BorrowedMessage { +// inner: message, +// user, +// }) +// } +// None => None, +// }; +// BorrowedChat { +// inner: &chat, +// user: BorrowedUser { +// inner: user, +// contact, +// }, +// latest_message, +// } +// }) +// .collect(); +// State { +// // open_chat: todo!(), +// chats, +// roster: todo!(), +// } +// } +// } + +// pub enum Node<'a> { +// User(BorrowedUser<'a>), +// Message(BorrowedMessage<'a>), +// Contact(BorrowedContact<'a>), +// Chat(BorrowedChat<'a>), +// OpenChat(OpenChat<'a>), +// } + +// pub enum Orphan { +// User(JID), +// Message(Uuid), +// } + +// pub struct BorrowedUser<'a> { +// inner: Ref<'a, OwnedUser>, +// // inner: &'a OwnedUser, +// contact: Option<&'a OwnedContact>, +// } + +// pub struct BorrowedMessage<'a> { +// inner: Ref<'a, OwnedMessage>, +// // user: Rc<RefCell<User>>, +// user: BorrowedUser<'a>, +// } + +// pub struct BorrowedContact<'a> { +// inner: &'a OwnedContact, +// user: BorrowedUser<'a>, +// } + +// pub struct BorrowedChat<'a> { +// inner: &'a OwnedChat, +// // user: Rc<RefCell<OwnedUser>>, +// user: BorrowedUser<'a>, +// // latest_message: Option<Rc<RefCell<OwnedMessage>>>, +// latest_message: Option<BorrowedMessage<'a>>, +// } + +// pub struct OpenChat<'a> { +// chat: BorrowedChat<'a>, +// messages: Vec<BorrowedMessage<'a>>, +// } + +// there are two states: an editing state and a reading state. +// because the state is self-referential, each time there is a change, the state needs to be recalculated. +// pub struct State<'a> { +// // open_chat: Option<OpenChat<'a>>, +// chats: Vec<BorrowedChat<'a>>, +// roster: Vec<BorrowedContact<'a>>, +// } + +// pub struct AState { +// open_chat: Option<OwnedOpenChat>, +// chats: HashMap<JID, (Chat, (User, Option<Contact>), Option<ChatMessage>)>, +// roster: HashMap<JID, (Contact, User)>, +// } + +// pub struct OwnedOpenChat { +// chat: (Chat, (User, Option<Contact>)), +// messages: IndexMap<Uuid, (ChatMessage, (User, Option<Contact>))>, +// } + +// pub struct MacawUser { +// inner: User, +// contact: Option<Contact>, +// } + +// impl Deref for MacawUser { + +// } + +// other option is forget about all this bullshit and just build the relations graph again after each update? +// impl Macaw { +// pub async fn insert_contact( +// &mut self, +// contact: Contact, +// ) -> Result<(), CommandError<DatabaseError>> { +// let user_jid = contact.user_jid.clone(); +// if !self.users.contains_key(&user_jid) { +// // TODO: all methods only on logged-in client +// match &self.client { +// Account::LoggedIn(client) => { +// let user = client.get_user(user_jid.clone()).await?; +// self.users.insert(user_jid, user); +// } +// Account::LoggedOut(login_modal) => todo!(), +// } +// } else { +// // up the dependency count +// } +// self.roster.insert(contact.user_jid.clone(), contact); +// Ok(()) +// } + +// pub fn get_contact(&self, jid: &JID) -> Option<(&Contact, &User)> {} + +// pub fn get_contact_mut(&mut self, jid: &JID) -> Option<&mut Contact> {} + +// pub fn remove_contact(&mut self, jid: JID) -> Option<Contact> { +// self.roster. +// } + +// // updating is fine to do directly on any part of the store. +// // if a contact is retrieved, it is guaranteed that there is a user in the store, because when the contact was inserted, a user was added to the user store, and the userstore is a droppable store that does not allow you to remove items if there are other things depending on it. +// } + +// pub struct MacawContact<'a> { +// inner: Contact, +// user: &'a User, +// } + +// messages must be tombstoned because of this +// items are never directly added to or removed from a droppablestore +// remove can only be called from a store that called insert +// if a store calls insert it must call remove if something is removed from that store +pub struct DroppableStore<K: Clone, V: Clone>(HashMap<K, (usize, V)>); + +impl<K: Clone, V: Clone> DroppableStore<K, V> { + pub fn capacity(&self) -> usize { + self.0.capacity() + } + + pub fn contains_key<Q: ?Sized>(&self, k: &Q) -> bool + where + Q: std::hash::Hash + Eq, + K: Borrow<Q> + std::hash::Hash + Eq, + { + self.0.contains_key(k) + } + + pub fn get<Q>(&self, k: &Q) -> Option<&V> + where + Q: std::hash::Hash + Eq, + K: Borrow<Q> + std::hash::Hash + Eq, + { + self.0.get(k).map(|(_, v)| v) + } + + pub fn get_key_value<Q>(&self, k: &Q) -> Option<(&K, &V)> + where + Q: std::hash::Hash + Eq + ?Sized, + K: Borrow<Q> + std::hash::Hash + Eq, + { + self.0.get_key_value(k).map(|(k, (_, v))| (k, v)) + } + + pub fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut V> + where + Q: std::hash::Hash + Eq + ?Sized, + K: Borrow<Q> + std::hash::Hash + Eq, + { + self.0.get_mut(k).map(|(_, v)| v) + } + + pub fn insert(&mut self, k: K, v: V) -> Option<V> + where + K: std::hash::Hash + Eq, + { + if let Some((count, old_v)) = self.0.get_mut(&k) { + *count += 1; + let output = std::mem::replace(old_v, v); + Some(output) + } else { + self.0.insert(k, (1, v)); + None + } + } + + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } + + pub fn iter(&self) -> impl Iterator<Item = (&K, &V)> { + self.0.iter().map(|(k, (_, v))| (k, v)) + } + + pub fn iter_mut(&mut self) -> impl Iterator<Item = (&K, &mut V)> { + self.0.iter_mut().map(|(k, (_, v))| (k, v)) + } + + pub fn keys(&self) -> impl Iterator<Item = &K> { + self.0.keys() + } + + pub fn len(&self) -> usize { + self.0.len() + } + + pub fn new() -> Self { + Self(HashMap::new()) + } + + pub fn remove<Q>(&mut self, k: &Q) -> Option<V> + where + K: Borrow<Q> + std::hash::Hash + Eq, + Q: std::hash::Hash + Eq + ?Sized, + { + if let Some((count, old_v)) = self.0.get_mut(&k) { + if *count == 1 { + self.0.remove(&k).map(|(_, v)| v) + } else { + *count = *count - 1; + Some(old_v.clone()) + } + } else { + None + } + } + + pub fn remove_entry<Q>(&mut self, k: &K) -> Option<(K, V)> + where + K: std::hash::Hash + Eq, + { + if let Some((count, old_v)) = self.0.get_mut(&k) { + if *count == 1 { + self.0.remove_entry(&k).map(|(k, (_, v))| (k, v)) + } else { + *count = *count - 1; + Some((k.clone(), old_v.clone())) + } + } else { + None + } + } + + pub fn reserve(&mut self, additional: usize) + where + K: std::hash::Hash + Eq, + { + self.0.reserve(additional) + } + + pub fn shrink_to(&mut self, min_capacity: usize) + where + K: std::hash::Hash + Eq, + { + self.0.shrink_to(min_capacity) + } + + pub fn shrink_to_fit(&mut self) + where + K: std::hash::Hash + Eq, + { + self.0.shrink_to_fit() + } + + pub fn try_reserve( + &mut self, + additional: usize, + ) -> Result<(), std::collections::TryReserveError> + where + K: std::hash::Hash + Eq, + { + self.0.try_reserve(additional) + } + + pub fn values(&self) -> impl Iterator<Item = &V> { + self.0.values().map(|(_, v)| v) + } + + pub fn values_mut(&mut self) -> impl Iterator<Item = &mut V> { + self.0.values_mut().map(|(_, v)| v) + } + + pub fn with_capacity(capacity: usize) -> Self { + Self(HashMap::with_capacity(capacity)) + } +} + +// #[derive(Debug, Clone)] +// pub struct MacawChat { +// inner: Arc<Mutex<Chat>>, +// jid: JID, +// latest_message: Option<MacawChatMessage>, +// store: MacawChatStore, +// } + +// impl Drop for MacawChat { +// fn drop(&mut self) { +// let mut store = match self.store.0.lock() { +// Ok(s) => s, +// Err(s) => s.into_inner(), +// }; +// if Arc::<Mutex<Chat>>::strong_count(&self.inner) == 2 { +// store.shift_remove(&self.jid); +// } +// } +// } + +// #[derive(Debug, Clone)] +// pub struct MacawChatStore(Arc<Mutex<IndexMap<JID, MacawChat>>>); + +// #[derive(Debug, Clone)] +// pub struct MacawChatMessage { +// inner: Arc<Mutex<ChatMessage>>, +// id: Uuid, +// user: BorrowedUser, +// store: MacawChatMessageStore, +// } + +// impl Drop for MacawChatMessage { +// fn drop(&mut self) { +// let mut store = match self.store.0.lock() { +// Ok(s) => s, +// Err(s) => s.into_inner(), +// }; +// if Rc::<ChatMessage>::strong_count(&self.inner) == 1 { +// store.shift_remove(&self.id) +// } +// } +// } + +// #[derive(Debug, Clone)] +// pub struct MacawChatMessageStore(HashMap<Uuid, MacawChatMessage>); + +// impl Deref for MacawChatMessageStore { +// type Target = HashMap<Uuid, (ChatMessage, BorrowedUser)>; + +// fn deref(&self) -> &Self::Target { +// &self.0 +// } +// } + +// impl DerefMut for MacawChatMessageStore { +// fn deref_mut(&mut self) -> &mut Self::Target { +// &mut self.0 +// } +// } + +// #[derive(Debug, Clone)] +// pub struct BorrowedUser { +// inner: Rc<User>, +// contact: Option<Box<BorrowedContact>>, +// store: Rc<RefCell<MacawUserStore>>, +// } + +// impl Drop for BorrowedUser { +// fn drop(&mut self) { +// if Rc::<User>::strong_count(&self.inner) == 1 { +// self.store.borrow_mut().remove(&self.inner.jid); +// } +// } +// } + +// impl Deref for BorrowedUser { +// type Target = User; + +// fn deref(&self) -> &Self::Target { +// self.inner.as_ref() +// } +// } + +// #[derive(Debug)] +// pub struct MacawUserStore(HashMap<JID, (User, Option<BorrowedContact>)>); + +// impl Deref for MacawUserStore { +// type Target = HashMap<JID, (User, Option<BorrowedContact>)>; + +// fn deref(&self) -> &Self::Target { +// &self.0 +// } +// } + +// impl DerefMut for MacawUserStore { +// fn deref_mut(&mut self) -> &mut Self::Target { +// &mut self.0 +// } +// } + +// #[derive(Debug, Clone)] +// pub struct BorrowedContact { +// inner: Rc<Contact>, +// user: Box<BorrowedUser>, +// store: Rc<RefCell<MacawRosterStore>>, +// } + +// impl Drop for BorrowedContact { +// fn drop(&mut self) { +// if Rc::<Contact>::strong_count(&self.inner) == 1 { +// self.store.borrow_mut().remove(&self.inner.user_jid); +// } +// } +// } + +// impl Deref for BorrowedContact { +// type Target = Contact; + +// fn deref(&self) -> &Self::Target { +// self.inner.as_ref() +// } +// } + +// #[derive(Debug)] +// pub struct MacawRosterStore(HashMap<JID, (Contact, BorrowedUser)>); + +// impl Deref for MacawRosterStore { +// type Target = HashMap<JID, (Contact, BorrowedUser)>; + +// fn deref(&self) -> &Self::Target { +// &self.0 +// } +// } + +// impl DerefMut for MacawRosterStore { +// fn deref_mut(&mut self) -> &mut Self::Target { +// &mut self.0 +// } +// } + diff --git a/src/icons.rs b/src/icons.rs new file mode 100644 index 0000000..63e7708 --- /dev/null +++ b/src/icons.rs @@ -0,0 +1,190 @@ +use filamento::chat::Delivery; +use iced::widget::svg; +use iced::widget::{svg::Handle, Svg}; +use iced::{color, Element, Theme}; + +pub enum Icon { + AddContact24, + Attachment24, + Away16, + Away16Color, + Bubble16, + Bubble16Color, + Bubble24, + Contact24, + Delivered16, + Dnd16, + Dnd16Color, + Error16Color, + Forward24, + Heart24, + NewBubble24, + Reply24, + Sending16, + Sent16, +} + +impl Icon { + pub fn svg(self) -> Svg<'static> { + self.into() + } +} + +impl From<Icon> for Svg<'_> { + fn from(value: Icon) -> Self { + match value { + Icon::AddContact24 => svg(Handle::from_memory(include_bytes!( + "../assets/icons/addcontact24.svg" + ))) + .width(24) + .height(24) + .style(|theme: &Theme, _status| svg::Style { + color: Some(theme.extended_palette().background.base.text), + }), + Icon::Attachment24 => svg(Handle::from_memory(include_bytes!( + "../assets/icons/attachment24.svg" + ))) + .width(24) + .height(24) + .style(|theme: &Theme, _status| svg::Style { + color: Some(theme.extended_palette().background.base.text), + }), + Icon::Away16 => svg(Handle::from_memory(include_bytes!( + "../assets/icons/away16.svg" + ))) + .width(16) + .height(16) + .style(|theme: &Theme, _status| svg::Style { + color: Some(theme.extended_palette().background.base.text), + }), + Icon::Away16Color => svg(Handle::from_memory(include_bytes!( + "../assets/icons/away16color.svg" + ))) + .width(16) + .height(16), + Icon::Bubble16 => svg(Handle::from_memory(include_bytes!( + "../assets/icons/bubble16.svg" + ))) + .width(16) + .height(16) + .style(|theme: &Theme, _status| svg::Style { + color: Some(theme.extended_palette().background.base.text), + }), + Icon::Bubble16Color => svg(Handle::from_memory(include_bytes!( + "../assets/icons/bubble16color.svg" + ))) + .width(16) + .height(16), + Icon::Bubble24 => svg(Handle::from_memory(include_bytes!( + "../assets/icons/bubble24.svg" + ))) + .width(24) + .height(24) + .style(|theme: &Theme, _status| svg::Style { + color: Some(theme.extended_palette().background.base.text), + }), + Icon::Contact24 => svg(Handle::from_memory(include_bytes!( + "../assets/icons/contact24.svg" + ))) + .width(24) + .height(24) + .style(|theme: &Theme, _status| svg::Style { + color: Some(theme.extended_palette().background.base.text), + }), + Icon::Delivered16 => svg(Handle::from_memory(include_bytes!( + "../assets/icons/delivered16.svg" + ))) + .width(16) + .height(16) + .style(|theme: &Theme, _status| svg::Style { + color: Some(theme.extended_palette().background.base.text), + }), + Icon::Dnd16 => svg(Handle::from_memory(include_bytes!( + "../assets/icons/dnd16.svg" + ))) + .width(16) + .height(16) + .style(|theme: &Theme, _status| svg::Style { + color: Some(theme.extended_palette().background.base.text), + }), + Icon::Dnd16Color => svg(Handle::from_memory(include_bytes!( + "../assets/icons/dnd16color.svg" + ))) + .width(16) + .height(16), + Icon::Error16Color => svg(Handle::from_memory(include_bytes!( + "../assets/icons/error16color.svg" + ))) + .width(16) + .height(16), + Icon::Forward24 => svg(Handle::from_memory(include_bytes!( + "../assets/icons/forward24.svg" + ))) + .width(24) + .height(24) + .style(|theme: &Theme, _status| svg::Style { + color: Some(theme.extended_palette().background.base.text), + }), + Icon::Heart24 => svg(Handle::from_memory(include_bytes!( + "../assets/icons/heart24.svg" + ))) + .width(24) + .height(24) + .style(|theme: &Theme, _status| svg::Style { + color: Some(theme.extended_palette().background.base.text), + }), + Icon::NewBubble24 => svg(Handle::from_memory(include_bytes!( + "../assets/icons/newbubble24.svg" + ))) + .width(24) + .height(24) + .style(|theme: &Theme, _status| svg::Style { + color: Some(theme.extended_palette().background.base.text), + }), + Icon::Reply24 => svg(Handle::from_memory(include_bytes!( + "../assets/icons/reply24.svg" + ))) + .width(24) + .height(24) + .style(|theme: &Theme, _status| svg::Style { + color: Some(theme.extended_palette().background.base.text), + }), + Icon::Sending16 => svg(Handle::from_memory(include_bytes!( + "../assets/icons/sending16.svg" + ))) + .width(16) + .height(16) + .style(|theme: &Theme, _status| svg::Style { + color: Some(theme.extended_palette().background.base.text), + }), + Icon::Sent16 => svg(Handle::from_memory(include_bytes!( + "../assets/icons/sent16.svg" + ))) + .width(16) + .height(16) + .style(|theme: &Theme, _status| svg::Style { + color: Some(theme.extended_palette().background.base.text), + }), + } + } +} + +impl<Message> From<Icon> for Element<'_, Message> { + fn from(value: Icon) -> Self { + Into::<Svg>::into(value).into() + } +} + +pub fn delivery_to_icon_svg(delivery: Delivery) -> Option<Svg<'static>> { + match delivery { + Delivery::Sending => Some(Icon::Sending16.into()), + Delivery::Written => None, + Delivery::Sent => Some(Icon::Sent16.into()), + Delivery::Delivered => Some(Icon::Delivered16.into()), + Delivery::Read => Some(Icon::Delivered16.svg().style(|_theme, _| svg::Style { + color: Some(color!(0x52cf6e)), + })), + Delivery::Failed => Some(Icon::Error16Color.into()), + Delivery::Queued => Some(Icon::Sending16.into()), + } +} diff --git a/src/login_modal.rs b/src/login_modal.rs index 5a63158..f61c204 100644 --- a/src/login_modal.rs +++ b/src/login_modal.rs @@ -1,3 +1,4 @@ +use filamento::presence::{Offline, Presence}; use iced::{ futures::StreamExt, widget::{button, checkbox, column, container, text, text_input}, @@ -5,10 +6,6 @@ use iced::{ }; use jid::JID; use keyring::Entry; -use luz::{ - presence::{Offline, Presence}, - LuzHandle, -}; use serde::{Deserialize, Serialize}; use tokio_stream::wrappers::ReceiverStream; use tracing::info; diff --git a/src/main.rs b/src/main.rs index 37551c8..8b50bef 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,44 +1,48 @@ -use std::borrow::Cow; +use std::borrow::{Borrow, Cow}; +use std::cell::{Ref, RefCell}; use std::collections::{HashMap, HashSet}; use std::fmt::Debug; use std::ops::{Deref, DerefMut}; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; +use std::rc::{Rc, Weak}; use std::str::FromStr; -use std::sync::Arc; +use std::sync::{Arc, Mutex}; use chrono::{Local, Utc}; +use filamento::chat::{Chat, Message as ChatMessage}; +use filamento::error::{CommandError, DatabaseError}; +use filamento::files::Files; +use filamento::presence::{Offline, Presence, PresenceType}; +use filamento::{roster::Contact, user::User, UpdateMessage}; use iced::alignment::Horizontal::Right; +use iced::font::{Stretch, Weight}; use iced::futures::{SinkExt, Stream, StreamExt}; use iced::keyboard::{on_key_press, on_key_release, Key, Modifiers}; -use iced::theme::palette::{ - Background, Danger, Extended, Pair, Primary, Secondary, Success, Warning, -}; +use iced::theme::palette::{Background, Danger, Extended, Pair, Primary, Secondary, Success}; use iced::theme::{Custom, Palette}; use iced::widget::button::Status; use iced::widget::text::{Fragment, IntoFragment, Wrapping}; use iced::widget::{ - button, center, checkbox, column, container, horizontal_space, mouse_area, opaque, row, - scrollable, stack, text, text_input, toggler, Column, Text, Toggler, + button, center, checkbox, column, container, horizontal_space, image, mouse_area, opaque, row, + scrollable, stack, text, text_input, toggler, Column, Svg, Text, Toggler, }; use iced::Length::{self, Fill, Shrink}; -use iced::{color, stream, Color, Element, Subscription, Task, Theme}; +use iced::{color, stream, Color, Element, Font, Subscription, Task, Theme}; +use icons::Icon; use indexmap::{indexmap, IndexMap}; use jid::JID; use keyring::Entry; use login_modal::{Creds, LoginModal}; -use luz::chat::{Chat, Message as ChatMessage}; -use luz::error::CommandError; -use luz::presence::{Offline, Presence, PresenceType}; -use luz::CommandMessage; -use luz::{roster::Contact, user::User, LuzHandle, UpdateMessage}; use message_view::MessageView; use serde::{Deserialize, Serialize}; use thiserror::Error; +use tokio::sync::mpsc::Sender; use tokio::sync::{mpsc, oneshot}; use tokio_stream::wrappers::ReceiverStream; -use tracing::{error, info}; +use tracing::{debug, error, info}; use uuid::Uuid; +mod icons; mod login_modal; mod message_view; @@ -61,16 +65,123 @@ impl Default for Config { } } +// any object that references another contains an arc to that object, so that items can be garbage-collected by checking reference count +// maybe have a cache which is a set of an enum of reference counted objects, so that when an object is needed it's first cloned from the set, otherwise it is added then cloned. then once an object is no longer needed, it is automatically garbage collected. +// or maybe have the cache items automatically drop themselves at 1 reference? some kind of custom pointer. items in the cache must be easily addressable and updateable. pub struct Macaw { client: Account, config: Config, - roster: HashMap<JID, Contact>, - users: HashMap<JID, User>, presences: HashMap<JID, Presence>, - chats: IndexMap<JID, (Chat, Option<ChatMessage>)>, - subscription_requests: HashSet<JID>, - open_chat: Option<MessageView>, + subscription_requests: HashSet<MacawUser>, new_chat: Option<NewChat>, + // references chats, users, messages + open_chat: Option<MessageView>, + // references users, contacts + roster: HashMap<JID, MacawContact>, + // references chats, users, messages + chats_list: IndexMap<JID, ChatListItem>, +} + +#[derive(Debug, Clone)] +pub struct MacawMessage { + inner: ChatMessage, + from: MacawUser, +} + +impl Deref for MacawMessage { + type Target = ChatMessage; + + fn deref(&self) -> &Self::Target { + &self.inner + } +} + +impl DerefMut for MacawMessage { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.inner + } +} + +#[derive(Debug, Clone)] +pub struct MacawUser { + inner: User, + // contact not needed, as can always query the roster store to get this option. + // contact: Option<Contact>, +} + +impl Deref for MacawUser { + type Target = User; + + fn deref(&self) -> &Self::Target { + &self.inner + } +} + +impl DerefMut for MacawUser { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.inner + } +} + +#[derive(Debug, Clone)] +pub struct MacawContact { + inner: Contact, + user: User, +} + +impl Deref for MacawContact { + type Target = Contact; + + fn deref(&self) -> &Self::Target { + &self.inner + } +} + +impl DerefMut for MacawContact { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.inner + } +} + +#[derive(Debug, Clone)] +pub struct MacawChat { + inner: Chat, + user: MacawUser, +} + +pub struct ChatListItem { + // references chats + inner: MacawChat, + // references users, messages + latest_message: Option<MacawMessage>, +} + +impl Deref for ChatListItem { + type Target = MacawChat; + + fn deref(&self) -> &Self::Target { + &self.inner + } +} + +impl DerefMut for ChatListItem { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.inner + } +} + +impl Deref for MacawChat { + type Target = Chat; + + fn deref(&self) -> &Self::Target { + &self.inner + } +} + +impl DerefMut for MacawChat { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.inner + } } pub struct NewChat; @@ -87,13 +198,12 @@ impl Macaw { Self { client: account, config, - roster: HashMap::new(), - users: HashMap::new(), presences: HashMap::new(), - chats: IndexMap::new(), subscription_requests: HashSet::new(), - open_chat: None, new_chat: None, + open_chat: None, + roster: HashMap::new(), + chats_list: IndexMap::new(), } } } @@ -125,7 +235,8 @@ impl Account { #[derive(Clone, Debug)] pub struct Client { - client: LuzHandle, + client: filamento::Client<Files>, + files_root: PathBuf, jid: JID, status: Presence, connection_state: ConnectionState, @@ -135,6 +246,10 @@ impl Client { pub fn is_connected(&self) -> bool { self.connection_state.is_connected() } + + pub fn files_root(&self) -> &Path { + &self.files_root + } } #[derive(Clone, Debug)] @@ -161,47 +276,119 @@ impl DerefMut for Client { } impl Deref for Client { - type Target = LuzHandle; + type Target = filamento::Client<Files>; fn deref(&self) -> &Self::Target { &self.client } } -async fn luz(jid: &JID, creds: &Creds, cfg: &Config) -> (LuzHandle, mpsc::Receiver<UpdateMessage>) { - let luz; +async fn filamento( + jid: &JID, + creds: &Creds, + cfg: &Config, +) -> ( + (filamento::Client<Files>, mpsc::Receiver<UpdateMessage>), + PathBuf, +) { + let filamento; if let Some(ref dburl) = cfg.dburl { // TODO: have some sort of crash popup for this stuff let db_path = dburl.strip_prefix("sqlite://").unwrap_or(&dburl); let db_path = PathBuf::from_str(db_path).expect("invalid database path"); - let db = luz::db::Db::create_connect_and_migrate(db_path) + let db = filamento::db::Db::create_connect_and_migrate(db_path) .await .unwrap(); - luz = LuzHandle::new(jid.clone(), creds.password.to_string(), db); - } else if let Some(ref dir) = cfg.storage_dir { - let mut data_dir = PathBuf::from_str(&dir).expect("invalid storage directory path"); - data_dir.push(creds.jid.clone()); - data_dir.push(creds.jid.clone()); - data_dir.set_extension("db"); - let db = luz::db::Db::create_connect_and_migrate(data_dir) - .await - .unwrap(); - luz = LuzHandle::new(jid.clone(), creds.password.to_string(), db); + let files; + if let Some(ref dir) = cfg.storage_dir { + let mut data_dir = PathBuf::from_str(&dir).expect("invalid storage directory path"); + data_dir.push(creds.jid.clone()); + let files_dir = data_dir.join("files"); + files = Files::new(&files_dir); + if !tokio::fs::try_exists(&files_dir) + .await + .expect("could not read storage directory") + { + tokio::fs::create_dir_all(&files_dir) + .await + .expect("could not create file storage directory") + } + filamento = ( + filamento::Client::new(jid.clone(), creds.password.to_string(), db, files), + files_dir, + ); + } else { + let mut data_dir = dirs::data_dir().expect( + "operating system does not support retreiving determining default data dir", + ); + data_dir.push("macaw"); + data_dir.push(creds.jid.clone()); + data_dir.push("files"); + let files_dir = data_dir; + files = Files::new(&files_dir); + if !tokio::fs::try_exists(&files_dir) + .await + .expect("could not read storage directory") + { + tokio::fs::create_dir_all(&files_dir) + .await + .expect("could not create file storage directory") + } + filamento = ( + filamento::Client::new(jid.clone(), creds.password.to_string(), db, files), + files_dir, + ); + } } else { - let mut data_dir = dirs::data_dir() - .expect("operating system does not support retreiving determining default data dir"); - data_dir.push("macaw"); - data_dir.push(creds.jid.clone()); - data_dir.push(creds.jid.clone()); - // TODO: better lol - data_dir.set_extension("db"); - info!("db_path: {:?}", data_dir); - let db = luz::db::Db::create_connect_and_migrate(data_dir) - .await - .unwrap(); - luz = LuzHandle::new(jid.clone(), creds.password.to_string(), db); + if let Some(ref dir) = cfg.storage_dir { + let mut data_dir = PathBuf::from_str(&dir).expect("invalid storage directory path"); + data_dir.push(creds.jid.clone()); + let files_dir = data_dir.join("files"); + let files = Files::new(&files_dir); + data_dir.push(format!("{}.db", creds.jid.clone())); + let db = filamento::db::Db::create_connect_and_migrate(data_dir) + .await + .unwrap(); + if !tokio::fs::try_exists(&files_dir) + .await + .expect("could not read storage directory") + { + tokio::fs::create_dir_all(&files_dir) + .await + .expect("could not create file storage directory") + } + filamento = ( + filamento::Client::new(jid.clone(), creds.password.to_string(), db, files), + files_dir, + ); + } else { + let mut data_dir = dirs::data_dir().expect( + "operating system does not support retreiving determining default data dir", + ); + data_dir.push("macaw"); + data_dir.push(creds.jid.clone()); + let files_dir = data_dir.join("files"); + let files = Files::new(&files_dir); + data_dir.push(format!("{}.db", creds.jid.clone())); + info!("db_path: {:?}", data_dir); + let db = filamento::db::Db::create_connect_and_migrate(data_dir) + .await + .unwrap(); + if !tokio::fs::try_exists(&files_dir) + .await + .expect("could not read storage directory") + { + tokio::fs::create_dir_all(&files_dir) + .await + .expect("could not create file storage directory") + } + filamento = ( + filamento::Client::new(jid.clone(), creds.password.to_string(), db, files), + files_dir, + ); + } } - luz + filamento } #[tokio::main] @@ -244,66 +431,91 @@ async fn main() -> iced::Result { } } - let mut client: Option<(JID, LuzHandle, mpsc::Receiver<UpdateMessage>)> = None; + let mut client: Option<( + JID, + filamento::Client<Files>, + mpsc::Receiver<UpdateMessage>, + PathBuf, + )> = None; if let Some(creds) = creds { let jid = creds.jid.parse::<JID>(); match jid { Ok(jid) => { - let (handle, updates) = luz(&jid, &creds, &cfg).await; - client = Some((jid, handle, updates)); + let ((handle, updates), files_dir) = filamento(&jid, &creds, &cfg).await; + client = Some((jid, handle, updates, files_dir)); } Err(e) => client_creation_error = Some(Error::CredentialsLoad(e.into())), } } - if let Some((jid, luz_handle, update_recv)) = client { + if let Some((jid, luz_handle, update_recv, files_root)) = client { let stream = ReceiverStream::new(update_recv); let stream = stream.map(|message| Message::Luz(message)); let task = { let luz_handle1 = luz_handle.clone(); let luz_handle2 = luz_handle.clone(); if cfg.auto_connect { - Task::batch( - [ - Task::batch([ - Task::perform( - async move { luz_handle1.get_roster().await }, - |result| { - let roster = result.unwrap(); - let mut macaw_roster = HashMap::new(); - for contact in roster { - macaw_roster.insert(contact.user_jid.clone(), contact); - } - Message::Roster(macaw_roster) - }, - ), - Task::perform( - async move { - luz_handle2.get_chats_ordered_with_latest_messages().await - }, - |chats| { - let chats = chats.unwrap(); - info!("got chats: {:?}", chats); - Message::GotChats(chats) - }, - ), - ]) - .chain(Task::done(Message::Connect)), - Task::stream(stream), - ], - ) + Task::batch([ + Task::batch([ + Task::perform( + async move { luz_handle1.get_roster_with_users().await }, + |result| { + let roster = result.unwrap(); + let mut macaw_roster = HashMap::new(); + for (contact, user) in roster { + macaw_roster.insert( + contact.user_jid.clone(), + MacawContact { + inner: contact, + user, + }, + ); + } + Message::Roster(macaw_roster) + }, + ), + Task::perform( + async move { + luz_handle2 + .get_chats_ordered_with_latest_messages_and_users() + .await + }, + |chats| { + let chats = chats.unwrap(); + info!("got chats: {:?}", chats); + Message::GotChats(chats) + }, + ), + ]) + .chain(Task::done(Message::Connect)), + Task::stream(stream), + ]) } else { + debug!("no auto connect"); Task::batch([ - Task::perform(async move { luz_handle1.get_roster().await }, |result| { - let roster = result.unwrap(); - let mut macaw_roster = HashMap::new(); - for contact in roster { - macaw_roster.insert(contact.user_jid.clone(), contact); - } - Message::Roster(macaw_roster) - }), Task::perform( - async move { luz_handle2.get_chats_ordered_with_latest_messages().await }, + async move { luz_handle1.get_roster_with_users().await }, + |result| { + let roster = result.unwrap(); + let mut macaw_roster = HashMap::new(); + for (contact, user) in roster { + macaw_roster.insert( + contact.user_jid.clone(), + MacawContact { + inner: contact, + user, + }, + ); + } + Message::Roster(macaw_roster) + }, + ), + Task::perform( + async move { + luz_handle2 + .get_chats_ordered_with_latest_messages_and_users() + .await + }, |chats| { let chats = chats.unwrap(); info!("got chats: {:?}", chats); @@ -314,7 +526,29 @@ async fn main() -> iced::Result { ]) } }; + let mut font = Font::with_name("K2D"); + font.weight = Weight::Light; + // font.stretch = Stretch::Condensed; iced::application("Macaw", Macaw::update, Macaw::view) + .font(include_bytes!("../assets/fonts/Diolce-Regular.ttf")) + .font(include_bytes!("../assets/fonts/K2D-Italic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-Thin.ttf")) + .font(include_bytes!("../assets/fonts/K2D-ExtraBold.ttf")) + .font(include_bytes!("../assets/fonts/K2D-ExtraLightItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-ExtraLight.ttf")) + .font(include_bytes!("../assets/fonts/K2D-Light.ttf")) + .font(include_bytes!("../assets/fonts/K2D-Light.ttf")) + .font(include_bytes!("../assets/fonts/K2D-BoldItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-MediumItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-ThinItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-Medium.ttf")) + .font(include_bytes!("../assets/fonts/K2D-Bold.ttf")) + .font(include_bytes!("../assets/fonts/K2D-Regular.ttf")) + .font(include_bytes!("../assets/fonts/K2D-ExtraBoldItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-LightItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-SemiBoldItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-SemiBold.ttf")) + .default_font(font) .subscription(subscription) .theme(Macaw::theme) .run_with(|| { @@ -322,14 +556,13 @@ async fn main() -> iced::Result { Macaw::new( Some(Client { client: luz_handle, - // TODO: jid, - // TODO: store cached status status: Presence { timestamp: Utc::now(), presence: PresenceType::Offline(Offline::default()), }, connection_state: ConnectionState::Offline, + files_root, }), cfg, ), @@ -339,9 +572,49 @@ async fn main() -> iced::Result { } else { if let Some(e) = client_creation_error { iced::application("Macaw", Macaw::update, Macaw::view) + .font(include_bytes!("../assets/fonts/Diolce-Regular.otf")) + .font(include_bytes!("../assets/fonts/K2D-Italic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-Thin.ttf")) + .font(include_bytes!("../assets/fonts/K2D-ExtraBold.ttf")) + .font(include_bytes!("../assets/fonts/K2D-ExtraLightItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-ExtraLight.ttf")) + .font(include_bytes!("../assets/fonts/K2D-Light.ttf")) + .font(include_bytes!("../assets/fonts/K2D-Light.ttf")) + .font(include_bytes!("../assets/fonts/K2D-BoldItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-MediumItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-ThinItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-Medium.ttf")) + .font(include_bytes!("../assets/fonts/K2D-Bold.ttf")) + .font(include_bytes!("../assets/fonts/K2D-Regular.ttf")) + .font(include_bytes!("../assets/fonts/K2D-ExtraBoldItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-LightItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-SemiBoldItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-SemiBold.ttf")) + .default_font(Font::with_name("K2D")) + .theme(Macaw::theme) .run_with(|| (Macaw::new(None, cfg), Task::done(Message::Error(e)))) } else { iced::application("Macaw", Macaw::update, Macaw::view) + .font(include_bytes!("../assets/fonts/Diolce-Regular.otf")) + .font(include_bytes!("../assets/fonts/K2D-Italic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-Thin.ttf")) + .font(include_bytes!("../assets/fonts/K2D-ExtraBold.ttf")) + .font(include_bytes!("../assets/fonts/K2D-ExtraLightItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-ExtraLight.ttf")) + .font(include_bytes!("../assets/fonts/K2D-Light.ttf")) + .font(include_bytes!("../assets/fonts/K2D-Light.ttf")) + .font(include_bytes!("../assets/fonts/K2D-BoldItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-MediumItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-ThinItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-Medium.ttf")) + .font(include_bytes!("../assets/fonts/K2D-Bold.ttf")) + .font(include_bytes!("../assets/fonts/K2D-Regular.ttf")) + .font(include_bytes!("../assets/fonts/K2D-ExtraBoldItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-LightItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-SemiBoldItalic.ttf")) + .font(include_bytes!("../assets/fonts/K2D-SemiBold.ttf")) + .default_font(Font::with_name("K2D")) + .theme(Macaw::theme) .run_with(|| (Macaw::new(None, cfg), Task::none())) } } @@ -380,11 +653,10 @@ pub enum Message { LoginModal(login_modal::Message), ClientCreated(Client), Luz(UpdateMessage), - Roster(HashMap<JID, Contact>), + Roster(HashMap<JID, MacawContact>), Connect, Disconnect, - GotChats(Vec<(Chat, ChatMessage)>), - GotMessageHistory(Chat, IndexMap<Uuid, ChatMessage>), + GotChats(Vec<((Chat, User), (ChatMessage, User))>), ToggleChat(JID), SendMessage(JID, String), Error(Error), @@ -394,13 +666,13 @@ pub enum Message { #[derive(Debug, Error, Clone)] pub enum Error { #[error("failed to create Luz client: {0}")] - ClientCreation(#[from] luz::error::DatabaseError), + ClientCreation(#[from] filamento::error::DatabaseError), #[error("failed to save credentials: {0}")] CredentialsSave(CredentialsSaveError), #[error("failed to load credentials: {0}")] CredentialsLoad(CredentialsLoadError), #[error("failed to retreive messages for chat {0}")] - MessageHistory(JID, CommandError<luz::error::DatabaseError>), + MessageHistory(JID, CommandError<filamento::error::DatabaseError>), } #[derive(Debug, Error, Clone)] @@ -437,10 +709,6 @@ impl Macaw { fn update(&mut self, message: Message) -> Task<Message> { match message { Message::Luz(update_message) => match update_message { - UpdateMessage::Error(error) => { - tracing::error!("Luz error: {:?}", error); - Task::none() - } UpdateMessage::Online(online, vec) => match &mut self.client { Account::LoggedIn(client) => { client.status = Presence { @@ -448,10 +716,19 @@ impl Macaw { presence: PresenceType::Online(online), }; client.connection_state = ConnectionState::Online; - let mut roster = HashMap::new(); - for contact in vec { - roster.insert(contact.user_jid.clone(), contact); - } + let roster = vec + .into_iter() + .map(|(contact, user)| { + ( + contact.user_jid.clone(), + MacawContact { + inner: contact, + user, + }, + ) + }) + .collect(); + // no need to also update users as any user updates will come in separately self.roster = roster; Task::none() } @@ -471,16 +748,14 @@ impl Macaw { Account::LoggedOut(login_modal) => Task::none(), } } - UpdateMessage::FullRoster(vec) => { - let mut macaw_roster = HashMap::new(); - for contact in vec { - macaw_roster.insert(contact.user_jid.clone(), contact); - } - self.roster = macaw_roster; - Task::none() - } - UpdateMessage::RosterUpdate(contact) => { - self.roster.insert(contact.user_jid.clone(), contact); + UpdateMessage::RosterUpdate(contact, user) => { + self.roster.insert( + contact.user_jid.clone(), + MacawContact { + inner: contact, + user, + }, + ); Task::none() } UpdateMessage::RosterDelete(jid) => { @@ -488,26 +763,40 @@ impl Macaw { Task::none() } UpdateMessage::Presence { from, presence } => { - self.presences.insert(from, presence); + // TODO: presence handling + info!("got presence from {:?} {:?}", from, presence); + self.presences.insert(from.as_bare(), presence); Task::none() } - UpdateMessage::Message { to, message } => { - if let Some((chat_jid, (chat, old_message))) = - self.chats.shift_remove_entry(&to) + UpdateMessage::Message { to, message, from } => { + let message = MacawMessage { + inner: message, + from: MacawUser { inner: from }, + }; + if let Some((chat_jid, mut chat_list_item)) = + self.chats_list.shift_remove_entry(&to) { - self.chats - .insert_before(0, chat_jid, (chat, Some(message.clone()))); + chat_list_item.latest_message = Some(message.clone()); + self.chats_list.insert_before(0, chat_jid, chat_list_item); if let Some(open_chat) = &mut self.open_chat { - if open_chat.jid == to { + if open_chat.chat.user.jid == to { open_chat.update(message_view::Message::Message(message)); } } } else { + // TODO: get the actual chat from the thing, or send the chat first, from the client side. let chat = Chat { correspondent: to.clone(), + have_chatted: false, + }; + let chat_list_item = ChatListItem { + inner: MacawChat { + inner: chat, + user: message.from.clone(), + }, + latest_message: Some(message), }; - let message_history = indexmap! {message.id => message.clone()}; - self.chats.insert_before(0, to, (chat, Some(message))); + self.chats_list.insert_before(0, to, chat_list_item); } Task::none() } @@ -515,6 +804,62 @@ impl Macaw { // TODO: subscription requests Task::none() } + UpdateMessage::MessageDelivery { chat, id, delivery } => { + if let Some(chat_list_item) = self.chats_list.get_mut(&chat) { + if let Some(latest_message) = &mut chat_list_item.latest_message { + if latest_message.id == id { + latest_message.delivery = Some(delivery) + } + } + } + if let Some(open_chat) = &mut self.open_chat { + if let Some((message, _)) = open_chat.messages.get_mut(&id) { + message.delivery = Some(delivery) + } + } + Task::none() + } + UpdateMessage::NickChanged { jid, nick } => { + // roster, chats_list, open chat + if let Some(contact) = self.roster.get_mut(&jid) { + contact.user.nick = nick.clone(); + } + if let Some(chats_list_item) = self.chats_list.get_mut(&jid) { + chats_list_item.user.nick = nick.clone() + } + if let Some(open_chat) = &mut self.open_chat { + for (_, (message, _)) in &mut open_chat.messages { + if message.from.jid == jid { + message.from.nick = nick.clone() + } + } + if open_chat.chat.user.jid == jid { + open_chat.chat.user.nick = nick + } + } + Task::none() + } + UpdateMessage::AvatarChanged { jid, id } => { + // roster, chats_list, open chat + if let Some(contact) = self.roster.get_mut(&jid) { + contact.user.avatar = id.clone(); + } + if let Some(chats_list_item) = self.chats_list.get_mut(&jid) { + chats_list_item.user.avatar = id.clone() + } + if let Some(open_chat) = &mut self.open_chat { + // TODO: consider using an indexmap with two keys for speeding this up? + for (_, (message, _)) in &mut open_chat.messages { + if message.from.jid == jid { + message.from.avatar = id.clone() + } + } + if open_chat.chat.user.jid == jid { + open_chat.chat.user.avatar = id + } + } + Task::none() + } }, // TODO: NEXT Message::ClientCreated(client) => { @@ -523,19 +868,29 @@ impl Macaw { let client2 = client.clone(); if self.config.auto_connect { Task::batch([ - Task::perform(async move { client1.client.get_roster().await }, |result| { - let roster = result.unwrap(); - let mut macaw_roster = HashMap::new(); - for contact in roster { - macaw_roster.insert(contact.user_jid.clone(), contact); - } - Message::Roster(macaw_roster) - }), + Task::perform( + async move { client1.client.get_roster_with_users().await }, + |result| { + let roster = result.unwrap(); + let mut macaw_roster = HashMap::new(); + for (contact, user) in roster { + macaw_roster.insert( + contact.user_jid.clone(), + MacawContact { + inner: contact, + user, + }, + ); + } + // TODO: clean this up + Message::Roster(macaw_roster) + }, + ), Task::perform( async move { client2 .client - .get_chats_ordered_with_latest_messages() + .get_chats_ordered_with_latest_messages_and_users() .await }, |chats| { @@ -552,19 +907,28 @@ impl Macaw { .chain(Task::done(Message::Connect)) } else { Task::batch([ - Task::perform(async move { client1.client.get_roster().await }, |result| { - let roster = result.unwrap(); - let mut macaw_roster = HashMap::new(); - for contact in roster { - macaw_roster.insert(contact.user_jid.clone(), contact); - } - Message::Roster(macaw_roster) - }), + Task::perform( + async move { client1.client.get_roster_with_users().await }, + |result| { + let roster = result.unwrap(); + let mut macaw_roster = HashMap::new(); + for (contact, user) in roster { + macaw_roster.insert( + contact.user_jid.clone(), + MacawContact { + inner: contact, + user, + }, + ); + } + Message::Roster(macaw_roster) + }, + ), Task::perform( async move { client2 .client - .get_chats_ordered_with_latest_messages() + .get_chats_ordered_with_latest_messages_and_users() .await }, |chats| { @@ -589,7 +953,7 @@ impl Macaw { client.connection_state = ConnectionState::Connecting; let client = client.client.clone(); Task::future(async move { - client.send(CommandMessage::Connect).await; + client.connect().await.unwrap(); }) .discard() } @@ -599,9 +963,7 @@ impl Macaw { Account::LoggedIn(client) => { let client = client.client.clone(); Task::future(async move { - client - .send(CommandMessage::Disconnect(Offline::default())) - .await; + client.disconnect(Offline::default()).await.unwrap(); }) .discard() } @@ -610,29 +972,43 @@ impl Macaw { Message::ToggleChat(jid) => { match &self.open_chat { Some(message_view) => { - if message_view.jid == jid { + if message_view.chat.user.jid == jid { self.open_chat = None; return Task::none(); } } None => {} } - self.open_chat = Some(MessageView::new(jid.clone(), &self.config)); - let jid1 = jid.clone(); - match &self.client { - Account::LoggedIn(client) => { - let client = client.clone(); - Task::perform( - async move { client.get_messages(jid1).await }, - move |result| match result { - Ok(h) => { - Message::MessageView(message_view::Message::MessageHistory(h)) - } - Err(e) => Message::Error(Error::MessageHistory(jid.clone(), e)), - }, - ) + if let Some(chat) = self.chats_list.get(&jid) { + match &self.client { + Account::LoggedIn(client) => { + let client = client.clone(); + self.open_chat = Some(MessageView::new( + (*chat).clone(), + &self.config, + client.files_root.clone(), + )); + Task::perform( + async move { client.get_messages_with_users(jid).await }, + move |result| { + let message_history = result.unwrap(); + let messages = message_history + .into_iter() + .map(|(message, user)| MacawMessage { + inner: message, + from: MacawUser { inner: user }, + }) + .collect(); + Message::MessageView(message_view::Message::MessageHistory( + messages, + )) + }, + ) + } + Account::LoggedOut(login_modal) => Task::none(), } - Account::LoggedOut(login_modal) => Task::none(), + } else { + Task::none() } } Message::LoginModal(login_modal_message) => match &mut self.client { @@ -649,9 +1025,9 @@ impl Macaw { Ok(jid) => { Task::perform(async move { let (jid, creds, config) = (jid, creds, config); - let (handle, recv) = luz(&jid, &creds, &config).await; - (handle, recv, jid, creds, config) - }, move |(handle, recv, jid, creds, config)| { + let ((handle, recv), files_root) = filamento(&jid, &creds, &config).await; + (handle, recv, jid, creds, config, files_root) + }, move |(handle, recv, jid, creds, config, files_root)| { let creds = creds; let mut tasks = Vec::new(); tasks.push(Task::done(crate::Message::ClientCreated( @@ -660,6 +1036,7 @@ impl Macaw { jid, status: Presence { timestamp: Utc::now(), presence: PresenceType::Offline(Offline::default()) }, connection_state: ConnectionState::Offline, + files_root, }, ))); let stream = ReceiverStream::new(recv); @@ -719,45 +1096,25 @@ impl Macaw { return Task::none(); } }; - for chat in chats { - self.chats - // TODO: could have a chat with no messages, bad database state - .insert(chat.0.correspondent.clone(), (chat.0.clone(), Some(chat.1))); - // let client = client.clone(); - // let correspondent = chat.correspondent.clone(); - // tasks.push(Task::perform( - // // TODO: don't get the entire message history LOL - // async move { (chat, client.get_messages(correspondent).await) }, - // |result| { - // let messages: IndexMap<Uuid, ChatMessage> = result - // .1 - // .unwrap() - // .into_iter() - // .map(|message| (message.id.clone(), message)) - // .collect(); - // Message::GotMessageHistory(result.0, messages) - // }, - // )) + for ((chat, chat_user), (message, message_user)) in chats { + let chat = MacawChat { + inner: chat, + user: MacawUser { inner: chat_user }, + }; + let latest_message = MacawMessage { + inner: message, + from: MacawUser { + inner: message_user, + }, + }; + let chat_list_item = ChatListItem { + inner: chat.clone(), + latest_message: Some(latest_message), + }; + self.chats_list + .insert(chat.correspondent.clone(), chat_list_item); } Task::batch(tasks) - // .then(|chats| { - // let tasks = Vec::new(); - // for key in chats.keys() { - // let client = client.client.clone(); - // tasks.push(Task::future(async { - // client.get_messages(key.clone()).await; - // })); - // } - // Task::batch(tasks) - // }), - } - Message::GotMessageHistory(chat, mut message_history) => { - // TODO: don't get the entire message history LOL - if let Some((_id, message)) = message_history.pop() { - self.chats - .insert(chat.correspondent.clone(), (chat, Some(message))); - } - Task::none() } Message::SendMessage(jid, body) => { let client = match &self.client { @@ -767,9 +1124,11 @@ impl Macaw { return Task::none(); } }; - Task::future( - async move { client.send_message(jid, luz::chat::Body { body }).await }, - ) + Task::future(async move { + client + .send_message(jid, filamento::chat::Body { body }) + .await + }) .discard() } Message::Error(error) => { @@ -782,7 +1141,7 @@ impl Macaw { match action { message_view::Action::None => Task::none(), message_view::Action::SendMessage(m) => { - Task::done(Message::SendMessage(message_view.jid.clone(), m)) + Task::done(Message::SendMessage(message_view.chat.user.jid.clone(), m)) } } } else { @@ -809,15 +1168,23 @@ impl Macaw { fn view(&self) -> Element<Message> { let mut ui: Element<Message> = { let mut chats_list: Column<Message> = column![]; - for (jid, (chat, latest_message)) in &self.chats { - let mut open = false; - if let Some(open_chat) = &self.open_chat { - if open_chat.jid == *jid { - open = true; + if let Account::LoggedIn(client) = &self.client { + for (jid, chat) in &self.chats_list { + let mut open = false; + if let Some(open_chat) = &self.open_chat { + if open_chat.chat.user.jid == *jid { + open = true; + } } + let chat_list_item = chat_list_item( + &self.presences, + &self.roster, + client.files_root(), + chat, + open, + ); + chats_list = chats_list.push(chat_list_item); } - let chat_list_item = chat_list_item(chat, latest_message, open); - chats_list = chats_list.push(chat_list_item); } let chats_list = scrollable(chats_list.spacing(8).padding(8)) .spacing(1) @@ -881,23 +1248,15 @@ impl Macaw { let extended = Extended { background: Background { base: Pair { - color: color!(0x392c25), + color: color!(0x503e34), text: color!(0xdcdcdc), }, - weakest: Pair { - color: color!(0xdcdcdc), - text: color!(0x392c25), - }, weak: Pair { - color: color!(0xdcdcdc), - text: color!(0x392c25), - }, - strong: Pair { - color: color!(0x364b3b), + color: color!(0x392c25), text: color!(0xdcdcdc), }, - strongest: Pair { - color: color!(0x364b3b), + strong: Pair { + color: color!(0x293f2e), text: color!(0xdcdcdc), }, }, @@ -918,15 +1277,15 @@ impl Macaw { secondary: Secondary { base: Pair { color: color!(0xffce07), - text: color!(0x000000), + text: color!(0xdcdcdc), }, weak: Pair { color: color!(0xffce07), - text: color!(0x000000), + text: color!(0xdcdcdc), }, strong: Pair { color: color!(0xffce07), - text: color!(0x000000), + text: color!(0xdcdcdc), }, }, success: Success { @@ -943,20 +1302,6 @@ impl Macaw { text: color!(0xdcdcdc), }, }, - warning: Warning { - base: Pair { - color: color!(0xFF9D00), - text: color!(0x000000), - }, - weak: Pair { - color: color!(0xFF9D00), - text: color!(0x000000), - }, - strong: Pair { - color: color!(0xFF9D00), - text: color!(0x000000), - }, - }, danger: Danger { base: Pair { color: color!(0xC1173C), @@ -1019,34 +1364,109 @@ where } fn chat_list_item<'a>( - chat: &'a Chat, - latest_message: &'a Option<ChatMessage>, + presences: &HashMap<JID, Presence>, + roster: &HashMap<JID, MacawContact>, + file_root: &'a Path, + chat_list_item: &'a ChatListItem, open: bool, ) -> Element<'a, Message> { - let mut content: Column<Message> = column![text(chat.correspondent.to_string())]; - if let Some(latest_message) = latest_message { + let name: String; + if let Some(Some(contact_name)) = roster + .get(chat_list_item.correspondent()) + .map(|contact| &contact.name) + { + name = contact_name.clone() + } else if let Some(nick) = &chat_list_item.user.nick { + name = nick.clone() + } else { + name = chat_list_item.correspondent().to_string(); + } + + let avatar: Option<String>; + if let Some(user_avatar) = &chat_list_item.user.avatar { + avatar = Some(user_avatar.clone()) + } else { + avatar = None + } + + let latest_message_text: Option<(String, String)>; + if let Some(latest_message) = &chat_list_item.latest_message { let message = latest_message.body.body.replace("\n", " "); let date = latest_message.timestamp.naive_local(); let now = Local::now().naive_local(); let timeinfo; if date.date() == now.date() { // TODO: localisation/config - timeinfo = text(date.time().format("%H:%M").to_string()) + timeinfo = date.time().format("%H:%M").to_string() } else { - timeinfo = text(date.date().format("%d/%m").to_string()) + timeinfo = date.date().format("%d/%m").to_string() } - content = content.push( - row![ - container(text(message).wrapping(Wrapping::None)) - .clip(true) - .width(Fill), - timeinfo + latest_message_text = Some((message, timeinfo)); + // content = content.push( + // row![ + // container(text(message).wrapping(Wrapping::None)) + // .clip(true) + // .width(Fill), + // timeinfo + // ] + // .spacing(8) + // .width(Fill), + // ); + } else { + latest_message_text = None; + } + + let mut avatar_stack = stack([]); + if let Some(avatar) = avatar { + let mut path = file_root.join(avatar); + path.set_extension("jpg"); + info!("got avatar: {:?}", path); + avatar_stack = avatar_stack.push(image(path).width(48).height(48)); + } + let mut status_icon: Option<Icon> = None; + if let Some(presence) = presences.get(&chat_list_item.user.jid) { + debug!("found a presence"); + match &presence.presence { + PresenceType::Online(online) => match online.show { + Some(s) => match s { + filamento::presence::Show::Away => status_icon = Some(Icon::Away16Color), + filamento::presence::Show::Chat => status_icon = Some(Icon::Bubble16Color), + filamento::presence::Show::DoNotDisturb => status_icon = Some(Icon::Dnd16Color), + filamento::presence::Show::ExtendedAway => { + status_icon = Some(Icon::Away16Color) + } + }, + None => status_icon = Some(Icon::Bubble16Color), + }, + PresenceType::Offline(offline) => {} + } + } + if let Some(status_icon) = status_icon { + avatar_stack = avatar_stack.push(Into::<Svg>::into(status_icon)); + } + let content: Element<Message> = if let Some((message, time)) = latest_message_text { + row![ + avatar_stack, + column![ + text(name), + row![ + container(text(message).wrapping(Wrapping::None)) + .clip(true) + .width(Fill), + text(time) + ] + .spacing(8) + .width(Fill) ] .spacing(8) - .width(Fill), - ); - } - let mut button = button(content).on_press(Message::ToggleChat(chat.correspondent.clone())); + ] + .spacing(8) + .into() + } else { + row![avatar_stack, text(name)].spacing(8).into() + }; + let mut button = + button(content).on_press(Message::ToggleChat(chat_list_item.correspondent().clone())); if open { button = button.style(|theme: &Theme, status| { let palette = theme.extended_palette(); diff --git a/src/message_view.rs b/src/message_view.rs index 16e8ac1..742aac0 100644 --- a/src/message_view.rs +++ b/src/message_view.rs @@ -1,29 +1,34 @@ -use std::borrow::Cow; +use std::{path::PathBuf, time::Duration}; -use chrono::NaiveDate; +use chrono::{NaiveDate, NaiveDateTime, TimeDelta}; +use filamento::chat::Delivery; +use iced::advanced::Overlay; +use iced::alignment::Vertical; +use iced::widget::{horizontal_space, mouse_area, text_editor, vertical_space, Container}; use iced::{ - alignment::Horizontal::{self, Right}, border::Radius, - color, - theme::Palette, - widget::{ - button, column, container, horizontal_space, row, scrollable, text, text_editor, - text_editor::Content, text_input, Column, - }, - Border, Color, Element, + font::{Style, Weight}, + widget::{button, column, container, image, row, scrollable, text, text_editor::Content}, + Border, Color, Element, Font, Length::{Fill, Shrink}, Theme, }; +use iced::{color, overlay, Length, Padding}; use indexmap::IndexMap; use jid::JID; -use luz::chat::Message as ChatMessage; use serde::{Deserialize, Serialize}; use uuid::Uuid; +use crate::icons; +use crate::{icons::Icon, MacawChat, MacawMessage}; + pub struct MessageView { + pub file_root: PathBuf, + // references chats, users + pub chat: MacawChat, + // references users, messages + pub messages: IndexMap<Uuid, (MacawMessage, bool)>, pub config: Config, - pub jid: JID, - pub message_history: IndexMap<Uuid, ChatMessage>, pub new_message: Content, pub shift_pressed: bool, } @@ -43,8 +48,11 @@ impl Default for Config { #[derive(Debug, Clone)] pub enum Message { - MessageHistory(Vec<ChatMessage>), - Message(ChatMessage), + MessageHistory(Vec<MacawMessage>), + Message(MacawMessage), + MessageHovered(Uuid), + MessageUnhovered(Uuid), + MessageRightClicked(Uuid), MessageCompose(text_editor::Action), SendMessage(String), } @@ -55,42 +63,22 @@ pub enum Action { } impl MessageView { - pub fn new(jid: JID, config: &super::Config) -> Self { + pub fn new(chat: MacawChat, config: &super::Config, file_root: PathBuf) -> Self { Self { - jid, + chat, // TODO: save position in message history - message_history: IndexMap::new(), + messages: IndexMap::new(), // TODO: save draft (as part of chat struct?) new_message: Content::new(), config: config.message_view_config.clone(), // TODO: have centralised modifier state location? shift_pressed: false, + file_root, } } pub fn update(&mut self, message: Message) -> Action { match message { - Message::MessageHistory(messages) => { - if self.message_history.is_empty() { - self.message_history = messages - .into_iter() - .map(|message| (message.id.clone(), message)) - .collect(); - } - Action::None - } - Message::Message(message) => { - let i = self - .message_history - .iter() - .position(|(_id, m)| m.timestamp > message.timestamp); - if let Some(i) = i { - self.message_history.insert_before(i, message.id, message); - } else { - self.message_history.insert(message.id, message); - } - Action::None - } Message::MessageCompose(a) => { match &a { text_editor::Action::Edit(edit) => match edit { @@ -120,30 +108,109 @@ impl MessageView { self.new_message = Content::new(); Action::SendMessage(m) } + Message::MessageHistory(macaw_messages) => { + if self.messages.is_empty() { + self.messages = macaw_messages + .into_iter() + .map(|message| (message.id, (message, false))) + .collect() + } else { + for message in macaw_messages { + let index = match self + .messages + .binary_search_by(|_, value| value.0.timestamp.cmp(&message.timestamp)) + { + Ok(i) => i, + Err(i) => i, + }; + self.messages + .insert_before(index, message.id, (message, false)); + } + } + Action::None + } + Message::Message(macaw_message) => { + if let Some((_, last)) = self.messages.last() { + if last.0.timestamp < macaw_message.timestamp { + self.messages + .insert(macaw_message.id, (macaw_message, false)); + } else { + let index = match self.messages.binary_search_by(|_, value| { + value.0.timestamp.cmp(&macaw_message.timestamp) + }) { + Ok(i) => i, + Err(i) => i, + }; + self.messages.insert_before( + index, + macaw_message.id, + (macaw_message, false), + ); + } + } else { + self.messages + .insert(macaw_message.id, (macaw_message, false)); + } + Action::None + } + Message::MessageHovered(uuid) => { + if let Some(message) = self.messages.get_mut(&uuid) { + message.1 = true; + } + Action::None + } + Message::MessageUnhovered(uuid) => { + if let Some(message) = self.messages.get_mut(&uuid) { + message.1 = false; + } + Action::None + } + Message::MessageRightClicked(uuid) => todo!(), } } pub fn view(&self) -> Element<Message> { - let mut messages_view = column![].spacing(8).padding(8); - let mut latest_date = NaiveDate::MIN; - for (_id, message) in &self.message_history { - let message_date = message.timestamp.naive_local().date(); - if message_date > latest_date { - latest_date = message_date; - messages_view = messages_view.push(date(latest_date)); + let mut messages_view = column![]; + let mut last_timestamp = NaiveDateTime::MIN; + let mut last_user: Option<JID> = None; + for (_id, message) in &self.messages { + let message_timestamp = message.0.timestamp.naive_local(); + if message_timestamp.date() > last_timestamp.date() { + messages_view = messages_view.push(date(message_timestamp.date())); + } + if last_user.as_ref() != Some(&message.0.from.jid) + || message_timestamp - last_timestamp > TimeDelta::minutes(3) + { + messages_view = messages_view.push(self.message(&message.0, message.1, true)); + } else { + messages_view = messages_view.push(self.message(&message.0, message.1, false)); } - messages_view = messages_view.push(self.message(message)); + last_user = Some(message.0.from.jid.clone()); + last_timestamp = message_timestamp; } let text_editor = text_editor(&self.new_message) .placeholder("new message") .on_action(Message::MessageCompose) - .wrapping(text::Wrapping::WordOrGlyph); + .wrapping(text::Wrapping::WordOrGlyph) + .style(|theme, status| text_editor::Style { + background: color!(0xdcdcdc).into(), + border: Border { + color: Color::BLACK, + width: 0.0, + radius: 0.into(), + }, + icon: color!(0x00000000), + placeholder: color!(0xacacac), + value: color!(0x000000), + selection: color!(0xffce07), + }); let message_send_input = row![ text_editor, - button("send").on_press(Message::SendMessage(self.new_message.text())) + // button(Icon::NewBubble24).on_press(Message::SendMessage(self.new_message.text())) ] .padding(8); column![ + self.header(), scrollable(messages_view) .height(Fill) .width(Fill) @@ -154,69 +221,157 @@ impl MessageView { .into() } - pub fn message<'a>(&'a self, message: &'a ChatMessage) -> Element<'a, Message> { + pub fn header(&self) -> Element<'_, Message> { + // TODO: contact stored here for name + let mut bold = Font::with_name("K2D"); + bold.weight = Weight::Bold; + let mut sweet = Font::with_name("Diolce"); + sweet.style = Style::Italic; + let mut name_and_jid = column![]; + if let Some(nick) = &self.chat.user.nick { + name_and_jid = name_and_jid.push(text(nick).font(bold).size(20)); + } + let jid = self.chat.user.jid.as_bare().to_string(); + name_and_jid = name_and_jid.push(text(jid).font(sweet)); + let mut header = row![]; + if let Some(avatar) = &self.chat.user.avatar { + let mut path = self.file_root.join(avatar); + path.set_extension("jpg"); + header = header.push(container(image(path).width(48).height(48))); + } + header = header.push(name_and_jid); + container( + container(header.spacing(8).padding(8)) + .style(|theme: &Theme| { + container::Style::default() + .background(theme.extended_palette().background.strong.color) + }) + .width(Fill), + ) + .padding(8) + .width(Fill) + .into() + } + + pub fn message<'a>( + &'a self, + message: &'a MacawMessage, + hovered: bool, + major: bool, + // next_read: bool, + ) -> Element<'a, Message> { let timestamp = message.timestamp.naive_local(); let timestamp = timestamp.time().format("%H:%M").to_string(); - if self.jid == message.from.as_bare() { + let container: Container<Message> = if major { + let nick: String = if let Some(nick) = &message.from.nick { + nick.to_string() + } else { + message.from.jid.as_bare().to_string() + }; + let mut bold = Font::with_name("K2D"); + bold.weight = Weight::Bold; + let mut thin = Font::with_name("K2D"); + thin.weight = Weight::Thin; + let timestamp = text(timestamp).size(12).font(thin); + let header = row![text(nick).font(bold), timestamp] + .align_y(Vertical::Bottom) + .spacing(8); + let message_right = column![header, text(&message.body.body)].spacing(8); + let avatar = if let Some(avatar) = &message.from.avatar { + let mut path = self.file_root.join(avatar); + path.set_extension("jpg"); + // info!("got avatar: {:?}", path); + container(image(path).width(48).height(48)) + } else { + container("").width(48) + }; + let show_delivery = match message.delivery { + Some(Delivery::Sending) => true, + Some(Delivery::Failed) => true, + // TODO: queued icon + Some(Delivery::Queued) => true, + _ => hovered, + }; + let delivery = if show_delivery { + message + .delivery + .map(|delivery| icons::delivery_to_icon_svg(delivery)) + .unwrap_or_default() + } else { + None + }; + let delivery: Container<Message> = if let Some(delivery) = delivery { + container(delivery) + } else { + container("") + } + .width(16); + let major_message = row![avatar, message_right, horizontal_space(), delivery]; + container(major_message.spacing(8)) + } else { + let timestamp = if hovered { + let mut thin = Font::with_name("K2D"); + thin.weight = Weight::Thin; + let timestamp = text(timestamp).size(10).font(thin); + container(timestamp).align_right(48) + } else { + container("").width(48) + }; + let show_delivery = match message.delivery { + Some(Delivery::Sending) => true, + Some(Delivery::Failed) => true, + // TODO: queued icon + Some(Delivery::Queued) => true, + _ => hovered, + }; + let delivery = if show_delivery { + message + .delivery + .map(|delivery| icons::delivery_to_icon_svg(delivery)) + .unwrap_or_default() + } else { + None + }; + let delivery: Container<Message> = if let Some(delivery) = delivery { + container(delivery) + } else { + container("") + } + .width(16); container( - container( - column![ - text(message.body.body.as_str()).wrapping(text::Wrapping::WordOrGlyph), - container(text(timestamp).wrapping(text::Wrapping::None).size(12)) // .align_right(Fill) - ] - .width(Shrink) - .max_width(500), - ) - .padding(16) - .style(|theme: &Theme| { - let palette = theme.extended_palette(); - container::Style::default() - .background(palette.primary.weak.color) - .border(Border { - color: Color::BLACK, - width: 0., - // width: 4., - radius: Radius::new(16), - }) - }), + row![ + timestamp, + text(&message.body.body), + horizontal_space(), + delivery + ] + .align_y(Vertical::Top) + .spacing(8), ) - .align_left(Fill) - .into() - } else { - let element: Element<Message> = container( - container( - column![ - text(message.body.body.as_str()).wrapping(text::Wrapping::WordOrGlyph), - container(text(timestamp).wrapping(text::Wrapping::None).size(12)) - .align_right(Fill) // row![ - // // horizontal_space(), - // // horizontal_space(), - // text(timestamp).wrapping(text::Wrapping::None).size(12) - // ] // container(text(timestamp).wrapping(text::Wrapping::None).size(12)) - // .align_right(Fill) - ] - .width(Shrink) - .max_width(500), - ) - .padding(16) - .style(|theme: &Theme| { - let palette = theme.extended_palette(); - container::Style::default() - .background(palette.primary.base.color) - .border(Border { - color: Color::BLACK, - width: 0., - // width: 4., - radius: Radius::new(16), - }) + }; + // let overlay = overlay::Element::new(Box::new(Overlay {})); + mouse_area( + container + .width(Length::Fill) + .style(move |theme| { + if hovered { + container::Style::default() + .background(theme.extended_palette().background.weak.color) + } else { + container::Style::default() + } + }) + .padding(Padding { + top: 4., + right: 8., + bottom: 4., + left: 8., }), - ) - .align_right(Fill) - .into(); - // element.explain(Color::BLACK) - element - } + ) + .on_enter(Message::MessageHovered(message.id)) + .on_exit(Message::MessageUnhovered(message.id)) + .into() } } |