#![allow(non_snake_case)]
#![warn(missing_docs)]
use dioxus::prelude::*;
#[derive(Props, PartialEq, Clone)]
pub struct MaterialIconStylesheetProps {
#[props(default = MaterialIconVariant::Regular)]
pub variant: MaterialIconVariant,
}
#[derive(PartialEq, Clone)]
pub enum MaterialIconVariant {
Regular,
Outlined,
Round,
Sharp,
TwoTone,
SelfHosted(String),
}
pub fn MaterialIconStylesheet(props: MaterialIconStylesheetProps) -> Element {
let href = match &props.variant {
MaterialIconVariant::SelfHosted(file) => {
return rsx!(
style { {format!(include_str!("./self-hosted-styles.css"), file)} }
);
}
MaterialIconVariant::Regular => "https://fonts.googleapis.com/icon?family=Material+Icons",
MaterialIconVariant::Outlined => {
"https://fonts.googleapis.com/icon?family=Material+Icons+Outlined"
}
MaterialIconVariant::Round => {
"https://fonts.googleapis.com/icon?family=Material+Icons+Round"
}
MaterialIconVariant::Sharp => {
"https://fonts.googleapis.com/icon?family=Material+Icons+Sharp"
}
MaterialIconVariant::TwoTone => {
"https://fonts.googleapis.com/icon?family=Material+Icons+Two+Tone"
}
};
rsx!(document::Link {
href: "{href}",
rel: "stylesheet"
})
}
#[derive(Props, PartialEq, Clone)]
pub struct MaterialIconProps {
#[props(into)]
pub name: String,
pub size: Option<u32>,
#[props(into)]
pub color: Option<MaterialIconColor>,
}
#[derive(PartialEq, Clone)]
pub enum MaterialIconColor {
Dark,
DarkInactive,
Light,
LightInactive,
Custom(String),
}
impl<T: Into<String>> From<T> for MaterialIconColor {
fn from(value: T) -> Self {
Self::Custom(value.into())
}
}
impl MaterialIconColor {
pub fn to_css_color(&self) -> &str {
match self {
MaterialIconColor::Dark => "rgba(0, 0, 0, 0.54)",
MaterialIconColor::DarkInactive => "rgba(0, 0, 0, 0.26)",
MaterialIconColor::Light => "rgba(255, 255, 255, 1)",
MaterialIconColor::LightInactive => "rgba(255, 255, 255, 0.3)",
MaterialIconColor::Custom(c) => c,
}
}
}
pub fn IconColor<T: Into<String>>(color: T) -> MaterialIconColor {
MaterialIconColor::Custom(color.into())
}
pub fn MaterialIcon(props: MaterialIconProps) -> Element {
let css_size = props
.size
.map(|s| format!("{s}px"))
.unwrap_or_else(|| "inherit".to_string());
let css_color = props
.color
.as_ref()
.map(|c| format!("color: {};", c.to_css_color()))
.unwrap_or_default();
rsx!(
span {
class: "material-icons material-icons-outlined material-icons-round material-icons-sharp material-icons-two-tone md-48",
style: "font-size: {css_size}; {css_color} user-select: none;",
{props.name}
}
)
}