use crate::{class::Class, format_class};
use dioxus::prelude::*;
use dioxus_free_icons::IconShape;
pub fn Icon<'a>(cx: Scope<'a, IconProps<'a>>) -> Element {
let class = format_class!(cx, "icon");
if let Some(icon) = cx.props.icon_class.as_ref() {
let icon_class = icon.format();
render! {
span {
class: "{class}",
i {
class: "{icon_class}"
}
}
}
} else {
render! {
span {
class: "{class}",
&cx.props.children
}
}
}
}
#[derive(Props)]
pub struct IconProps<'a> {
#[props(into)]
pub class: Option<Class<'a>>,
#[props(into)]
pub icon_class: Option<Class<'a>>,
children: Element<'a>,
}
pub fn SvgIcon<'a, T: IconShape + Copy>(cx: Scope<'a, SvgIconProps<'a, T>>) -> Element {
let class = format_class!(cx, "icon");
let width = cx.props.width;
let height = cx.props.height.unwrap_or(width);
render! {
span {
class: "{class}",
dioxus_free_icons::Icon {
icon: cx.props.shape,
width: width,
height: height,
}
}
}
}
#[derive(Props)]
pub struct SvgIconProps<'a, T: IconShape> {
#[props(into)]
pub class: Option<Class<'a>>,
pub shape: T,
#[props(default = 20)]
pub width: u32,
#[props(into)]
pub height: Option<u32>,
}
pub fn IconText<'a>(cx: Scope<'a, IconTextProps<'a>>) -> Element {
let class = format_class!(cx, "icon-text");
render! {
span {
class: "{class}",
&cx.props.children
}
}
}
#[derive(Props)]
pub struct IconTextProps<'a> {
#[props(into)]
pub class: Option<Class<'a>>,
children: Element<'a>,
}