leptos-bootstrap 0.0.3

Bootstrap styled components for leptos.
Documentation
use leptos::prelude::*;

#[component]
pub fn NavLink<'a>(
    #[prop(into)] href: &'a str,
    #[prop(optional)] active: bool,
    #[prop(optional)] disabled: bool,
    #[prop(optional, into)] class: &'a str,
    children: Children,
) -> impl IntoView {
    let mut className = "nav-link".to_string();
    if active {
        className.push_str(" active");
    }
    if disabled {
        className.push_str(" disabled");
    }
    let class = format!("nav-link {}", class);
    view! {
        <a class=class href=href>
            {children()}
        </a>
    }
}

#[component]
pub fn NavBar<'a>(#[prop(optional, into)] class: &'a str, children: Children) -> impl IntoView {
    let class = format!("navbar {}", class);
    view! { <nav class=class>{children()}</nav> }
}

#[component]
pub fn NavBarBrand<'a>(
    #[prop(into)] href: &'a str,
    #[prop(optional, into)] class: &'a str,
    children: Children,
) -> impl IntoView {
    let class = format!("navbar-brand {}", class);
    view! {
        <a class=class href=href>
            {children()}
        </a>
    }
}

#[component]
pub fn NavBarMenu(children: Children) -> impl IntoView {
    view! {
        <button
            class="navbar-toggler"
            type="button"
            data-bs-toggle="collapse"
            data-bs-target="#navbarNavAltMarkup"
            aria-controls="navbarNavAltMarkup"
            aria-expanded="false"
            aria-label="Toggle navigation"
        >
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
            {children()}
        </div>
    }
}

#[component]
pub fn NavItem(children: Children) -> impl IntoView {
    view! { <div class="navbar-item">{children()}</div> }
}

#[component]
pub fn NavBarNav<'a>(#[prop(optional, into)] class: &'a str, children: Children) -> impl IntoView {
    let class = format!("navbar-nav {}", class);
    view! { <ul class=class>{children()}</ul> }
}

#[component]
pub fn NavBarDropDown<'a>(
    #[prop(into)] label: &'a str,
    #[prop(optional, into)] class: &'a str,
    children: Children,
) -> impl IntoView {
    let class = format!("navbar-item dropdown {}", class);
    view! {
        <li class=class>
            <a
                class="nav-link dropdown-toggle"
                href="#"
                role="button"
                data-bs-toggle="dropdown"
                aria-expanded="false"
            >
                {label}
            </a>
            <ul class="dropdown-menu">{children()}</ul>
        </li>
    }
}

#[component]
pub fn NavBarDropDownItem<'a>(
    #[prop(optional)] href: &'a str,
    #[prop(optional, into)] class: &'a str,
    children: Children,
) -> impl IntoView {
    let class = format!("dropdown-item {}", class);
    if href.is_empty() {
        view! { <li class=class>{children()}</li> }
        .into_any()
    } else {
        view! {
            <li>
                <a class=class href=href>
                    {children()}
                </a>
            </li>
        }
        .into_any()
    }
}

#[component]
pub fn NavBarText<'a>(#[prop(optional)] class: &'a str, children: Children) -> impl IntoView {
    let class = format!("navbar-text {}", class);
    view! { <span class=class>{children()}</span> }
}