nes_yew/components/
icon.rs1use 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}