mod color;
mod radio_button_icon;
mod size;
use yew::{classes, function_component, html, AttrValue, Callback, Classes, Html, Properties};
use crate::styles::color::Color;
use crate::styles::size::Size;
use crate::switch_base::{SwitchBase, Variant};
use radio_button_icon::RadioButtonIcon;
#[derive(Debug, Clone, PartialEq, Properties)]
pub struct Props {
#[prop_or(false)]
pub checked: bool,
#[prop_or_default]
pub checked_icon: Option<Html>,
#[prop_or_default]
pub classes: Classes,
#[prop_or_default]
pub color: Color,
#[prop_or(false)]
pub default_checked: bool,
#[prop_or(false)]
pub disabled: bool,
#[prop_or(false)]
pub disable_ripple: bool,
#[prop_or_default]
pub icon: Option<Html>,
#[prop_or_default]
pub id: AttrValue,
#[prop_or_default]
pub input_aria_label: AttrValue,
#[prop_or_default]
pub name: AttrValue,
#[prop_or_default]
pub on_change: Option<Callback<String>>,
#[prop_or(false)]
pub required: bool,
#[prop_or_default]
pub size: Size,
#[prop_or_default]
pub style: AttrValue,
#[prop_or_default]
pub value: AttrValue,
}
#[function_component(Radio)]
pub fn radio(props: &Props) -> Html {
let root_cls = classes!(
"ZuRadio-root",
color::css_class(props.color),
size::css_class(props.size),
if props.disable_ripple {
""
} else {
"ZuRadio-enableRipple"
},
props.classes.clone(),
);
let font_size = props.size.to_font_size();
let checked_icon = props.checked_icon.as_ref().map_or_else(
|| html! {<RadioButtonIcon checked={true} {font_size} />},
Clone::clone,
);
let icon = props
.icon
.as_ref()
.map_or_else(|| html! {<RadioButtonIcon {font_size} />}, Clone::clone);
html! {
<SwitchBase
aria_label={&props.input_aria_label}
classes={root_cls}
checked={props.checked}
checked_icon={checked_icon}
default_checked={props.default_checked}
disabled={props.disabled}
disable_focus_ripple={props.disable_ripple}
icon={icon}
id={&props.id}
name={&props.name}
required={props.required}
size={props.size}
style={&props.style}
value={&props.value}
variant={Variant::Radio}
>
</SwitchBase>
}
}