pub mod item;
pub use item::{BottomNavItem, BottomNavItemProps};
use dioxus::prelude::*;
#[derive(Clone, Copy, PartialEq, Debug, Default)]
pub enum BottomNavPosition {
#[default]
Fixed,
Absolute,
Relative,
}
impl BottomNavPosition {
pub const ALL: &'static [BottomNavPosition] = &[
BottomNavPosition::Fixed,
BottomNavPosition::Absolute,
BottomNavPosition::Relative,
];
#[must_use]
pub fn as_class(&self) -> &'static str {
match self {
BottomNavPosition::Fixed => "sd-bottom-nav--fixed",
BottomNavPosition::Absolute => "sd-bottom-nav--absolute",
BottomNavPosition::Relative => "sd-bottom-nav--relative",
}
}
#[must_use]
pub fn name(&self) -> &'static str {
match self {
BottomNavPosition::Fixed => "Fixed",
BottomNavPosition::Absolute => "Absolute",
BottomNavPosition::Relative => "Relative",
}
}
}
#[derive(Props, Clone, PartialEq)]
pub struct BottomNavigationProps {
#[props(default)]
pub position: Option<BottomNavPosition>,
#[props(default = true)]
pub safe_area: bool,
#[props(default = true)]
pub border: bool,
#[props(default = true)]
pub blur: bool,
#[props(default)]
pub class: String,
pub children: Element,
}
#[component]
pub fn BottomNavigation(props: BottomNavigationProps) -> Element {
#[cfg(feature = "theme")]
let theme_val = crate::theme::use_theme()();
#[cfg(feature = "theme")]
let base_override = theme_val.resolve_component_base("bottom_navigation").unwrap_or("");
#[cfg(feature = "theme")]
let class_modifiers = theme_val.resolve_class_modifiers("bottom_navigation", &props.class);
#[cfg(not(feature = "theme"))]
let base_override = "";
#[cfg(not(feature = "theme"))]
let class_modifiers = String::new();
let pos = props.position.unwrap_or_default();
let pos_class = pos.as_class();
let safe_area_class = if props.safe_area { "sd-bottom-nav--safe-area" } else { "" };
let border_class = if props.border { "sd-bottom-nav--border" } else { "" };
let blur_class = if props.blur { "sd-bottom-nav--blur" } else { "" };
rsx! {
nav {
role: "navigation",
"aria-label": "Navigazione inferiore principale",
class: "sd-bottom-nav {pos_class} {safe_area_class} {border_class} {blur_class} {base_override} {class_modifiers} {props.class}",
div { class: "sd-bottom-nav__container",
{props.children}
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_bottom_nav_position_classes() {
assert_eq!(BottomNavPosition::Fixed.as_class(), "sd-bottom-nav--fixed");
assert_eq!(BottomNavPosition::Absolute.as_class(), "sd-bottom-nav--absolute");
assert_eq!(BottomNavPosition::Relative.as_class(), "sd-bottom-nav--relative");
}
#[test]
fn test_bottom_nav_position_names() {
assert_eq!(BottomNavPosition::Fixed.name(), "Fixed");
assert_eq!(BottomNavPosition::Absolute.name(), "Absolute");
assert_eq!(BottomNavPosition::Relative.name(), "Relative");
assert_eq!(BottomNavPosition::ALL.len(), 3);
}
}