diff --git a/demo_markdown/docs/slider/mod.md b/demo_markdown/docs/slider/mod.md
index f37522a..d007071 100644
--- a/demo_markdown/docs/slider/mod.md
+++ b/demo_markdown/docs/slider/mod.md
@@ -1,7 +1,7 @@
# Slider
```rust demo
-let value = create_rw_signal(0.0);
+let value = RwSignal::new(0.0);
view! {
@@ -11,20 +11,20 @@ view! {
### Step
```rust demo
-let value = create_rw_signal(0.0);
+let value = RwSignal::new(0.0);
view! {
-
+
}
```
## Slider Label
```rust demo
-let value = create_rw_signal(0.0);
+let value = RwSignal::new(0.0);
view! {
-
+
"0"
diff --git a/thaw/src/slider/mod.rs b/thaw/src/slider/mod.rs
index 2719ec1..ee277d3 100644
--- a/thaw/src/slider/mod.rs
+++ b/thaw/src/slider/mod.rs
@@ -5,114 +5,106 @@ pub use slider_label::SliderLabel;
use leptos::*;
use thaw_components::OptionComp;
use thaw_utils::{class_list, mount_style, Model, OptionalProp};
-use web_sys::DomRect;
#[component]
pub fn Slider(
#[prop(optional, into)] value: Model,
- #[prop(default = MaybeSignal::Static(100f64), into)] max: MaybeSignal,
- #[prop(optional, into)] step: MaybeSignal,
+ #[prop(default = 0f64.into(), into)] min: MaybeSignal,
+ #[prop(default = 100f64.into(), into)] max: MaybeSignal,
+ #[prop(optional, into)] step: MaybeProp,
#[prop(optional, into)] class: OptionalProp>,
#[prop(optional)] children: Option,
) -> impl IntoView {
mount_style("slider", include_str!("./slider.css"));
- let percentage = create_memo(move |_| {
- if value.get() < 0.0 || max.get() <= 0.0 {
- 0f64
- } else if value.get() >= max.get() {
- 100f64
+ let is_chldren = children.is_some();
+ let list_id = is_chldren.then(|| uuid::Uuid::new_v4().to_string());
+ let current_value = Memo::new(move |_| {
+ let max = max.get();
+ let min = min.get();
+ let v = value.get();
+ if v > max {
+ max
+ } else if v < min {
+ min
} else {
- value.get() / max.get() * 100.0
+ v
}
});
- let do_update_value = move |mut val| {
- let step = step.get_untracked();
- if step > 0.0 {
- let result: f64 = val / step;
- if result.fract() != 0.0 {
- let prev_multiple = (result.floor() * step).abs();
- let mut next_multiple = (result.ceil() * step).abs();
- let max = max.get_untracked();
- if next_multiple > max {
- next_multiple = max;
- }
- if val - prev_multiple > next_multiple - val {
- val = next_multiple;
- } else {
- val = prev_multiple;
- }
+ let on_input = move |e: ev::Event| {
+ if let Ok(range_value) = event_target_value(&e).parse::() {
+ value.set(range_value);
+ }
+ };
+
+ let css_vars = move || {
+ let max = max.get();
+ let min = min.get();
+ let mut css_vars = format!(
+ "--thaw-slider--direction: 90deg;--thaw-slider--progress: {:.2}%;",
+ if max == min {
+ 0.0
+ } else {
+ (current_value.get() - min) / (max - min) * 100.0
+ }
+ );
+
+ if is_chldren {
+ css_vars.push_str(&format!("--thaw-slider--max: {:.2};", max));
+ css_vars.push_str(&format!("--thaw-slider--min: {:.2};", min));
+ }
+
+ if let Some(step) = step.get() {
+ if step > 0.0 {
+ css_vars.push_str(&format!(
+ "--thaw-slider--steps-percent: {:.2}%",
+ step * 100.0 / (max - min)
+ ));
}
}
- value.set(val);
+ css_vars
};
- let rail_ref = create_node_ref::();
- let (mouse_move_value, set_mouse_move_value) = create_signal::
}
}