diff --git a/crates/feedback/src/feedback.rs b/crates/feedback/src/feedback.rs index f95f24f557..cd72cdf950 100644 --- a/crates/feedback/src/feedback.rs +++ b/crates/feedback/src/feedback.rs @@ -20,7 +20,12 @@ impl_actions!(zed, [OpenBrowser]); actions!( zed, - [CopySystemSpecsIntoClipboard, FileBugReport, RequestFeature] + [ + CopySystemSpecsIntoClipboard, + FileBugReport, + RequestFeature, + OpenZedCommunityRepo + ] ); pub fn init(app_state: Arc, cx: &mut MutableAppContext) { @@ -66,4 +71,11 @@ pub fn init(app_state: Arc, cx: &mut MutableAppContext) { }); }, ); + + cx.add_action( + |_: &mut Workspace, _: &OpenZedCommunityRepo, cx: &mut ViewContext| { + let url = "https://github.com/zed-industries/community"; + cx.dispatch_action(OpenBrowser { url: url.into() }); + }, + ); } diff --git a/crates/feedback/src/feedback_info_text.rs b/crates/feedback/src/feedback_info_text.rs index 6693a7cb44..8c31050109 100644 --- a/crates/feedback/src/feedback_info_text.rs +++ b/crates/feedback/src/feedback_info_text.rs @@ -1,10 +1,12 @@ use gpui::{ - elements::Label, Element, ElementBox, Entity, RenderContext, View, ViewContext, ViewHandle, + elements::{Flex, Label, MouseEventHandler, ParentElement, Text}, + CursorStyle, Element, ElementBox, Entity, MouseButton, RenderContext, View, ViewContext, + ViewHandle, }; use settings::Settings; use workspace::{item::ItemHandle, ToolbarItemLocation, ToolbarItemView}; -use crate::feedback_editor::FeedbackEditor; +use crate::{feedback_editor::FeedbackEditor, OpenZedCommunityRepo}; pub struct FeedbackInfoText { active_item: Option>, @@ -29,9 +31,44 @@ impl View for FeedbackInfoText { fn render(&mut self, cx: &mut RenderContext) -> ElementBox { let theme = cx.global::().theme.clone(); - let text = "We read whatever you submit here. For issues and discussions, visit the community repo on GitHub."; - Label::new(text, theme.feedback.info_text.text.clone()) - .contained() + + Flex::row() + .with_child( + Text::new( + "We read whatever you submit here. For issues and discussions, visit the ", + theme.feedback.info_text_default.text.clone(), + ) + .with_soft_wrap(false) + .aligned() + .boxed(), + ) + .with_child( + MouseEventHandler::::new(0, cx, |state, _| { + let contained_text = if state.hovered() { + &theme.feedback.link_text_hover + } else { + &theme.feedback.link_text_default + }; + + Label::new("community repo", contained_text.text.clone()) + .contained() + .aligned() + .left() + .clipped() + .boxed() + }) + .with_cursor_style(CursorStyle::PointingHand) + .on_click(MouseButton::Left, |_, cx| { + cx.dispatch_action(OpenZedCommunityRepo) + }) + .boxed(), + ) + .with_child( + Text::new(" on GitHub.", theme.feedback.info_text_default.text.clone()) + .with_soft_wrap(false) + .aligned() + .boxed(), + ) .aligned() .left() .clipped() diff --git a/crates/theme/src/theme.rs b/crates/theme/src/theme.rs index 4e10b81447..efe64cbc5c 100644 --- a/crates/theme/src/theme.rs +++ b/crates/theme/src/theme.rs @@ -821,7 +821,9 @@ pub struct TerminalStyle { pub struct FeedbackStyle { pub submit_button: Interactive, pub button_margin: f32, - pub info_text: ContainedText, + pub info_text_default: ContainedText, + pub link_text_default: ContainedText, + pub link_text_hover: ContainedText, } #[derive(Clone, Deserialize, Default)] diff --git a/styles/src/styleTree/feedback.ts b/styles/src/styleTree/feedback.ts index 9d09058842..d794674439 100644 --- a/styles/src/styleTree/feedback.ts +++ b/styles/src/styleTree/feedback.ts @@ -31,6 +31,8 @@ export default function feedback(colorScheme: ColorScheme) { }, }, button_margin: 8, - info_text: text(layer, "sans", "default", { size: "xs" }), + info_text_default: text(layer, "sans", "default", { size: "xs" }), + link_text_default: text(layer, "sans", "default", { size: "xs", underline: true }), + link_text_hover: text(layer, "sans", "hovered", { size: "xs", underline: true }) } }