mirror of
https://github.com/adoyle0/thaw.git
synced 2025-01-23 06:19:22 -05:00
✨ feat: slider component ameliorate
This commit is contained in:
parent
357c7c5862
commit
071055d9fa
4 changed files with 39 additions and 2 deletions
|
@ -18,6 +18,7 @@ stylers = "0.3.1"
|
||||||
web-sys = "0.3.61"
|
web-sys = "0.3.61"
|
||||||
leptos_dom = { version = "0.2.5" }
|
leptos_dom = { version = "0.2.5" }
|
||||||
leptos-icons = { git = "https://github.com/Carlosted/leptos-icons.git", features = ["AiCloseOutlined", "AiCheckOutlined"] }
|
leptos-icons = { git = "https://github.com/Carlosted/leptos-icons.git", features = ["AiCloseOutlined", "AiCheckOutlined"] }
|
||||||
|
wasm-bindgen = "0.2.84"
|
||||||
|
|
||||||
[workspace]
|
[workspace]
|
||||||
members = ["examples/basic"]
|
members = ["examples/basic"]
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
use crate::{theme::use_theme, utils::mount_style::mount_style, Theme};
|
use crate::{
|
||||||
|
theme::use_theme,
|
||||||
|
utils::{dom::window_event_listener, mount_style::mount_style},
|
||||||
|
Theme,
|
||||||
|
};
|
||||||
use leptos::*;
|
use leptos::*;
|
||||||
use stylers::style_sheet_str;
|
use stylers::style_sheet_str;
|
||||||
|
|
||||||
|
@ -30,12 +34,27 @@ pub fn Slider(
|
||||||
});
|
});
|
||||||
let class_name = mount_style("slider", || style_sheet_str!("./src/slider/slider.css"));
|
let class_name = mount_style("slider", || style_sheet_str!("./src/slider/slider.css"));
|
||||||
|
|
||||||
|
let rail_ref = create_node_ref::<html::Div>(cx);
|
||||||
|
let (is_mouse_move, set_mouse_move) = create_signal(cx, false);
|
||||||
|
let on_mouse_down = move |_| {
|
||||||
|
set_mouse_move.set(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
let on_mouse_move = window_event_listener("mousemove", move |_| {
|
||||||
|
if is_mouse_move.get() {
|
||||||
|
rail_ref.on_load(cx, move |rail| {
|
||||||
|
// rail.get_bounding_client_rect();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
on_cleanup(cx, on_mouse_move);
|
||||||
|
|
||||||
view! {cx, class=class_name,
|
view! {cx, class=class_name,
|
||||||
<div class="melt-slider" style=move || css_vars.get()>
|
<div class="melt-slider" style=move || css_vars.get()>
|
||||||
<div class="melt-slider-rail">
|
<div class="melt-slider-rail">
|
||||||
<div class="melt-slider-rail__fill" style=move || format!("width: {}%", percentage.get())></div>
|
<div class="melt-slider-rail__fill" style=move || format!("width: {}%", percentage.get())></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="melt-slider-handle" style=move || format!("left: {}%; transform: translateX(-{}%)", percentage.get(), percentage.get())>
|
<div on:mousedown=on_mouse_down class="melt-slider-handle" style=move || format!("left: {}%; transform: translateX(-{}%)", percentage.get(), percentage.get())>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
16
src/utils/dom.rs
Normal file
16
src/utils/dom.rs
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
use leptos::window;
|
||||||
|
use wasm_bindgen::{prelude::Closure, JsCast};
|
||||||
|
|
||||||
|
pub fn window_event_listener<'a>(
|
||||||
|
event_name: &'a str,
|
||||||
|
cb: impl Fn(web_sys::Event) + 'static,
|
||||||
|
) -> impl FnOnce() -> () + 'a {
|
||||||
|
let handler = Box::new(cb) as Box<dyn FnMut(web_sys::Event)>;
|
||||||
|
|
||||||
|
let cb = Closure::wrap(handler).into_js_value();
|
||||||
|
_ = window().add_event_listener_with_callback(event_name, cb.unchecked_ref());
|
||||||
|
|
||||||
|
move || {
|
||||||
|
_ = window().remove_event_listener_with_callback(event_name, cb.unchecked_ref());
|
||||||
|
}
|
||||||
|
}
|
|
@ -1 +1,2 @@
|
||||||
pub(crate) mod mount_style;
|
pub(crate) mod mount_style;
|
||||||
|
pub mod dom;
|
||||||
|
|
Loading…
Add table
Reference in a new issue