use gpui::{AnyElement, Div, StyleRefinement};use smallvec::SmallVec;use ui::{prelude::*, ButtonLike}; #[derive(IntoElement)]pub struct FeatureUpsell { base: Div, text: SharedString, docs_url: Option<SharedString>, children: SmallVec<[AnyElement; 2]>,} impl FeatureUpsell { pub fn new(text: impl Into<SharedString>) -> Self { Self { base: h_flex(), text: text.into(), docs_url: None, children: SmallVec::new(), } } pub fn docs_url(mut self, docs_url: impl Into<SharedString>) -> Self { self.docs_url = Some(docs_url.into()); self }} impl ParentElement for FeatureUpsell { fn extend(&mut self, elements: impl IntoIterator<Item = AnyElement>) { self.children.extend(elements) }} // Style methods.impl FeatureUpsell { fn style(&mut self) -> &mut StyleRefinement { self.base.style() } gpui::border_style_methods!({ visibility: pub });} impl RenderOnce for FeatureUpsell { fn render(self, _window: &mut Window, cx: &mut App) -> impl IntoElement { self.base .p_4() .justify_between() .border_color(cx.theme().colors().border) .child(v_flex().overflow_hidden().child(Label::new(self.text))) .child(h_flex().gap_2().children(self.children).when_some( self.docs_url, |el, docs_url| { el.child( ButtonLike::new("open_docs") .child( h_flex() .gap_2() .child(Label::new("View docs")) .child(Icon::new(IconName::ArrowUpRight)), ) .on_click({ let docs_url = docs_url.clone(); move |_event, _window, cx| { telemetry::event!( "Documentation Viewed", source = "Feature Upsell", url = docs_url, ); cx.open_url(&docs_url) } }), ) }, )) }}
use gpui::{AnyElement, Div, StyleRefinement};
use smallvec::SmallVec;
use ui::{prelude::*, ButtonLike};
#[derive(IntoElement)]
pub struct FeatureUpsell {
base: Div,
text: SharedString,
docs_url: Option<SharedString>,
children: SmallVec<[AnyElement; 2]>,
}
impl FeatureUpsell {
pub fn new(text: impl Into<SharedString>) -> Self {
Self {
base: h_flex(),
text: text.into(),
docs_url: None,
children: SmallVec::new(),
}
}
pub fn docs_url(mut self, docs_url: impl Into<SharedString>) -> Self {
self.docs_url = Some(docs_url.into());
self
}
}
impl ParentElement for FeatureUpsell {
fn extend(&mut self, elements: impl IntoIterator<Item = AnyElement>) {
self.children.extend(elements)
}
}
// Style methods.
impl FeatureUpsell {
fn style(&mut self) -> &mut StyleRefinement {
self.base.style()
}
gpui::border_style_methods!({
visibility: pub
});
}
impl RenderOnce for FeatureUpsell {
fn render(self, _window: &mut Window, cx: &mut App) -> impl IntoElement {
self.base
.p_4()
.justify_between()
.border_color(cx.theme().colors().border)
.child(v_flex().overflow_hidden().child(Label::new(self.text)))
.child(h_flex().gap_2().children(self.children).when_some(
self.docs_url,
|el, docs_url| {
el.child(
ButtonLike::new("open_docs")
.child(
h_flex()
.gap_2()
.child(Label::new("View docs"))
.child(Icon::new(IconName::ArrowUpRight)),
)
.on_click({
let docs_url = docs_url.clone();
move |_event, _window, cx| {
telemetry::event!(
"Documentation Viewed",
source = "Feature Upsell",
url = docs_url,
);
cx.open_url(&docs_url)
}
}),
)
},
))
}
}