aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.cargo/config.toml2
-rw-r--r--.gitignore1
-rw-r--r--.helix/languages.toml4
-rw-r--r--Cargo.lock2577
-rw-r--r--Cargo.toml7
-rw-r--r--aaaa.md11
-rw-r--r--assets/fonts/Diolce-Regular.otfbin0 -> 37600 bytes
-rw-r--r--assets/fonts/Diolce-Regular.ttfbin0 -> 49224 bytes
-rw-r--r--assets/fonts/K2D-Bold.ttfbin0 -> 92876 bytes
-rw-r--r--assets/fonts/K2D-BoldItalic.ttfbin0 -> 97072 bytes
-rw-r--r--assets/fonts/K2D-ExtraBold.ttfbin0 -> 92920 bytes
-rw-r--r--assets/fonts/K2D-ExtraBoldItalic.ttfbin0 -> 97228 bytes
-rw-r--r--assets/fonts/K2D-ExtraLight.ttfbin0 -> 92112 bytes
-rw-r--r--assets/fonts/K2D-ExtraLightItalic.ttfbin0 -> 96264 bytes
-rw-r--r--assets/fonts/K2D-Italic.ttfbin0 -> 96444 bytes
-rw-r--r--assets/fonts/K2D-Light.ttfbin0 -> 92148 bytes
-rw-r--r--assets/fonts/K2D-LightItalic.ttfbin0 -> 96240 bytes
-rw-r--r--assets/fonts/K2D-Medium.ttfbin0 -> 92772 bytes
-rw-r--r--assets/fonts/K2D-MediumItalic.ttfbin0 -> 96888 bytes
-rw-r--r--assets/fonts/K2D-Regular.ttfbin0 -> 92352 bytes
-rw-r--r--assets/fonts/K2D-SemiBold.ttfbin0 -> 92912 bytes
-rw-r--r--assets/fonts/K2D-SemiBoldItalic.ttfbin0 -> 97032 bytes
-rw-r--r--assets/fonts/K2D-Thin.ttfbin0 -> 92276 bytes
-rw-r--r--assets/fonts/K2D-ThinItalic.ttfbin0 -> 96192 bytes
-rw-r--r--assets/icons/addcontact24.svg5
-rw-r--r--assets/icons/attachment24.svg3
-rw-r--r--assets/icons/away16.svg10
-rw-r--r--assets/icons/away16color.svg10
-rw-r--r--assets/icons/bubble16.svg3
-rw-r--r--assets/icons/bubble16color.svg3
-rw-r--r--assets/icons/bubble24.svg3
-rw-r--r--assets/icons/contact24.svg4
-rw-r--r--assets/icons/delivered16.svg4
-rw-r--r--assets/icons/dnd16.svg3
-rw-r--r--assets/icons/dnd16color.svg3
-rw-r--r--assets/icons/error16color.svg10
-rw-r--r--assets/icons/forward24.svg10
-rw-r--r--assets/icons/heart24.svg3
-rw-r--r--assets/icons/newbubble24.svg4
-rw-r--r--assets/icons/reply24.svg10
-rw-r--r--assets/icons/sending16.svg5
-rw-r--r--assets/icons/sent16.svg3
-rw-r--r--icons.md24
-rw-r--r--ideas.md7
-rw-r--r--old_code.md460
-rw-r--r--src/icons.rs190
-rw-r--r--src/login_modal.rs5
-rw-r--r--src/main.rs944
-rw-r--r--src/message_view.rs367
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
diff --git a/.gitignore b/.gitignore
index 8c308d0..e13b707 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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"] }
diff --git a/Cargo.lock b/Cargo.lock
index 0f11e5d..543eaee 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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",
]
diff --git a/Cargo.toml b/Cargo.toml
index b66da70..b3aa76f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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"
diff --git a/aaaa.md b/aaaa.md
new file mode 100644
index 0000000..699f9f3
--- /dev/null
+++ b/aaaa.md
@@ -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
new file mode 100644
index 0000000..562e749
--- /dev/null
+++ b/assets/fonts/Diolce-Regular.otf
Binary files differ
diff --git a/assets/fonts/Diolce-Regular.ttf b/assets/fonts/Diolce-Regular.ttf
new file mode 100644
index 0000000..a7f0fd6
--- /dev/null
+++ b/assets/fonts/Diolce-Regular.ttf
Binary files differ
diff --git a/assets/fonts/K2D-Bold.ttf b/assets/fonts/K2D-Bold.ttf
new file mode 100644
index 0000000..6c07a9a
--- /dev/null
+++ b/assets/fonts/K2D-Bold.ttf
Binary files differ
diff --git a/assets/fonts/K2D-BoldItalic.ttf b/assets/fonts/K2D-BoldItalic.ttf
new file mode 100644
index 0000000..be68508
--- /dev/null
+++ b/assets/fonts/K2D-BoldItalic.ttf
Binary files differ
diff --git a/assets/fonts/K2D-ExtraBold.ttf b/assets/fonts/K2D-ExtraBold.ttf
new file mode 100644
index 0000000..1065611
--- /dev/null
+++ b/assets/fonts/K2D-ExtraBold.ttf
Binary files differ
diff --git a/assets/fonts/K2D-ExtraBoldItalic.ttf b/assets/fonts/K2D-ExtraBoldItalic.ttf
new file mode 100644
index 0000000..fbd4804
--- /dev/null
+++ b/assets/fonts/K2D-ExtraBoldItalic.ttf
Binary files differ
diff --git a/assets/fonts/K2D-ExtraLight.ttf b/assets/fonts/K2D-ExtraLight.ttf
new file mode 100644
index 0000000..21273c3
--- /dev/null
+++ b/assets/fonts/K2D-ExtraLight.ttf
Binary files differ
diff --git a/assets/fonts/K2D-ExtraLightItalic.ttf b/assets/fonts/K2D-ExtraLightItalic.ttf
new file mode 100644
index 0000000..75a3ca3
--- /dev/null
+++ b/assets/fonts/K2D-ExtraLightItalic.ttf
Binary files differ
diff --git a/assets/fonts/K2D-Italic.ttf b/assets/fonts/K2D-Italic.ttf
new file mode 100644
index 0000000..ae77b56
--- /dev/null
+++ b/assets/fonts/K2D-Italic.ttf
Binary files differ
diff --git a/assets/fonts/K2D-Light.ttf b/assets/fonts/K2D-Light.ttf
new file mode 100644
index 0000000..48bf67d
--- /dev/null
+++ b/assets/fonts/K2D-Light.ttf
Binary files differ
diff --git a/assets/fonts/K2D-LightItalic.ttf b/assets/fonts/K2D-LightItalic.ttf
new file mode 100644
index 0000000..8086fd7
--- /dev/null
+++ b/assets/fonts/K2D-LightItalic.ttf
Binary files differ
diff --git a/assets/fonts/K2D-Medium.ttf b/assets/fonts/K2D-Medium.ttf
new file mode 100644
index 0000000..667fefe
--- /dev/null
+++ b/assets/fonts/K2D-Medium.ttf
Binary files differ
diff --git a/assets/fonts/K2D-MediumItalic.ttf b/assets/fonts/K2D-MediumItalic.ttf
new file mode 100644
index 0000000..177f863
--- /dev/null
+++ b/assets/fonts/K2D-MediumItalic.ttf
Binary files differ
diff --git a/assets/fonts/K2D-Regular.ttf b/assets/fonts/K2D-Regular.ttf
new file mode 100644
index 0000000..dce2033
--- /dev/null
+++ b/assets/fonts/K2D-Regular.ttf
Binary files differ
diff --git a/assets/fonts/K2D-SemiBold.ttf b/assets/fonts/K2D-SemiBold.ttf
new file mode 100644
index 0000000..d448629
--- /dev/null
+++ b/assets/fonts/K2D-SemiBold.ttf
Binary files differ
diff --git a/assets/fonts/K2D-SemiBoldItalic.ttf b/assets/fonts/K2D-SemiBoldItalic.ttf
new file mode 100644
index 0000000..8ec3713
--- /dev/null
+++ b/assets/fonts/K2D-SemiBoldItalic.ttf
Binary files differ
diff --git a/assets/fonts/K2D-Thin.ttf b/assets/fonts/K2D-Thin.ttf
new file mode 100644
index 0000000..4d68740
--- /dev/null
+++ b/assets/fonts/K2D-Thin.ttf
Binary files differ
diff --git a/assets/fonts/K2D-ThinItalic.ttf b/assets/fonts/K2D-ThinItalic.ttf
new file mode 100644
index 0000000..64191d8
--- /dev/null
+++ b/assets/fonts/K2D-ThinItalic.ttf
Binary files differ
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
diff --git a/ideas.md b/ideas.md
index 1b1772e..23d2a89 100644
--- a/ideas.md
+++ b/ideas.md
@@ -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()
}
}