orbital-base-components 0.1.1

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

use super::sizes::{drawer_presence_motion, drawer_size_css, DrawerPosition, DrawerSize};
use crate::overlay::open_bind::OpenBind;

#[component]
pub fn BaseInlineDrawer(
    #[prop(optional, into)] class: MaybeProp<String>,
    #[prop(into)] open: OpenBind,
    #[prop(default = DrawerPosition::Left.into(), into)] position: Signal<DrawerPosition>,
    #[prop(default = DrawerSize::Small.into(), into)] size: Signal<DrawerSize>,
    #[prop(optional)] motion: MotionSlot,
    children: Children,
) -> impl IntoView {
    let open_drawer = RwSignal::new(open.get_untracked());

    Effect::new(move |_| {
        open_drawer.set(open.get());
    });

    let motion =
        resolve_presence_motion_derived(motion, move || drawer_presence_motion(position.get()));

    view! {
        <OrbitalPresence
            appear=open_drawer.get_untracked()
            show=open_drawer.read_only()
            motion=motion
        >
            <div
                class=move || {
                    let mut parts = vec![
                        "orbital-inline-drawer".to_string(),
                        format!(
                            "orbital-inline-drawer--position-{}",
                            position.get().as_str()
                        ),
                    ];
                    if let Some(extra) = class.get() {
                        if !extra.is_empty() {
                            parts.push(extra);
                        }
                    }
                    parts.join(" ")
                }
                style=(
                    "--orbital-drawer--size",
                    move || drawer_size_css(size.get(), position.get()),
                )
            >
                {children()}
            </div>
        </OrbitalPresence>
    }
}