diff --git a/examples/basic/src/demo_slider.rs b/examples/basic/src/demo_slider.rs new file mode 100644 index 0000000..560a568 --- /dev/null +++ b/examples/basic/src/demo_slider.rs @@ -0,0 +1,9 @@ +use leptos::*; +use melt_ui::*; + +#[component] +pub fn DemoSlider(cx: Scope) -> impl IntoView { + view! { cx, + + } +} diff --git a/examples/basic/src/main.rs b/examples/basic/src/main.rs index 19853e6..806ac9f 100644 --- a/examples/basic/src/main.rs +++ b/examples/basic/src/main.rs @@ -3,9 +3,12 @@ use melt_ui::*; mod demo_button; mod demo_checkbox; mod demo_modal; +mod demo_slider; + pub use demo_button::*; pub use demo_checkbox::*; pub use demo_modal::*; +pub use demo_slider::*; #[component] pub fn App(cx: Scope) -> impl IntoView { @@ -49,6 +52,8 @@ pub fn App(cx: Scope) -> impl IntoView {
+
+ } } diff --git a/src/lib.rs b/src/lib.rs index ce682b1..07c2325 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,7 @@ mod checkbox; mod input; mod modal; mod progress; +mod slider; mod space; mod table; mod teleport; @@ -15,6 +16,7 @@ pub use checkbox::*; pub use input::*; pub use modal::*; pub use progress::*; +pub use slider::*; pub use space::*; pub use table::*; pub use theme::Theme; diff --git a/src/slider/mod.rs b/src/slider/mod.rs new file mode 100644 index 0000000..b8371a6 --- /dev/null +++ b/src/slider/mod.rs @@ -0,0 +1,42 @@ +use crate::{theme::use_theme, utils::mount_style::mount_style, Theme}; +use leptos::*; +use stylers::style_sheet_str; + +#[component] +pub fn Slider( + cx: Scope, + #[prop(optional, into)] value: MaybeSignal, + #[prop(optional)] on_value: Option>, + #[prop(default = MaybeSignal::Static(100f64), into)] max: MaybeSignal, +) -> impl IntoView { + let theme = use_theme(cx, Theme::light); + let css_vars = create_memo(cx, move |_| { + let mut css_vars = String::new(); + let theme = theme.get(); + let bg_color = theme.common.color_primary; + css_vars.push_str(&format!("--background-color-fill: {bg_color};")); + + css_vars + }); + + let percentage = create_memo(cx, move |_| { + if value.get() < 0.0 || max.get() <= 0.0 { + 0f64 + } else if value.get() >= max.get() { + 100f64 + } else { + value.get() / max.get() * 100.0 + } + }); + let class_name = mount_style("slider", || style_sheet_str!("./src/slider/slider.css")); + + view! {cx, class=class_name, +
+
+
+
+
+
+
+ } +} diff --git a/src/slider/slider.css b/src/slider/slider.css new file mode 100644 index 0000000..4f72346 --- /dev/null +++ b/src/slider/slider.css @@ -0,0 +1,25 @@ +.melt-slider { + position: relative; + padding: 6px 0; + cursor: pointer; +} +.melt-slider-rail { + height: 4px; + background-color: #e6e6e6; + border-radius: 2px; +} +.melt-slider-rail__fill { + width: 0%; + height: 4px; + background-color: var(--background-color-fill); + border-radius: 2px; +} +.melt-slider-handle { + position: absolute; + top: 0px; + width: 16px; + height: 16px; + border-radius: 50%; + background-color: white; + box-shadow: 0px 0px 4px #2224; +}