use super::*;
const PERCENT_SCALE: f64 = 100.0;
#[derive(Clone, CustomDebug, Data, Default)]
pub struct EuvSliderProps {
#[get(type(copy))]
pub id: &'static str,
#[get(type(copy))]
pub name: &'static str,
#[get(type(copy))]
pub min: f64,
#[get(type(copy))]
pub max: f64,
#[get(type(copy))]
pub step: f64,
#[get(type(copy))]
pub value: Signal<f64>,
#[get(type(copy))]
pub label: &'static str,
#[debug(skip)]
pub oninput: Option<Rc<dyn Fn(Event)>>,
}
pub struct EuvSliderHelpers;
impl EuvSliderHelpers {
pub fn percent(value: f64, min: f64, max: f64) -> f64 {
if max <= min {
return 0.0;
}
let ratio: f64 = (value - min) / (max - min);
let clamped: f64 = ratio.clamp(0.0, 1.0);
clamped * PERCENT_SCALE
}
pub fn on_slider_input(signal: Signal<f64>, min: f64, max: f64) -> Option<Rc<dyn Fn(Event)>> {
Some(Rc::new(move |event: Event| {
let raw: Option<f64> = event.target().and_then(|target: EventTarget| {
if let Ok(input) = target.dyn_into::<HtmlInputElement>() {
return input.value().parse::<f64>().ok();
}
None
});
if let Some(parsed) = raw {
signal.set(parsed.clamp(min, max));
}
}))
}
}