diff --git a/src/color_picker/color-picker.css b/src/color_picker/color-picker.css index ecfcb31..f4aa05f 100644 --- a/src/color_picker/color-picker.css +++ b/src/color_picker/color-picker.css @@ -70,7 +70,7 @@ .melt-color-picker-slider { height: 12px; - padding-right: 12px; + padding: 0 6px; background-image: linear-gradient( 90deg, red, diff --git a/src/color_picker/mod.rs b/src/color_picker/mod.rs index a41836b..a3ecd66 100644 --- a/src/color_picker/mod.rs +++ b/src/color_picker/mod.rs @@ -99,7 +99,7 @@ pub fn ColorPicker(#[prop(optional, into)] value: MaybeRwSignal) -> impl I } > - + @@ -107,19 +107,19 @@ pub fn ColorPicker(#[prop(optional, into)] value: MaybeRwSignal) -> impl I } #[component] -fn Panel(hue: ReadSignal, sv: RwSignal<(f64, f64)>) -> impl IntoView { +fn ColorPanel(hue: ReadSignal, sv: RwSignal<(f64, f64)>) -> impl IntoView { let panel_ref = create_node_ref::(); let mouse = store_value(Vec::::new()); - let on_mouse_down = move |_| { - let on_mouse_move = window_event_listener(ev::mousemove, move |ev| { + let on_mouse_down = move |ev| { + let cb = move |ev: ev::MouseEvent| { if let Some(panel) = panel_ref.get_untracked() { let rect = panel.get_bounding_client_rect(); let ev_x = f64::from(ev.x()); let ev_y = f64::from(ev.y()); let v = (rect.bottom() - ev_y) / rect.height(); - let s = (ev_x - rect.x()) / rect.width(); + let s = (ev_x - rect.left()) / rect.width(); let v = if v > 1.0 { 1.0 @@ -138,7 +138,9 @@ fn Panel(hue: ReadSignal, sv: RwSignal<(f64, f64)>) -> impl IntoView { sv.set((s, v)) } - }); + }; + cb(ev); + let on_mouse_move = window_event_listener(ev::mousemove, cb); let on_mouse_up = window_event_listener(ev::mouseup, move |_| { mouse.update_value(|value| { for handle in value.drain(..).into_iter() { @@ -153,7 +155,7 @@ fn Panel(hue: ReadSignal, sv: RwSignal<(f64, f64)>) -> impl IntoView { }; view! { -
+
, sv: RwSignal<(f64, f64)>) -> impl IntoView {
@@ -183,12 +183,12 @@ fn HueSlider(hue: RwSignal) -> impl IntoView { let rail_ref = create_node_ref::(); let mouse = store_value(Vec::::new()); - let on_mouse_down = move |_| { - let on_mouse_move = window_event_listener(ev::mousemove, move |ev| { + let on_mouse_down = move |ev| { + let cb = move |ev: ev::MouseEvent| { if let Some(rail) = rail_ref.get_untracked() { let rect = rail.get_bounding_client_rect(); let ev_x = f64::from(ev.x()); - let value = (ev_x - rect.x()) / (rect.width() - 12.0) * 360.0; + let value = (ev_x - rect.left() - 6.0) / (rect.width() - 12.0) * 359.0; let value = if value < 0.0 { 0 } else if value > 359.0 { @@ -198,7 +198,10 @@ fn HueSlider(hue: RwSignal) -> impl IntoView { }; hue.set(value); } - }); + }; + cb(ev); + + let on_mouse_move = window_event_listener(ev::mousemove, cb); let on_mouse_up = window_event_listener(ev::mouseup, move |_| { mouse.update_value(|value| { for handle in value.drain(..).into_iter() { @@ -212,11 +215,10 @@ fn HueSlider(hue: RwSignal) -> impl IntoView { }); }; view! { -
+
}