use crate::{
core::{
assets,
class::{Bem, ClassList},
state::Orientation,
},
fc_modifier,
theme::use_stylesheets,
};
use dioxus::core::AttributeValue;
use dioxus::prelude::*;
const BEM: Bem = Bem::new("fc-divider");
fc_modifier! {
pub enum DividerInset for BEM {
None => None,
Inset => "inset",
Middle => "middle",
}
}
fc_modifier! {
enum DividerAxis for BEM {
Horizontal => None,
Vertical => "vertical",
}
}
#[derive(Props, Clone, PartialEq)]
pub struct DividerProps {
#[props(default)]
pub orientation: Orientation,
#[props(default)]
pub inset: DividerInset,
#[props(default)]
pub class: Option<String>,
#[props(extends = GlobalAttributes)]
pub attributes: Vec<Attribute>,
}
#[component]
pub fn Divider(props: DividerProps) -> Element {
let axis = if props.orientation == Orientation::Vertical {
DividerAxis::Vertical
} else {
DividerAxis::Horizontal
};
let mut classes = ClassList::new(BEM.block())
.with_modifier(BEM, props.inset)
.with_modifier(BEM, axis);
for attribute in &props.attributes {
if attribute.name == "class" {
if let AttributeValue::Text(value) = &attribute.value {
classes = classes.with(value);
}
}
}
let classes = classes.extend(props.class.as_deref()).to_string();
let mut attributes: Vec<_> = props
.attributes
.into_iter()
.filter(|attr| {
!matches!(
attr.name,
"class" | "role" | "aria-orientation" | "tabindex"
)
})
.collect();
attributes.push(Attribute::new("class", classes, None, false));
if props.orientation == Orientation::Vertical {
attributes.push(Attribute::new("role", "separator", None, false));
attributes.push(Attribute::new("aria-orientation", "vertical", None, false));
}
rsx! {
if use_stylesheets() { document::Stylesheet { href: assets::COMPONENTS_DIVIDER_CSS } }
if props.orientation == Orientation::Vertical {
div { ..attributes }
} else {
hr { ..attributes }
}
}
}