use crate::{class::Class, extension::VNodeExt, format_class};
use dioxus::prelude::*;
use dioxus_router::components::{IntoRoutable, Link};
pub fn Navbar<'a>(cx: Scope<'a, NavbarProps<'a>>) -> Element {
let children = cx.props.children.as_ref()?;
let class = format_class!(cx, "navbar is-link");
if children.has_component("NavbarBrand") {
render! {
nav {
class: "{class}",
children
}
}
} else {
render! {
nav {
class: "{class}",
NavbarMenu {
children
}
}
}
}
}
#[derive(Props)]
pub struct NavbarProps<'a> {
#[props(into)]
pub class: Option<Class<'a>>,
children: Element<'a>,
}
pub fn NavbarBrand<'a>(cx: Scope<'a, NavbarBrandProps<'a>>) -> Element {
let class = format_class!(cx, "navbar-brand");
render! {
div {
class: "{class}",
&cx.props.children
}
}
}
#[derive(Props)]
pub struct NavbarBrandProps<'a> {
#[props(into)]
pub class: Option<Class<'a>>,
children: Element<'a>,
}
pub fn NavbarMenu<'a>(cx: Scope<'a, NavbarMenuProps<'a>>) -> Element {
let class = format_class!(cx, "navbar-menu is-active");
render! {
div {
class: "{class}",
&cx.props.children
}
}
}
#[derive(Props)]
pub struct NavbarMenuProps<'a> {
#[props(into)]
pub class: Option<Class<'a>>,
children: Element<'a>,
}
pub fn NavbarStart<'a>(cx: Scope<'a, NavbarStartProps<'a>>) -> Element {
let class = format_class!(cx, "navbar-start");
render! {
div {
class: "{class}",
&cx.props.children
}
}
}
#[derive(Props)]
pub struct NavbarStartProps<'a> {
#[props(into)]
pub class: Option<Class<'a>>,
children: Element<'a>,
}
pub fn NavbarCenter<'a>(cx: Scope<'a, NavbarCenterProps<'a>>) -> Element {
let class = format_class!(cx, "navbar-center");
render! {
div {
class: "{class}",
&cx.props.children
}
}
}
#[derive(Props)]
pub struct NavbarCenterProps<'a> {
#[props(into)]
pub class: Option<Class<'a>>,
children: Element<'a>,
}
pub fn NavbarEnd<'a>(cx: Scope<'a, NavbarEndProps<'a>>) -> Element {
let class = format_class!(cx, "navbar-end");
render! {
div {
class: "{class}",
&cx.props.children
}
}
}
#[derive(Props)]
pub struct NavbarEndProps<'a> {
#[props(into)]
pub class: Option<Class<'a>>,
children: Element<'a>,
}
pub fn NavbarLink<'a>(cx: Scope<'a, NavbarLinkProps<'a>>) -> Element {
let class = format_class!(cx, "navbar-item");
let active_class = format_class!(cx, "is-active");
render! {
Link {
class: "{class}",
active_class: "{active_class}",
to: cx.props.to.clone(),
&cx.props.children
}
}
}
#[derive(Props)]
pub struct NavbarLinkProps<'a> {
#[props(into)]
pub class: Option<Class<'a>>,
#[props(into)]
pub active_class: Option<Class<'a>>,
#[props(into)]
pub to: IntoRoutable,
children: Element<'a>,
}