Skip to main content

orbital_base_components/overlay/trigger/
mod.rs

1mod styles;
2
3use leptos::{prelude::*, tachys::html::class::class as tachys_class};
4use orbital_style::inject_style;
5
6use super::visibility::UseOverlayVisibility;
7
8pub use styles::overlay_trigger_styles;
9
10#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
11pub enum OverlayTriggerType {
12    #[default]
13    Hover,
14    Click,
15}
16
17/// Trigger slot for anchored overlays — wraps children in a stable inline-flex target.
18#[slot]
19pub struct OverlayTrigger<T> {
20    children: TypedChildren<T>,
21}
22
23impl OverlayTriggerType {
24    pub fn uses_hover(&self) -> bool {
25        matches!(self, Self::Hover)
26    }
27
28    pub fn uses_click(&self) -> bool {
29        matches!(self, Self::Click)
30    }
31}
32
33pub fn render_overlay_trigger<T>(
34    overlay_trigger: OverlayTrigger<T>,
35    visibility: &UseOverlayVisibility,
36    trigger_type: OverlayTriggerType,
37    open_class: &'static str,
38) -> impl IntoView
39where
40    T: AddAnyAttr + IntoView + Send + 'static,
41{
42    inject_style("orbital-overlay-trigger", overlay_trigger_styles());
43
44    let OverlayTrigger { children } = overlay_trigger;
45    let is_show = visibility.is_show;
46    let inner = children.into_inner()().into_inner();
47    let wrapped = view! {
48        <span class="orbital-overlay-trigger">
49            {inner}
50        </span>
51    }
52    .into_view()
53    .add_any_attr(tachys_class((open_class, move || is_show.get())));
54
55    visibility.attach_trigger(wrapped, trigger_type)
56}