diff --git a/Cargo.lock b/Cargo.lock
index 3d3dcf3..fdac7ab 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -220,9 +220,9 @@ dependencies = [
[[package]]
name = "ashpd"
-version = "0.13.3"
+version = "0.13.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e21900ac91937e4d9a51391f3569cd92fc38caea1a2a671d56b39797f3ece61f"
+checksum = "5df42e54d7015b7a00d2db9f5cb9975bc4b0cd46627e666c94c3534207503e71"
dependencies = [
"enumflags2",
"futures-channel",
@@ -1200,7 +1200,7 @@ dependencies = [
[[package]]
name = "collections"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"indexmap",
"rustc-hash 2.1.1",
@@ -1316,9 +1316,12 @@ dependencies = [
[[package]]
name = "convert_case"
-version = "0.4.0"
+version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
+checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9"
+dependencies = [
+ "unicode-segmentation",
+]
[[package]]
name = "coop"
@@ -1633,9 +1636,18 @@ checksum = "807800ff3288b621186fe0a8f3392c4652068257302709c24efd918c3dffcdc2"
[[package]]
name = "derive_more"
-version = "0.99.20"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f"
+checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134"
+dependencies = [
+ "derive_more-impl",
+]
+
+[[package]]
+name = "derive_more-impl"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb"
dependencies = [
"convert_case",
"proc-macro2",
@@ -1647,7 +1659,7 @@ dependencies = [
[[package]]
name = "derive_refineable"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"proc-macro2",
"quote",
@@ -2611,7 +2623,7 @@ dependencies = [
[[package]]
name = "gpui"
version = "0.2.2"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"anyhow",
"async-channel 2.5.0",
@@ -2690,7 +2702,7 @@ dependencies = [
[[package]]
name = "gpui_linux"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"anyhow",
"as-raw-xcb-connection",
@@ -2738,7 +2750,7 @@ dependencies = [
[[package]]
name = "gpui_macos"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"anyhow",
"async-task",
@@ -2780,7 +2792,7 @@ dependencies = [
[[package]]
name = "gpui_macros"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"heck 0.5.0",
"proc-macro2",
@@ -2791,7 +2803,7 @@ dependencies = [
[[package]]
name = "gpui_platform"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"console_error_panic_hook",
"gpui",
@@ -2804,7 +2816,7 @@ dependencies = [
[[package]]
name = "gpui_tokio"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"anyhow",
"gpui",
@@ -2815,7 +2827,7 @@ dependencies = [
[[package]]
name = "gpui_util"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"anyhow",
"log",
@@ -2824,7 +2836,7 @@ dependencies = [
[[package]]
name = "gpui_web"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"anyhow",
"console_error_panic_hook",
@@ -2848,7 +2860,7 @@ dependencies = [
[[package]]
name = "gpui_wgpu"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"anyhow",
"bytemuck",
@@ -2876,7 +2888,7 @@ dependencies = [
[[package]]
name = "gpui_windows"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"anyhow",
"collections",
@@ -2937,9 +2949,9 @@ dependencies = [
[[package]]
name = "harfrust"
-version = "0.5.0"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f9f40651a03bc0f7316bd75267ff5767e93017ef3cfffe76c6aa7252cc5a31c"
+checksum = "9da2e5ae821f6e96664977bf974d6d6a2d6682f9ccee23e62ec1d134246845f9"
dependencies = [
"bitflags 2.11.0",
"bytemuck",
@@ -3119,7 +3131,7 @@ dependencies = [
[[package]]
name = "http_client"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"anyhow",
"async-compression",
@@ -3144,7 +3156,7 @@ dependencies = [
[[package]]
name = "http_client_tls"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"rustls",
"rustls-platform-verifier",
@@ -3924,7 +3936,7 @@ dependencies = [
[[package]]
name = "media"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"anyhow",
"bindgen",
@@ -4065,7 +4077,7 @@ dependencies = [
[[package]]
name = "naga"
version = "28.0.1"
-source = "git+https://github.com/zed-industries/wgpu?rev=e0f83a6cedc5e0b97da1ebe2d638ad103672e0a2#e0f83a6cedc5e0b97da1ebe2d638ad103672e0a2"
+source = "git+https://github.com/zed-industries/wgpu?rev=9459e95113c5bd116b2cc2c87e8424b28059e17c#9459e95113c5bd116b2cc2c87e8424b28059e17c"
dependencies = [
"arrayvec",
"bit-set",
@@ -4692,7 +4704,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
[[package]]
name = "perf"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"collections",
"serde",
@@ -4962,11 +4974,11 @@ dependencies = [
[[package]]
name = "proc-macro-crate"
-version = "3.4.0"
+version = "3.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983"
+checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f"
dependencies = [
- "toml_edit 0.23.10+spec-1.0.0",
+ "toml_edit 0.25.4+spec-1.1.0",
]
[[package]]
@@ -5089,9 +5101,9 @@ dependencies = [
[[package]]
name = "quick-xml"
-version = "0.38.4"
+version = "0.39.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c"
+checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d"
dependencies = [
"memchr",
]
@@ -5401,7 +5413,7 @@ dependencies = [
[[package]]
name = "refineable"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"derive_refineable",
]
@@ -5500,7 +5512,7 @@ dependencies = [
[[package]]
name = "reqwest_client"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"anyhow",
"bytes",
@@ -5555,7 +5567,7 @@ dependencies = [
[[package]]
name = "rope"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"arrayvec",
"log",
@@ -5817,7 +5829,7 @@ dependencies = [
[[package]]
name = "scheduler"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"async-task",
"backtrace",
@@ -6411,7 +6423,7 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]]
name = "sum_tree"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"arrayvec",
"log",
@@ -6960,6 +6972,15 @@ dependencies = [
"serde_core",
]
+[[package]]
+name = "toml_datetime"
+version = "1.0.0+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e"
+dependencies = [
+ "serde_core",
+]
+
[[package]]
name = "toml_edit"
version = "0.22.27"
@@ -6976,12 +6997,12 @@ dependencies = [
[[package]]
name = "toml_edit"
-version = "0.23.10+spec-1.0.0"
+version = "0.25.4+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269"
+checksum = "7193cbd0ce53dc966037f54351dbbcf0d5a642c7f0038c382ef9e677ce8c13f2"
dependencies = [
"indexmap",
- "toml_datetime 0.7.5+spec-1.1.0",
+ "toml_datetime 1.0.0+spec-1.1.0",
"toml_parser",
"winnow",
]
@@ -7162,13 +7183,13 @@ checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb"
[[package]]
name = "uds_windows"
-version = "1.1.0"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9"
+checksum = "51b70b87d15e91f553711b40df3048faf27a7a04e01e0ddc0cf9309f0af7c2ca"
dependencies = [
"memoffset",
"tempfile",
- "winapi",
+ "windows-sys 0.61.2",
]
[[package]]
@@ -7358,7 +7379,7 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "util"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"anyhow",
"async-fs",
@@ -7397,7 +7418,7 @@ dependencies = [
[[package]]
name = "util_macros"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"perf",
"quote",
@@ -7406,9 +7427,9 @@ dependencies = [
[[package]]
name = "uuid"
-version = "1.21.0"
+version = "1.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb"
+checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37"
dependencies = [
"getrandom 0.4.2",
"js-sys",
@@ -7671,9 +7692,9 @@ dependencies = [
[[package]]
name = "wayland-backend"
-version = "0.3.12"
+version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fee64194ccd96bf648f42a65a7e589547096dfa702f7cadef84347b66ad164f9"
+checksum = "aa75f400b7f719bcd68b3f47cd939ba654cedeef690f486db71331eec4c6a406"
dependencies = [
"cc",
"downcast-rs",
@@ -7685,9 +7706,9 @@ dependencies = [
[[package]]
name = "wayland-client"
-version = "0.31.12"
+version = "0.31.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8e6faa537fbb6c186cb9f1d41f2f811a4120d1b57ec61f50da451a0c5122bec"
+checksum = "ab51d9f7c071abeee76007e2b742499e535148035bb835f97aaed1338cf516c3"
dependencies = [
"bitflags 2.11.0",
"rustix 1.1.4",
@@ -7697,9 +7718,9 @@ dependencies = [
[[package]]
name = "wayland-cursor"
-version = "0.31.12"
+version = "0.31.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5864c4b5b6064b06b1e8b74ead4a98a6c45a285fe7a0e784d24735f011fdb078"
+checksum = "4b3298683470fbdc6ca40151dfc48c8f2fd4c41a26e13042f801f85002384091"
dependencies = [
"rustix 1.1.4",
"wayland-client",
@@ -7708,9 +7729,9 @@ dependencies = [
[[package]]
name = "wayland-protocols"
-version = "0.32.10"
+version = "0.32.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baeda9ffbcfc8cd6ddaade385eaf2393bd2115a69523c735f12242353c3df4f3"
+checksum = "b23b5df31ceff1328f06ac607591d5ba360cf58f90c8fad4ac8d3a55a3c4aec7"
dependencies = [
"bitflags 2.11.0",
"wayland-backend",
@@ -7720,9 +7741,9 @@ dependencies = [
[[package]]
name = "wayland-protocols-plasma"
-version = "0.3.10"
+version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa98634619300a535a9a97f338aed9a5ff1e01a461943e8346ff4ae26007306b"
+checksum = "d392fc283a87774afc9beefcd6f931582bb97fe0e6ced0b306a62cb1d026527c"
dependencies = [
"bitflags 2.11.0",
"wayland-backend",
@@ -7733,9 +7754,9 @@ dependencies = [
[[package]]
name = "wayland-protocols-wlr"
-version = "0.3.10"
+version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e9597cdf02cf0c34cd5823786dce6b5ae8598f05c2daf5621b6e178d4f7345f3"
+checksum = "78248e4cc0eff8163370ba5c158630dcae1f3497a586b826eca2ef5f348d6235"
dependencies = [
"bitflags 2.11.0",
"wayland-backend",
@@ -7746,20 +7767,20 @@ dependencies = [
[[package]]
name = "wayland-scanner"
-version = "0.31.8"
+version = "0.31.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5423e94b6a63e68e439803a3e153a9252d5ead12fd853334e2ad33997e3889e3"
+checksum = "c86287151a309799b821ca709b7345a048a2956af05957c89cb824ab919fa4e3"
dependencies = [
"proc-macro2",
- "quick-xml 0.38.4",
+ "quick-xml 0.39.2",
"quote",
]
[[package]]
name = "wayland-sys"
-version = "0.31.8"
+version = "0.31.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e6dbfc3ac5ef974c92a2235805cc0114033018ae1290a72e474aa8b28cbbdfd"
+checksum = "374f6b70e8e0d6bf9461a32988fd553b59ff630964924dad6e4a4eb6bd538d17"
dependencies = [
"dlib",
"log",
@@ -7848,7 +7869,7 @@ checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88"
[[package]]
name = "wgpu"
version = "28.0.1"
-source = "git+https://github.com/zed-industries/wgpu?rev=e0f83a6cedc5e0b97da1ebe2d638ad103672e0a2#e0f83a6cedc5e0b97da1ebe2d638ad103672e0a2"
+source = "git+https://github.com/zed-industries/wgpu?rev=9459e95113c5bd116b2cc2c87e8424b28059e17c#9459e95113c5bd116b2cc2c87e8424b28059e17c"
dependencies = [
"arrayvec",
"bitflags 2.11.0",
@@ -7877,7 +7898,7 @@ dependencies = [
[[package]]
name = "wgpu-core"
version = "28.0.1"
-source = "git+https://github.com/zed-industries/wgpu?rev=e0f83a6cedc5e0b97da1ebe2d638ad103672e0a2#e0f83a6cedc5e0b97da1ebe2d638ad103672e0a2"
+source = "git+https://github.com/zed-industries/wgpu?rev=9459e95113c5bd116b2cc2c87e8424b28059e17c#9459e95113c5bd116b2cc2c87e8424b28059e17c"
dependencies = [
"arrayvec",
"bit-set",
@@ -7908,7 +7929,7 @@ dependencies = [
[[package]]
name = "wgpu-core-deps-apple"
version = "28.0.1"
-source = "git+https://github.com/zed-industries/wgpu?rev=e0f83a6cedc5e0b97da1ebe2d638ad103672e0a2#e0f83a6cedc5e0b97da1ebe2d638ad103672e0a2"
+source = "git+https://github.com/zed-industries/wgpu?rev=9459e95113c5bd116b2cc2c87e8424b28059e17c#9459e95113c5bd116b2cc2c87e8424b28059e17c"
dependencies = [
"wgpu-hal",
]
@@ -7916,7 +7937,7 @@ dependencies = [
[[package]]
name = "wgpu-core-deps-emscripten"
version = "28.0.1"
-source = "git+https://github.com/zed-industries/wgpu?rev=e0f83a6cedc5e0b97da1ebe2d638ad103672e0a2#e0f83a6cedc5e0b97da1ebe2d638ad103672e0a2"
+source = "git+https://github.com/zed-industries/wgpu?rev=9459e95113c5bd116b2cc2c87e8424b28059e17c#9459e95113c5bd116b2cc2c87e8424b28059e17c"
dependencies = [
"wgpu-hal",
]
@@ -7924,7 +7945,7 @@ dependencies = [
[[package]]
name = "wgpu-core-deps-windows-linux-android"
version = "28.0.1"
-source = "git+https://github.com/zed-industries/wgpu?rev=e0f83a6cedc5e0b97da1ebe2d638ad103672e0a2#e0f83a6cedc5e0b97da1ebe2d638ad103672e0a2"
+source = "git+https://github.com/zed-industries/wgpu?rev=9459e95113c5bd116b2cc2c87e8424b28059e17c#9459e95113c5bd116b2cc2c87e8424b28059e17c"
dependencies = [
"wgpu-hal",
]
@@ -7932,7 +7953,7 @@ dependencies = [
[[package]]
name = "wgpu-hal"
version = "28.0.1"
-source = "git+https://github.com/zed-industries/wgpu?rev=e0f83a6cedc5e0b97da1ebe2d638ad103672e0a2#e0f83a6cedc5e0b97da1ebe2d638ad103672e0a2"
+source = "git+https://github.com/zed-industries/wgpu?rev=9459e95113c5bd116b2cc2c87e8424b28059e17c#9459e95113c5bd116b2cc2c87e8424b28059e17c"
dependencies = [
"android_system_properties",
"arrayvec",
@@ -7979,7 +8000,7 @@ dependencies = [
[[package]]
name = "wgpu-types"
version = "28.0.1"
-source = "git+https://github.com/zed-industries/wgpu?rev=e0f83a6cedc5e0b97da1ebe2d638ad103672e0a2#e0f83a6cedc5e0b97da1ebe2d638ad103672e0a2"
+source = "git+https://github.com/zed-industries/wgpu?rev=9459e95113c5bd116b2cc2c87e8424b28059e17c#9459e95113c5bd116b2cc2c87e8424b28059e17c"
dependencies = [
"bitflags 2.11.0",
"bytemuck",
@@ -8637,9 +8658,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
[[package]]
name = "winnow"
-version = "0.7.14"
+version = "0.7.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829"
+checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945"
dependencies = [
"memchr",
]
@@ -9193,7 +9214,7 @@ dependencies = [
[[package]]
name = "zlog"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"anyhow",
"chrono",
@@ -9210,7 +9231,7 @@ checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
[[package]]
name = "ztracing"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
dependencies = [
"tracing",
"tracing-subscriber",
@@ -9221,7 +9242,7 @@ dependencies = [
[[package]]
name = "ztracing_macro"
version = "0.1.0"
-source = "git+https://github.com/zed-industries/zed#152d3eafcaf4655ac65e2a25e65cc5ee0545db3f"
+source = "git+https://github.com/zed-industries/zed#a1d8c52a1be83379589438f5dc9665e1f8164dac"
[[package]]
name = "zune-core"
diff --git a/Cargo.toml b/Cargo.toml
index bf84d10..8319337 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -11,7 +11,7 @@ publish = false
[workspace.dependencies]
# GPUI
gpui = { git = "https://github.com/zed-industries/zed" }
-gpui_platform = { git = "https://github.com/zed-industries/zed", features = ["font-kit", "x11", "wayland", "runtime_shaders"] }
+gpui_platform = { git = "https://github.com/zed-industries/zed", features = ["font-kit", "x11", "wayland"] }
gpui_linux = { git = "https://github.com/zed-industries/zed" }
gpui_windows = { git = "https://github.com/zed-industries/zed" }
gpui_macos = { git = "https://github.com/zed-industries/zed" }
diff --git a/assets/icons/input.svg b/assets/icons/input.svg
new file mode 100644
index 0000000..86efa0e
--- /dev/null
+++ b/assets/icons/input.svg
@@ -0,0 +1,3 @@
+
diff --git a/crates/chat_ui/src/actions.rs b/crates/chat_ui/src/actions.rs
index 915f212..fdb5fbb 100644
--- a/crates/chat_ui/src/actions.rs
+++ b/crates/chat_ui/src/actions.rs
@@ -7,21 +7,11 @@ use settings::SignerKind;
#[action(namespace = chat, no_json)]
pub enum Command {
Insert(&'static str),
- ChangeSubject(&'static str),
+ ChangeSubject(String),
ChangeSigner(SignerKind),
ToggleBackup,
+ Subject,
+ Copy(PublicKey),
+ Relays(PublicKey),
+ Njump(PublicKey),
}
-
-#[derive(Action, Clone, PartialEq, Eq, Deserialize)]
-#[action(namespace = chat, no_json)]
-pub struct SeenOn(pub EventId);
-
-/// Define a open public key action
-#[derive(Action, Clone, PartialEq, Eq, Deserialize, Debug)]
-#[action(namespace = pubkey, no_json)]
-pub struct OpenPublicKey(pub PublicKey);
-
-/// Define a copy inline public key action
-#[derive(Action, Clone, PartialEq, Eq, Deserialize, Debug)]
-#[action(namespace = pubkey, no_json)]
-pub struct CopyPublicKey(pub PublicKey);
diff --git a/crates/chat_ui/src/lib.rs b/crates/chat_ui/src/lib.rs
index 2ffaf8a..eb0efd6 100644
--- a/crates/chat_ui/src/lib.rs
+++ b/crates/chat_ui/src/lib.rs
@@ -27,7 +27,7 @@ use ui::button::{Button, ButtonVariants};
use ui::dock_area::panel::{Panel, PanelEvent};
use ui::indicator::Indicator;
use ui::input::{InputEvent, InputState, TextInput};
-use ui::menu::{ContextMenuExt, DropdownMenu};
+use ui::menu::DropdownMenu;
use ui::notification::Notification;
use ui::scroll::Scrollbar;
use ui::{
@@ -72,9 +72,15 @@ pub struct ChatPanel {
/// Mapping message (rumor event) ids to their reports
reports_by_id: Entity>>,
- /// Input state
+ /// Chat input state
input: Entity,
+ /// Subject input state
+ subject_input: Entity,
+
+ /// Subject bar visibility
+ subject_bar: Entity,
+
/// Sent message ids
sent_ids: Arc>>,
@@ -91,7 +97,7 @@ pub struct ChatPanel {
tasks: Vec>>,
/// Event subscriptions
- subscriptions: SmallVec<[Subscription; 2]>,
+ subscriptions: SmallVec<[Subscription; 3]>,
}
impl ChatPanel {
@@ -124,15 +130,34 @@ impl ChatPanel {
.clean_on_escape()
});
+ // Define subject input state
+ let subject_input = cx.new(|cx| InputState::new(window, cx).placeholder("Nostr Meetup"));
+ let subject_bar = cx.new(|_cx| false);
+
// Define subscriptions
- let subscriptions =
- smallvec![
- cx.subscribe_in(&input, window, move |this, _input, event, window, cx| {
+ let mut subscriptions = smallvec![];
+
+ subscriptions.push(
+ // Subscribe the chat input event
+ cx.subscribe_in(&input, window, move |this, _input, event, window, cx| {
+ if let InputEvent::PressEnter { .. } = event {
+ this.send_text_message(window, cx);
+ };
+ }),
+ );
+
+ subscriptions.push(
+ // Subscribe the subject input event
+ cx.subscribe_in(
+ &subject_input,
+ window,
+ move |this, _input, event, window, cx| {
if let InputEvent::PressEnter { .. } = event {
- this.send_text_message(window, cx);
+ this.change_subject(window, cx);
};
- })
- ];
+ },
+ ),
+ );
// Define all functions that will run after the current cycle
cx.defer_in(window, |this, window, cx| {
@@ -149,6 +174,8 @@ impl ChatPanel {
room,
list_state,
input,
+ subject_input,
+ subject_bar,
replies_to,
attachments,
rendered_texts_by_id: BTreeMap::new(),
@@ -254,23 +281,21 @@ impl ChatPanel {
}
fn subscribe_room_events(&mut self, window: &mut Window, cx: &mut Context) {
- let Some(room) = self.room.upgrade() else {
- return;
- };
-
- self.subscriptions.push(
- // Subscribe to room events
- cx.subscribe_in(&room, window, move |this, _room, event, window, cx| {
- match event {
- RoomEvent::Incoming(message) => {
- this.insert_message(message, false, cx);
- }
- RoomEvent::Reload => {
- this.get_messages(window, cx);
- }
- };
- }),
- );
+ if let Some(room) = self.room.upgrade() {
+ self.subscriptions.push(
+ // Subscribe to room events
+ cx.subscribe_in(&room, window, move |this, _room, event, window, cx| {
+ match event {
+ RoomEvent::Incoming(message) => {
+ this.insert_message(message, false, cx);
+ }
+ RoomEvent::Reload => {
+ this.get_messages(window, cx);
+ }
+ };
+ }),
+ );
+ }
}
/// Load all messages belonging to this room
@@ -316,6 +341,16 @@ impl ChatPanel {
content
}
+ fn change_subject(&mut self, _window: &mut Window, cx: &mut Context) {
+ let subject = self.subject_input.read(cx).value();
+
+ self.room
+ .update(cx, |this, cx| {
+ this.set_subject(subject, cx);
+ })
+ .ok();
+ }
+
fn send_text_message(&mut self, window: &mut Window, cx: &mut Context) {
// Get the message which includes all attachments
let content = self.get_input_value(cx);
@@ -505,10 +540,21 @@ impl ChatPanel {
}
}
- fn copy_message(&self, id: &EventId, cx: &Context) {
- if let Some(message) = self.message(id) {
- cx.write_to_clipboard(ClipboardItem::new_string(message.content.to_string()));
- }
+ fn copy_author(&self, public_key: &PublicKey, cx: &App) {
+ let content = public_key.to_bech32().unwrap();
+ let item = ClipboardItem::new_string(content);
+
+ cx.write_to_clipboard(item);
+ }
+
+ fn copy_message(&self, id: &EventId, cx: &App) {
+ let Some(message) = self.message(id) else {
+ return;
+ };
+ let content = message.content.to_string();
+ let item = ClipboardItem::new_string(content);
+
+ cx.write_to_clipboard(item);
}
fn reply_to(&mut self, id: &EventId, cx: &mut Context) {
@@ -588,7 +634,7 @@ impl ChatPanel {
});
}
- fn profile(&self, public_key: &PublicKey, cx: &Context) -> Person {
+ fn profile(&self, public_key: &PublicKey, cx: &App) -> Person {
let persons = PersonRegistry::global(cx);
persons.read(cx).get(public_key, cx)
}
@@ -602,7 +648,7 @@ impl ChatPanel {
if self
.room
.update(cx, |this, cx| {
- this.set_subject(*subject, cx);
+ this.set_subject(subject, cx);
})
.is_err()
{
@@ -631,9 +677,97 @@ impl ChatPanel {
window.push_notification(Notification::error("Failed to toggle backup"), cx);
}
}
+ Command::Subject => {
+ self.open_subject(window, cx);
+ }
+ Command::Copy(public_key) => {
+ self.copy_author(public_key, cx);
+ }
+ Command::Relays(public_key) => {
+ self.open_relays(public_key, window, cx);
+ }
+ Command::Njump(public_key) => {
+ self.open_njump(public_key, cx);
+ }
}
}
+ fn open_subject(&mut self, window: &mut Window, cx: &mut Context) {
+ let subject_input = self.subject_input.clone();
+
+ window.open_modal(cx, move |this, _window, cx| {
+ let subject = subject_input.read(cx).value();
+
+ this.title("Change subject")
+ .show_close(true)
+ .confirm()
+ .child(
+ v_flex()
+ .gap_2()
+ .child(
+ v_flex()
+ .gap_1p5()
+ .child(
+ div()
+ .text_sm()
+ .text_color(cx.theme().text_muted)
+ .child(SharedString::from("Subject:")),
+ )
+ .child(TextInput::new(&subject_input).small()),
+ )
+ .child(
+ div()
+ .italic()
+ .text_xs()
+ .text_color(cx.theme().text_placeholder)
+ .child(SharedString::from(
+ "Subject will be updated when you send a new message.",
+ )),
+ ),
+ )
+ .on_ok(move |_ev, window, cx| {
+ window
+ .dispatch_action(Box::new(Command::ChangeSubject(subject.to_string())), cx);
+ true
+ })
+ });
+ }
+
+ fn open_relays(&mut self, public_key: &PublicKey, window: &mut Window, cx: &mut Context) {
+ let profile = self.profile(public_key, cx);
+
+ window.open_modal(cx, move |this, _window, cx| {
+ let relays = profile.messaging_relays();
+
+ this.title("Messaging Relays")
+ .show_close(true)
+ .child(v_flex().gap_1().children({
+ let mut items = vec![];
+
+ for url in relays.iter() {
+ items.push(
+ h_flex()
+ .h_7()
+ .px_2()
+ .gap_2()
+ .bg(cx.theme().elevated_surface_background)
+ .rounded(cx.theme().radius)
+ .text_sm()
+ .child(div().size_1p5().rounded_full().bg(gpui::green()))
+ .child(SharedString::from(url.to_string())),
+ );
+ }
+
+ items
+ }))
+ });
+ }
+
+ fn open_njump(&mut self, public_key: &PublicKey, cx: &mut Context) {
+ let content = format!("https://njump.me/{}", public_key.to_bech32().unwrap());
+ cx.open_url(&content);
+ }
+
fn render_announcement(&self, ix: usize, cx: &Context) -> AnyElement {
v_flex()
.id(ix)
@@ -758,18 +892,14 @@ impl ChatPanel {
.flex()
.gap_3()
.when(!hide_avatar, |this| {
- this.child(
- div()
- .id(SharedString::from(format!("{ix}-avatar")))
- .child(Avatar::new(author.avatar()))
- .context_menu(move |this, _window, _cx| {
- let view = Box::new(OpenPublicKey(public_key));
- let copy = Box::new(CopyPublicKey(public_key));
-
- this.menu("View Profile", view)
- .menu("Copy Public Key", copy)
- }),
- )
+ this.child(Avatar::new(author.avatar()).dropdown_menu(
+ move |this, _window, _cx| {
+ this.menu("Copy Public Key", Box::new(Command::Copy(public_key)))
+ .menu("View Relays", Box::new(Command::Relays(public_key)))
+ .separator()
+ .menu("View on njump.me", Box::new(Command::Njump(public_key)))
+ },
+ ))
})
.child(
v_flex()
@@ -807,8 +937,17 @@ impl ChatPanel {
}),
),
)
- .child(self.render_border(cx))
- .child(self.render_actions(&id, cx))
+ .child(
+ div()
+ .group_hover("", |this| this.bg(cx.theme().element_active))
+ .absolute()
+ .left_0()
+ .top_0()
+ .w(px(2.))
+ .h_full()
+ .bg(cx.theme().border_transparent),
+ )
+ .child(self.render_actions(&id, &public_key, cx))
.on_mouse_down(
MouseButton::Middle,
cx.listener(move |this, _, _window, cx| {
@@ -911,7 +1050,7 @@ impl ChatPanel {
window.open_modal(cx, move |this, _window, cx| {
this.show_close(true)
.title(SharedString::from("Sent Reports"))
- .child(v_flex().gap_4().pb_4().w_full().children({
+ .child(v_flex().gap_4().w_full().children({
let mut items = Vec::with_capacity(reports.len());
for report in reports.iter() {
@@ -1030,18 +1169,12 @@ impl ChatPanel {
})
}
- fn render_border(&self, cx: &Context) -> impl IntoElement {
- div()
- .group_hover("", |this| this.bg(cx.theme().element_active))
- .absolute()
- .left_0()
- .top_0()
- .w(px(2.))
- .h_full()
- .bg(cx.theme().border_transparent)
- }
-
- fn render_actions(&self, id: &EventId, cx: &Context) -> impl IntoElement {
+ fn render_actions(
+ &self,
+ id: &EventId,
+ public_key: &PublicKey,
+ cx: &Context,
+ ) -> impl IntoElement {
h_flex()
.p_0p5()
.gap_1()
@@ -1082,13 +1215,22 @@ impl ChatPanel {
)
.child(div().flex_shrink_0().h_4().w_px().bg(cx.theme().border))
.child(
- Button::new("seen-on")
+ Button::new("advance")
.icon(IconName::Ellipsis)
.small()
.ghost()
.dropdown_menu({
- let id = id.to_owned();
- move |this, _window, _cx| this.menu("Seen on", Box::new(SeenOn(id)))
+ let public_key = *public_key;
+ let _id = *id;
+ move |this, _window, _cx| {
+ this.menu("Copy author", Box::new(Command::Copy(public_key)))
+ /*
+ .menu(
+ "Trace",
+ Box::new(Command::Trace(id)),
+ )
+ */
+ }
}),
)
.group_hover("", |this| this.visible())
@@ -1286,12 +1428,30 @@ impl Panel for ChatPanel {
h_flex()
.gap_1p5()
- .child(Avatar::new(url).small())
+ .child(Avatar::new(url).xsmall())
.child(label)
.into_any_element()
})
.unwrap_or(div().child("Unknown").into_any_element())
}
+
+ fn toolbar_buttons(&self, _window: &Window, _cx: &App) -> Vec