use leptos::prelude::*;
#[cfg(feature = "preview")]
use orbital_macros::component_doc;
use crate::callback::MotionElementCallback;
use crate::presence::{stagger_motion, OrbitalPresence, PresenceMotion};
use crate::tokens::MotionDuration;
#[derive(Clone, Copy)]
pub struct MotionGroupContext {
pub motion: Signal<PresenceMotion>,
pub stagger: Signal<MotionDuration>,
}
#[cfg_attr(
feature = "preview",
component_doc(
category = "Motion",
preview_slug = "orbital-presence-group",
preview_label = "Orbital Presence Group",
preview_icon = icondata::AiOrderedListOutlined,
)
)]
#[component]
pub fn OrbitalPresenceGroup(
#[prop(into)] motion: Signal<PresenceMotion>,
#[prop(optional, into)] stagger: Option<Signal<MotionDuration>>,
children: Children,
) -> impl IntoView {
let stagger = stagger.unwrap_or_else(|| Signal::from(MotionDuration::Normal));
provide_context(MotionGroupContext { motion, stagger });
children()
}
#[component]
pub fn OrbitalPresenceGroupItem(
#[prop(into)] show: Signal<bool>,
#[prop(into)]
index: Signal<usize>,
#[prop(optional)]
on_after_leave: Option<MotionElementCallback>,
children: Children,
) -> impl IntoView {
let ctx = use_context::<MotionGroupContext>()
.expect("OrbitalPresenceGroupItem must be used inside OrbitalPresenceGroup");
let motion =
Signal::derive(move || stagger_motion(ctx.motion.get(), ctx.stagger.get(), index.get()));
let on_after_leave =
on_after_leave.unwrap_or_else(|| MotionElementCallback::new(|_: web_sys::HtmlElement| {}));
view! {
<OrbitalPresence show=show motion=motion appear=true on_after_leave=on_after_leave>
{children()}
</OrbitalPresence>
}
}