use crate::prelude::*; use crate::{v_stack, ButtonGroup}; #[derive(Component)] pub struct Details { text: &'static str, meta: Option<&'static str>, actions: Option>, } impl Details { pub fn new(text: &'static str) -> Self { Self { text, meta: None, actions: None, } } pub fn meta_text(mut self, meta: &'static str) -> Self { self.meta = Some(meta); self } pub fn actions(mut self, actions: ButtonGroup) -> Self { self.actions = Some(actions); self } fn render(self, _view: &mut V, cx: &mut ViewContext) -> impl Component { v_stack() .p_1() .gap_0p5() .text_ui_sm() .text_color(cx.theme().colors().text) .size_full() .child(self.text) .children(self.meta.map(|m| m)) .children(self.actions.map(|a| a)) } } #[cfg(feature = "stories")] pub use stories::*; #[cfg(feature = "stories")] mod stories { use super::*; use crate::{Button, Story}; use gpui::{Div, Render}; pub struct DetailsStory; impl Render for DetailsStory { type Element = Div; fn render(&mut self, cx: &mut ViewContext) -> Self::Element { Story::container(cx) .child(Story::title_for::<_, Details>(cx)) .child(Story::label(cx, "Default")) .child(Details::new("The quick brown fox jumps over the lazy dog")) .child(Story::label(cx, "With meta")) .child( Details::new("The quick brown fox jumps over the lazy dog") .meta_text("Sphinx of black quartz, judge my vow."), ) .child(Story::label(cx, "With meta and actions")) .child( Details::new("The quick brown fox jumps over the lazy dog") .meta_text("Sphinx of black quartz, judge my vow.") .actions(ButtonGroup::new(vec![ Button::new("Decline"), Button::new("Accept").variant(crate::ButtonVariant::Filled), ])), ) } } }