leptos_remix_icon/lib.rs
1use leptos::{component, view, IntoView};
2
3
4
5
6use serde::{Deserialize, Serialize};
7
8/// the icon size can be one of 10x, sm, lg ... etc
9/// this ported directly from remixicon.css
10/// .ri-lg { font-size: 1.3333em; line-height: 0.75em; vertical-align: -.0667em; }
11/// .ri-xl { font-size: 1.5em; line-height: 0.6666em; vertical-align: -.075em; }
12/// .ri-xxs { font-size: .5em; }
13/// .ri-xs { font-size: .75em; }
14/// .ri-sm { font-size: .875em }
15/// .ri-sm { font-size: .875em }
16/// .ri-1x { font-size: 1em; }
17/// .ri-2x { font-size: 2em; }
18/// .ri-3x { font-size: 3em; }
19/// .ri-4x { font-size: 4em; }
20/// .ri-5x { font-size: 5em; }
21/// .ri-6x { font-size: 6em; }
22/// .ri-7x { font-size: 7em; }
23/// .ri-8x { font-size: 8em; }
24/// .ri-9x { font-size: 9em; }
25/// .ri-10x { font-size: 10em; }
26/// .ri-fw { text-align: center; width: 1.25em; }
27///
28///
29
30#[derive(Debug, Serialize, Deserialize, Default)]
31/// An enum to represent CSS class variants for font size and text alignment.
32pub enum IconSize {
33 /// .ri-xl { font-size: 1.5em; line-height: 0.6666em; vertical-align: -.075em; }
34 RiXl,
35 /// .ri-xxs { font-size: .5em; }
36 RiXxs,
37 /// .ri-xs { font-size: .75em; }
38 RiXs,
39 /// .ri-sm { font-size: .875em; }
40 RiSm,
41 /// .ri-1x { font-size: 1em; }
42 Ri1x,
43 /// .ri-2x { font-size: 2em; }
44 Ri2x,
45 /// .ri-3x { font-size: 3em; }
46 Ri3x,
47 /// .ri-4x { font-size: 4em; }
48 Ri4x,
49 /// .ri-5x { font-size: 5em; }
50 Ri5x,
51 /// .ri-6x { font-size: 6em; }
52 Ri6x,
53 /// .ri-7x { font-size: 7em; }
54 Ri7x,
55 /// .ri-8x { font-size: 8em; }
56 Ri8x,
57 /// .ri-9x { font-size: 9em; }
58 Ri9x,
59 /// .ri-10x { font-size: 10em; }
60 Ri10x,
61 #[default]
62 /// .ri-fw { text-align: center; width: 1.25em; }
63 RiFw,
64}
65
66impl IconSize {
67 pub fn from_str(size: &str) -> Option<Self> {
68 match size {
69 "xl" => Some(IconSize::RiXl),
70 "xxs" => Some(IconSize::RiXxs),
71 "xs" => Some(IconSize::RiXs),
72 "sm" => Some(IconSize::RiSm),
73 "1x" => Some(IconSize::Ri1x),
74 "2x" => Some(IconSize::Ri2x),
75 "3x" => Some(IconSize::Ri3x),
76 "4x" => Some(IconSize::Ri4x),
77 "5x" => Some(IconSize::Ri5x),
78 "6x" => Some(IconSize::Ri6x),
79 "7x" => Some(IconSize::Ri7x),
80 "8x" => Some(IconSize::Ri8x),
81 "9x" => Some(IconSize::Ri9x),
82 "10x" => Some(IconSize::Ri10x),
83 "fw" => Some(IconSize::RiFw),
84 _ => None,
85 }
86 }
87
88 pub fn as_str(&self) -> &'static str {
89 match self {
90 IconSize::RiXl => "ri-xl",
91 IconSize::RiXxs => "ri-xxs",
92 IconSize::RiXs => "ri-xs",
93 IconSize::RiSm => "ri-sm",
94 IconSize::Ri1x => "ri-1x",
95 IconSize::Ri2x => "ri-2x",
96 IconSize::Ri3x => "ri-3x",
97 IconSize::Ri4x => "ri-4x",
98 IconSize::Ri5x => "ri-5x",
99 IconSize::Ri6x => "ri-6x",
100 IconSize::Ri7x => "ri-7x",
101 IconSize::Ri8x => "ri-8x",
102 IconSize::Ri9x => "ri-9x",
103 IconSize::Ri10x => "ri-10x",
104 IconSize::RiFw => "ri-fw",
105 }
106 }
107}
108
109
110
111/// The Icon takes three props
112/// icon - an equivalent of remix icon without the "ri-" prefix
113/// style - custom css rules
114/// class - tailwind or custom css classes
115///
116///
117/// ### Example (tailwind)
118/// ```rust
119/// <Icon class="text-2xl" icon="github-line"/>
120/// ```
121///
122/// ### Example (with style)
123/// <Icon class="text-2xl" icon="github-line" style="background-color-red; border:1px solid green;"/>
124///
125///
126#[component]
127pub fn Icon(
128 /// additional tailwind or custom css classes
129 #[prop(default = "")]
130 class: &'static str,
131 /// css style rules
132 #[prop(default = "")]
133 style: &'static str,
134 /// the remix icon class without the "ri-" prefix
135 #[prop(default = "")]
136 icon: &'static str,
137 /// remix icon class
138 #[prop(default = "")]
139 size: &'static str,
140) -> impl IntoView {
141 let icon_size = IconSize::from_str(&size.trim())
142 .unwrap_or_default()
143 .as_str();
144 view! { <i class=format!("ri-{icon} {class} {icon_size}") style=style></i> }
145}