Add `Details` component

Marshall Bowers created

Change summary

crates/storybook2/src/stories/elements.rs         |  1 
crates/storybook2/src/stories/elements/details.rs | 31 +++++++++++++
crates/storybook2/src/story_selector.rs           |  2 
crates/ui2/src/elements.rs                        |  2 
crates/ui2/src/elements/details.rs                | 40 +++++++++++++++++
5 files changed, 76 insertions(+)

Detailed changes

crates/storybook2/src/stories/elements/details.rs 🔗

@@ -0,0 +1,31 @@
+use std::marker::PhantomData;
+
+use ui::prelude::*;
+use ui::Details;
+
+use crate::story::Story;
+
+#[derive(Element)]
+pub struct DetailsStory<S: 'static + Send + Sync + Clone> {
+    state_type: PhantomData<S>,
+}
+
+impl<S: 'static + Send + Sync + Clone> DetailsStory<S> {
+    pub fn new() -> Self {
+        Self {
+            state_type: PhantomData,
+        }
+    }
+
+    fn render(&mut self, cx: &mut ViewContext<S>) -> impl Element<State = S> {
+        Story::container(cx)
+            .child(Story::title_for::<_, Details<S>>(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."),
+            )
+    }
+}

crates/storybook2/src/story_selector.rs 🔗

@@ -14,6 +14,7 @@ use ui::prelude::*;
 pub enum ElementStory {
     Avatar,
     Button,
+    Details,
     Icon,
     Input,
     Label,
@@ -26,6 +27,7 @@ impl ElementStory {
         match self {
             Self::Avatar => elements::avatar::AvatarStory::new().into_any(),
             Self::Button => elements::button::ButtonStory::new().into_any(),
+            Self::Details => elements::details::DetailsStory::new().into_any(),
             Self::Icon => elements::icon::IconStory::new().into_any(),
             Self::Input => elements::input::InputStory::new().into_any(),
             Self::Label => elements::label::LabelStory::new().into_any(),

crates/ui2/src/elements.rs 🔗

@@ -1,5 +1,6 @@
 mod avatar;
 mod button;
+mod details;
 mod icon;
 mod input;
 mod label;
@@ -9,6 +10,7 @@ mod tool_divider;
 
 pub use avatar::*;
 pub use button::*;
+pub use details::*;
 pub use icon::*;
 pub use input::*;
 pub use label::*;

crates/ui2/src/elements/details.rs 🔗

@@ -0,0 +1,40 @@
+use std::marker::PhantomData;
+
+use crate::prelude::*;
+use crate::theme;
+
+#[derive(Element, Clone)]
+pub struct Details<S: 'static + Send + Sync + Clone> {
+    state_type: PhantomData<S>,
+    text: &'static str,
+    meta: Option<&'static str>,
+}
+
+impl<S: 'static + Send + Sync + Clone> Details<S> {
+    pub fn new(text: &'static str) -> Self {
+        Self {
+            state_type: PhantomData,
+            text,
+            meta: None,
+        }
+    }
+
+    pub fn meta_text(mut self, meta: &'static str) -> Self {
+        self.meta = Some(meta);
+        self
+    }
+
+    fn render(&mut self, cx: &mut ViewContext<S>) -> impl Element<State = S> {
+        let theme = theme(cx);
+
+        div()
+            // .flex()
+            // .w_full()
+            .p_1()
+            .gap_0p5()
+            .text_xs()
+            .text_color(theme.lowest.base.default.foreground)
+            .child(self.text)
+            .children(self.meta.map(|m| m))
+    }
+}