mod position;
use yew::{classes, html, AttrValue, Children, Html, Properties};
use yew::{function_component, Classes};
use zu_util::prop::ToAttr;
use crate::stack::Stack;
use crate::styles::flex_direction::FlexDirection;
use crate::styles::position::Position;
use crate::typography::Typography;
#[derive(Debug, Clone, PartialEq, Properties)]
pub struct Props {
#[prop_or_default]
pub children: Children,
#[prop_or_default]
pub classes: Classes,
#[prop_or(false)]
pub checked: bool,
#[prop_or_default]
pub control: Html,
#[prop_or(false)]
pub disabled: bool,
#[prop_or(false)]
pub disable_typography: bool,
#[prop_or(false)]
pub error: bool,
#[prop_or_default]
pub label: Html,
#[prop_or(Position::End)]
pub label_position: Position,
#[prop_or(false)]
pub required: bool,
#[prop_or_default]
pub style: AttrValue,
#[prop_or_default]
pub value: AttrValue,
}
#[function_component(FormControlLabel)]
pub fn form_control_label(props: &Props) -> Html {
let root_cls = classes!(
"ZuFormControlLabel-root",
if props.disabled {
"ZuFormControlLabel-disabled"
} else {
""
},
position::css_class(props.label_position),
if props.error {
"ZuFormControlLabel-error"
} else {
""
},
if props.required {
"ZuFormControlLabel-required"
} else {
""
},
props.classes.clone(),
);
let label_cls = classes! {
"ZuFormControlLabel-label",
if props.disabled {
"ZuFormControlLabel-disabled"
} else {
""
}
};
let asterisk_cls = classes! {
"ZuFormControlLabel-asterisk",
if props.error {
"ZuFormControlLabel-error"
} else {
""
}
};
let required = props.required;
let label_elem = html! {
<Typography classes={label_cls}>
{props.label.clone()}
</Typography>
};
html! {
<label class={root_cls} style={props.style.to_attr()}>
{props.control.clone()}
if required {
<Stack direction={FlexDirection::Row}>
{label_elem.clone()}
<span
aria-hidden="true"
class={asterisk_cls}>
{"\u{2009}*"}
</span>
</Stack>
} else {
{label_elem}
}
</label>
}
}