Skip to main content

shadow_design/
tooltip.rs

1use dioxus::prelude::*;
2
3#[derive(Clone, Copy, PartialEq, Debug, Default)]
4pub enum TooltipPosition {
5    #[default]
6    Top,
7    Bottom,
8    Left,
9    Right,
10}
11
12impl TooltipPosition {
13    pub fn bubble_class(&self) -> &'static str {
14        match self {
15            TooltipPosition::Top => "sd-tooltip__bubble--top",
16            TooltipPosition::Bottom => "sd-tooltip__bubble--bottom",
17            TooltipPosition::Left => "sd-tooltip__bubble--left",
18            TooltipPosition::Right => "sd-tooltip__bubble--right",
19        }
20    }
21}
22
23#[component]
24pub fn Tooltip(
25    content: String,
26    #[props(default)] position: TooltipPosition,
27    #[props(default)] glow: Option<bool>,
28    #[props(default)] class: String,
29    children: Element,
30) -> Element {
31    let position_class = position.bubble_class();
32
33    #[cfg(feature = "theme")]
34    let theme_val = crate::theme::use_theme()();
35    #[cfg(feature = "theme")]
36    let base_override = theme_val.resolve_component_base("tooltip").unwrap_or("");
37    #[cfg(feature = "theme")]
38    let class_modifiers = theme_val.resolve_class_modifiers("tooltip", &class);
39    #[cfg(feature = "theme")]
40    let glow_class = theme_val.resolve_elevation_class("tooltip", glow);
41
42    #[cfg(not(feature = "theme"))]
43    let base_override = "";
44    #[cfg(not(feature = "theme"))]
45    let class_modifiers = String::new();
46    #[cfg(not(feature = "theme"))]
47    let glow_class = if glow == Some(true) {
48        "sd-tooltip__bubble--glow".to_string()
49    } else {
50        String::new()
51    };
52
53    rsx! {
54        div {
55            class: "sd-tooltip {class_modifiers} {class}",
56            {children}
57            div {
58                class: "sd-tooltip__bubble {base_override} {position_class} {glow_class}",
59                "{content}"
60            }
61        }
62    }
63}