use crate::class::Class;
use dioxus::prelude::*;
use dioxus_free_icons::IconShape;
pub fn Icon(props: IconProps) -> Element {
let class = props.class;
let icon_class = props.icon_class;
if icon_class.is_empty() {
rsx! {
span {
class: "{class}",
{ props.children }
}
}
} else {
let icon = icon_class.format();
rsx! {
span {
class: "{class}",
i {
class: "{icon}"
}
}
}
}
}
#[derive(Clone, PartialEq, Props)]
pub struct IconProps {
#[props(into, default = "icon".into())]
pub class: Class,
#[props(into, default)]
pub icon_class: Class,
children: Element,
}
pub fn SvgIcon<T: IconShape + Clone + PartialEq + 'static>(props: SvgIconProps<T>) -> Element {
let class = props.class;
let width = props.width;
let height = props.height.unwrap_or(width);
let style = if props.intrinsic {
format!("width:{width}px;height:{height}px")
} else {
String::new()
};
rsx! {
span {
class: "{class}",
style: "{style}",
dioxus_free_icons::Icon {
icon: props.shape,
width: width,
height: height,
}
}
}
}
#[derive(Clone, PartialEq, Props)]
pub struct SvgIconProps<T: IconShape + Clone + PartialEq + 'static> {
#[props(into, default = "icon".into())]
pub class: Class,
pub shape: T,
#[props(default = 20)]
pub width: u32,
#[props(into)]
pub height: Option<u32>,
#[props(default = false)]
pub intrinsic: bool,
}
pub fn IconText(props: IconTextProps) -> Element {
let class = props.class;
rsx! {
span {
class: "{class}",
{ props.children }
}
}
}
#[derive(Clone, PartialEq, Props)]
pub struct IconTextProps {
#[props(into, default = "icon-text".into())]
pub class: Class,
children: Element,
}