1#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
4#[non_exhaustive]
5#[repr(usize)]
6pub enum IconName {
7 Copy,
9 Check,
11 Close,
13 Plus,
15 Minus,
17 Search,
19 Edit,
21 Trash,
23 Download,
25 Upload,
27 Share,
29 Link,
31 ExternalLink,
33 Refresh,
35 Undo,
37 Redo,
39 Filter,
41 Settings,
43 Maximize,
45 Minimize,
47 Menu,
49 MoreHorizontal,
51 MoreVertical,
53 ChevronUp,
55 ChevronDown,
57 ChevronStart,
59 ChevronEnd,
61 ArrowUp,
63 ArrowDown,
65 ArrowStart,
67 ArrowEnd,
69 Home,
71 Sidebar,
73 Info,
75 Success,
77 Warning,
79 Error,
81 Help,
83 Lock,
85 Eye,
87 EyeOff,
89 Bell,
91 Star,
93 Clock,
95 Send,
97 Stop,
99 Play,
101 Pause,
103 Mic,
105 Attach,
107 ThumbsUp,
109 ThumbsDown,
111 Sparkles,
113 User,
115 Mail,
117 File,
119 Folder,
121 Image,
123 Code,
125 Terminal,
127 GitBranch,
129 Calendar,
131 Bookmark,
133 Globe,
135 Sun,
137 Moon,
139}
140struct IconData {
141 name: &'static str,
142 path: &'static str,
143 mirror: bool,
144}
145const DATA: &[IconData] = &[
146IconData { name: "copy", path: "M11 9h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-8a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2zM15 9V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h4", mirror: false },
147IconData { name: "check", path: "M5 12.5l4.5 4.5L19 7.5", mirror: false },
148IconData { name: "close", path: "M6 6l12 12M18 6L6 18", mirror: false },
149IconData { name: "plus", path: "M12 5v14M5 12h14", mirror: false },
150IconData { name: "minus", path: "M5 12h14", mirror: false },
151IconData { name: "search", path: "M11 4.5a6.5 6.5 0 1 0 0 13a6.5 6.5 0 1 0 0-13zM15.6 15.6L20 20", mirror: false },
152IconData { name: "edit", path: "M4 20h4L19 9a2.83 2.83 0 0 0-4-4L4 16zM13.5 6.5l4 4", mirror: false },
153IconData { name: "trash", path: "M4 7h16M10 11v6M14 11v6M6 7l1 12a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2l1-12M9 7V4h6v3", mirror: false },
154IconData { name: "download", path: "M12 4v11M7 10l5 5 5-5M5 20h14", mirror: false },
155IconData { name: "upload", path: "M12 16V5M7 10l5-5 5 5M5 20h14", mirror: false },
156IconData { name: "share", path: "M18 2.5a2.5 2.5 0 1 0 0 5a2.5 2.5 0 1 0 0-5zM6 9.5a2.5 2.5 0 1 0 0 5a2.5 2.5 0 1 0 0-5zM18 16.5a2.5 2.5 0 1 0 0 5a2.5 2.5 0 1 0 0-5zM8.2 10.8l7.6-4.5M8.2 13.2l7.6 4.5", mirror: false },
157IconData { name: "link", path: "M10 14a4 4 0 0 0 5.66 0l3-3a4 4 0 0 0-5.66-5.66l-1 1M14 10a4 4 0 0 0-5.66 0l-3 3a4 4 0 0 0 5.66 5.66l1-1", mirror: false },
158IconData { name: "external-link", path: "M14 4h6v6M20 4l-9 9M18 14v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h5", mirror: true },
159IconData { name: "refresh", path: "M20 12a8 8 0 1 1-2.34-5.66M20 4v4h-4", mirror: false },
160IconData { name: "undo", path: "M9 14L4 9l5-5M4 9h10a6 6 0 0 1 0 12h-3", mirror: true },
161IconData { name: "redo", path: "M15 14l5-5-5-5M20 9H10a6 6 0 0 0 0 12h3", mirror: true },
162IconData { name: "filter", path: "M3 5h18l-7 8v6l-4 2v-8z", mirror: false },
163IconData { name: "settings", path: "M4 6h9M17 6h3M4 12h3M11 12h9M4 18h11M19 18h1M15 4v4M9 10v4M17 16v4", mirror: false },
164IconData { name: "maximize", path: "M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7", mirror: false },
165IconData { name: "minimize", path: "M4 14h6v6M20 10h-6V4M14 10l7-7M3 21l7-7", mirror: false },
166IconData { name: "menu", path: "M4 6h16M4 12h16M4 18h16", mirror: false },
167IconData { name: "more-horizontal", path: "M5 11a1 1 0 1 0 0 2a1 1 0 1 0 0-2zM12 11a1 1 0 1 0 0 2a1 1 0 1 0 0-2zM19 11a1 1 0 1 0 0 2a1 1 0 1 0 0-2z", mirror: false },
168IconData { name: "more-vertical", path: "M12 4a1 1 0 1 0 0 2a1 1 0 1 0 0-2zM12 11a1 1 0 1 0 0 2a1 1 0 1 0 0-2zM12 18a1 1 0 1 0 0 2a1 1 0 1 0 0-2z", mirror: false },
169IconData { name: "chevron-up", path: "M6 15l6-6 6 6", mirror: false },
170IconData { name: "chevron-down", path: "M6 9l6 6 6-6", mirror: false },
171IconData { name: "chevron-start", path: "M15 6l-6 6 6 6", mirror: true },
172IconData { name: "chevron-end", path: "M9 6l6 6-6 6", mirror: true },
173IconData { name: "arrow-up", path: "M12 19V5M6 11l6-6 6 6", mirror: false },
174IconData { name: "arrow-down", path: "M12 5v14M6 13l6 6 6-6", mirror: false },
175IconData { name: "arrow-start", path: "M19 12H5M11 6l-6 6 6 6", mirror: true },
176IconData { name: "arrow-end", path: "M5 12h14M13 6l6 6-6 6", mirror: true },
177IconData { name: "home", path: "M3 11l9-7 9 7M5 9.5V20h5v-6h4v6h5V9.5", mirror: false },
178IconData { name: "sidebar", path: "M5 4h14a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1zM9 4v16", mirror: true },
179IconData { name: "info", path: "M12 3a9 9 0 1 0 0 18a9 9 0 1 0 0-18zM12 11v5M12 8h.01", mirror: false },
180IconData { name: "success", path: "M12 3a9 9 0 1 0 0 18a9 9 0 1 0 0-18zM8 12.5l2.5 2.5L16 9.5", mirror: false },
181IconData { name: "warning", path: "M10.3 4.2L2.8 17.5a2 2 0 0 0 1.7 3h15a2 2 0 0 0 1.7-3L13.7 4.2a2 2 0 0 0-3.4 0zM12 9v4M12 17h.01", mirror: false },
182IconData { name: "error", path: "M12 3a9 9 0 1 0 0 18a9 9 0 1 0 0-18zM12 7.5v5M12 16h.01", mirror: false },
183IconData { name: "help", path: "M12 3a9 9 0 1 0 0 18a9 9 0 1 0 0-18zM9.5 9.5a2.5 2.5 0 1 1 3.5 2.3c-.6.3-1 .9-1 1.6v.6M12 17h.01", mirror: false },
184IconData { name: "lock", path: "M6 11h12a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1v-8a1 1 0 0 1 1-1zM8 11V7a4 4 0 0 1 8 0v4", mirror: false },
185IconData { name: "eye", path: "M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12zM12 9a3 3 0 1 0 0 6a3 3 0 1 0 0-6z", mirror: false },
186IconData { name: "eye-off", path: "M10.6 5.1A10.6 10.6 0 0 1 12 5c6.5 0 10 7 10 7a17 17 0 0 1-2.2 3.2M6.6 6.6A16.6 16.6 0 0 0 2 12s3.5 7 10 7a9.7 9.7 0 0 0 5.4-1.6M9.9 9.9a3 3 0 0 0 4.2 4.2M3 3l18 18", mirror: false },
187IconData { name: "bell", path: "M6 16v-5a6 6 0 0 1 12 0v5l2 2H4zM10 21h4", mirror: false },
188IconData { name: "star", path: "M12 3L14.5 9.1L21 9.6L16 13.8L17.6 20.2L12 16.7L6.4 20.2L8 13.8L3 9.6L9.5 9.1z", mirror: false },
189IconData { name: "clock", path: "M12 3a9 9 0 1 0 0 18a9 9 0 1 0 0-18zM12 7v5l3 2", mirror: false },
190IconData { name: "send", path: "M21 3L10 14M21 3l-7 18-4-7-7-4z", mirror: true },
191IconData { name: "stop", path: "M8 6h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2z", mirror: false },
192IconData { name: "play", path: "M7 4.5v15l12-7.5z", mirror: false },
193IconData { name: "pause", path: "M8 5v14M16 5v14", mirror: false },
194IconData { name: "mic", path: "M12 3a3 3 0 0 0-3 3v6a3 3 0 0 0 6 0V6a3 3 0 0 0-3-3zM5 11a7 7 0 0 0 14 0M12 18v3", mirror: false },
195IconData { name: "attach", path: "M20 11.5l-8 8a5 5 0 0 1-7-7l8.5-8.5a3.3 3.3 0 0 1 4.7 4.7L9.7 17.2a1.7 1.7 0 0 1-2.4-2.4L15 7", mirror: false },
196IconData { name: "thumbs-up", path: "M7 11v10M7 11l4-8a2 2 0 0 1 2.5 2v4h5.3a2 2 0 0 1 2 2.4l-1.4 6A2 2 0 0 1 17.4 21H4a1 1 0 0 1-1-1v-8a1 1 0 0 1 1-1z", mirror: false },
197IconData { name: "thumbs-down", path: "M7 13V3M7 13l4 8a2 2 0 0 0 2.5-2v-4h5.3a2 2 0 0 0 2-2.4l-1.4-6A2 2 0 0 0 17.4 3H4a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1z", mirror: false },
198IconData { name: "sparkles", path: "M11 3l1.8 5.2L18 10l-5.2 1.8L11 17l-1.8-5.2L4 10l5.2-1.8zM19 15v5M16.5 17.5h5", mirror: false },
199IconData { name: "user", path: "M12 4a4 4 0 1 0 0 8a4 4 0 1 0 0-8zM4 20a8 6 0 0 1 16 0", mirror: false },
200IconData { name: "mail", path: "M4 5h16a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1zM3 7l9 6 9-6", mirror: false },
201IconData { name: "file", path: "M6 3h8l5 5v12a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zM14 3v5h5", mirror: false },
202IconData { name: "folder", path: "M3 6a1 1 0 0 1 1-1h5l2 2h9a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1z", mirror: false },
203IconData { name: "image", path: "M5 4h14a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1zM9 8a1.5 1.5 0 1 0 0 3a1.5 1.5 0 1 0 0-3zM20 15l-5-5L5 20", mirror: false },
204IconData { name: "code", path: "M9 7l-5 5 5 5M15 7l5 5-5 5", mirror: false },
205IconData { name: "terminal", path: "M4 6l6 6-6 6M12 18h8", mirror: false },
206IconData { name: "git-branch", path: "M6 3v12M18 3a3 3 0 1 0 0 6a3 3 0 1 0 0-6zM6 15a3 3 0 1 0 0 6a3 3 0 1 0 0-6zM18 9a9 9 0 0 1-9 9", mirror: false },
207IconData { name: "calendar", path: "M5 5h14a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1zM4 10h16M8 3v4M16 3v4", mirror: false },
208IconData { name: "bookmark", path: "M6 3h12v18l-6-4-6 4z", mirror: false },
209IconData { name: "globe", path: "M12 3a9 9 0 1 0 0 18a9 9 0 1 0 0-18zM3 12h18M12 3a14 14 0 0 1 0 18a14 14 0 0 1 0-18z", mirror: false },
210IconData { name: "sun", path: "M12 8a4 4 0 1 0 0 8a4 4 0 1 0 0-8zM12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4", mirror: false },
211IconData { name: "moon", path: "M20 14A8 8 0 1 1 10 4a6.5 6.5 0 0 0 10 10z", mirror: false },
212];
213pub const ICON_VIEWBOX: &str = "0 0 24 24";
215pub const ICON_STROKE_WIDTH: &str = "2";
217impl IconName {
218 pub const ALL: &'static [Self] = &[
220 Self::Copy,
221 Self::Check,
222 Self::Close,
223 Self::Plus,
224 Self::Minus,
225 Self::Search,
226 Self::Edit,
227 Self::Trash,
228 Self::Download,
229 Self::Upload,
230 Self::Share,
231 Self::Link,
232 Self::ExternalLink,
233 Self::Refresh,
234 Self::Undo,
235 Self::Redo,
236 Self::Filter,
237 Self::Settings,
238 Self::Maximize,
239 Self::Minimize,
240 Self::Menu,
241 Self::MoreHorizontal,
242 Self::MoreVertical,
243 Self::ChevronUp,
244 Self::ChevronDown,
245 Self::ChevronStart,
246 Self::ChevronEnd,
247 Self::ArrowUp,
248 Self::ArrowDown,
249 Self::ArrowStart,
250 Self::ArrowEnd,
251 Self::Home,
252 Self::Sidebar,
253 Self::Info,
254 Self::Success,
255 Self::Warning,
256 Self::Error,
257 Self::Help,
258 Self::Lock,
259 Self::Eye,
260 Self::EyeOff,
261 Self::Bell,
262 Self::Star,
263 Self::Clock,
264 Self::Send,
265 Self::Stop,
266 Self::Play,
267 Self::Pause,
268 Self::Mic,
269 Self::Attach,
270 Self::ThumbsUp,
271 Self::ThumbsDown,
272 Self::Sparkles,
273 Self::User,
274 Self::Mail,
275 Self::File,
276 Self::Folder,
277 Self::Image,
278 Self::Code,
279 Self::Terminal,
280 Self::GitBranch,
281 Self::Calendar,
282 Self::Bookmark,
283 Self::Globe,
284 Self::Sun,
285 Self::Moon,
286 ];
287 #[must_use]
289 pub fn as_str(self) -> &'static str {
290 DATA.get(self as usize).map_or("", |data| data.name)
291 }
292 #[must_use]
294 pub fn path(self) -> &'static str {
295 DATA.get(self as usize).map_or("", |data| data.path)
296 }
297 #[must_use]
299 pub fn mirrored(self) -> bool {
300 DATA.get(self as usize).is_some_and(|data| data.mirror)
301 }
302 #[must_use]
304 pub fn from_name(name: &str) -> Option<Self> {
305 Self::ALL.iter().copied().find(|icon| icon.as_str() == name)
306 }
307}