From bac04ab4dafcf5dd709a9b406c7c9a334c89f27b Mon Sep 17 00:00:00 2001 From: Ren Amamiya Date: Tue, 2 Jun 2026 18:15:54 +0700 Subject: [PATCH] migrate to gpui-component --- Cargo.lock | 532 ++++- Cargo.toml | 1 + crates/chat_ui/Cargo.toml | 3 +- crates/chat_ui/src/lib.rs | 168 +- crates/chat_ui/src/text.rs | 6 +- crates/common/Cargo.toml | 1 + crates/common/src/icons.rs | 132 ++ crates/common/src/lib.rs | 2 + crates/device/Cargo.toml | 4 +- crates/device/src/lib.rs | 30 +- crates/relay_auth/Cargo.toml | 4 +- crates/relay_auth/src/lib.rs | 17 +- crates/settings/Cargo.toml | 1 - crates/settings/src/lib.rs | 52 +- crates/theme/Cargo.toml | 17 - crates/theme/LICENSE | 1 - crates/theme/README.md | 1 - crates/theme/src/colors.rs | 2484 --------------------- crates/theme/src/geometry.rs | 159 -- crates/theme/src/lib.rs | 221 -- crates/theme/src/notification.rs | 30 - crates/theme/src/platform_kind.rs | 33 - crates/theme/src/registry.rs | 70 - crates/theme/src/scale.rs | 281 --- crates/theme/src/scrollbar_mode.rs | 24 - crates/theme/src/theme.rs | 359 --- crates/title_bar/Cargo.toml | 6 +- crates/title_bar/src/lib.rs | 32 +- crates/title_bar/src/platforms/linux.rs | 16 +- crates/title_bar/src/platforms/mod.rs | 34 + crates/title_bar/src/platforms/windows.rs | 11 +- crates/ui/Cargo.toml | 26 - crates/ui/LICENSE | 191 -- crates/ui/src/actions.rs | 12 - crates/ui/src/animation.rs | 18 - crates/ui/src/avatar.rs | 143 -- crates/ui/src/button.rs | 626 ------ crates/ui/src/checkbox.rs | 312 --- crates/ui/src/divider.rs | 81 - crates/ui/src/dock/dock.rs | 436 ---- crates/ui/src/dock/mod.rs | 807 ------- crates/ui/src/dock/panel.rs | 158 -- crates/ui/src/dock/stack_panel.rs | 394 ---- crates/ui/src/dock/tab_panel.rs | 1156 ---------- crates/ui/src/element_ext.rs | 27 - crates/ui/src/event.rs | 21 - crates/ui/src/focusable.rs | 39 - crates/ui/src/group_box.rs | 177 -- crates/ui/src/history.rs | 167 -- crates/ui/src/icon.rs | 317 --- crates/ui/src/index_path.rs | 69 - crates/ui/src/indicator.rs | 66 - crates/ui/src/input/blink_cursor.rs | 97 - crates/ui/src/input/change.rs | 40 - crates/ui/src/input/clear_button.rs | 15 - crates/ui/src/input/cursor.rs | 46 - crates/ui/src/input/element.rs | 888 -------- crates/ui/src/input/mask_pattern.rs | 409 ---- crates/ui/src/input/mod.rs | 15 - crates/ui/src/input/mode.rs | 129 -- crates/ui/src/input/rope_ext.rs | 208 -- crates/ui/src/input/state.rs | 2279 ------------------- crates/ui/src/input/text_input.rs | 314 --- crates/ui/src/input/text_wrapper.rs | 227 -- crates/ui/src/kbd.rs | 312 --- crates/ui/src/lib.rs | 56 - crates/ui/src/list/cache.rs | 221 -- crates/ui/src/list/delegate.rs | 171 -- crates/ui/src/list/list.rs | 745 ------ crates/ui/src/list/list_item.rs | 226 -- crates/ui/src/list/loading.rs | 34 - crates/ui/src/list/mod.rs | 28 - crates/ui/src/list/separator_item.rs | 50 - crates/ui/src/menu/app_menu_bar.rs | 257 --- crates/ui/src/menu/context_menu.rs | 323 --- crates/ui/src/menu/dropdown_menu.rs | 145 -- crates/ui/src/menu/menu_item.rs | 125 -- crates/ui/src/menu/mod.rs | 17 - crates/ui/src/menu/popup_menu.rs | 1341 ----------- crates/ui/src/modal.rs | 540 ----- crates/ui/src/notification.rs | 578 ----- crates/ui/src/popover.rs | 432 ---- crates/ui/src/resizable/mod.rs | 294 --- crates/ui/src/resizable/panel.rs | 408 ---- crates/ui/src/resizable/resize_handle.rs | 226 -- crates/ui/src/root.rs | 483 ---- crates/ui/src/scroll/mod.rs | 7 - crates/ui/src/scroll/scrollable.rs | 211 -- crates/ui/src/scroll/scrollable_mask.rs | 169 -- crates/ui/src/scroll/scrollbar.rs | 945 -------- crates/ui/src/skeleton.rs | 68 - crates/ui/src/styled.rs | 275 --- crates/ui/src/switch.rs | 287 --- crates/ui/src/tab/mod.rs | 702 ------ crates/ui/src/tab/tab_bar.rs | 290 --- crates/ui/src/tooltip.rs | 36 - crates/ui/src/window_ext.rs | 133 -- desktop/Cargo.toml | 3 +- desktop/src/dialogs/accounts.rs | 38 +- desktop/src/dialogs/connect.rs | 7 +- desktop/src/dialogs/import.rs | 19 +- desktop/src/dialogs/restore.rs | 15 +- desktop/src/dialogs/screening.rs | 56 +- desktop/src/dialogs/settings.rs | 72 +- desktop/src/main.rs | 9 +- desktop/src/panels/backup.rs | 42 +- desktop/src/panels/contact_list.rs | 46 +- desktop/src/panels/greeter.rs | 51 +- desktop/src/panels/messaging_relays.rs | 48 +- desktop/src/panels/profile.rs | 58 +- desktop/src/panels/relay_list.rs | 42 +- desktop/src/panels/trash.rs | 32 +- desktop/src/sidebar/entry.rs | 27 +- desktop/src/sidebar/mod.rs | 114 +- desktop/src/workspace.rs | 152 +- web/Cargo.toml | 2 - 116 files changed, 1165 insertions(+), 24445 deletions(-) create mode 100644 crates/common/src/icons.rs delete mode 100644 crates/theme/Cargo.toml delete mode 100644 crates/theme/LICENSE delete mode 100644 crates/theme/README.md delete mode 100644 crates/theme/src/colors.rs delete mode 100644 crates/theme/src/geometry.rs delete mode 100644 crates/theme/src/lib.rs delete mode 100644 crates/theme/src/notification.rs delete mode 100644 crates/theme/src/platform_kind.rs delete mode 100644 crates/theme/src/registry.rs delete mode 100644 crates/theme/src/scale.rs delete mode 100644 crates/theme/src/scrollbar_mode.rs delete mode 100644 crates/theme/src/theme.rs delete mode 100644 crates/ui/Cargo.toml delete mode 100644 crates/ui/LICENSE delete mode 100644 crates/ui/src/actions.rs delete mode 100644 crates/ui/src/animation.rs delete mode 100644 crates/ui/src/avatar.rs delete mode 100644 crates/ui/src/button.rs delete mode 100644 crates/ui/src/checkbox.rs delete mode 100644 crates/ui/src/divider.rs delete mode 100644 crates/ui/src/dock/dock.rs delete mode 100644 crates/ui/src/dock/mod.rs delete mode 100644 crates/ui/src/dock/panel.rs delete mode 100644 crates/ui/src/dock/stack_panel.rs delete mode 100644 crates/ui/src/dock/tab_panel.rs delete mode 100644 crates/ui/src/element_ext.rs delete mode 100644 crates/ui/src/event.rs delete mode 100644 crates/ui/src/focusable.rs delete mode 100644 crates/ui/src/group_box.rs delete mode 100644 crates/ui/src/history.rs delete mode 100644 crates/ui/src/icon.rs delete mode 100644 crates/ui/src/index_path.rs delete mode 100644 crates/ui/src/indicator.rs delete mode 100644 crates/ui/src/input/blink_cursor.rs delete mode 100644 crates/ui/src/input/change.rs delete mode 100644 crates/ui/src/input/clear_button.rs delete mode 100644 crates/ui/src/input/cursor.rs delete mode 100644 crates/ui/src/input/element.rs delete mode 100644 crates/ui/src/input/mask_pattern.rs delete mode 100644 crates/ui/src/input/mod.rs delete mode 100644 crates/ui/src/input/mode.rs delete mode 100644 crates/ui/src/input/rope_ext.rs delete mode 100644 crates/ui/src/input/state.rs delete mode 100644 crates/ui/src/input/text_input.rs delete mode 100644 crates/ui/src/input/text_wrapper.rs delete mode 100644 crates/ui/src/kbd.rs delete mode 100644 crates/ui/src/lib.rs delete mode 100644 crates/ui/src/list/cache.rs delete mode 100644 crates/ui/src/list/delegate.rs delete mode 100644 crates/ui/src/list/list.rs delete mode 100644 crates/ui/src/list/list_item.rs delete mode 100644 crates/ui/src/list/loading.rs delete mode 100644 crates/ui/src/list/mod.rs delete mode 100644 crates/ui/src/list/separator_item.rs delete mode 100644 crates/ui/src/menu/app_menu_bar.rs delete mode 100644 crates/ui/src/menu/context_menu.rs delete mode 100644 crates/ui/src/menu/dropdown_menu.rs delete mode 100644 crates/ui/src/menu/menu_item.rs delete mode 100644 crates/ui/src/menu/mod.rs delete mode 100644 crates/ui/src/menu/popup_menu.rs delete mode 100644 crates/ui/src/modal.rs delete mode 100644 crates/ui/src/notification.rs delete mode 100644 crates/ui/src/popover.rs delete mode 100644 crates/ui/src/resizable/mod.rs delete mode 100644 crates/ui/src/resizable/panel.rs delete mode 100644 crates/ui/src/resizable/resize_handle.rs delete mode 100644 crates/ui/src/root.rs delete mode 100644 crates/ui/src/scroll/mod.rs delete mode 100644 crates/ui/src/scroll/scrollable.rs delete mode 100644 crates/ui/src/scroll/scrollable_mask.rs delete mode 100644 crates/ui/src/scroll/scrollbar.rs delete mode 100644 crates/ui/src/skeleton.rs delete mode 100644 crates/ui/src/styled.rs delete mode 100644 crates/ui/src/switch.rs delete mode 100644 crates/ui/src/tab/mod.rs delete mode 100644 crates/ui/src/tab/tab_bar.rs delete mode 100644 crates/ui/src/tooltip.rs delete mode 100644 crates/ui/src/window_ext.rs diff --git a/Cargo.lock b/Cargo.lock index 6864164..de2bbbb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -260,6 +260,15 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +[[package]] +name = "arc-swap" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" +dependencies = [ + "rustversion", +] + [[package]] name = "arg_enum_proc_macro" version = "0.3.4" @@ -763,6 +772,12 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "base62" +version = "2.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd637ac531c60eb7fbc4684dc061c2d7d90d73d758181aa02eeff0464b9eee4b" + [[package]] name = "base64" version = "0.22.1" @@ -1170,6 +1185,7 @@ dependencies = [ "common", "flume 0.11.1", "gpui", + "gpui-component", "gpui_tokio", "itertools 0.13.0", "linkify", @@ -1185,8 +1201,6 @@ dependencies = [ "smallvec", "smol", "state", - "theme", - "ui", ] [[package]] @@ -1396,6 +1410,7 @@ dependencies = [ "dirs 5.0.1", "futures", "gpui", + "gpui-component", "itertools 0.13.0", "log", "nostr", @@ -1497,6 +1512,7 @@ dependencies = [ "device", "futures", "gpui", + "gpui-component", "gpui_linux", "gpui_macos", "gpui_platform", @@ -1517,10 +1533,8 @@ dependencies = [ "smallvec", "smol", "state", - "theme", "title_bar", "tracing-subscriber", - "ui", "webbrowser", ] @@ -1553,10 +1567,8 @@ dependencies = [ "smallvec", "smol", "state", - "theme", "tracing-subscriber", "tracing-wasm", - "ui", "wasm-bindgen", "webbrowser", ] @@ -1857,6 +1869,7 @@ dependencies = [ "common", "flume 0.11.1", "gpui", + "gpui-component", "itertools 0.13.0", "log", "nostr-sdk", @@ -1866,8 +1879,6 @@ dependencies = [ "smallvec", "smol", "state", - "theme", - "ui", ] [[package]] @@ -2053,6 +2064,26 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" +[[package]] +name = "enum-iterator" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4549325971814bda7a44061bf3fe7e487d447cba01e4220a4b454d630d7a016" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685adfa4d6f3d765a26bc5dbc936577de9abf756c1feeb3089b01dd395034842" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "enumflags2" version = "0.7.12" @@ -2451,6 +2482,15 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" +[[package]] +name = "fsevent-sys" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +dependencies = [ + "libc", +] + [[package]] name = "ftree" version = "1.3.0" @@ -2733,6 +2773,17 @@ dependencies = [ "regex-syntax", ] +[[package]] +name = "globwalk" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" +dependencies = [ + "bitflags 1.3.2", + "ignore", + "walkdir", +] + [[package]] name = "gloo-timers" version = "0.3.0" @@ -2881,6 +2932,59 @@ dependencies = [ "zed-scap", ] +[[package]] +name = "gpui-component" +version = "0.5.2" +source = "git+https://github.com/reyakov/gpui-component#af5eb24c00da145d5145cbad87f14e0f9234b094" +dependencies = [ + "aho-corasick", + "anyhow", + "async-channel 2.5.0", + "chrono", + "core-text", + "enum-iterator", + "futures", + "gpui", + "gpui-component-macros", + "gpui_macros", + "html5ever", + "instant", + "itertools 0.13.0", + "log", + "lsp-types", + "markdown", + "markup5ever_rcdom", + "notify", + "num-traits", + "once_cell", + "paste", + "regex", + "ropey", + "rust-i18n", + "schemars", + "serde", + "serde_json", + "serde_repr", + "smallvec", + "smol", + "tracing", + "tree-sitter", + "tree-sitter-json", + "unicode-segmentation", + "uuid", + "zed-sum-tree", +] + +[[package]] +name = "gpui-component-macros" +version = "0.5.1" +source = "git+https://github.com/reyakov/gpui-component#af5eb24c00da145d5145cbad87f14e0f9234b094" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "gpui_linux" version = "0.1.0" @@ -3331,6 +3435,20 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "html5ever" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13771afe0e6e846f1e67d038d4cb29998a6779f93c809212e4e9c32efd244d4" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "http" version = "1.4.1" @@ -3598,6 +3716,22 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "ignore" +version = "0.4.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata", + "same-file", + "walkdir", + "winapi-util", +] + [[package]] name = "image" version = "0.25.10" @@ -3665,6 +3799,26 @@ dependencies = [ "ftree", ] +[[package]] +name = "inotify" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd168d97690d0b8c412d6b6c10360277f4d7ee495c5d0d5d5fe0854923255cc" +dependencies = [ + "bitflags 1.3.2", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + [[package]] name = "inout" version = "0.1.4" @@ -3682,6 +3836,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", ] [[package]] @@ -3747,6 +3904,15 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.13.0" @@ -3884,6 +4050,26 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" +[[package]] +name = "kqueue" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "273c0752728918e0ac4976f2b275b6fefb9ecd400585dec929419f3844cd87b5" +dependencies = [ + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087" +dependencies = [ + "bitflags 2.11.1", + "libc", +] + [[package]] name = "kurbo" version = "0.11.3" @@ -4201,6 +4387,42 @@ dependencies = [ "libc", ] +[[package]] +name = "markdown" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5cab8f2cadc416a82d2e783a1946388b31654d391d1c7d92cc1f03e295b1deb" +dependencies = [ + "serde", + "unicode-id", +] + +[[package]] +name = "markup5ever" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16ce3abbeba692c8b8441d036ef91aea6df8da2c6b6e21c7e14d3c18e526be45" +dependencies = [ + "log", + "phf 0.11.3", + "phf_codegen", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "markup5ever_rcdom" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edaa21ab3701bfee5099ade5f7e1f84553fd19228cf332f13cd6e964bf59be18" +dependencies = [ + "html5ever", + "markup5ever", + "tendril", + "xml5ever", +] + [[package]] name = "matchers" version = "0.2.0" @@ -4332,6 +4554,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" dependencies = [ "libc", + "log", "wasi", "windows-sys 0.61.2", ] @@ -4465,6 +4688,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" +[[package]] +name = "normpath" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9985ef7269fa99f3b12437bb698381da2428743ab90f20393f399fa14cab21a" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "nostr" version = "0.44.1" @@ -4577,6 +4809,34 @@ dependencies = [ "universal-time", ] +[[package]] +name = "notify" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c533b4c39709f9ba5005d8002048266593c1cfaf3c5f0739d5b8ab0c6c504009" +dependencies = [ + "bitflags 2.11.1", + "filetime", + "fsevent-sys", + "inotify", + "kqueue", + "libc", + "log", + "mio", + "notify-types", + "walkdir", + "windows-sys 0.52.0", +] + +[[package]] +name = "notify-types" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585d3cb5e12e01aed9e8a1f70d5c6b5e86fe2a6e48fc8cd0b3e0b8df6f6eb174" +dependencies = [ + "instant", +] + [[package]] name = "ntapi" version = "0.4.3" @@ -5195,6 +5455,16 @@ dependencies = [ "serde", ] +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", +] + [[package]] name = "phf_generator" version = "0.11.3" @@ -5433,6 +5703,12 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + [[package]] name = "presser" version = "0.3.1" @@ -5946,14 +6222,13 @@ dependencies = [ "common", "flume 0.11.1", "gpui", + "gpui-component", "log", "nostr-sdk", "settings", "smallvec", "smol", "state", - "theme", - "ui", ] [[package]] @@ -6059,18 +6334,12 @@ dependencies = [ ] [[package]] -name = "rope" -version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#46ac5758a5562f05b786b88cf3600b9334abeb7d" +name = "ropey" +version = "2.0.0-beta.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4045a00dc327d084a2bbf126976e14125b54f23bd30511d45b842eba76c52d74" dependencies = [ - "heapless 0.9.3", - "log", - "rayon", - "sum_tree", - "tracing", - "unicode-segmentation", - "util", - "ztracing", + "str_indices", ] [[package]] @@ -6114,6 +6383,54 @@ dependencies = [ "walkdir", ] +[[package]] +name = "rust-i18n" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55691a65892c33ee2de49c15ea5600c6f4a70e8eeb8e6c3cd96d2a231d230c40" +dependencies = [ + "globwalk", + "regex", + "rust-i18n-macro", + "rust-i18n-support", + "smallvec", +] + +[[package]] +name = "rust-i18n-macro" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30de488acadcf767d97cd48518a8da8ea9777b1c9a5beca4eab78bbf77d07309" +dependencies = [ + "glob", + "proc-macro2", + "quote", + "rust-i18n-support", + "serde", + "serde_json", + "serde_yaml", + "syn", +] + +[[package]] +name = "rust-i18n-support" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aea0fef8a93c06326b66392c95a115120e609674cb2132d37d276a6b05b545b4" +dependencies = [ + "arc-swap", + "base62", + "globwalk", + "itertools 0.11.0", + "normpath", + "serde", + "serde_json", + "serde_yaml", + "siphasher", + "toml 0.8.23", + "triomphe", +] + [[package]] name = "rust-ini" version = "0.17.0" @@ -6600,6 +6917,19 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + [[package]] name = "settings" version = "1.0.0-beta4" @@ -6614,7 +6944,6 @@ dependencies = [ "serde_json", "smallvec", "smol", - "theme", ] [[package]] @@ -6889,6 +7218,18 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "str_indices" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d08889ec5408683408db66ad89e0e1f93dff55c73a4ccc71c427d5b277ee47e6" + +[[package]] +name = "streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520" + [[package]] name = "strict-num" version = "0.1.1" @@ -6898,6 +7239,31 @@ dependencies = [ "float-cmp", ] +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.11.3", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", +] + [[package]] name = "strsim" version = "0.11.1" @@ -7195,20 +7561,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "theme" -version = "1.0.0-beta4" -dependencies = [ - "anyhow", - "gpui", - "log", - "schemars", - "serde", - "serde_json", - "smallvec", - "tempfile", -] - [[package]] name = "thiserror" version = "1.0.69" @@ -7339,13 +7691,12 @@ dependencies = [ "anyhow", "common", "gpui", + "gpui-component", "linicon", "log", "nostr-sdk", "smallvec", "smol", - "theme", - "ui", "windows 0.61.3", ] @@ -7648,6 +7999,47 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "tree-sitter" +version = "0.26.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dab76d0b724ba557954125188cf0633a1ca43199ced82d95c7b9c32cc3de1f3" +dependencies = [ + "cc", + "regex", + "regex-syntax", + "serde_json", + "streaming-iterator", + "tree-sitter-language", +] + +[[package]] +name = "tree-sitter-json" +version = "0.24.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d727acca406c0020cffc6cf35516764f36c8e3dc4408e5ebe2cb35a947ec471" +dependencies = [ + "cc", + "tree-sitter-language", +] + +[[package]] +name = "tree-sitter-language" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "009994f150cc0cd50ff54917d5bc8bffe8cad10ca10d81c34da2ec421ae61782" + +[[package]] +name = "triomphe" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39" +dependencies = [ + "arc-swap", + "serde", + "stable_deref_trait", +] + [[package]] name = "try-lock" version = "0.2.5" @@ -7705,29 +8097,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "ui" -version = "1.0.0-beta4" -dependencies = [ - "anyhow", - "common", - "gpui", - "image", - "itertools 0.13.0", - "log", - "lsp-types", - "regex", - "rope", - "serde", - "serde_json", - "smallvec", - "smol", - "sum_tree", - "theme", - "unicode-segmentation", - "uuid", -] - [[package]] name = "unicase" version = "2.9.0" @@ -7752,6 +8121,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" +[[package]] +name = "unicode-id" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ba288e709927c043cbe476718d37be306be53fb1fafecd0dbe36d072be2580" + [[package]] name = "unicode-ident" version = "1.0.24" @@ -7825,6 +8200,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f942cacf37a673350e8f252dff4691fb8e525a5fff6e1f2c4b6c2f3b8349248d" +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + [[package]] name = "untrusted" version = "0.9.0" @@ -9325,6 +9706,12 @@ dependencies = [ "wasmparser", ] +[[package]] +name = "workspace-hack" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "beffa227304dbaea3ad6a06ac674f9bc83a3dec3b7f63eeb442de37e7cb6bb01" + [[package]] name = "writeable" version = "0.6.3" @@ -9438,6 +9825,17 @@ version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" +[[package]] +name = "xml5ever" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bbb26405d8e919bc1547a5aa9abc95cbfa438f04844f5fdd9dc7596b748bf69" +dependencies = [ + "log", + "mac", + "markup5ever", +] + [[package]] name = "xmlwriter" version = "0.1.0" @@ -9681,6 +10079,18 @@ dependencies = [ "xcb", ] +[[package]] +name = "zed-sum-tree" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d490156d0d7311855564d6e1d6dccab992405a0c0e15e1c8ef18920c02177e35" +dependencies = [ + "arrayvec", + "log", + "rayon", + "workspace-hack", +] + [[package]] name = "zed-xim" version = "0.4.0-zed" diff --git a/Cargo.toml b/Cargo.toml index 99afc7e..84c1c06 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,7 @@ 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" } gpui_tokio = { git = "https://github.com/zed-industries/zed" } +gpui-component = { git = "https://github.com/reyakov/gpui-component" } reqwest_client = { git = "https://github.com/zed-industries/zed" } # Nostr diff --git a/crates/chat_ui/Cargo.toml b/crates/chat_ui/Cargo.toml index 658b111..9b037bc 100644 --- a/crates/chat_ui/Cargo.toml +++ b/crates/chat_ui/Cargo.toml @@ -6,8 +6,6 @@ publish.workspace = true [dependencies] state = { path = "../state" } -ui = { path = "../ui" } -theme = { path = "../theme" } common = { path = "../common" } person = { path = "../person" } chat = { path = "../chat" } @@ -15,6 +13,7 @@ settings = { path = "../settings" } gpui.workspace = true gpui_tokio.workspace = true +gpui-component.workspace = true nostr-sdk.workspace = true anyhow.workspace = true diff --git a/crates/chat_ui/src/lib.rs b/crates/chat_ui/src/lib.rs index f309f86..1cb0268 100644 --- a/crates/chat_ui/src/lib.rs +++ b/crates/chat_ui/src/lib.rs @@ -4,15 +4,26 @@ use std::sync::Arc; pub use actions::*; use anyhow::{Context as AnyhowContext, Error}; use chat::{ChatRegistry, Message, RenderedMessage, Room, RoomEvent, SendReport, SendStatus}; -use common::{TimestampExt, coop_cache}; +use common::{CoopIcon, TimestampExt, coop_cache}; use gpui::prelude::FluentBuilder; use gpui::{ - AnyElement, App, AppContext, ClipboardItem, Context, Entity, EventEmitter, FocusHandle, - Focusable, InteractiveElement, IntoElement, ListAlignment, ListOffset, ListState, MouseButton, - ObjectFit, ParentElement, PathPromptOptions, Render, SharedString, SharedUri, + AnyElement, App, AppContext, ClipboardItem, Context, Element, Entity, EventEmitter, + FocusHandle, Focusable, InteractiveElement, IntoElement, ListAlignment, ListOffset, ListState, + MouseButton, ObjectFit, ParentElement, PathPromptOptions, Render, SharedString, SharedUri, StatefulInteractiveElement, Styled, StyledImage, Subscription, Task, WeakEntity, Window, deferred, div, img, list, px, red, relative, svg, white, }; +use gpui_component::avatar::Avatar; +use gpui_component::button::{Button, ButtonVariants}; +use gpui_component::dock::{Panel, PanelEvent}; +use gpui_component::input::{Input, InputEvent, InputState}; +use gpui_component::menu::DropdownMenu; +use gpui_component::notification::Notification; +use gpui_component::scroll::Scrollbar; +use gpui_component::{ + ActiveTheme, Disableable, Icon, InteractiveElementExt, Sizable, StyledExt, WindowExt, h_flex, + v_flex, +}; use itertools::Itertools; use nostr_sdk::prelude::*; use person::{Person, PersonRegistry}; @@ -20,18 +31,6 @@ use settings::{AppSettings, SignerKind}; use smallvec::{SmallVec, smallvec}; use smol::lock::RwLock; use state::{NostrRegistry, upload}; -use theme::ActiveTheme; -use ui::avatar::Avatar; -use ui::button::{Button, ButtonVariants}; -use ui::dock::{Panel, PanelEvent}; -use ui::input::{InputEvent, InputState, TextInput}; -use ui::menu::DropdownMenu; -use ui::notification::Notification; -use ui::scroll::Scrollbar; -use ui::{ - Disableable, Icon, IconName, InteractiveElementExt, Sizable, StyledExt, WindowExtension, - h_flex, v_flex, -}; use crate::text::RenderedText; @@ -119,7 +118,7 @@ impl ChatPanel { InputState::new(window, cx) .placeholder(format!("Message {}", name)) .auto_grow(1, 20) - .prevent_new_line_on_enter() + .submit_on_enter(true) .clean_on_escape() }); @@ -674,8 +673,8 @@ impl ChatPanel { let chat = ChatRegistry::global(cx); let seen_on = chat.read(cx).rumor_seen_on(id); - window.open_modal(cx, move |this, _window, cx| { - this.title("Seen on").show_close(true).child( + window.open_dialog(cx, move |this, _window, cx| { + this.title("Seen on").close_button(true).child( v_flex() .gap_1() .when_none(&seen_on, |this| { @@ -684,7 +683,7 @@ impl ChatPanel { .h_10() .justify_center() .text_sm() - .bg(cx.theme().elevated_surface_background) + .bg(cx.theme().muted) .rounded(cx.theme().radius) .child("Message isn't traced yet"), ) @@ -699,7 +698,7 @@ impl ChatPanel { .h_7() .px_2() .gap_2() - .bg(cx.theme().elevated_surface_background) + .bg(cx.theme().muted) .rounded(cx.theme().radius) .text_sm() .child(div().size_1p5().rounded_full().bg(gpui::green())) @@ -717,11 +716,11 @@ impl ChatPanel { 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| { + window.open_dialog(cx, move |this, _window, cx| { let relays = profile.messaging_relays(); this.title("Messaging Relays") - .show_close(true) + .close_button(true) .child(v_flex().gap_1().children({ let mut items = vec![]; @@ -731,7 +730,7 @@ impl ChatPanel { .h_7() .px_2() .gap_2() - .bg(cx.theme().elevated_surface_background) + .bg(cx.theme().muted) .rounded(cx.theme().radius) .text_sm() .child(div().size_1p5().rounded_full().bg(gpui::green())) @@ -760,13 +759,13 @@ impl ChatPanel { .justify_center() .text_center() .text_xs() - .text_color(cx.theme().text_placeholder) + .text_color(cx.theme().muted_foreground) .line_height(relative(1.3)) .child( svg() .path("brand/coop.svg") .size_12() - .text_color(cx.theme().ghost_element_active), + .text_color(cx.theme().muted_foreground), ) .child(SharedString::from(ANNOUNCEMENT)) .into_any_element() @@ -789,9 +788,9 @@ impl ChatPanel { .size_8() .justify_center() .rounded_full() - .bg(cx.theme().warning_background) + .bg(cx.theme().warning) .text_color(cx.theme().warning_foreground) - .child(Icon::new(IconName::Warning).small()), + .child(Icon::new(CoopIcon::Warning).small()), ) .child( div() @@ -867,15 +866,11 @@ impl ChatPanel { .gap_3() .when(!hide_avatar, |this| { this.child( - Avatar::new(author.avatar()) + Avatar::new() + .src(author.avatar()) + .name(author.name()) .flex_shrink_0() - .relative() - .dropdown_menu(move |this, _window, _cx| { - this.menu("Public Key", Box::new(Command::Copy(pk))) - .menu("View Relays", Box::new(Command::Relays(pk))) - .separator() - .menu("View on njump.me", Box::new(Command::Njump(pk))) - }), + .relative(), ) }) .child( @@ -888,17 +883,17 @@ impl ChatPanel { h_flex() .gap_2() .text_sm() - .text_color(cx.theme().text_placeholder) + .text_color(cx.theme().muted_foreground) .child( div() .font_semibold() - .text_color(cx.theme().text) + .text_color(cx.theme().foreground) .child(author.name()), ) .when(encrypted_by_dekey, |this| { this.child( Button::new(format!("dekey-{ix}")) - .icon(IconName::Shield) + .icon(CoopIcon::Shield) .ghost() .xsmall() .px_4() @@ -920,13 +915,13 @@ impl ChatPanel { ) .child( div() - .group_hover("", |this| this.bg(cx.theme().element_active)) + .group_hover("", |this| this.bg(cx.theme().primary_active)) .absolute() .left_0() .top_0() .w(px(2.)) .h_full() - .bg(cx.theme().border_transparent), + .bg(cx.theme().transparent), ) .child(self.render_actions(&id, &pk, cx)) .on_mouse_down( @@ -938,7 +933,7 @@ impl ChatPanel { .on_double_click(cx.listener(move |this, _, _window, cx| { this.reply_to(&id, cx); })) - .hover(|this| this.bg(cx.theme().surface_background)) + .hover(|this| this.bg(cx.theme().muted)) .into_any_element() } @@ -953,7 +948,7 @@ impl ChatPanel { return div().child( img(media[0].clone()) .border_1() - .border_color(cx.theme().border_variant) + .border_color(cx.theme().border) .h(px(250.)) .object_fit(ObjectFit::Cover) .rounded(cx.theme().radius), @@ -981,7 +976,7 @@ impl ChatPanel { img(item.clone()) .h_32() .border_1() - .border_color(cx.theme().border_variant) + .border_color(cx.theme().border) .rounded(cx.theme().radius), ), ); @@ -1010,11 +1005,11 @@ impl ChatPanel { .w_full() .px_2() .border_l_2() - .border_color(cx.theme().element_selected) + .border_color(cx.theme().primary_active) .text_sm() .child( div() - .text_color(cx.theme().text_accent) + .text_color(cx.theme().accent_foreground) .child(author.name()), ) .child( @@ -1024,7 +1019,7 @@ impl ChatPanel { .line_clamp(1) .child(SharedString::from(&message.content)), ) - .hover(|this| this.bg(cx.theme().elevated_surface_background)) + .hover(|this| this.bg(cx.theme().muted)) .on_click({ let id = *id; cx.listener(move |this, _event, _window, _cx| { @@ -1065,15 +1060,15 @@ impl ChatPanel { div() .id(SharedString::from(id.to_hex())) .child(label) - .when(failed, |this| this.text_color(cx.theme().text_danger)) + .when(failed, |this| this.text_color(cx.theme().danger_foreground)) .when_some(reports, |this, reports| { this.when(!pending, |this| { this.on_click(move |_e, window, cx| { let reports = reports.clone(); - window.open_modal(cx, move |this, _window, cx| { + window.open_dialog(cx, move |this, _window, cx| { this.title(SharedString::from("Sent Reports")) - .show_close(true) + .close_button(true) .child(v_flex().gap_4().children({ let mut items = Vec::with_capacity(reports.len()); @@ -1107,7 +1102,7 @@ impl ChatPanel { h_flex() .gap_1() .font_semibold() - .child(Avatar::new(avatar).small()) + .child(Avatar::new().src(avatar).name(name.clone()).small()) .child(name.clone()), ), ) @@ -1121,7 +1116,7 @@ impl ChatPanel { .w_full() .text_sm() .rounded(cx.theme().radius) - .bg(cx.theme().warning_background) + .bg(cx.theme().warning) .text_color(cx.theme().warning_foreground) .child(div().flex_1().w_full().text_center().child(error)), ) @@ -1141,7 +1136,7 @@ impl ChatPanel { .p_1() .w_full() .rounded(cx.theme().radius) - .bg(cx.theme().danger_background) + .bg(cx.theme().danger) .child( div() .text_xs() @@ -1171,7 +1166,7 @@ impl ChatPanel { .p_1() .w_full() .rounded(cx.theme().radius) - .bg(cx.theme().elevated_surface_background) + .bg(cx.theme().muted) .child( div() .text_xs() @@ -1214,7 +1209,7 @@ impl ChatPanel { .bg(cx.theme().background) .child( Button::new("reply") - .icon(IconName::Reply) + .icon(CoopIcon::Reply) .tooltip("Reply") .small() .ghost() @@ -1227,7 +1222,7 @@ impl ChatPanel { ) .child( Button::new("copy") - .icon(IconName::Copy) + .icon(CoopIcon::Copy) .tooltip("Copy") .small() .ghost() @@ -1241,7 +1236,7 @@ impl ChatPanel { .child(div().flex_shrink_0().h_4().w_px().bg(cx.theme().border)) .child( Button::new("advance") - .icon(IconName::Ellipsis) + .icon(CoopIcon::Ellipsis) .small() .ghost() .dropdown_menu({ @@ -1279,7 +1274,7 @@ impl ChatPanel { .justify_center() .rounded_full() .bg(red()) - .child(Icon::new(IconName::Close).size_2().text_color(white())), + .child(Icon::new(CoopIcon::Close).size_2().text_color(white())), ) .on_click({ let url = url.clone(); @@ -1312,7 +1307,7 @@ impl ChatPanel { .w_full() .pl_2() .border_l_2() - .border_color(cx.theme().element_active) + .border_color(cx.theme().secondary_active) .child( div() .flex() @@ -1324,17 +1319,17 @@ impl ChatPanel { .items_baseline() .gap_1() .text_xs() - .text_color(cx.theme().text_muted) + .text_color(cx.theme().muted_foreground) .child(SharedString::from("Replying to:")) .child( div() - .text_color(cx.theme().text_accent) + .text_color(cx.theme().secondary_foreground) .child(profile.name()), ), ) .child( Button::new("remove-reply") - .icon(IconName::Close) + .icon(CoopIcon::Close) .xsmall() .ghost() .on_click({ @@ -1382,7 +1377,7 @@ impl ChatPanel { .unwrap_or((true, SignerKind::default())); Button::new("encryption") - .icon(IconName::Settings2) + .icon(CoopIcon::Settings2) .tooltip("Configuration") .ghost() .large() @@ -1418,11 +1413,11 @@ impl ChatPanel { fn render_emoji_menu(&self, _window: &Window, _cx: &Context) -> impl IntoElement { Button::new("emoji") - .icon(IconName::Emoji) + .icon(CoopIcon::Emoji) .ghost() .large() .dropdown_menu_with_anchor(gpui::Anchor::BottomLeft, move |this, _window, _cx| { - this.horizontal() + this.separator() .menu("👍", Box::new(Command::Insert("👍"))) .menu("👎", Box::new(Command::Insert("👎"))) .menu("😄", Box::new(Command::Insert("😄"))) @@ -1436,11 +1431,11 @@ impl ChatPanel { } impl Panel for ChatPanel { - fn panel_id(&self) -> SharedString { - self.id.clone() + fn panel_name(&self) -> &'static str { + "Chat" } - fn title(&self, cx: &App) -> AnyElement { + fn title(&mut self, _window: &mut Window, cx: &mut Context) -> impl IntoElement { self.room .read_with(cx, |this, cx| { let label = this.display_name(cx); @@ -1448,19 +1443,24 @@ impl Panel for ChatPanel { h_flex() .gap_1p5() - .child(Avatar::new(url).xsmall()) + .child(Avatar::new().src(url).xsmall()) .child(label) .into_any_element() }) - .unwrap_or(div().child("Unknown").into_any_element()) + .unwrap_or(div().child("Unknown").into_any()) + .into_any() } - fn toolbar_buttons(&self, _window: &Window, _cx: &App) -> Vec