nes_yew/components/
icon.rs

1use std::borrow::Cow;
2use strum::{EnumIter, IntoEnumIterator, IntoStaticStr};
3use yew::prelude::*;
4
5#[derive(Properties, PartialEq)]
6pub struct IconProps {
7    pub icon: IconKind,
8    #[prop_or_default]
9    pub small: bool,
10    #[prop_or_default]
11    pub medium: bool,
12    #[prop_or_default]
13    pub large: bool,
14    #[prop_or_default]
15    pub empty: bool,
16    #[prop_or_default]
17    pub transparent: bool,
18    #[prop_or_default]
19    pub half: bool,
20    pub class: Option<Cow<'static, str>>,
21    pub style: Option<AttrValue>,
22}
23
24#[derive(Copy, Clone, Eq, PartialEq, EnumIter, IntoStaticStr)]
25#[strum(serialize_all = "snake_case")]
26pub enum IconKind {
27    Heart,
28    Star,
29    Like,
30    Twitter,
31    Facebook,
32    Github,
33    Youtube,
34    Google,
35    Medium,
36    Twitch,
37    Reddit,
38    Whatsapp,
39    Gmail,
40    Linkedin,
41    Close,
42    Trophy,
43}
44
45impl IconKind {
46    pub fn iter() -> impl Iterator<Item = Self> {
47        <Self as IntoEnumIterator>::iter()
48    }
49}
50
51#[function_component(Icon)]
52pub fn icon(
53    IconProps {
54        icon,
55        small,
56        medium,
57        large,
58        empty,
59        transparent,
60        half,
61        class,
62        style,
63    }: &IconProps,
64) -> Html {
65    let icon: &'static str = icon.into();
66    html! {
67        <i
68            class={classes!(
69                class,
70                "nes-icon",
71                icon,
72                if *small { Some("is-small") } else { None },
73                if *medium { Some("is-medium") } else { None },
74                if *large { Some("is-large") } else { None },
75                if *empty { Some("is-transparent") } else { None },
76                if *transparent { Some("is-empty") } else { None },
77                if *half { Some("is-half") } else { None },
78            )}
79            style={style.clone()}
80        />
81    }
82}