orbital-base-components 0.1.1

Headless base primitives for Orbital — structure, semantics, and accessibility
Documentation
use leptos::{html, prelude::*};

use super::{
    base::{merge_config, AnchoredOverlay},
    config::TooltipVariant,
};
use crate::overlay::{
    appearance::OverlayAppearance, panel_surface::OverlaySurface, placement::Placement,
};

#[component]
pub fn BaseTooltip<TTrigger>(
    #[prop(optional)] placement: Option<Placement>,
    #[prop(optional)] appearance: Option<OverlayAppearance>,
    #[prop(default = 0u64)] show_delay_ms: u64,
    #[prop(default = 100u64)] hide_delay_ms: u64,
    #[prop(optional, into)] class: MaybeProp<String>,
    #[prop(default = None)] mount: Option<NodeRef<html::Div>>,
    trigger: TypedChildren<TTrigger>,
    children: Children,
) -> impl IntoView
where
    TTrigger: AddAnyAttr + IntoView + Send + 'static,
{
    let appearance = appearance.unwrap_or(OverlayAppearance::Normal);
    let config = merge_config(
        TooltipVariant::config(),
        None,
        placement,
        Some(appearance),
        Some(show_delay_ms),
        Some(hide_delay_ms),
    );

    let shell_class = Signal::derive(move || {
        let mut classes = vec!["orbital-tooltip-shell".to_string()];
        if let Some(extra) = class.get() {
            if !extra.is_empty() {
                classes.push(extra);
            }
        }
        classes.join(" ")
    });

    view! {
        <AnchoredOverlay config=config trigger=trigger mount=mount>
            <OverlaySurface class=shell_class>
                {children()}
            </OverlaySurface>
        </AnchoredOverlay>
    }
}