use dioxus::prelude::*;
use crate::types::ColumnSize;
#[derive(Clone, PartialEq, Props)]
pub struct ContainerProps {
#[props(default)]
pub fluid: bool,
#[props(default)]
pub class: String,
#[props(extends = GlobalAttributes)]
attributes: Vec<Attribute>,
pub children: Element,
}
#[component]
pub fn Container(props: ContainerProps) -> Element {
let base = if props.fluid {
"container-fluid"
} else {
"container"
};
let full_class = if props.class.is_empty() {
base.to_string()
} else {
format!("{base} {}", props.class)
};
rsx! {
div { class: "{full_class}", ..props.attributes, {props.children} }
}
}
#[derive(Clone, PartialEq, Props)]
pub struct RowProps {
#[props(default)]
pub class: String,
#[props(extends = GlobalAttributes)]
attributes: Vec<Attribute>,
pub children: Element,
}
#[component]
pub fn Row(props: RowProps) -> Element {
let full_class = if props.class.is_empty() {
"row".to_string()
} else {
format!("row {}", props.class)
};
rsx! {
div { class: "{full_class}", ..props.attributes, {props.children} }
}
}
#[derive(Clone, PartialEq, Props)]
pub struct ColProps {
#[props(default)]
pub xs: Option<ColumnSize>,
#[props(default)]
pub sm: Option<ColumnSize>,
#[props(default)]
pub md: Option<ColumnSize>,
#[props(default)]
pub lg: Option<ColumnSize>,
#[props(default)]
pub xl: Option<ColumnSize>,
#[props(default)]
pub xxl: Option<ColumnSize>,
#[props(default)]
pub offset: Option<u8>,
#[props(default)]
pub offset_sm: Option<u8>,
#[props(default)]
pub offset_md: Option<u8>,
#[props(default)]
pub offset_lg: Option<u8>,
#[props(default)]
pub offset_xl: Option<u8>,
#[props(default)]
pub offset_xxl: Option<u8>,
#[props(default)]
pub order: Option<u8>,
#[props(default)]
pub order_sm: Option<u8>,
#[props(default)]
pub order_md: Option<u8>,
#[props(default)]
pub order_lg: Option<u8>,
#[props(default)]
pub class: String,
#[props(extends = GlobalAttributes)]
attributes: Vec<Attribute>,
pub children: Element,
}
#[component]
pub fn Col(props: ColProps) -> Element {
let mut classes = Vec::new();
if let Some(size) = &props.xs {
classes.push(format!("col-{size}"));
}
if let Some(size) = &props.sm {
classes.push(format!("col-sm-{size}"));
}
if let Some(size) = &props.md {
classes.push(format!("col-md-{size}"));
}
if let Some(size) = &props.lg {
classes.push(format!("col-lg-{size}"));
}
if let Some(size) = &props.xl {
classes.push(format!("col-xl-{size}"));
}
if let Some(size) = &props.xxl {
classes.push(format!("col-xxl-{size}"));
}
if classes.is_empty() {
classes.push("col".to_string());
}
if let Some(n) = props.offset {
classes.push(format!("offset-{n}"));
}
if let Some(n) = props.offset_sm {
classes.push(format!("offset-sm-{n}"));
}
if let Some(n) = props.offset_md {
classes.push(format!("offset-md-{n}"));
}
if let Some(n) = props.offset_lg {
classes.push(format!("offset-lg-{n}"));
}
if let Some(n) = props.offset_xl {
classes.push(format!("offset-xl-{n}"));
}
if let Some(n) = props.offset_xxl {
classes.push(format!("offset-xxl-{n}"));
}
if let Some(n) = props.order {
classes.push(format!("order-{n}"));
}
if let Some(n) = props.order_sm {
classes.push(format!("order-sm-{n}"));
}
if let Some(n) = props.order_md {
classes.push(format!("order-md-{n}"));
}
if let Some(n) = props.order_lg {
classes.push(format!("order-lg-{n}"));
}
if !props.class.is_empty() {
classes.push(props.class.clone());
}
let full_class = classes.join(" ");
rsx! {
div { class: "{full_class}", ..props.attributes, {props.children} }
}
}