delicious_adwaita/
theme.rs

1use crate::{
2    color::{ThemeColor, ThemeColorVariant},
3    named_colors::ColorName,
4};
5use std::collections::HashMap;
6
7#[cfg(feature = "serde")]
8use serde::Deserialize;
9
10/// A theme or color scheme represents a homogeneous combination of colors to
11/// applly to an application.
12///
13/// Each color scheme must have a unique name that identifies it.
14///
15/// The default [`Theme`] has no defined colors and has `is_system` set to
16/// `true` to indicate that it's a theme that follows the system wide
17/// color scheme.
18#[cfg_attr(feature = "serde", derive(Deserialize))]
19#[derive(Debug, Clone)]
20pub struct Theme {
21    /// Unique name for the theme
22    pub name: String,
23    /// Indicates that the [`Theme`] has no colors set and therefore follows
24    /// the system wide color scheme.
25    #[cfg_attr(feature = "serde", serde(default, skip))]
26    pub is_system: bool,
27    pub colors: HashMap<ColorName, ThemeColor>,
28}
29
30impl Default for Theme {
31    fn default() -> Self {
32        Self {
33            name: "Follow system".into(),
34            is_system: true,
35            colors: HashMap::default(),
36        }
37    }
38}
39
40impl Theme {
41    pub fn new_from_iter<I: IntoIterator<Item = (ColorName, ThemeColor)>>(
42        name: String,
43        colors: I,
44    ) -> Self {
45        Self::new(name, HashMap::from_iter(colors))
46    }
47
48    pub fn new(name: String, colors: HashMap<ColorName, ThemeColor>) -> Self {
49        Self {
50            name,
51            is_system: false,
52            colors,
53        }
54    }
55
56    pub fn to_css(&self, variant: ThemeColorVariant) -> String {
57        self.colors
58            .iter()
59            .map(|(name, tcolor)| format!("@define-color {name} {};\n", tcolor.get(variant)))
60            .collect::<String>()
61    }
62
63    pub fn get_provider(&self, variant: ThemeColorVariant) -> gtk::CssProvider {
64        let provider = gtk::CssProvider::new();
65        provider.load_from_data(&self.to_css(variant));
66        provider
67    }
68
69    pub fn action_row(&self) -> adw::ActionRow {
70        adw::ActionRow::builder()
71            .title_lines(1)
72            .title(&self.name)
73            .build()
74    }
75
76    /// Returns a list of built-in themes. Without any additional feature flags
77    /// this will return an empty list.
78    pub fn default_themes() -> Vec<Self> {
79        vec![
80            // adapted from https://github.com/lassekongo83/adw-colors/
81            // provided by https://github.com/davidphilipbarr
82            #[cfg(feature = "theme_solarized")]
83            Self::new_from_iter(
84                "Solarized".into(),
85                [
86                    (ColorName::WindowBg, ThemeColor::new("#eee8d5", "#002b36")),
87                    (ColorName::WindowFg, ThemeColor::new("#586e75", "#eee8d5")),
88                    (ColorName::Accent, ThemeColor::new("#dbd6c4", "#586e75")),
89                    (ColorName::AccentBg, ThemeColor::new("#dbd6c4", "#1f444d")),
90                    (ColorName::AccentFg, ThemeColor::new("#073642", "#eee8d5")),
91                    (
92                        ColorName::HeaderbarBg,
93                        ThemeColor::new("#f5efde", "#07313b"),
94                    ),
95                    (
96                        ColorName::HeaderbarFg,
97                        ThemeColor::new("#586e75", "#eee8d5"),
98                    ),
99                    (
100                        ColorName::HeaderbarBackdrop,
101                        ThemeColor::new("#fdf6e3", "#002b36"),
102                    ),
103                    (ColorName::PopoverBg, ThemeColor::new("#fdf6e3", "#123a44")),
104                    (ColorName::PopoverFg, ThemeColor::new("#073642", "#eee8d5")),
105                    (
106                        ColorName::DialogBg,
107                        ThemeColor::new("@popover_bg_color", "@popover_bg_color"),
108                    ),
109                    (
110                        ColorName::DialogFg,
111                        ThemeColor::new("@popover_fg_color", "@popover_fg_color"),
112                    ),
113                    (ColorName::SidebarBg, ThemeColor::new("#f5efde", "#07313b")),
114                    (ColorName::SidebarFg, ThemeColor::new("#586e75", "#eee8d5")),
115                    (
116                        ColorName::SidebarBackdrop,
117                        ThemeColor::new("#fdf6e3", "#002b36"),
118                    ),
119                    (
120                        ColorName::SidebarShade,
121                        ThemeColor::new("RGB(0 0 6 / 7%)", "RGB(0 0 6 / 25%)"),
122                    ),
123                    (
124                        ColorName::SidebarBorder,
125                        ThemeColor::new("RGB(0 0 6 / 7%)", "RGB(0 0 6 / 36%)"),
126                    ),
127                    (
128                        ColorName::SecondarySidebarBg,
129                        ThemeColor::new("@sidebar_backdrop_color", "@sidebar_backdrop_color"),
130                    ),
131                    (
132                        ColorName::SecondarySidebarFg,
133                        ThemeColor::new("RGB(0 0 6 / 80%)", "white"),
134                    ),
135                    (
136                        ColorName::SecondarySidebarBackdrop,
137                        ThemeColor::new("@sidebar_backdrop_color", "@sidebar_backdrop_color"),
138                    ),
139                    (
140                        ColorName::SecondarySidebarShade,
141                        ThemeColor::new("@sidebar_shade_color", "@sidebar_shade_color"),
142                    ),
143                    (
144                        ColorName::SecondarySidebarBorder,
145                        ThemeColor::new("@sidebar_border_color", "@sidebar_border_color"),
146                    ),
147                    (ColorName::ViewBg, ThemeColor::new("#fdf6e3", "#073642")),
148                    (ColorName::ViewFg, ThemeColor::new("#073642", "#eee8d5")),
149                    (ColorName::CardBg, ThemeColor::new("#eee8d5", "#123a44")),
150                    (ColorName::CardFg, ThemeColor::new("#073642", "#fdf6e3")),
151                    (ColorName::WarningBg, ThemeColor::new("#CB4B16", "#CB4B16")),
152                    (ColorName::WarningFg, ThemeColor::new("#eee8d5", "#eee8d5")),
153                    (ColorName::Warning, ThemeColor::new("#CB4B16", "#CB4B16")),
154                    (ColorName::ErrorBg, ThemeColor::new("#DC322F", "#DC322F")),
155                    (ColorName::ErrorFg, ThemeColor::new("#eee8d5", "#eee8d5")),
156                    (ColorName::Error, ThemeColor::new("#DC322F", "#DC322F")),
157                    (ColorName::SuccessBg, ThemeColor::new("#859900", "#859900")),
158                    (ColorName::SuccessFg, ThemeColor::new("#eee8d5", "#eee8d5")),
159                    (ColorName::Success, ThemeColor::new("#859900", "#859900")),
160                    (
161                        ColorName::DestructiveBg,
162                        ThemeColor::new("#D33682", "#D33682"),
163                    ),
164                    (
165                        ColorName::DestructiveFg,
166                        ThemeColor::new("#eee8d5", "#eee8d5"),
167                    ),
168                    (
169                        ColorName::Destructive,
170                        ThemeColor::new("#D33682", "#D33682"),
171                    ),
172                ],
173            ),
174            // adapted from https://github.com/claymorwan/adw-catppuccin/
175            #[cfg(feature = "theme_catppuccin")]
176            Self::new_from_iter(
177                "Catppuccin Frappe".into(),
178                [
179                    (ColorName::Accent, ThemeColor::new("#ca9ee6", "#ca9ee6")),
180                    (ColorName::AccentBg, ThemeColor::new("#ca9ee6", "#ca9ee6")),
181                    (ColorName::AccentFg, ThemeColor::new("#232634", "#232634")),
182                    (ColorName::WindowBg, ThemeColor::new("#303446", "#303446")),
183                    (ColorName::WindowFg, ThemeColor::new("#c6d0f5", "#c6d0f5")),
184                    (
185                        ColorName::HeaderbarBg,
186                        ThemeColor::new("#303446", "#303446"),
187                    ),
188                    (
189                        ColorName::HeaderbarFg,
190                        ThemeColor::new("#c6d0f5", "#c6d0f5"),
191                    ),
192                    (ColorName::PopoverBg, ThemeColor::new("#414559", "#414559")),
193                    (ColorName::PopoverFg, ThemeColor::new("#c6d0f5", "#c6d0f5")),
194                    (
195                        ColorName::DialogBg,
196                        ThemeColor::new("@popover_bg_color", "@popover_bg_color"),
197                    ),
198                    (
199                        ColorName::DialogFg,
200                        ThemeColor::new("@popover_fg_color", "@popover_fg_color"),
201                    ),
202                    (ColorName::SidebarBg, ThemeColor::new("#303446", "#303446")),
203                    (ColorName::SidebarFg, ThemeColor::new("#c6d0f5", "#c6d0f5")),
204                    (
205                        ColorName::SidebarBackdrop,
206                        ThemeColor::new("#303446", "#303446"),
207                    ),
208                    (
209                        ColorName::SidebarShade,
210                        ThemeColor::new("RGB(0 0 6 / 25%)", "RGB(0 0 6 / 25%)"),
211                    ),
212                    (
213                        ColorName::SidebarBorder,
214                        ThemeColor::new("RGB(0 0 6 / 36%)", "RGB(0 0 6 / 36%)"),
215                    ),
216                    (
217                        ColorName::SecondarySidebarBg,
218                        ThemeColor::new("@sidebar_backdrop_color", "@sidebar_backdrop_color"),
219                    ),
220                    (
221                        ColorName::SecondarySidebarFg,
222                        ThemeColor::new("#c6d0f5", "#c6d0f5"),
223                    ),
224                    (
225                        ColorName::SecondarySidebarBackdrop,
226                        ThemeColor::new("@sidebar_backdrop_color", "@sidebar_backdrop_color"),
227                    ),
228                    (
229                        ColorName::SecondarySidebarShade,
230                        ThemeColor::new("@sidebar_shade_color", "@sidebar_shade_color"),
231                    ),
232                    (
233                        ColorName::SecondarySidebarBorder,
234                        ThemeColor::new("@sidebar_border_color", "@sidebar_border_color"),
235                    ),
236                    (ColorName::ViewBg, ThemeColor::new("#303446", "#303446")),
237                    (ColorName::ViewFg, ThemeColor::new("#c6d0f5", "#c6d0f5")),
238                    (ColorName::CardBg, ThemeColor::new("#414559", "#414559")),
239                    (ColorName::CardFg, ThemeColor::new("#c6d0f5", "#c6d0f5")),
240                    (
241                        ColorName::ThumbnailBg,
242                        ThemeColor::new("#414559", "#414559"),
243                    ),
244                    (
245                        ColorName::ThumbnailFg,
246                        ThemeColor::new("#c6d0f5", "#c6d0f5"),
247                    ),
248                    (ColorName::WarningBg, ThemeColor::new("#e78284", "#e78284")),
249                    (ColorName::WarningFg, ThemeColor::new("#c6d0f5", "#c6d0f5")),
250                    (ColorName::Warning, ThemeColor::new("#e78284", "#e78284")),
251                    (ColorName::ErrorBg, ThemeColor::new("#e78284", "#e78284")),
252                    (ColorName::ErrorFg, ThemeColor::new("#c6d0f5", "#c6d0f5")),
253                    (ColorName::Error, ThemeColor::new("#e78284", "#e78284")),
254                    (ColorName::SuccessBg, ThemeColor::new("#a6d189", "#a6d189")),
255                    (ColorName::SuccessFg, ThemeColor::new("#c6d0f5", "#c6d0f5")),
256                    (ColorName::Success, ThemeColor::new("#a6d189", "#a6d189")),
257                    (
258                        ColorName::DestructiveBg,
259                        ThemeColor::new("#e78284", "#e78284"),
260                    ),
261                    (
262                        ColorName::DestructiveFg,
263                        ThemeColor::new("#232634", "#232634"),
264                    ),
265                    (
266                        ColorName::Destructive,
267                        ThemeColor::new("#e78284", "#e78284"),
268                    ),
269                ],
270            ),
271            #[cfg(feature = "theme_catppuccin")]
272            Self::new_from_iter(
273                "Catppuccin Latte".into(),
274                [
275                    (ColorName::Accent, ThemeColor::new("#8839ef", "#8839ef")),
276                    (ColorName::AccentBg, ThemeColor::new("#8839ef", "#8839ef")),
277                    (ColorName::AccentFg, ThemeColor::new("#4c4f69", "#4c4f69")),
278                    (ColorName::WindowBg, ThemeColor::new("#eff1f5", "#eff1f5")),
279                    (ColorName::WindowFg, ThemeColor::new("#4c4f69", "#4c4f69")),
280                    (
281                        ColorName::HeaderbarBg,
282                        ThemeColor::new("#eff1f5", "#eff1f5"),
283                    ),
284                    (
285                        ColorName::HeaderbarFg,
286                        ThemeColor::new("#4c4f69", "#4c4f69"),
287                    ),
288                    (ColorName::PopoverBg, ThemeColor::new("#ccd0da", "#ccd0da")),
289                    (ColorName::PopoverFg, ThemeColor::new("#4c4f69", "#4c4f69")),
290                    (
291                        ColorName::DialogBg,
292                        ThemeColor::new("@popover_bg_color", "@popover_bg_color"),
293                    ),
294                    (
295                        ColorName::DialogFg,
296                        ThemeColor::new("@popover_fg_color", "@popover_fg_color"),
297                    ),
298                    (ColorName::SidebarBg, ThemeColor::new("#eff1f5", "#eff1f5")),
299                    (ColorName::SidebarFg, ThemeColor::new("#4c4f69", "#4c4f69")),
300                    (
301                        ColorName::SidebarBackdrop,
302                        ThemeColor::new("#eff1f5", "#eff1f5"),
303                    ),
304                    (
305                        ColorName::SidebarShade,
306                        ThemeColor::new("RGB(0 0 6 / 25%)", "RGB(0 0 6 / 25%)"),
307                    ),
308                    (
309                        ColorName::SidebarBorder,
310                        ThemeColor::new("RGB(0 0 6 / 36%)", "RGB(0 0 6 / 36%)"),
311                    ),
312                    (
313                        ColorName::SecondarySidebarBg,
314                        ThemeColor::new("@sidebar_backdrop_color", "@sidebar_backdrop_color"),
315                    ),
316                    (
317                        ColorName::SecondarySidebarFg,
318                        ThemeColor::new("#4c4f69", "#4c4f69"),
319                    ),
320                    (
321                        ColorName::SecondarySidebarBackdrop,
322                        ThemeColor::new("@sidebar_backdrop_color", "@sidebar_backdrop_color"),
323                    ),
324                    (
325                        ColorName::SecondarySidebarShade,
326                        ThemeColor::new("@sidebar_shade_color", "@sidebar_shade_color"),
327                    ),
328                    (
329                        ColorName::SecondarySidebarBorder,
330                        ThemeColor::new("@sidebar_border_color", "@sidebar_border_color"),
331                    ),
332                    (ColorName::ViewBg, ThemeColor::new("#eff1f5", "#eff1f5")),
333                    (ColorName::ViewFg, ThemeColor::new("#4c4f69", "#4c4f69")),
334                    (ColorName::CardBg, ThemeColor::new("#ccd0da", "#ccd0da")),
335                    (ColorName::CardFg, ThemeColor::new("#4c4f69", "#4c4f69")),
336                    (
337                        ColorName::ThumbnailBg,
338                        ThemeColor::new("#ccd0da", "#ccd0da"),
339                    ),
340                    (
341                        ColorName::ThumbnailFg,
342                        ThemeColor::new("#4c4f69", "#4c4f69"),
343                    ),
344                    (ColorName::WarningBg, ThemeColor::new("#d20f39", "#d20f39")),
345                    (ColorName::WarningFg, ThemeColor::new("#4c4f69", "#4c4f69")),
346                    (ColorName::Warning, ThemeColor::new("#d20f39", "#d20f39")),
347                    (ColorName::ErrorBg, ThemeColor::new("#d20f39", "#d20f39")),
348                    (ColorName::ErrorFg, ThemeColor::new("#4c4f69", "#4c4f69")),
349                    (ColorName::Error, ThemeColor::new("#d20f39", "#d20f39")),
350                    (ColorName::SuccessBg, ThemeColor::new("#40a02b", "#40a02b")),
351                    (ColorName::SuccessFg, ThemeColor::new("#4c4f69", "#4c4f69")),
352                    (ColorName::Success, ThemeColor::new("#40a02b", "#40a02b")),
353                    (
354                        ColorName::DestructiveBg,
355                        ThemeColor::new("#d20f39", "#d20f39"),
356                    ),
357                    (
358                        ColorName::DestructiveFg,
359                        ThemeColor::new("#dce0e8", "#dce0e8"),
360                    ),
361                    (
362                        ColorName::Destructive,
363                        ThemeColor::new("#d20f39", "#d20f39"),
364                    ),
365                ],
366            ),
367            #[cfg(feature = "theme_catppuccin")]
368            Self::new_from_iter(
369                "Catppuccin Macchiato".into(),
370                [
371                    (ColorName::Accent, ThemeColor::new("#c6a0f6", "#c6a0f6")),
372                    (ColorName::AccentBg, ThemeColor::new("#c6a0f6", "#c6a0f6")),
373                    (ColorName::AccentFg, ThemeColor::new("#181926", "#181926")),
374                    (ColorName::WindowBg, ThemeColor::new("#24273a", "#24273a")),
375                    (ColorName::WindowFg, ThemeColor::new("#cad3f5", "#cad3f5")),
376                    (
377                        ColorName::HeaderbarBg,
378                        ThemeColor::new("#24273a", "#24273a"),
379                    ),
380                    (
381                        ColorName::HeaderbarFg,
382                        ThemeColor::new("#cad3f5", "#cad3f5"),
383                    ),
384                    (ColorName::PopoverBg, ThemeColor::new("#363a4f", "#363a4f")),
385                    (ColorName::PopoverFg, ThemeColor::new("#cad3f5", "#cad3f5")),
386                    (
387                        ColorName::DialogBg,
388                        ThemeColor::new("@popover_bg_color", "@popover_bg_color"),
389                    ),
390                    (
391                        ColorName::DialogFg,
392                        ThemeColor::new("@popover_fg_color", "@popover_fg_color"),
393                    ),
394                    (ColorName::SidebarBg, ThemeColor::new("#24273a", "#24273a")),
395                    (ColorName::SidebarFg, ThemeColor::new("#cad3f5", "#cad3f5")),
396                    (
397                        ColorName::SidebarBackdrop,
398                        ThemeColor::new("#24273a", "#24273a"),
399                    ),
400                    (
401                        ColorName::SidebarShade,
402                        ThemeColor::new("RGB(0 0 6 / 25%)", "RGB(0 0 6 / 25%)"),
403                    ),
404                    (
405                        ColorName::SidebarBorder,
406                        ThemeColor::new("RGB(0 0 6 / 36%)", "RGB(0 0 6 / 36%)"),
407                    ),
408                    (
409                        ColorName::SecondarySidebarBg,
410                        ThemeColor::new("@sidebar_backdrop_color", "@sidebar_backdrop_color"),
411                    ),
412                    (
413                        ColorName::SecondarySidebarFg,
414                        ThemeColor::new("#cad3f5", "#cad3f5"),
415                    ),
416                    (
417                        ColorName::SecondarySidebarBackdrop,
418                        ThemeColor::new("@sidebar_backdrop_color", "@sidebar_backdrop_color"),
419                    ),
420                    (
421                        ColorName::SecondarySidebarShade,
422                        ThemeColor::new("@sidebar_shade_color", "@sidebar_shade_color"),
423                    ),
424                    (
425                        ColorName::SecondarySidebarBorder,
426                        ThemeColor::new("@sidebar_border_color", "@sidebar_border_color"),
427                    ),
428                    (ColorName::ViewBg, ThemeColor::new("#24273a", "#24273a")),
429                    (ColorName::ViewFg, ThemeColor::new("#cad3f5", "#cad3f5")),
430                    (ColorName::CardBg, ThemeColor::new("#363a4f", "#363a4f")),
431                    (ColorName::CardFg, ThemeColor::new("#cad3f5", "#cad3f5")),
432                    (
433                        ColorName::ThumbnailBg,
434                        ThemeColor::new("#363a4f", "#363a4f"),
435                    ),
436                    (
437                        ColorName::ThumbnailFg,
438                        ThemeColor::new("#cad3f5", "#cad3f5"),
439                    ),
440                    (ColorName::WarningBg, ThemeColor::new("#ed8796", "#ed8796")),
441                    (ColorName::WarningFg, ThemeColor::new("#cad3f5", "#cad3f5")),
442                    (ColorName::Warning, ThemeColor::new("#ed8796", "#ed8796")),
443                    (ColorName::ErrorBg, ThemeColor::new("#ed8796", "#ed8796")),
444                    (ColorName::ErrorFg, ThemeColor::new("#cad3f5", "#cad3f5")),
445                    (ColorName::Error, ThemeColor::new("#ed8796", "#ed8796")),
446                    (ColorName::SuccessBg, ThemeColor::new("#a6da95", "#a6da95")),
447                    (ColorName::SuccessFg, ThemeColor::new("#cad3f5", "#cad3f5")),
448                    (ColorName::Success, ThemeColor::new("#a6da95", "#a6da95")),
449                    (
450                        ColorName::DestructiveBg,
451                        ThemeColor::new("#ed8796", "#ed8796"),
452                    ),
453                    (
454                        ColorName::DestructiveFg,
455                        ThemeColor::new("#181926", "#181926"),
456                    ),
457                    (
458                        ColorName::Destructive,
459                        ThemeColor::new("#ed8796", "#ed8796"),
460                    ),
461                ],
462            ),
463            #[cfg(feature = "theme_catppuccin")]
464            Self::new_from_iter(
465                "Catppuccin Mocha".into(),
466                [
467                    (ColorName::Accent, ThemeColor::new("#cba6f7", "#cba6f7")),
468                    (ColorName::AccentBg, ThemeColor::new("#cba6f7", "#cba6f7")),
469                    (ColorName::AccentFg, ThemeColor::new("#11111b", "#11111b")),
470                    (ColorName::WindowBg, ThemeColor::new("#1e1e2e", "#1e1e2e")),
471                    (ColorName::WindowFg, ThemeColor::new("#cdd6f4", "#cdd6f4")),
472                    (
473                        ColorName::HeaderbarBg,
474                        ThemeColor::new("#1e1e2e", "#1e1e2e"),
475                    ),
476                    (
477                        ColorName::HeaderbarFg,
478                        ThemeColor::new("#cdd6f4", "#cdd6f4"),
479                    ),
480                    (ColorName::PopoverBg, ThemeColor::new("#313244", "#313244")),
481                    (ColorName::PopoverFg, ThemeColor::new("#cdd6f4", "#cdd6f4")),
482                    (
483                        ColorName::DialogBg,
484                        ThemeColor::new("@popover_bg_color", "@popover_bg_color"),
485                    ),
486                    (
487                        ColorName::DialogFg,
488                        ThemeColor::new("@popover_fg_color", "@popover_fg_color"),
489                    ),
490                    (ColorName::SidebarBg, ThemeColor::new("#1e1e2e", "#1e1e2e")),
491                    (ColorName::SidebarFg, ThemeColor::new("#cdd6f4", "#cdd6f4")),
492                    (
493                        ColorName::SidebarBackdrop,
494                        ThemeColor::new("#1e1e2e", "#1e1e2e"),
495                    ),
496                    (
497                        ColorName::SidebarShade,
498                        ThemeColor::new("RGB(0 0 6 / 25%)", "RGB(0 0 6 / 25%)"),
499                    ),
500                    (
501                        ColorName::SidebarBorder,
502                        ThemeColor::new("RGB(0 0 6 / 36%)", "RGB(0 0 6 / 36%)"),
503                    ),
504                    (
505                        ColorName::SecondarySidebarBg,
506                        ThemeColor::new("@sidebar_backdrop_color", "@sidebar_backdrop_color"),
507                    ),
508                    (
509                        ColorName::SecondarySidebarFg,
510                        ThemeColor::new("#cdd6f4", "#cdd6f4"),
511                    ),
512                    (
513                        ColorName::SecondarySidebarBackdrop,
514                        ThemeColor::new("@sidebar_backdrop_color", "@sidebar_backdrop_color"),
515                    ),
516                    (
517                        ColorName::SecondarySidebarShade,
518                        ThemeColor::new("@sidebar_shade_color", "@sidebar_shade_color"),
519                    ),
520                    (
521                        ColorName::SecondarySidebarBorder,
522                        ThemeColor::new("@sidebar_border_color", "@sidebar_border_color"),
523                    ),
524                    (ColorName::ViewBg, ThemeColor::new("#1e1e2e", "#1e1e2e")),
525                    (ColorName::ViewFg, ThemeColor::new("#cdd6f4", "#cdd6f4")),
526                    (ColorName::CardBg, ThemeColor::new("#313244", "#313244")),
527                    (ColorName::CardFg, ThemeColor::new("#cdd6f4", "#cdd6f4")),
528                    (
529                        ColorName::ThumbnailBg,
530                        ThemeColor::new("#313244", "#313244"),
531                    ),
532                    (
533                        ColorName::ThumbnailFg,
534                        ThemeColor::new("#cdd6f4", "#cdd6f4"),
535                    ),
536                    (ColorName::WarningBg, ThemeColor::new("#f38ba8", "#f38ba8")),
537                    (ColorName::WarningFg, ThemeColor::new("#cdd6f4", "#cdd6f4")),
538                    (ColorName::Warning, ThemeColor::new("#f38ba8", "#f38ba8")),
539                    (ColorName::ErrorBg, ThemeColor::new("#f38ba8", "#f38ba8")),
540                    (ColorName::ErrorFg, ThemeColor::new("#cdd6f4", "#cdd6f4")),
541                    (ColorName::Error, ThemeColor::new("#f38ba8", "#f38ba8")),
542                    (ColorName::SuccessBg, ThemeColor::new("#a6e3a1", "#a6e3a1")),
543                    (ColorName::SuccessFg, ThemeColor::new("#cdd6f4", "#cdd6f4")),
544                    (ColorName::Success, ThemeColor::new("#a6e3a1", "#a6e3a1")),
545                    (
546                        ColorName::DestructiveBg,
547                        ThemeColor::new("#f38ba8", "#f38ba8"),
548                    ),
549                    (
550                        ColorName::DestructiveFg,
551                        ThemeColor::new("#11111b", "#11111b"),
552                    ),
553                    (
554                        ColorName::Destructive,
555                        ThemeColor::new("#f38ba8", "#f38ba8"),
556                    ),
557                ],
558            ),
559            // adapted from https://github.com/Fausto-Korpsvart/Everforest-GTK-Theme/
560            #[cfg(feature = "theme_everforest")]
561            Self::new_from_iter(
562                "Everforest".into(),
563                [
564                    (ColorName::AccentBg, ThemeColor::new("#3a94c5", "#7fbbb3")),
565                    (
566                        ColorName::AccentFg,
567                        ThemeColor::new("#fffbef", "rgba(39, 46, 51, 0.87)"),
568                    ),
569                    (ColorName::Accent, ThemeColor::new("#3a94c5", "#7fbbb3")),
570                    (
571                        ColorName::DestructiveBg,
572                        ThemeColor::new("#e67e80", "#f85552"),
573                    ),
574                    (
575                        ColorName::DestructiveFg,
576                        ThemeColor::new("rgba(39, 46, 51, 0.87)", "#fffbef"),
577                    ),
578                    (
579                        ColorName::Destructive,
580                        ThemeColor::new("#e67e80", "#f85552"),
581                    ),
582                    (ColorName::SuccessBg, ThemeColor::new("#a7c080", "#8da101")),
583                    (
584                        ColorName::SuccessFg,
585                        ThemeColor::new("rgba(39, 46, 51, 0.87)", "#fffbef"),
586                    ),
587                    (ColorName::Success, ThemeColor::new("#a7c080", "#8da101")),
588                    (ColorName::WarningBg, ThemeColor::new("#dbbc7f", "#dfa000")),
589                    (
590                        ColorName::WarningFg,
591                        ThemeColor::new("rgba(39, 46, 51, 0.87)", "rgba(39, 46, 51, 0.87)"),
592                    ),
593                    (ColorName::Warning, ThemeColor::new("#dbbc7f", "#dfa000")),
594                    (ColorName::ErrorBg, ThemeColor::new("#e67e80", "#f85552")),
595                    (
596                        ColorName::ErrorFg,
597                        ThemeColor::new("rgba(39, 46, 51, 0.87)", "#fffbef"),
598                    ),
599                    (ColorName::Error, ThemeColor::new("#e67e80", "#f85552")),
600                    (ColorName::WindowBg, ThemeColor::new("#fffbef", "#272e33")),
601                    (
602                        ColorName::WindowFg,
603                        ThemeColor::new("rgba(39, 46, 51, 0.87)", "#fffbef"),
604                    ),
605                    (ColorName::ViewBg, ThemeColor::new("#e8e5d5", "#293136")),
606                    (
607                        ColorName::ViewFg,
608                        ThemeColor::new("rgba(39, 46, 51, 0.87)", "#fffbef"),
609                    ),
610                    (
611                        ColorName::HeaderbarBg,
612                        ThemeColor::new("#fffbef", "#272e33"),
613                    ),
614                    (
615                        ColorName::HeaderbarFg,
616                        ThemeColor::new("rgba(39, 46, 51, 0.87)", "#fffbef"),
617                    ),
618                    (
619                        ColorName::HeaderbarBorder,
620                        ThemeColor::new("rgba(39, 46, 51, 0.12)", "rgba(255, 251, 239, 0.12)"),
621                    ),
622                    (
623                        ColorName::HeaderbarBackdrop,
624                        ThemeColor::new("#fffbef", "#272e33"),
625                    ),
626                    (
627                        ColorName::HeaderbarShade,
628                        ThemeColor::new("rgba(39, 46, 51, 0.12)", "rgba(255, 251, 239, 0.12)"),
629                    ),
630                    (ColorName::CardBg, ThemeColor::new("#e8e5d5", "#293136")),
631                    (
632                        ColorName::CardFg,
633                        ThemeColor::new("rgba(39, 46, 51, 0.87)", "#fffbef"),
634                    ),
635                    (
636                        ColorName::CardShade,
637                        ThemeColor::new("rgba(39, 46, 51, 0.12)", "rgba(255, 251, 239, 0.12)"),
638                    ),
639                    (ColorName::DialogBg, ThemeColor::new("#e0dcc7", "#293136")),
640                    (
641                        ColorName::DialogFg,
642                        ThemeColor::new("rgba(39, 46, 51, 0.87)", "#fffbef"),
643                    ),
644                    (ColorName::PopoverBg, ThemeColor::new("#fffbef", "#232a2e")),
645                    (
646                        ColorName::PopoverFg,
647                        ThemeColor::new("rgba(39, 46, 51, 0.87)", "#fffbef"),
648                    ),
649                    (
650                        ColorName::Shade,
651                        ThemeColor::new("rgba(39, 46, 51, 0.12)", "rgba(255, 251, 239, 0.12)"),
652                    ),
653                    (
654                        ColorName::SidebarBg,
655                        ThemeColor::new("@popover_bg_color", "@popover_bg_color"),
656                    ),
657                    (
658                        ColorName::SidebarFg,
659                        ThemeColor::new("@popover_fg_color", "@popover_fg_color"),
660                    ),
661                    (
662                        ColorName::SidebarShade,
663                        ThemeColor::new("@popover_shade_color", "@popover_shade_color"),
664                    ),
665                    (
666                        ColorName::SidebarBackdrop,
667                        ThemeColor::new("@window_bg_color", "@window_bg_color"),
668                    ),
669                    (
670                        ColorName::SecondarySidebarBg,
671                        ThemeColor::new("@popover_bg_color", "@popover_bg_color"),
672                    ),
673                    (
674                        ColorName::SecondarySidebarFg,
675                        ThemeColor::new("@popover_fg_color", "@popover_fg_color"),
676                    ),
677                    (
678                        ColorName::SecondarySidebarShade,
679                        ThemeColor::new("@popover_shade_color", "@popover_shade_color"),
680                    ),
681                    (
682                        ColorName::SecondarySidebarBackdrop,
683                        ThemeColor::new("@window_bg_color", "@window_bg_color"),
684                    ),
685                    (
686                        ColorName::ScrollbarOutline,
687                        ThemeColor::new("rgba(39, 46, 51, 0.12)", "rgba(255, 251, 239, 0.12)"),
688                    ),
689                    (
690                        ColorName::SidebarBorder,
691                        ThemeColor::new("@scrollbar_outline_color", "@scrollbar_outline_color"),
692                    ),
693                    (
694                        ColorName::SecondarySidebarBorder,
695                        ThemeColor::new("@scrollbar_outline_color", "@scrollbar_outline_color"),
696                    ),
697                ],
698            ),
699        ]
700    }
701}
702
703#[cfg(test)]
704mod tests {
705    #[cfg(feature = "serde")]
706    #[test]
707    fn deserialize_json_theme() {
708        use super::Theme;
709        use crate::named_colors::ColorName;
710
711        let theme: Theme = serde_json::from_str(
712            r###"{
713                "name": "Example",
714                "colors": {
715                    "Accent": {
716                        "light": "#ff0000",
717                        "dark": "#aa0000"
718                    }
719                }
720            }"###,
721        )
722        .unwrap();
723        assert_eq!(theme.colors.len(), 1);
724        assert_eq!(
725            theme
726                .colors
727                .get(&ColorName::Accent)
728                .unwrap()
729                .get(crate::color::ThemeColorVariant::Light),
730            "#ff0000"
731        );
732    }
733}