diff --git a/crates/storybook2/src/stories/components.rs b/crates/storybook2/src/stories/components.rs index 9016567de4..0da4010aed 100644 --- a/crates/storybook2/src/stories/components.rs +++ b/crates/storybook2/src/stories/components.rs @@ -12,6 +12,7 @@ pub mod multi_buffer; pub mod palette; pub mod panel; pub mod project_panel; +pub mod recent_projects; pub mod tab; pub mod tab_bar; pub mod terminal; diff --git a/crates/storybook2/src/stories/components/recent_projects.rs b/crates/storybook2/src/stories/components/recent_projects.rs new file mode 100644 index 0000000000..d347092f79 --- /dev/null +++ b/crates/storybook2/src/stories/components/recent_projects.rs @@ -0,0 +1,26 @@ +use std::marker::PhantomData; + +use ui::prelude::*; +use ui::RecentProjects; + +use crate::story::Story; + +#[derive(Element)] +pub struct RecentProjectsStory { + state_type: PhantomData, +} + +impl RecentProjectsStory { + pub fn new() -> Self { + Self { + state_type: PhantomData, + } + } + + fn render(&mut self, cx: &mut ViewContext) -> impl Element { + Story::container(cx) + .child(Story::title_for::<_, RecentProjects>(cx)) + .child(Story::label(cx, "Default")) + .child(RecentProjects::new()) + } +} diff --git a/crates/storybook2/src/story_selector.rs b/crates/storybook2/src/story_selector.rs index d75e14bd32..b1df686f7c 100644 --- a/crates/storybook2/src/story_selector.rs +++ b/crates/storybook2/src/story_selector.rs @@ -50,6 +50,7 @@ pub enum ComponentStory { Palette, Panel, ProjectPanel, + RecentProjects, Tab, TabBar, Terminal, @@ -86,6 +87,9 @@ impl ComponentStory { Self::Palette => components::palette::PaletteStory::new().into_any(), Self::Panel => components::panel::PanelStory::new().into_any(), Self::ProjectPanel => components::project_panel::ProjectPanelStory::new().into_any(), + Self::RecentProjects => { + components::recent_projects::RecentProjectsStory::new().into_any() + } Self::Tab => components::tab::TabStory::new().into_any(), Self::TabBar => components::tab_bar::TabBarStory::new().into_any(), Self::Terminal => components::terminal::TerminalStory::new().into_any(), diff --git a/crates/ui2/src/components.rs b/crates/ui2/src/components.rs index a9557baac6..f47676ed5f 100644 --- a/crates/ui2/src/components.rs +++ b/crates/ui2/src/components.rs @@ -17,6 +17,7 @@ mod panel; mod panes; mod player_stack; mod project_panel; +mod recent_projects; mod status_bar; mod tab; mod tab_bar; @@ -47,6 +48,7 @@ pub use panel::*; pub use panes::*; pub use player_stack::*; pub use project_panel::*; +pub use recent_projects::*; pub use status_bar::*; pub use tab::*; pub use tab_bar::*; diff --git a/crates/ui2/src/components/recent_projects.rs b/crates/ui2/src/components/recent_projects.rs new file mode 100644 index 0000000000..2bdc4ea3ec --- /dev/null +++ b/crates/ui2/src/components/recent_projects.rs @@ -0,0 +1,36 @@ +use std::marker::PhantomData; + +use crate::prelude::*; +use crate::{OrderMethod, Palette, PaletteItem}; + +#[derive(Element)] +pub struct RecentProjects { + state_type: PhantomData, + scroll_state: ScrollState, +} + +impl RecentProjects { + pub fn new() -> Self { + Self { + state_type: PhantomData, + scroll_state: ScrollState::default(), + } + } + + fn render(&mut self, cx: &mut ViewContext) -> impl Element { + div().child( + Palette::new(self.scroll_state.clone()) + .items(vec![ + PaletteItem::new("zed").sublabel("~/projects/zed"), + PaletteItem::new("saga").sublabel("~/projects/saga"), + PaletteItem::new("journal").sublabel("~/journal"), + PaletteItem::new("dotfiles").sublabel("~/dotfiles"), + PaletteItem::new("zed.dev").sublabel("~/projects/zed.dev"), + PaletteItem::new("laminar").sublabel("~/projects/laminar"), + ]) + .placeholder("Recent Projects...") + .empty_string("No matches") + .default_order(OrderMethod::Ascending), + ) + } +}