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}