use crate::{class::Class, format_class};
use dioxus::prelude::*;
use dioxus_free_icons::IconShape;
pub fn Icon(props: IconProps) -> Element {
let class = format_class!(props, "icon");
if let Some(icon) = props.icon_class.as_ref() {
let icon_class = icon.format();
rsx! {
span {
class: "{class}",
i {
class: "{icon_class}"
}
}
}
} else {
rsx! {
span {
class: "{class}",
{ props.children }
}
}
}
}
#[derive(Clone, PartialEq, Props)]
pub struct IconProps {
#[props(into)]
pub class: Option<Class>,
#[props(into)]
pub icon_class: Option<Class>,
children: Element,
}
pub fn SvgIcon<T: IconShape + Clone + PartialEq + 'static>(props: SvgIconProps<T>) -> Element {
let class = format_class!(props, "icon");
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)]
pub class: Option<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 = format_class!(props, "icon-text");
rsx! {
span {
class: "{class}",
{ props.children }
}
}
}
#[derive(Clone, PartialEq, Props)]
pub struct IconTextProps {
#[props(into)]
pub class: Option<Class>,
children: Element,
}