mirror of
https://github.com/adoyle0/thaw.git
synced 2025-02-02 16:44:15 -05:00
Feat/drawer (#71)
* feat: add drawer component * feat: drawer style * fix(demo): nightly Callback
This commit is contained in:
parent
74e5491d3d
commit
9eda9757d3
8 changed files with 177 additions and 0 deletions
|
@ -34,3 +34,11 @@ hydrate = [
|
||||||
"thaw/hydrate",
|
"thaw/hydrate",
|
||||||
]
|
]
|
||||||
nightly = ["leptos/nightly", "leptos_meta/nightly", "leptos_router/nightly"]
|
nightly = ["leptos/nightly", "leptos_meta/nightly", "leptos_router/nightly"]
|
||||||
|
|
||||||
|
# https://benw.is/posts/how-i-improved-my-rust-compile-times-by-seventy-five-percent#optimization-level
|
||||||
|
|
||||||
|
[profile.dev]
|
||||||
|
opt-level = 1
|
||||||
|
|
||||||
|
[profile.dev.package."*"]
|
||||||
|
opt-level = 3
|
|
@ -56,6 +56,7 @@ fn TheRouter(is_routing: RwSignal<bool>) -> impl IntoView {
|
||||||
<Route path="/color-picker" view=ColorPickerMdPage/>
|
<Route path="/color-picker" view=ColorPickerMdPage/>
|
||||||
<Route path="/date-picker" view=DatePickerMdPage/>
|
<Route path="/date-picker" view=DatePickerMdPage/>
|
||||||
<Route path="/divider" view=DividerMdPage/>
|
<Route path="/divider" view=DividerMdPage/>
|
||||||
|
<Route path="/drawer" view=DrawerMdPage/>
|
||||||
<Route path="/grid" view=GridMdPage/>
|
<Route path="/grid" view=GridMdPage/>
|
||||||
<Route path="/icon" view=IconMdPage/>
|
<Route path="/icon" view=IconMdPage/>
|
||||||
<Route path="/image" view=ImageMdPage/>
|
<Route path="/image" view=ImageMdPage/>
|
||||||
|
|
|
@ -233,6 +233,10 @@ pub(crate) fn gen_menu_data() -> Vec<MenuGroupOption> {
|
||||||
value: "badge".into(),
|
value: "badge".into(),
|
||||||
label: "Badge".into(),
|
label: "Badge".into(),
|
||||||
},
|
},
|
||||||
|
MenuItemOption {
|
||||||
|
value: "drawer".into(),
|
||||||
|
label: "Drawer".into(),
|
||||||
|
},
|
||||||
MenuItemOption {
|
MenuItemOption {
|
||||||
value: "message".into(),
|
value: "message".into(),
|
||||||
label: "Message".into(),
|
label: "Message".into(),
|
||||||
|
|
35
demo_markdown/docs/drawer/mod.md
Normal file
35
demo_markdown/docs/drawer/mod.md
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
# Drawer
|
||||||
|
|
||||||
|
```rust demo
|
||||||
|
let show = create_rw_signal(false);
|
||||||
|
let placement = create_rw_signal(DrawerPlacement::Top);
|
||||||
|
|
||||||
|
let open = Callback::new(move |new_placement: DrawerPlacement| {
|
||||||
|
show.set(true);
|
||||||
|
placement.set(new_placement);
|
||||||
|
});
|
||||||
|
|
||||||
|
view! {
|
||||||
|
<ButtonGroup>
|
||||||
|
<Button on_click=Callback::new(move |_| open.call(DrawerPlacement::Top))>"Top"</Button>
|
||||||
|
<Button on_click=Callback::new(move |_| open.call(DrawerPlacement::Right))>"Right"</Button>
|
||||||
|
<Button on_click=Callback::new(move |_| open.call(DrawerPlacement::Bottom))>"Bottom"</Button>
|
||||||
|
<Button on_click=Callback::new(move |_| open.call(DrawerPlacement::Left))>"Left"</Button>
|
||||||
|
</ButtonGroup>
|
||||||
|
<Drawer title="Title" show placement>
|
||||||
|
"Hello"
|
||||||
|
</Drawer>
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Drawer Props
|
||||||
|
|
||||||
|
| Name | Type | Default | Desciption |
|
||||||
|
| --------- | ------------------------------ | ------------------------ | ----------------------------------------- |
|
||||||
|
| class | `MaybeSignal<String>` | `Default::default()` | Addtional classes for the drawer element. |
|
||||||
|
| show | `MaybeSignal<bool>` | | Whether to show drawer. |
|
||||||
|
| title | `MaybeSignal<String>` | `Default::default()` | Drawer title. |
|
||||||
|
| placement | `MaybeSignal<DrawerPlacement>` | `DrawerPlacement::Right` | Drawer placement. |
|
||||||
|
| width | `MaybeSignal<String>` | `520px` | Drawer width. |
|
||||||
|
| height | `MaybeSignal<String>` | `260px` | Drawer height. |
|
||||||
|
| children | `Children` | | Drawer content. |
|
|
@ -50,6 +50,7 @@ pub fn include_md(_token_stream: proc_macro::TokenStream) -> proc_macro::TokenSt
|
||||||
include_str!("../docs/date_picker/mod.md"),
|
include_str!("../docs/date_picker/mod.md"),
|
||||||
),
|
),
|
||||||
("DividerMdPage", include_str!("../docs/divider/mod.md")),
|
("DividerMdPage", include_str!("../docs/divider/mod.md")),
|
||||||
|
("DrawerMdPage", include_str!("../docs/drawer/mod.md")),
|
||||||
("GridMdPage", include_str!("../docs/grid/mod.md")),
|
("GridMdPage", include_str!("../docs/grid/mod.md")),
|
||||||
("IconMdPage", include_str!("../docs/icon/mod.md")),
|
("IconMdPage", include_str!("../docs/icon/mod.md")),
|
||||||
("ImageMdPage", include_str!("../docs/image/mod.md")),
|
("ImageMdPage", include_str!("../docs/image/mod.md")),
|
||||||
|
|
61
thaw/src/drawer/drawer.css
Normal file
61
thaw/src/drawer/drawer.css
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
.thaw-drawer-container {
|
||||||
|
z-index: 2001;
|
||||||
|
}
|
||||||
|
|
||||||
|
.thaw-drawer-mask {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
left: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background-color: #0007;
|
||||||
|
z-index: 2000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.thaw-drawer {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 2002;
|
||||||
|
}
|
||||||
|
|
||||||
|
.thaw-drawer > .thaw-card {
|
||||||
|
border-radius: 0;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.thaw-drawer > .thaw-card > .thaw-card__header {
|
||||||
|
border-bottom: 1px solid var(--thaw-border-color);
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.thaw-drawer > .thaw-card > .thaw-card__content {
|
||||||
|
flex: 1;
|
||||||
|
padding: 20px 28px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.thaw-drawer--placement-top {
|
||||||
|
height: var(--thaw-height);
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.thaw-drawer--placement-bottom {
|
||||||
|
height: var(--thaw-height);
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.thaw-drawer--placement-left {
|
||||||
|
width: var(--thaw-width);
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.thaw-drawer--placement-right {
|
||||||
|
width: var(--thaw-width);
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
right: 0;
|
||||||
|
}
|
65
thaw/src/drawer/mod.rs
Normal file
65
thaw/src/drawer/mod.rs
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
use crate::{
|
||||||
|
components::Teleport,
|
||||||
|
utils::{class_list::class_list, mount_style},
|
||||||
|
Card,
|
||||||
|
};
|
||||||
|
use leptos::*;
|
||||||
|
|
||||||
|
#[component]
|
||||||
|
pub fn Drawer(
|
||||||
|
#[prop(into)] show: RwSignal<bool>,
|
||||||
|
#[prop(optional, into)] title: MaybeSignal<String>,
|
||||||
|
#[prop(optional, into)] placement: MaybeSignal<DrawerPlacement>,
|
||||||
|
#[prop(default = MaybeSignal::Static("520px".to_string()), into)] width: MaybeSignal<String>,
|
||||||
|
#[prop(default = MaybeSignal::Static("260px".to_string()), into)] height: MaybeSignal<String>,
|
||||||
|
#[prop(optional, into)] class: MaybeSignal<String>,
|
||||||
|
children: Children,
|
||||||
|
) -> impl IntoView {
|
||||||
|
mount_style("drawer", include_str!("./drawer.css"));
|
||||||
|
let css_vars = create_memo(move |_| {
|
||||||
|
let mut css_vars = String::new();
|
||||||
|
css_vars.push_str(&format!("--thaw-width: {};", width.get()));
|
||||||
|
css_vars.push_str(&format!("--thaw-height: {};", height.get()));
|
||||||
|
css_vars
|
||||||
|
});
|
||||||
|
|
||||||
|
view! {
|
||||||
|
<Teleport>
|
||||||
|
<div
|
||||||
|
class="thaw-drawer-container"
|
||||||
|
style=move || if show.get() { "" } else { "display: none" }
|
||||||
|
>
|
||||||
|
<div class="thaw-drawer-mask" on:click=move |_| show.set(false)></div>
|
||||||
|
<div
|
||||||
|
class=class_list![
|
||||||
|
"thaw-drawer", move || format!("thaw-drawer--placement-{}", placement.get()
|
||||||
|
.as_str()), move || class.get()
|
||||||
|
]
|
||||||
|
style=move || css_vars.get()
|
||||||
|
>
|
||||||
|
<Card title>{children()}</Card>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Teleport>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Default)]
|
||||||
|
pub enum DrawerPlacement {
|
||||||
|
Top,
|
||||||
|
Bottom,
|
||||||
|
Left,
|
||||||
|
#[default]
|
||||||
|
Right,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DrawerPlacement {
|
||||||
|
pub fn as_str(&self) -> &'static str {
|
||||||
|
match self {
|
||||||
|
Self::Top => "top",
|
||||||
|
Self::Bottom => "bottom",
|
||||||
|
Self::Left => "left",
|
||||||
|
Self::Right => "right",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,6 +12,7 @@ mod color_picker;
|
||||||
mod components;
|
mod components;
|
||||||
mod date_picker;
|
mod date_picker;
|
||||||
mod divider;
|
mod divider;
|
||||||
|
mod drawer;
|
||||||
mod global_style;
|
mod global_style;
|
||||||
mod grid;
|
mod grid;
|
||||||
mod icon;
|
mod icon;
|
||||||
|
@ -56,6 +57,7 @@ pub use code::*;
|
||||||
pub use color_picker::*;
|
pub use color_picker::*;
|
||||||
pub use date_picker::*;
|
pub use date_picker::*;
|
||||||
pub use divider::*;
|
pub use divider::*;
|
||||||
|
pub use drawer::*;
|
||||||
pub use global_style::*;
|
pub use global_style::*;
|
||||||
pub use grid::*;
|
pub use grid::*;
|
||||||
pub use icon::*;
|
pub use icon::*;
|
||||||
|
|
Loading…
Add table
Reference in a new issue