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};