orbital_base_components/overlay/trigger/
mod.rs1mod 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#[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}