From 48d16bb33e4af6b254dfe6a8241759aad01858d1 Mon Sep 17 00:00:00 2001 From: Ren Amamiya Date: Tue, 10 Nov 2026 04:11:42 +0700 Subject: [PATCH] migrate icons to gpui-native-kit --- Cargo.lock | 7 +- assets/icons/coins.svg | 16 ++++ crates/assets/Cargo.toml | 2 +- crates/assets/src/lib.rs | 24 ++---- crates/chat_ui/Cargo.toml | 1 + crates/chat_ui/src/lib.rs | 17 ++-- crates/nip29_ui/Cargo.toml | 1 + crates/nip29_ui/src/lib.rs | 20 ++--- crates/nip29_ui/src/message.rs | 10 +-- crates/nip4e/Cargo.toml | 1 + crates/nip60_ui/Cargo.toml | 1 + crates/nip60_ui/src/wallet.rs | 14 ++-- crates/ui/Cargo.toml | 1 + crates/ui/src/icon.rs | 87 ++++++++++++++++++-- crates/ui/src/lib.rs | 2 +- crates/ui/src/message.rs | 3 +- crates/workspace/src/dialogs/join_group.rs | 2 +- crates/workspace/src/dialogs/new_chat.rs | 2 +- crates/workspace/src/dialogs/new_group.rs | 11 +-- crates/workspace/src/dialogs/profile.rs | 2 +- crates/workspace/src/dialogs/relays.rs | 2 +- crates/workspace/src/dialogs/restore.rs | 2 +- crates/workspace/src/dialogs/screening.rs | 24 +++--- crates/workspace/src/dialogs/settings.rs | 2 +- crates/workspace/src/dock/tab_panel.rs | 2 +- crates/workspace/src/dock/window_controls.rs | 7 +- crates/workspace/src/panels/browse.rs | 14 ++-- crates/workspace/src/panels/contact_list.rs | 2 +- crates/workspace/src/panels/greeter.rs | 10 +-- crates/workspace/src/panels/inbox.rs | 11 +-- crates/workspace/src/sidebar/group_view.rs | 9 +- crates/workspace/src/sidebar/header.rs | 7 +- crates/workspace/src/sidebar/list.rs | 11 +-- crates/workspace/src/sidebar/rows.rs | 9 +- crates/workspace/src/sidebar/search.rs | 2 +- 35 files changed, 224 insertions(+), 114 deletions(-) create mode 100644 assets/icons/coins.svg diff --git a/Cargo.lock b/Cargo.lock index 013f5b9f..9ba7ff21 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -382,7 +382,7 @@ name = "assets" version = "2.0.0-alpha3" dependencies = [ "anyhow", - "gpui-kit", + "gpui-native-kit", "gpui-pre", "rust-embed", ] @@ -1459,6 +1459,7 @@ dependencies = [ "chat", "common", "gpui-kit", + "gpui-native-kit", "gpui-pre", "instant", "itertools 0.13.0", @@ -6128,6 +6129,7 @@ dependencies = [ "chat_ui", "common", "gpui-kit", + "gpui-native-kit", "gpui-pre", "instant", "log", @@ -6149,6 +6151,7 @@ dependencies = [ "anyhow", "flume 0.11.1", "gpui-kit", + "gpui-native-kit", "gpui-pre", "log", "nostr-sdk", @@ -6190,6 +6193,7 @@ dependencies = [ "anyhow", "common", "gpui-kit", + "gpui-native-kit", "gpui-pre", "nip60", "nostr-sdk", @@ -10498,6 +10502,7 @@ dependencies = [ "common", "gpui-base", "gpui-kit", + "gpui-native-kit", "gpui-pre", "log", "nostr-sdk", diff --git a/assets/icons/coins.svg b/assets/icons/coins.svg new file mode 100644 index 00000000..60451a86 --- /dev/null +++ b/assets/icons/coins.svg @@ -0,0 +1,16 @@ + + + + + + diff --git a/crates/assets/Cargo.toml b/crates/assets/Cargo.toml index 97af1380..63ba83e5 100644 --- a/crates/assets/Cargo.toml +++ b/crates/assets/Cargo.toml @@ -8,7 +8,7 @@ publish.workspace = true gpui.workspace = true anyhow.workspace = true rust-embed.workspace = true -gpui-kit.workspace = true +gpui-native-kit.workspace = true # On wasm there is no filesystem to read from, so rust-embed's debug-mode # disk loading returns nothing; embed the assets even in debug builds. diff --git a/crates/assets/src/lib.rs b/crates/assets/src/lib.rs index 8cc8cc90..0ac992da 100644 --- a/crates/assets/src/lib.rs +++ b/crates/assets/src/lib.rs @@ -1,4 +1,5 @@ use gpui::{AssetSource, Result, SharedString}; +use gpui_native_kit::icons::IconAssets; use rust_embed::RustEmbed; /// The Lucide icons the app and the kit components draw, vendored so they ship @@ -11,8 +12,7 @@ use rust_embed::RustEmbed; #[exclude = "*.DS_Store"] pub struct Assets; -/// Coop's bundled assets, with the GPUI Kit component icon bundle as the -/// fallback for any icon not vendored here. +/// Coop's bundled assets, with the native kit's icon bundle. pub struct CombinedAssets; impl AssetSource for CombinedAssets { @@ -23,17 +23,13 @@ impl AssetSource for CombinedAssets { #[cfg(target_arch = "wasm32")] { - // The kit bundle fetches icons over HTTP on the web; a single - // instance keeps its download cache alive across loads. use std::sync::OnceLock; - static KIT_ASSETS: OnceLock = OnceLock::new(); - KIT_ASSETS - .get_or_init(gpui_kit::assets::Assets::default) - .load(path) + static KIT_ASSETS: OnceLock = OnceLock::new(); + KIT_ASSETS.get_or_init(|| IconAssets).load(path) } #[cfg(not(target_arch = "wasm32"))] - gpui_kit::assets::Assets.load(path) + IconAssets.load(path) } fn list(&self, path: &str) -> Result> { @@ -42,16 +38,12 @@ impl AssetSource for CombinedAssets { #[cfg(target_arch = "wasm32")] { use std::sync::OnceLock; - static KIT_ASSETS: OnceLock = OnceLock::new(); - paths.extend( - KIT_ASSETS - .get_or_init(gpui_kit::assets::Assets::default) - .list(path)?, - ); + static KIT_ASSETS: OnceLock = OnceLock::new(); + paths.extend(KIT_ASSETS.get_or_init(|| IconAssets).list(path)?); } #[cfg(not(target_arch = "wasm32"))] - paths.extend(gpui_kit::assets::Assets.list(path)?); + paths.extend(IconAssets.list(path)?); Ok(paths) } diff --git a/crates/chat_ui/Cargo.toml b/crates/chat_ui/Cargo.toml index d41e9f78..6edee2c5 100644 --- a/crates/chat_ui/Cargo.toml +++ b/crates/chat_ui/Cargo.toml @@ -9,6 +9,7 @@ state = { path = "../state" } speech = { path = "../speech" } ui = { path = "../ui" } gpui-kit = { workspace = true, features = ["speech"] } +gpui-native-kit.workspace = true common = { path = "../common" } person = { path = "../person" } chat = { path = "../chat" } diff --git a/crates/chat_ui/src/lib.rs b/crates/chat_ui/src/lib.rs index 03386f79..b8f74b68 100644 --- a/crates/chat_ui/src/lib.rs +++ b/crates/chat_ui/src/lib.rs @@ -23,7 +23,8 @@ use gpui_kit::component::notification::Notification; use gpui_kit::component::scroll::Scrollbar; use gpui_kit::component::speech::{SpeechButton, SpeechEvent, SpeechState, SpeechWaveform}; use gpui_kit::component::tooltip::Tooltip; -use gpui_kit::component::{ActiveTheme, Disableable, Icon, Sizable, WindowExt, h_flex, v_flex}; +use gpui_kit::component::{ActiveTheme, Disableable, Sizable, WindowExt, h_flex, v_flex}; +use gpui_native_kit::icons::Icon; use itertools::Itertools; use nostr_sdk::prelude::*; use person::{Directory, Person}; @@ -1126,7 +1127,7 @@ impl ChatPanel { .rounded_full() .bg(cx.theme().warning.opacity(0.15)) .text_color(cx.theme().warning) - .child(Icon::new(IconName::Warning).small()), + .child(Icon::named(IconName::Warning).size(ui::small_icon_size(cx))), ) .child( div() @@ -1575,7 +1576,7 @@ impl ChatPanel { .justify_center() .rounded_full() .bg(red()) - .child(Icon::new(IconName::Close).size_2().text_color(white())), + .child(Icon::named(IconName::Close).size(px(8.)).color(white())), ) .on_click({ let url = url.clone(); @@ -1655,7 +1656,7 @@ impl ChatPanel { .border_1() .border_color(cx.theme().border) .rounded(cx.theme().radius) - .child(Icon::new(IconName::Lock).text_color(cx.theme().primary)) + .child(Icon::named(IconName::Lock).color(cx.theme().primary)) .child( v_flex() .min_w_0() @@ -1728,7 +1729,11 @@ impl ChatPanel { .border_1() .border_color(cx.theme().border) .bg(gpui::green()) - .child(Icon::new(IconName::Lock).size_2().text_color(gpui::white())), + .child( + Icon::named(IconName::Lock) + .size(px(8.)) + .color(gpui::white()), + ), ) .on_click({ let url = file.url.clone(); @@ -2050,7 +2055,7 @@ impl Render for ChatPanel { .when(cfg!(not(target_arch = "wasm32")), |this| { this.child( Button::new("nutzap") - .icon(gpui_kit::assets::IconName::Coins) + .icon(ui::IconName::Coins) .tooltip("Send eCash") .disabled(dictating) .ghost() diff --git a/crates/nip29_ui/Cargo.toml b/crates/nip29_ui/Cargo.toml index c6fa175d..1864b5f0 100644 --- a/crates/nip29_ui/Cargo.toml +++ b/crates/nip29_ui/Cargo.toml @@ -14,6 +14,7 @@ settings = { path = "../settings" } speech = { path = "../speech" } state = { path = "../state" } gpui-kit = { workspace = true, features = ["speech"] } +gpui-native-kit.workspace = true ui = { path = "../ui" } gpui.workspace = true diff --git a/crates/nip29_ui/src/lib.rs b/crates/nip29_ui/src/lib.rs index 715afbb8..1af75ae3 100644 --- a/crates/nip29_ui/src/lib.rs +++ b/crates/nip29_ui/src/lib.rs @@ -10,7 +10,6 @@ use gpui::{ ParentElement, Render, SharedString, Styled, Subscription, Task, WeakEntity, Window, div, list, px, }; -use gpui_kit::assets::IconName; use gpui_kit::base::StyledExt as _; use gpui_kit::component::button::{Button, ButtonVariant, ButtonVariants}; use gpui_kit::component::dialog::DialogButtonProps; @@ -19,7 +18,8 @@ use gpui_kit::component::input::{InputEvent, Textarea, TextareaState}; use gpui_kit::component::notification::Notification; use gpui_kit::component::scroll::Scrollbar; use gpui_kit::component::speech::{SpeechButton, SpeechEvent, SpeechState, SpeechWaveform}; -use gpui_kit::component::{ActiveTheme, Disableable, Icon, Sizable, WindowExt, h_flex, v_flex}; +use gpui_kit::component::{ActiveTheme, Disableable, Sizable, WindowExt, h_flex, v_flex}; +use gpui_native_kit::icons::Icon; use nip29::{Group, GroupEvent, GroupKey, GroupsRegistry, Membership, Pin, Row}; use nostr_sdk::prelude::*; use person::Directory; @@ -28,7 +28,7 @@ use settings::AppSettings; use smallvec::{SmallVec, smallvec}; use speech::speaker::Speaker; use state::{NostrRegistry, pick_file, upload_file}; -use ui::{Avatar, RenderedText, RevealText, WelcomeMessage, rendered_text}; +use ui::{Avatar, IconName, RenderedText, RevealText, WelcomeMessage, rendered_text}; use util::{attachment_name, display_name, opens_run, pin_label, report}; mod details; @@ -783,9 +783,9 @@ impl GroupPanel { .border_b_1() .border_color(cx.theme().border) .child( - Icon::new(IconName::Info) - .small() - .text_color(cx.theme().muted_foreground), + Icon::named(IconName::Info) + .size(ui::small_icon_size(cx)) + .color(cx.theme().muted_foreground), ) .child(div().flex_1().min_w_0().truncate().child(message)) .child( @@ -820,9 +820,9 @@ impl GroupPanel { .text_xs() .bg(cx.theme().secondary) .child( - Icon::new(IconName::Info) - .small() - .text_color(cx.theme().warning), + Icon::named(IconName::Info) + .size(ui::small_icon_size(cx)) + .color(cx.theme().warning), ) .child(div().flex_1().min_w_0().child( "This group is public. Messages are not encrypted and can be read by anyone.", @@ -1277,7 +1277,7 @@ impl GroupPanel { .rounded(cx.theme().radius) .text_xs() .text_color(cx.theme().muted_foreground) - .child(Icon::new(IconName::Link).xsmall()) + .child(Icon::named(IconName::Link).size(ui::dense_icon_size(cx))) .child( div() .max_w(px(200.)) diff --git a/crates/nip29_ui/src/message.rs b/crates/nip29_ui/src/message.rs index 0eda88d7..59d18a89 100644 --- a/crates/nip29_ui/src/message.rs +++ b/crates/nip29_ui/src/message.rs @@ -5,11 +5,11 @@ use gpui::{ AnyElement, App, Entity, InteractiveElement, IntoElement, ParentElement, SharedString, Styled, WeakEntity, div, }; -use gpui_kit::assets::IconName; use gpui_kit::base::StyledExt as _; use gpui_kit::component::menu::{ContextMenuExt as _, PopupMenuItem}; use gpui_kit::component::notification::Notification; -use gpui_kit::component::{ActiveTheme, Icon, Sizable, WindowExt, h_flex}; +use gpui_kit::component::{ActiveTheme, Sizable, WindowExt, h_flex}; +use gpui_native_kit::icons::Icon; use nip29::{Activity, Group, Reaction}; use nostr_sdk::prelude::{EventId, Kind}; use person::Directory; @@ -17,8 +17,8 @@ use settings::AppSettings; use speech::speaker::END_GRACE; use state::NostrRegistry; use ui::{ - Avatar, MessageActions, MessageMedia, MessageRow, REACTION_EMOJIS, ReactionBar, ReplyPreview, - group_reactions, react_menu, + Avatar, IconName, MessageActions, MessageMedia, MessageRow, REACTION_EMOJIS, ReactionBar, + ReplyPreview, group_reactions, react_menu, }; use crate::GroupPanel; @@ -274,7 +274,7 @@ fn badge(activity: &Activity, cx: &App) -> AnyElement { .flex_shrink_0() .justify_center() .size_8() - .child(Icon::new(icon).small().text_color(color)) + .child(Icon::named(icon).size(ui::small_icon_size(cx)).color(color)) .into_any_element() } diff --git a/crates/nip4e/Cargo.toml b/crates/nip4e/Cargo.toml index 8f511b83..67be68e2 100644 --- a/crates/nip4e/Cargo.toml +++ b/crates/nip4e/Cargo.toml @@ -9,6 +9,7 @@ state = { path = "../state" } person = { path = "../person" } ui = { path = "../ui" } gpui-kit.workspace = true +gpui-native-kit.workspace = true settings = { path = "../settings" } gpui.workspace = true diff --git a/crates/nip60_ui/Cargo.toml b/crates/nip60_ui/Cargo.toml index 33266d0d..6c86ad4b 100644 --- a/crates/nip60_ui/Cargo.toml +++ b/crates/nip60_ui/Cargo.toml @@ -14,6 +14,7 @@ ui = { path = "../ui" } gpui.workspace = true gpui-kit.workspace = true +gpui-native-kit.workspace = true nostr-sdk.workspace = true anyhow.workspace = true smallvec.workspace = true diff --git a/crates/nip60_ui/src/wallet.rs b/crates/nip60_ui/src/wallet.rs index 38d1a6b0..255ae8ac 100644 --- a/crates/nip60_ui/src/wallet.rs +++ b/crates/nip60_ui/src/wallet.rs @@ -10,22 +10,20 @@ use gpui::{ StatefulInteractiveElement as _, Styled, Subscription, Task, Window, div, px, relative, uniform_list, }; -use gpui_kit::assets::IconName; use gpui_kit::base::StyledExt as _; use gpui_kit::component::button::{Button, ButtonVariants as _}; use gpui_kit::component::dock::{Panel, PanelEvent}; use gpui_kit::component::input::{Input, InputEvent, InputState, NumberInput}; use gpui_kit::component::notification::Notification; use gpui_kit::component::separator::Separator; -use gpui_kit::component::{ - ActiveTheme, Disableable as _, Icon, Sizable, WindowExt, h_flex, v_flex, -}; +use gpui_kit::component::{ActiveTheme, Disableable as _, Sizable, WindowExt, h_flex, v_flex}; +use gpui_native_kit::icons::Icon; use nostr_sdk::prelude::*; use person::Directory; use settings::AppSettings; use smallvec::SmallVec; use state::NostrRegistry; -use ui::Avatar; +use ui::{Avatar, IconName}; pub fn init(window: &mut Window, cx: &mut App) -> Entity { cx.new(|cx| WalletPanel::new(window, cx)) @@ -743,9 +741,9 @@ impl Panel for WalletPanel { h_flex() .gap_1p5() .child( - Icon::new(IconName::Wallet) - .small() - .text_color(cx.theme().muted_foreground), + Icon::named(IconName::Wallet) + .size(ui::small_icon_size(cx)) + .color(cx.theme().muted_foreground), ) .child(self.name.clone()) .into_any_element() diff --git a/crates/ui/Cargo.toml b/crates/ui/Cargo.toml index 45e2aeea..033bd19e 100644 --- a/crates/ui/Cargo.toml +++ b/crates/ui/Cargo.toml @@ -11,6 +11,7 @@ person = { path = "../person" } gpui.workspace = true gpui-base.workspace = true gpui-kit.workspace = true +gpui-native-kit.workspace = true nostr-sdk.workspace = true web-time = "1.1" smallvec.workspace = true diff --git a/crates/ui/src/icon.rs b/crates/ui/src/icon.rs index 1e5e8222..bc5c13cd 100644 --- a/crates/ui/src/icon.rs +++ b/crates/ui/src/icon.rs @@ -1,38 +1,68 @@ -use gpui::SharedString; -use gpui_kit::assets::IconNamed; +use gpui::{App, Pixels, SharedString}; +use gpui_native_kit::icons::IconNamed; +use gpui_native_kit::theme::ActiveTheme as _; -/// Coop icons kept from before the gpui-kit migration; absent from the kit bundle. +/// The app-wide icon set: coop's vendored glyphs plus every kit glyph the app uses. #[derive(Clone, Copy)] pub enum IconName { ArrowDownCircle, ArrowLeft, + ArrowRight, + Ban, Book, CaretDown, CaretRight, + Check, CheckCircle, + ChevronDown, + CircleCheck, + CircleX, Close, + Coins, Compass, Door, + Ellipsis, Emoji, Group, + Inbox, + Info, Input, Invite, Link, Lock, + LogIn, + LogOut, Message, + MessageSquare, Paperclip, PaperPlaneFill, + PanelBottom, + PanelBottomOpen, + PanelLeft, + PanelLeftOpen, + PanelRight, + PanelRightOpen, Plus, PlusChat, Profile, Relay, - Speech, + Reply, Search, Settings, Settings2, + Speech, + SquarePen, + TriangleAlert, Unlock, Upload, + UserRoundPlus, + Wallet, Warning, + WindowClose, + WindowMaximize, + WindowMinimize, + WindowRestore, + X, } impl IconNamed for IconName { @@ -40,34 +70,81 @@ impl IconNamed for IconName { match self { Self::ArrowDownCircle => "icons/arrow-down-circle.svg", Self::ArrowLeft => "icons/arrow-left.svg", + Self::ArrowRight => "icons/arrow-right.svg", + Self::Ban => "icons/ban.svg", Self::Book => "icons/book.svg", Self::CaretDown => "icons/caret-down.svg", Self::CaretRight => "icons/caret-right.svg", + Self::Check => "icons/check.svg", Self::CheckCircle => "icons/check-circle.svg", + Self::ChevronDown => "icons/chevron-down.svg", + Self::CircleCheck => "icons/circle-check.svg", + Self::CircleX => "icons/circle-x.svg", Self::Close => "icons/close.svg", + Self::Coins => "icons/coins.svg", Self::Compass => "icons/compass.svg", Self::Door => "icons/door.svg", + Self::Ellipsis => "icons/ellipsis.svg", Self::Emoji => "icons/emoji.svg", Self::Group => "icons/group.svg", + Self::Inbox => "icons/inbox.svg", + Self::Info => "icons/info.svg", Self::Input => "icons/input.svg", Self::Invite => "icons/invite.svg", Self::Link => "icons/link.svg", Self::Lock => "icons/lock.svg", + Self::LogIn => "icons/log-in.svg", + Self::LogOut => "icons/log-out.svg", Self::Message => "icons/message.svg", + Self::MessageSquare => "icons/message-square.svg", Self::Paperclip => "icons/paperclip.svg", Self::PaperPlaneFill => "icons/paper-plane-fill.svg", + Self::PanelBottom => "icons/panel-bottom.svg", + Self::PanelBottomOpen => "icons/panel-bottom-open.svg", + Self::PanelLeft => "icons/panel-left.svg", + Self::PanelLeftOpen => "icons/panel-left-open.svg", + Self::PanelRight => "icons/panel-right.svg", + Self::PanelRightOpen => "icons/panel-right-open.svg", Self::Plus => "icons/plus.svg", Self::PlusChat => "icons/plus-chat.svg", Self::Profile => "icons/profile.svg", Self::Relay => "icons/relay.svg", - Self::Speech => "icons/speech.svg", + Self::Reply => "icons/reply.svg", Self::Search => "icons/search.svg", Self::Settings => "icons/settings.svg", Self::Settings2 => "icons/settings2.svg", + Self::Speech => "icons/speech.svg", + Self::SquarePen => "icons/square-pen.svg", + Self::TriangleAlert => "icons/triangle-alert.svg", Self::Unlock => "icons/unlock.svg", Self::Upload => "icons/upload.svg", + Self::UserRoundPlus => "icons/user-round-plus.svg", + Self::Wallet => "icons/wallet.svg", Self::Warning => "icons/warning.svg", + Self::WindowClose => "icons/x.svg", + Self::WindowMaximize => "icons/square.svg", + Self::WindowMinimize => "icons/minus.svg", + Self::WindowRestore => "icons/copy.svg", + Self::X => "icons/x.svg", } .into() } } + +// The old kit's identical trait, so its components keep accepting coop icons +// until they are replaced in later migration steps. +impl gpui_kit::assets::IconNamed for IconName { + fn path(self) -> SharedString { + IconNamed::path(self) + } +} + +/// The kit's small icon size, for icons drawn beside labels. +pub fn small_icon_size(cx: &App) -> Pixels { + cx.theme().sizes.small.icon_size +} + +/// The kit's dense icon size, for icons inline with dense rows. +pub fn dense_icon_size(cx: &App) -> Pixels { + cx.theme().sizes.small.dense_icon_size +} diff --git a/crates/ui/src/lib.rs b/crates/ui/src/lib.rs index acec50ca..2655d3b0 100644 --- a/crates/ui/src/lib.rs +++ b/crates/ui/src/lib.rs @@ -1,6 +1,6 @@ pub use avatar::Avatar; pub use form::*; -pub use icon::IconName; +pub use icon::{IconName, dense_icon_size, small_icon_size}; pub use message::*; pub use text::*; pub use window_drag::title_bar_drag_handlers; diff --git a/crates/ui/src/message.rs b/crates/ui/src/message.rs index 89b124ce..94d6ce92 100644 --- a/crates/ui/src/message.rs +++ b/crates/ui/src/message.rs @@ -9,7 +9,6 @@ use gpui::{ ParentElement as _, RenderOnce, SharedString, SharedUri, StatefulInteractiveElement as _, StyleRefinement, Styled, StyledImage, Window, div, img, px, }; -use gpui_kit::assets::IconName; use gpui_kit::component::button::{Button, ButtonVariants as _}; use gpui_kit::component::clipboard::Clipboard; use gpui_kit::component::menu::{DropdownMenu as _, PopupMenu, PopupMenuItem}; @@ -19,6 +18,8 @@ use gpui_kit::component::{ }; use smallvec::SmallVec; +use crate::icon::IconName; + type MouseDownListener = Box; type ClickListener = Box; type SharedClickListener = Rc; diff --git a/crates/workspace/src/dialogs/join_group.rs b/crates/workspace/src/dialogs/join_group.rs index e96107e7..12cb1c45 100644 --- a/crates/workspace/src/dialogs/join_group.rs +++ b/crates/workspace/src/dialogs/join_group.rs @@ -1,7 +1,7 @@ use std::rc::Rc; use gpui::{App, AppContext, ClickEvent, ParentElement, Styled, Window, px}; -use gpui_kit::assets::IconName; +use ui::IconName; use gpui_kit::component::button::{Button, ButtonVariants}; use gpui_kit::component::input::{Input, InputState}; use gpui_kit::component::notification::Notification; diff --git a/crates/workspace/src/dialogs/new_chat.rs b/crates/workspace/src/dialogs/new_chat.rs index 81d92ad0..135287c4 100644 --- a/crates/workspace/src/dialogs/new_chat.rs +++ b/crates/workspace/src/dialogs/new_chat.rs @@ -9,7 +9,7 @@ use gpui::{ Render, SharedString, StatefulInteractiveElement as _, Styled, Subscription, Task, WeakEntity, Window, div, px, uniform_list, }; -use gpui_kit::assets::IconName; +use ui::IconName; use gpui_kit::component::button::{Button, ButtonVariants}; use gpui_kit::component::dock::{DockArea, DockPlacement, PanelHandle}; use gpui_kit::component::input::{Input, InputEvent, InputState}; diff --git a/crates/workspace/src/dialogs/new_group.rs b/crates/workspace/src/dialogs/new_group.rs index f41562f9..f2c7a994 100644 --- a/crates/workspace/src/dialogs/new_group.rs +++ b/crates/workspace/src/dialogs/new_group.rs @@ -6,7 +6,7 @@ use gpui::{ Subscription, Task, WeakEntity, Window, div, px, rems, }; use gpui_base::{Popup, Select}; -use gpui_kit::assets::IconName; +use ui::IconName; use gpui_kit::base::StyledExt as _; use gpui_kit::component::button::{Button, ButtonVariants}; use gpui_kit::component::dock::{DockArea, DockPlacement, PanelHandle}; @@ -14,7 +14,8 @@ use gpui_kit::component::group_box::{GroupBox, GroupBoxVariants}; use gpui_kit::component::input::{Input, InputEvent, InputState, Textarea, TextareaState}; use gpui_kit::component::separator::Separator; use gpui_kit::component::switch::Switch; -use gpui_kit::component::{ActiveTheme, Disableable, Icon, Sizable, WindowExt, h_flex, v_flex}; +use gpui_kit::component::{ActiveTheme, Disableable, Sizable, WindowExt, h_flex, v_flex}; +use gpui_native_kit::icons::Icon; use nip29::{GroupCreateOptions, GroupKey, GroupsEvent, GroupsRegistry}; use nostr_sdk::prelude::*; use settings::AppSettings; @@ -379,9 +380,9 @@ impl NewGroup { })) .child(selected.to_owned()) .child( - Icon::new(IconName::ChevronDown) - .small() - .text_color(cx.theme().muted_foreground), + Icon::named(IconName::ChevronDown) + .size(ui::small_icon_size(cx)) + .color(cx.theme().muted_foreground), ); let select = Select::new("relay-select") diff --git a/crates/workspace/src/dialogs/profile.rs b/crates/workspace/src/dialogs/profile.rs index b3c83eb2..7b55474b 100644 --- a/crates/workspace/src/dialogs/profile.rs +++ b/crates/workspace/src/dialogs/profile.rs @@ -7,7 +7,7 @@ use gpui::{ App, AppContext, Context, Div, Entity, IntoElement, ParentElement, Render, SharedString, Styled, Task, Window, div, retain_all, }; -use gpui_kit::assets::IconName; +use ui::IconName; use gpui_kit::base::StyledExt as _; use gpui_kit::component::button::{Button, ButtonVariants}; use gpui_kit::component::clipboard::Clipboard; diff --git a/crates/workspace/src/dialogs/relays.rs b/crates/workspace/src/dialogs/relays.rs index 620a3b94..a4b0b29b 100644 --- a/crates/workspace/src/dialogs/relays.rs +++ b/crates/workspace/src/dialogs/relays.rs @@ -7,7 +7,7 @@ use gpui::{ ParentElement, Render, SharedString, Stateful, Styled, Subscription, Task, TextAlign, WeakEntity, Window, div, rems, }; -use gpui_kit::assets::IconName; +use ui::IconName; use gpui_kit::base::StyledExt as _; use gpui_kit::component::button::{Button, ButtonVariants}; use gpui_kit::component::input::{Input, InputEvent, InputState}; diff --git a/crates/workspace/src/dialogs/restore.rs b/crates/workspace/src/dialogs/restore.rs index 63c5f700..7c74fce5 100644 --- a/crates/workspace/src/dialogs/restore.rs +++ b/crates/workspace/src/dialogs/restore.rs @@ -4,7 +4,7 @@ use gpui::{ AppContext, Context, Entity, IntoElement, ParentElement, Render, SharedString, Styled, Subscription, Task, Window, div, }; -use gpui_kit::assets::IconName; +use ui::IconName; use gpui_kit::component::button::{Button, ButtonVariants}; use gpui_kit::component::input::{Input, InputEvent, InputState}; use gpui_kit::component::{ActiveTheme, WindowExt, h_flex, v_flex}; diff --git a/crates/workspace/src/dialogs/screening.rs b/crates/workspace/src/dialogs/screening.rs index 6defb5bb..9d26b400 100644 --- a/crates/workspace/src/dialogs/screening.rs +++ b/crates/workspace/src/dialogs/screening.rs @@ -7,17 +7,17 @@ use gpui::{ App, AppContext, Context, Div, Entity, InteractiveElement, IntoElement, ParentElement, Render, SharedString, Styled, Subscription, Task, Window, div, px, relative, uniform_list, }; -use gpui_kit::assets::IconName; use gpui_kit::base::StyledExt as _; use gpui_kit::component::button::{Button, ButtonVariants}; use gpui_kit::component::spinner::Spinner; -use gpui_kit::component::{ActiveTheme, Disableable, Icon, Sizable, WindowExt, h_flex, v_flex}; +use gpui_kit::component::{ActiveTheme, Disableable, Sizable, WindowExt, h_flex, v_flex}; +use gpui_native_kit::icons::Icon; use instant::Duration; use nostr_sdk::prelude::*; use person::{Directory, Person, PersonRegistry, shorten_pubkey}; use smallvec::{SmallVec, smallvec}; use state::{BOOTSTRAP_RELAYS, NostrAddress, NostrRegistry, TIMEOUT}; -use ui::Avatar; +use ui::{Avatar, IconName}; pub fn init(public_key: PublicKey, window: &mut Window, cx: &mut App) -> Entity { cx.new(|cx| Screening::new(public_key, window, cx)) @@ -569,13 +569,17 @@ fn status_badge(status: Option, cx: &App) -> Div { .flex_shrink_0() .map(|this| { if let Some(status) = status { - this.child(Icon::new(IconName::CircleCheck).small().text_color({ - if status { - cx.theme().primary - } else { - cx.theme().muted_foreground - } - })) + this.child( + Icon::named(IconName::CircleCheck) + .size(ui::small_icon_size(cx)) + .color({ + if status { + cx.theme().primary + } else { + cx.theme().muted_foreground + } + }), + ) } else { this.child(Spinner::new().small()) } diff --git a/crates/workspace/src/dialogs/settings.rs b/crates/workspace/src/dialogs/settings.rs index d0392084..d10becfe 100644 --- a/crates/workspace/src/dialogs/settings.rs +++ b/crates/workspace/src/dialogs/settings.rs @@ -11,7 +11,7 @@ use gpui::{ AnyElement, App, AppContext, Context, Entity, IntoElement, ParentElement, Render, Styled, Subscription, Window, div, }; -use gpui_kit::assets::IconName; +use ui::IconName; use gpui_kit::component::button::{Button, ButtonVariants}; use gpui_kit::component::input::{Input, InputState}; use gpui_kit::component::kbd::Kbd; diff --git a/crates/workspace/src/dock/tab_panel.rs b/crates/workspace/src/dock/tab_panel.rs index c92101b4..4d8fbc4f 100644 --- a/crates/workspace/src/dock/tab_panel.rs +++ b/crates/workspace/src/dock/tab_panel.rs @@ -15,7 +15,7 @@ use gpui_base::dock::{ PanelView as BasePanelView, TabGroupContext, TabGroupRenderer, }; use gpui_base::{ElementExt, InteractiveElementExt, Tab, Tabs}; -use gpui_kit::assets::IconName; +use ui::IconName; use gpui_kit::component::animation::{Lerp as _, ease_out_cubic}; use gpui_kit::component::button::{Button, ButtonVariants as _}; use gpui_kit::component::dock::{ClosePanel, PanelControl, PanelHandle, ToggleZoom}; diff --git a/crates/workspace/src/dock/window_controls.rs b/crates/workspace/src/dock/window_controls.rs index 708538cf..0ce72578 100644 --- a/crates/workspace/src/dock/window_controls.rs +++ b/crates/workspace/src/dock/window_controls.rs @@ -3,8 +3,9 @@ use gpui::{ App, Hsla, InteractiveElement, IntoElement, MouseButton, ParentElement, RenderOnce, StatefulInteractiveElement, Styled, Window, div, px, }; -use gpui_kit::assets::IconName; -use gpui_kit::component::{ActiveTheme as _, Icon, Sizable as _, h_flex}; +use gpui_kit::component::{ActiveTheme as _, h_flex}; +use gpui_native_kit::icons::Icon; +use ui::IconName; use super::TAB_BAR_HEIGHT; @@ -131,7 +132,7 @@ impl RenderOnce for ControlIcon { } }) }) - .child(Icon::new(self.icon()).small()) + .child(Icon::named(self.icon()).size(ui::small_icon_size(cx))) } } diff --git a/crates/workspace/src/panels/browse.rs b/crates/workspace/src/panels/browse.rs index db9073b9..2f8c161a 100644 --- a/crates/workspace/src/panels/browse.rs +++ b/crates/workspace/src/panels/browse.rs @@ -9,19 +9,19 @@ use gpui::{ size, transparent_black, }; use gpui_base::{VirtualListScrollHandle, v_virtual_list}; -use gpui_kit::assets::IconName; use gpui_kit::base::StyledExt as _; use gpui_kit::component::button::{Button, ButtonVariants}; use gpui_kit::component::dock::{DockArea, DockPlacement, Panel, PanelEvent, PanelHandle}; use gpui_kit::component::input::{Input, InputEvent, InputState}; use gpui_kit::component::notification::Notification; use gpui_kit::component::scroll::Scrollbar; -use gpui_kit::component::{ActiveTheme, Icon, Sizable, WindowExt, h_flex, v_flex}; +use gpui_kit::component::{ActiveTheme, Sizable, WindowExt, h_flex, v_flex}; +use gpui_native_kit::icons::Icon; use nip29::{Discovery, GroupCandidate, GroupKey, GroupsEvent, GroupsRegistry, Membership}; use nostr_sdk::prelude::{RelayUrl, Timestamp}; use settings::AppSettings; use smallvec::{SmallVec, smallvec}; -use ui::Avatar; +use ui::{Avatar, IconName}; const TITLE: &str = "Browse"; const INPUT_PLACEHOLDER: &str = "wss://relay.example.com"; @@ -437,7 +437,7 @@ impl BrowsePanel { .w_full() .gap_1p5() .text_color(cx.theme().muted_foreground) - .child(Icon::new(IconName::Book)) + .child(Icon::named(IconName::Book)) .child( div() .text_xs() @@ -464,9 +464,9 @@ impl Panel for BrowsePanel { .gap_1() .text_xs() .child( - Icon::new(IconName::Compass) - .small() - .text_color(cx.theme().muted_foreground), + Icon::named(IconName::Compass) + .size(ui::small_icon_size(cx)) + .color(cx.theme().muted_foreground), ) .child(TITLE) .into_any_element() diff --git a/crates/workspace/src/panels/contact_list.rs b/crates/workspace/src/panels/contact_list.rs index 059eb876..89c31559 100644 --- a/crates/workspace/src/panels/contact_list.rs +++ b/crates/workspace/src/panels/contact_list.rs @@ -7,7 +7,7 @@ use gpui::{ IntoElement, ParentElement, Render, SharedString, Styled, Subscription, Task, TextAlign, Window, div, rems, retain_all, }; -use gpui_kit::assets::IconName; +use ui::IconName; use gpui_kit::base::StyledExt as _; use gpui_kit::component::button::{Button, ButtonVariants}; use gpui_kit::component::dock::{Panel, PanelEvent}; diff --git a/crates/workspace/src/panels/greeter.rs b/crates/workspace/src/panels/greeter.rs index 5807094a..c9235fad 100644 --- a/crates/workspace/src/panels/greeter.rs +++ b/crates/workspace/src/panels/greeter.rs @@ -9,17 +9,17 @@ use gpui::{ InteractiveElement, IntoElement, ParentElement, Render, SharedString, StatefulInteractiveElement, Styled, Subscription, Task, WeakEntity, Window, div, svg, }; -use gpui_kit::assets::IconName; use gpui_kit::base::StyledExt as _; use gpui_kit::component::button::{Button, ButtonVariants}; use gpui_kit::component::dock::{DockArea, DockPlacement, Panel, PanelEvent, PanelHandle}; use gpui_kit::component::scroll::ScrollableElement; -use gpui_kit::component::{ActiveTheme, Icon, Sizable, h_flex, v_flex}; +use gpui_kit::component::{ActiveTheme, Sizable, h_flex, v_flex}; +use gpui_native_kit::icons::Icon; use nostr_sdk::prelude::*; use person::PersonRegistry; use smallvec::{SmallVec, smallvec}; use state::{NostrRegistry, StateEvent}; -use ui::Avatar; +use ui::{Avatar, IconName}; use super::browse; use crate::dock::add_panel_to; @@ -458,7 +458,7 @@ impl GreeterPanel { .w_full() .child( Nav::new("browse-group") - .prefix(Icon::new(IconName::Compass)) + .prefix(Icon::named(IconName::Compass)) .label("Browse Public Groups") .text_sm() .on_click(cx.listener(|this, _, window, cx| { @@ -474,7 +474,7 @@ impl GreeterPanel { ) .child( Nav::new("browse-posts") - .prefix(Icon::new(IconName::Link)) + .prefix(Icon::named(IconName::Link)) .label("Browse Nostr via Jumble") .text_sm() .on_click(|_, _, cx| { diff --git a/crates/workspace/src/panels/inbox.rs b/crates/workspace/src/panels/inbox.rs index e3feed66..5b3bc599 100644 --- a/crates/workspace/src/panels/inbox.rs +++ b/crates/workspace/src/panels/inbox.rs @@ -2,9 +2,10 @@ use gpui::{ App, AppContext, Context, Entity, EventEmitter, FocusHandle, Focusable, IntoElement, ParentElement, Render, SharedString, Styled, Window, }; -use gpui_kit::assets::IconName; use gpui_kit::component::dock::{Panel, PanelEvent}; -use gpui_kit::component::{ActiveTheme, Icon, Sizable, h_flex}; +use gpui_kit::component::{ActiveTheme, h_flex}; +use gpui_native_kit::icons::Icon; +use ui::IconName; pub fn init(window: &mut Window, cx: &mut App) -> Entity { cx.new(|cx| InboxPanel::new(window, cx)) @@ -35,9 +36,9 @@ impl Panel for InboxPanel { h_flex() .gap_1p5() .child( - Icon::new(IconName::Inbox) - .small() - .text_color(cx.theme().muted_foreground), + Icon::named(IconName::Inbox) + .size(ui::small_icon_size(cx)) + .color(cx.theme().muted_foreground), ) .child(self.name.clone()) .into_any_element() diff --git a/crates/workspace/src/sidebar/group_view.rs b/crates/workspace/src/sidebar/group_view.rs index 954ecd5c..be427a23 100644 --- a/crates/workspace/src/sidebar/group_view.rs +++ b/crates/workspace/src/sidebar/group_view.rs @@ -8,7 +8,8 @@ use gpui::{ }; use gpui_kit::base::StyledExt as _; use gpui_kit::component::menu::{ContextMenuExt as _, PopupMenuItem}; -use gpui_kit::component::{ActiveTheme, Icon, Sizable, h_flex, v_flex}; +use gpui_kit::component::{ActiveTheme, Sizable, h_flex, v_flex}; +use gpui_native_kit::icons::Icon; use nip29::Group; use nostr_sdk::prelude::*; use settings::AppSettings; @@ -231,9 +232,9 @@ impl Sidebar { Nav::new(label) .label(label) .suffix( - Icon::new(icon) - .small() - .text_color(cx.theme().muted_foreground), + Icon::named(icon) + .size(ui::small_icon_size(cx)) + .color(cx.theme().muted_foreground), ) .text_xs() .font_semibold() diff --git a/crates/workspace/src/sidebar/header.rs b/crates/workspace/src/sidebar/header.rs index d9ade48c..41139ee9 100644 --- a/crates/workspace/src/sidebar/header.rs +++ b/crates/workspace/src/sidebar/header.rs @@ -16,7 +16,8 @@ use gpui_kit::component::dialog::DialogButtonProps; use gpui_kit::component::menu::{DropdownMenu, PopupMenuItem}; use gpui_kit::component::popover::Popover; use gpui_kit::component::separator::Separator; -use gpui_kit::component::{ActiveTheme, Icon, Selectable, Sizable, WindowExt, h_flex, v_flex}; +use gpui_kit::component::{ActiveTheme, Selectable, Sizable, WindowExt, h_flex, v_flex}; +use gpui_native_kit::icons::Icon; use nostr_sdk::prelude::*; use person::shorten_pubkey; use settings::AppSettings; @@ -210,7 +211,7 @@ impl Sidebar { }) } - pub(super) fn render_footer(&self, loading: bool, _cx: &mut Context) -> Div { + pub(super) fn render_footer(&self, loading: bool, cx: &mut Context) -> Div { v_flex() .p_2() .flex_shrink_0() @@ -220,7 +221,7 @@ impl Sidebar { .when(!loading, |this| { this.child( Nav::new("settings") - .prefix(Icon::new(IconName::Settings).small()) + .prefix(Icon::named(IconName::Settings).size(ui::small_icon_size(cx))) .center_prefix(true) .label("Settings") .text_sm() diff --git a/crates/workspace/src/sidebar/list.rs b/crates/workspace/src/sidebar/list.rs index ec846d49..fdeb6735 100644 --- a/crates/workspace/src/sidebar/list.rs +++ b/crates/workspace/src/sidebar/list.rs @@ -6,7 +6,8 @@ use gpui::{ AnyElement, App, Context, IntoElement, ParentElement, SharedString, Styled, div, uniform_list, }; use gpui_kit::base::StyledExt as _; -use gpui_kit::component::{ActiveTheme, Icon, Sizable, h_flex, v_flex}; +use gpui_kit::component::{ActiveTheme, h_flex, v_flex}; +use gpui_native_kit::icons::Icon; use nip29::GroupsRegistry; use settings::AppSettings; use ui::IconName; @@ -70,7 +71,7 @@ impl Sidebar { .when(cfg!(not(target_arch = "wasm32")), |this| { this.child( Nav::new("wallet") - .prefix(Icon::new(gpui_kit::assets::IconName::Wallet).small()) + .prefix(Icon::named(IconName::Wallet).size(ui::small_icon_size(cx))) .label("Wallet") .text_sm() .on_click(|_, window, cx| { @@ -80,7 +81,7 @@ impl Sidebar { }) .child( Nav::new("browse") - .prefix(Icon::new(IconName::Compass).small()) + .prefix(Icon::named(IconName::Compass).size(ui::small_icon_size(cx))) .label("Browse") .text_sm() .on_click(|_, window, cx| { @@ -89,7 +90,7 @@ impl Sidebar { ) .child( Nav::new("reqs") - .prefix(Icon::new(IconName::Invite).small()) + .prefix(Icon::named(IconName::Invite).size(ui::small_icon_size(cx))) .label("Requests") .text_sm() .when(request_count > 0, |this| { @@ -129,7 +130,7 @@ impl Sidebar { ) .child( Nav::new("contacts") - .prefix(Icon::new(IconName::Book).small()) + .prefix(Icon::named(IconName::Book).size(ui::small_icon_size(cx))) .label("Contacts") .text_sm() .when(contacts_open, |this| this.bg(cx.theme().list_active)) diff --git a/crates/workspace/src/sidebar/rows.rs b/crates/workspace/src/sidebar/rows.rs index 753028d5..aa3879c6 100644 --- a/crates/workspace/src/sidebar/rows.rs +++ b/crates/workspace/src/sidebar/rows.rs @@ -11,7 +11,8 @@ use gpui_kit::base::StyledExt as _; use gpui_kit::component::dialog::DialogButtonProps; use gpui_kit::component::dock::{ClosePanel, DockArea, DockPlacement, PanelHandle}; use gpui_kit::component::menu::{ContextMenuExt as _, PopupMenuItem}; -use gpui_kit::component::{ActiveTheme, Icon, Selectable, Sizable, WindowExt, h_flex}; +use gpui_kit::component::{ActiveTheme, Selectable, Sizable, WindowExt, h_flex}; +use gpui_native_kit::icons::Icon; use nip29::Group; use nostr_sdk::prelude::*; use settings::AppSettings; @@ -119,9 +120,9 @@ impl Sidebar { Nav::new(label) .label(label) .suffix( - Icon::new(icon) - .small() - .text_color(cx.theme().muted_foreground), + Icon::named(icon) + .size(ui::small_icon_size(cx)) + .color(cx.theme().muted_foreground), ) .text_xs() .font_semibold() diff --git a/crates/workspace/src/sidebar/search.rs b/crates/workspace/src/sidebar/search.rs index 7024a4c9..b3ba83e8 100644 --- a/crates/workspace/src/sidebar/search.rs +++ b/crates/workspace/src/sidebar/search.rs @@ -6,7 +6,7 @@ use gpui::{ AnyElement, App, Context, Entity, IntoElement, ParentElement, SharedString, Styled, Task, Window, div, uniform_list, }; -use gpui_kit::assets::IconName; +use ui::IconName; use gpui_kit::component::button::{Button, ButtonVariants}; use gpui_kit::component::input::Input; use gpui_kit::component::{ActiveTheme, Selectable, Sizable, h_flex, v_flex};