tallyweb_components/
tooltip.rs1use leptos::*;
2
3#[component]
4pub fn ToolTip<T: html::ElementDescriptor + Clone + 'static>(
5 parent_node: NodeRef<T>,
6 #[prop(optional, default=std::time::Duration::from_secs(1))] delay: std::time::Duration,
7 children: ChildrenFn,
8) -> impl IntoView {
9 let is_shown = create_rw_signal(false);
10 let is_hovering = create_rw_signal(false);
11 let mouse_pos = create_rw_signal((0, 0));
12
13 if let Some(element) = parent_node.get_untracked() {
14 let _ = element.clone().on(ev::mouseover, move |_: ev::MouseEvent| {
15 is_hovering.set(true);
16 set_timeout(
17 move || {
18 if is_hovering.try_get().unwrap_or_default() {
19 is_shown.try_set(true);
20 }
21 },
22 delay,
23 )
24 });
25 let _ = element.clone().on(ev::mouseout, move |_: ev::MouseEvent| {
26 is_hovering.set(false);
27 is_shown.set(false);
28 });
29 let _ = element.on(ev::mousemove, move |ev: ev::MouseEvent| {
30 if !is_shown() {
31 mouse_pos.set((ev.x(), ev.y()))
32 }
33 });
34 }
35
36 view! {
37 <Show when=is_shown>
38 <tool-tip
39 style:left=move || format!("{}px", mouse_pos().0 + 8)
40 style:top=move || format!("{}px", mouse_pos().1 + 16)
41 >
42 {children()}
43 </tool-tip>
44 </Show>
45 }
46}