diff --git a/crates/workspace/src/views/repo_detail/mod.rs b/crates/workspace/src/views/repo_detail/mod.rs index 719b747..db95040 100644 --- a/crates/workspace/src/views/repo_detail/mod.rs +++ b/crates/workspace/src/views/repo_detail/mod.rs @@ -11,7 +11,7 @@ use gpui::prelude::*; use gpui::{ Action, Anchor, AnyElement, App, ClipboardItem, Context, Entity, EventEmitter, FocusHandle, Focusable, PathPromptOptions, Pixels, Render, SharedString, Size, Subscription, Task, - WeakEntity, Window, div, px, relative, size, + WeakEntity, Window, div, px, relative, size, transparent_white, }; use gpui_base::{Button as BaseButton, Disableable, Popover}; use gpui_component::alert::Alert; @@ -1985,26 +1985,51 @@ impl RepoDetailView { let path = status.path.clone(); let commits = if status.ahead == 1 { - "1 commit".to_owned() + SharedString::from("1 commit") } else { - format!("{} commits", status.ahead) + SharedString::from(format!("{} commits", status.ahead)) }; - let message = SharedString::from(format!( - "{} has {} ready to push in {}", - status.branch, - commits, - status.path.display() - )); - Some( h_flex() - .px_4() + .p_4() .gap_2() .w_full() .items_center() .justify_between() - .child(div().text_sm().child(message)) + .bg(cx.theme().muted) + .child( + h_flex() + .gap_2() + .text_sm() + .text_color(cx.theme().info) + .child( + h_flex() + .px_1() + .rounded(cx.theme().radius) + .border_1() + .border_color(cx.theme().info) + .bg(cx.theme().info.mix_oklab(transparent_white(), 0.04)) + .text_xs() + .font_semibold() + .font_family(cx.theme().mono_font_family.clone()) + .child(status.branch), + ) + .child("has") + .child( + h_flex() + .px_1() + .rounded(cx.theme().radius) + .border_1() + .border_color(cx.theme().info) + .bg(cx.theme().info.mix_oklab(transparent_white(), 0.04)) + .text_xs() + .font_semibold() + .font_family(cx.theme().mono_font_family.clone()) + .child(commits), + ) + .child("ready to push"), + ) .child( h_flex() .gap_1() @@ -2023,6 +2048,7 @@ impl RepoDetailView { .child( Button::new("close-repo") .icon(IconName::Close) + .tooltip("Dismiss") .small() .ghost() .disabled(self.pushing) @@ -2309,9 +2335,7 @@ impl Render for RepoDetailView { .image_cache(gpui::retain_all("repo")) .id("repo") .size_full() - .when_some(banner, |this, banner| { - this.child(v_flex().gap_1().py_4().bg(cx.theme().muted).child(banner)) - }) + .when_some(banner, |this, banner| this.child(banner)) .child(self.render_header(cx)) .when_some(self.error.clone(), |this, error| { this.child( @@ -2339,6 +2363,7 @@ impl Render for RepoDetailView { } /// Read the worktree state of `repo`, no network. +/// /// Entries, README, refs and HEAD commit. fn load_repo_data(repo: &Repository) -> Result { let entries = signed_git::worktree_entries(repo)?; @@ -2375,9 +2400,6 @@ fn load_repo_data(repo: &Repository) -> Result { } /// The `nostr://...` clone URL of an announcement, NIP-34. -/// The owner as a NIP-05 identifier when known, npub otherwise. -/// The first announced relay is a hint, plus the repository identifier. -/// `nip05` is the owner's NIP-05 identifier from the profile store, already blank-filtered. fn nostr_clone_url(announcement: &Announcement, nip05: Option<&str>) -> SharedString { let owner = announcement.owner; let user = nip05 @@ -2396,6 +2418,7 @@ fn nostr_clone_url(announcement: &Announcement, nip05: Option<&str>) -> SharedSt } /// The forked-from row of the detail header. +/// /// Clickable link to the upstream repository when the `u` tag references a NIP-34 repo. /// Plain text when it only carries a git URL. fn fork_row(announcement: &Announcement, cx: &mut Context) -> Option { @@ -2443,9 +2466,6 @@ fn fork_row(announcement: &Announcement, cx: &mut Context) -> Op } /// Open `announcement` as a repository panel in the dock's center. -/// Returns the new detail view. -/// Shared by the explore list, the sidebar and fork links. -/// Every entry point opens repositories identically. pub(crate) fn open_repo_panel( dock_area: &WeakEntity, announcement: &Announcement, diff --git a/crates/workspace/src/views/sidebar/mod.rs b/crates/workspace/src/views/sidebar/mod.rs index 96db48a..523bc10 100644 --- a/crates/workspace/src/views/sidebar/mod.rs +++ b/crates/workspace/src/views/sidebar/mod.rs @@ -11,10 +11,9 @@ use dock::{ use gpui::prelude::*; use gpui::{ AnyElement, App, Context, Div, EventEmitter, FocusHandle, Focusable, ObjectFit, Render, - SharedString, Subscription, WeakEntity, Window, div, img, px, uniform_list, + SharedString, Subscription, WeakEntity, Window, div, img, px, relative, uniform_list, white, }; use gpui_base::Button as BaseButton; -use gpui_component::badge::Badge; use gpui_component::button::{Button, ButtonVariants}; use gpui_component::input::InputState; use gpui_component::{ActiveTheme, Icon, IconName, Sizable, StyledExt, h_flex, v_flex}; @@ -400,7 +399,19 @@ impl SidebarPanel { let mut row = NavItem::new(format!("repo:{}", announcement.id), name, avatar); if unpushed > 0 { - row = row.suffix(Badge::new().count(unpushed).xsmall()); + row = row.suffix( + v_flex() + .flex_shrink_0() + .size_4() + .items_center() + .justify_center() + .rounded_full() + .line_height(relative(1.)) + .bg(cx.theme().red_light) + .text_color(white()) + .text_size(px(8.)) + .child(SharedString::from(unpushed.to_string())), + ); } row.on_click(