diff --git a/Cargo.toml b/Cargo.toml index 8529ed5..2e56d59 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,7 @@ stylers = "0.3.1" web-sys = "0.3.61" leptos_dom = { version = "0.2.5" } leptos-icons = { git = "https://github.com/Carlosted/leptos-icons.git", features = ["AiCloseOutlined", "AiCheckOutlined"] } +wasm-bindgen = "0.2.84" [workspace] members = ["examples/basic"] diff --git a/src/slider/mod.rs b/src/slider/mod.rs index b8371a6..aa37e7c 100644 --- a/src/slider/mod.rs +++ b/src/slider/mod.rs @@ -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 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 rail_ref = create_node_ref::(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,
-
+
} diff --git a/src/utils/dom.rs b/src/utils/dom.rs new file mode 100644 index 0000000..1dd8581 --- /dev/null +++ b/src/utils/dom.rs @@ -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; + + 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()); + } +} diff --git a/src/utils/mod.rs b/src/utils/mod.rs index f8a5cd4..97de455 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -1 +1,2 @@ pub(crate) mod mount_style; +pub mod dom;