1use crate::theme::{rgb, Spec, Theme};
8use ratatui::style::Color;
9
10named_themes! {
11 catppuccin_mocha, "catppuccin-mocha", "Catppuccin Mocha (dark)." =>
12 [0x1e1e2e, 0xcdd6f4, 0x9399b2, 0x313244, 0x89b4fa, 0xcba6f7, 0xa6e3a1, 0xf9e2af, 0xf38ba8, 0x89dceb],
13 [0x89b4fa, 0xf9e2af, 0xcba6f7, 0xa6e3a1, 0xf38ba8, 0x94e2d5, 0xfab387, 0xf5c2e7];
14 catppuccin_latte, "catppuccin-latte", "Catppuccin Latte (light)." =>
15 [0xeff1f5, 0x4c4f69, 0x7c7f93, 0xccd0da, 0x1e66f5, 0x8839ef, 0x40a02b, 0xdf8e1d, 0xd20f39, 0x04a5e5],
16 [0x1e66f5, 0xdf8e1d, 0x8839ef, 0x40a02b, 0xd20f39, 0x179299, 0xfe640b, 0xea76cb];
17 dracula, "dracula", "Dracula (dark)." =>
18 [0x282a36, 0xf8f8f2, 0x8e9bc4, 0x44475a, 0xbd93f9, 0xff79c6, 0x50fa7b, 0xf1fa8c, 0xff5555, 0x8be9fd],
19 [0xbd93f9, 0xff79c6, 0x50fa7b, 0xf1fa8c, 0xffb86c, 0x8be9fd, 0xff5555, 0x6272a4];
20 nord, "nord", "Nord (dark, arctic blues)." =>
21 [0x2e3440, 0xd8dee9, 0x8b96ab, 0x3b4252, 0x88c0d0, 0x81a1c1, 0xa3be8c, 0xebcb8b, 0xbf616a, 0x5e81ac],
22 [0x88c0d0, 0xa3be8c, 0xebcb8b, 0xb48ead, 0xd08770, 0x81a1c1, 0xbf616a, 0x8fbcbb];
23 gruvbox, "gruvbox", "Gruvbox (dark, warm retro)." =>
24 [0x282828, 0xebdbb2, 0xa89984, 0x3c3836, 0x83a598, 0xd3869b, 0xb8bb26, 0xfabd2f, 0xfb4934, 0x8ec07c],
25 [0x83a598, 0xfabd2f, 0xb8bb26, 0xd3869b, 0xfb4934, 0x8ec07c, 0xfe8019, 0xebdbb2];
26 tokyo_night, "tokyo-night", "Tokyo Night (dark)." =>
27 [0x1a1b26, 0xc0caf5, 0x737aa2, 0x292e42, 0x7aa2f7, 0xbb9af7, 0x9ece6a, 0xe0af68, 0xf7768e, 0x7dcfff],
28 [0x7aa2f7, 0xe0af68, 0xbb9af7, 0x9ece6a, 0xf7768e, 0x7dcfff, 0xff9e64, 0x73daca];
29 solarized_dark, "solarized-dark", "Solarized Dark." =>
30 [0x002b36, 0x93a1a1, 0x839496, 0x073642, 0x268bd2, 0x6c71c4, 0x859900, 0xb58900, 0xdc322f, 0x2aa198],
31 [0x268bd2, 0xb58900, 0x6c71c4, 0x859900, 0xdc322f, 0x2aa198, 0xcb4b16, 0xd33682];
32 solarized_light, "solarized-light", "Solarized Light." =>
33 [0xfdf6e3, 0x586e75, 0x657b83, 0xeee8d5, 0x268bd2, 0x6c71c4, 0x859900, 0xb58900, 0xdc322f, 0x2aa198],
34 [0x268bd2, 0xb58900, 0x6c71c4, 0x859900, 0xdc322f, 0x2aa198, 0xcb4b16, 0xd33682];
35 one_dark, "one-dark", "One Dark (Atom)." =>
36 [0x282c34, 0xabb2bf, 0x7f848e, 0x3e4451, 0x61afef, 0xc678dd, 0x98c379, 0xe5c07b, 0xe06c75, 0x56b6c2],
37 [0x61afef, 0xe5c07b, 0xc678dd, 0x98c379, 0xe06c75, 0x56b6c2, 0xd19a66, 0xabb2bf];
38 rose_pine, "rose-pine", "Rosé Pine (dark)." =>
39 [0x191724, 0xe0def4, 0x908caa, 0x1f1d2e, 0xc4a7e7, 0xebbcba, 0x9ccfd8, 0xf6c177, 0xeb6f92, 0x31748f],
40 [0xc4a7e7, 0xf6c177, 0xebbcba, 0x9ccfd8, 0xeb6f92, 0x31748f, 0xea9a97, 0xe0def4];
41 monokai, "monokai", "Monokai (dark)." =>
42 [0x272822, 0xf8f8f2, 0x90908a, 0x3e3d32, 0x66d9ef, 0xae81ff, 0xa6e22e, 0xe6db74, 0xf92672, 0x66d9ef],
43 [0x66d9ef, 0xa6e22e, 0xf92672, 0xe6db74, 0xae81ff, 0xfd971f, 0x75715e, 0xf8f8f2];
44 default_light, "default-light", "Default Light (light, from gitkraft)." =>
45 [0xfafaff, 0x1e2332, 0x828ca0, 0xebeef8, 0x008cdc, 0xff641e, 0x1ea050, 0xc88c00, 0xd23232, 0xff641e],
46 [0x008cdc, 0x1ea050, 0xd23232, 0xc88c00, 0xff641e, 0x8c50c8, 0x009696, 0xbe3c78];
47 grape, "grape", "Grape (dark, from gitkraft)." =>
48 [0x120c1e, 0xe6dcff, 0x6e6482, 0x1e1432, 0xc878ff, 0x82b4ff, 0xa06eff, 0xd2aaff, 0xff5096, 0x82b4ff],
49 [0xc878ff, 0xa06eff, 0xff5096, 0xd2aaff, 0x82b4ff, 0x50dcc8, 0xffb464, 0x78ffa0];
50 ocean, "ocean", "Ocean (dark, from gitkraft)." =>
51 [0x001423, 0xc8f0f5, 0x507882, 0x002337, 0x00c8b4, 0x00afd2, 0x50e6c8, 0xffdc50, 0xff6464, 0x00afd2],
52 [0x00c8b4, 0x50e6c8, 0xff6464, 0xffdc50, 0x00afd2, 0xb482ff, 0xffa064, 0xdc78c8];
53 sunset, "sunset", "Sunset (dark, from gitkraft)." =>
54 [0x160806, 0xffebd2, 0x8c6450, 0x280f0a, 0xff5050, 0xff9632, 0xffb450, 0xffe650, 0xff3232, 0xff9632],
55 [0xff5050, 0xffb450, 0xff3232, 0xffe650, 0xff9632, 0x64b4ff, 0xb478ff, 0x50dcc8];
56 forest, "forest", "Forest (dark, from gitkraft)." =>
57 [0x081208, 0xd2ebc8, 0x5a7850, 0x0f1e0f, 0x64c850, 0x50a050, 0x78d25a, 0xdcc850, 0xd25050, 0x50a050],
58 [0x64c850, 0x78d25a, 0xd25050, 0xdcc850, 0x50a050, 0x82a0ff, 0xc882b4, 0xc8b464];
59 rose, "rose", "Rose (dark, from gitkraft)." =>
60 [0x1c0610, 0xffe6eb, 0x8c5a6e, 0x320c1e, 0xff6496, 0xff8cb4, 0xffa0be, 0xffdcb4, 0xdc3c64, 0xff8cb4],
61 [0xff6496, 0xffa0be, 0xdc3c64, 0xffdcb4, 0xff8cb4, 0x64b4ff, 0x78dcc8, 0xc8b464];
62 neon, "neon", "Neon (dark, from gitkraft)." =>
63 [0x06000e, 0xe6e6ff, 0x645078, 0x0f001e, 0xff00c8, 0x00ffc8, 0x00ff82, 0xffdc00, 0xff1e50, 0x00ffc8],
64 [0xff00c8, 0x00ff82, 0xff1e50, 0xffdc00, 0x00ffc8, 0x6450ff, 0xff7800, 0x00b4ff];
65 gruvbox_light, "gruvbox-light", "Gruvbox Light (light, from gitkraft)." =>
66 [0xfbf1c7, 0x3c3836, 0x928374, 0xd5c4a1, 0xd65d0e, 0xd79921, 0x79740e, 0xd79921, 0xd65d0e, 0xd79921],
67 [0xd65d0e, 0x79740e, 0xcc241d, 0xd79921, 0x458588, 0xb16286, 0x689d6a, 0x076678];
68 catppuccin_frappe, "catppuccin-frappe", "Catppuccin Frappé (dark, from gitkraft)." =>
69 [0x303446, 0xc6d0f5, 0x737994, 0x414559, 0xca9ee6, 0x8caaee, 0xa6d189, 0xe5c890, 0xe78284, 0x8caaee],
70 [0xca9ee6, 0xa6d189, 0xe78284, 0xe5c890, 0x8caaee, 0x81c8be, 0xf4b8e4, 0xef9f76];
71 catppuccin_macchiato, "catppuccin-macchiato", "Catppuccin Macchiato (dark, from gitkraft)." =>
72 [0x24273a, 0xcad3f5, 0x6e738d, 0x363a4f, 0xc6a0f6, 0x8aadf4, 0xa6da95, 0xeed49f, 0xed8796, 0x8aadf4],
73 [0xc6a0f6, 0xa6da95, 0xed8796, 0xeed49f, 0x8aadf4, 0x8bd5ca, 0xf5bde6, 0xf0a880];
74 tokyo_night_storm, "tokyo-night-storm", "Tokyo Night Storm (dark, from gitkraft)." =>
75 [0x24283b, 0xc0caf5, 0x565f89, 0x2d314b, 0xbb9af7, 0x7aa2f7, 0x9ece6a, 0xe0af68, 0xf7768e, 0x7aa2f7],
76 [0xbb9af7, 0x9ece6a, 0xf7768e, 0xe0af68, 0x7aa2f7, 0x7dcfff, 0xff9e64, 0x73daca];
77 tokyo_night_light, "tokyo-night-light", "Tokyo Night Light (light, from gitkraft)." =>
78 [0xd5d6db, 0x343b58, 0x848cb0, 0xd0d5e3, 0x5a4a78, 0x2e7ee9, 0x485e30, 0x8c6c3e, 0xd20f39, 0x2e7ee9],
79 [0x5a4a78, 0x485e30, 0xd20f39, 0x8c6c3e, 0x2e7ee9, 0x388c96, 0xa6528c, 0xb46432];
80 kanagawa_wave, "kanagawa-wave", "Kanagawa Wave (dark, from gitkraft)." =>
81 [0x16161e, 0xdcd7ba, 0x727169, 0x2a2a37, 0xd27e99, 0x7e9cd8, 0x76946a, 0xdca561, 0xd27e99, 0x7e9cd8],
82 [0xd27e99, 0x76946a, 0xff5a64, 0xdca561, 0x7e9cd8, 0x6a9589, 0xe46876, 0x957fb8];
83 kanagawa_dragon, "kanagawa-dragon", "Kanagawa Dragon (dark, from gitkraft)." =>
84 [0x141414, 0xc5c9c5, 0xa6a69c, 0x282727, 0xd27e99, 0x8ba4b0, 0x87a987, 0xc8aa6d, 0xd27e99, 0x8ba4b0],
85 [0xd27e99, 0x87a987, 0xe36464, 0xc8aa6d, 0x8ba4b0, 0x6a9589, 0xc46c7c, 0xa591c4];
86 kanagawa_lotus, "kanagawa-lotus", "Kanagawa Lotus (light, from gitkraft)." =>
87 [0xf6f3e4, 0x545464, 0xc4b28a, 0xe7dba0, 0xa09abe, 0x4d699b, 0x6f894e, 0x77713f, 0xc04747, 0x4d699b],
88 [0xa09abe, 0x6f894e, 0xc04747, 0x77713f, 0x4d699b, 0x648c82, 0xb46478, 0x8c78aa];
89 moonfly, "moonfly", "Moonfly (dark, from gitkraft)." =>
90 [0x080808, 0xb2b2b2, 0x4e4e4e, 0x1c1c1c, 0xae81ff, 0x80a0ff, 0x8cc85f, 0xe2a478, 0xff7383, 0x80a0ff],
91 [0xae81ff, 0x8cc85f, 0xff7383, 0xe2a478, 0x80a0ff, 0x74b4bb, 0xffc078, 0xc88cff];
92 nightfly, "nightfly", "Nightfly (dark, from gitkraft)." =>
93 [0x011626, 0xacbbcb, 0x4b6479, 0x0b2942, 0xc792ea, 0x82aaff, 0xa1cd5e, 0xf3da0b, 0xfc5749, 0x82aaff],
94 [0xc792ea, 0xa1cd5e, 0xfc5749, 0xf3da0b, 0x82aaff, 0x21c8d7, 0xee8262, 0xaec8ff];
95 oxocarbon, "oxocarbon", "Oxocarbon (dark, from gitkraft)." =>
96 [0x161616, 0xf2f4f8, 0x525252, 0x262626, 0xff7eb6, 0x78a9ff, 0x42be65, 0xfacc37, 0xff6165, 0x78a9ff],
97 [0xff7eb6, 0x42be65, 0xff6165, 0xfacc37, 0x78a9ff, 0x08bdba, 0xbe95ff, 0xffaa78];
98 cyberpunk, "cyberpunk", "Cyberpunk (dark, from gitkraft)." =>
99 [0x0a0a10, 0xe6e6dc, 0x5a5a64, 0x14141e, 0xfcee0a, 0x00d2eb, 0x00dcb4, 0xff9600, 0xff3246, 0x00d2eb],
100 [0xfcee0a, 0x00dcb4, 0xff3246, 0xff9600, 0x00d2eb, 0xb400ff, 0xff0096, 0x00ff64];
101 rose_pine_moon, "rose-pine-moon", "Rose Pine Moon (dark, from gitkraft)." =>
102 [0x232136, 0xe0def4, 0x6e6a86, 0x302e46, 0xc4a7e7, 0x9ccfd8, 0x3e8fb0, 0xf6c177, 0xeb6f92, 0x9ccfd8],
103 [0xc4a7e7, 0x3e8fb0, 0xeb6f92, 0xf6c177, 0x9ccfd8, 0xea9a97, 0x9ccfd8, 0xe0def4];
104 rose_pine_dawn, "rose-pine-dawn", "Rose Pine Dawn (light, from gitkraft)." =>
105 [0xfaf4ed, 0x575279, 0x9893a5, 0xf2e9dd, 0x907aa9, 0x56949f, 0x286983, 0xea9d34, 0xb4637a, 0x56949f],
106 [0x907aa9, 0x286983, 0xb4637a, 0xea9d34, 0x56949f, 0xd7827e, 0x575279, 0x9893a5];
107 ayu_mirage, "ayu-mirage", "Ayu Mirage (dark, from gitkraft)." =>
108 [0x1f2430, 0xcccac2, 0x686868, 0x2a303e, 0x73d0ff, 0x73d0ff, 0x87d96c, 0xfacc6e, 0xed8274, 0x73d0ff],
109 [0x73d0ff, 0x87d96c, 0xed8274, 0xfacc6e, 0x409fff, 0xd9bfff, 0xffaa6c, 0xcccac2];
110 everforest_dark, "everforest-dark", "Everforest Dark (dark, from gitkraft)." =>
111 [0x1e2326, 0xd3c6aa, 0x7a8478, 0x2a3032, 0xa7c080, 0x7fbbb3, 0xa7c080, 0xdbbc7f, 0xe67e80, 0x7fbbb3],
112 [0xa7c080, 0x7fbbb3, 0xe67e80, 0xdbbc7f, 0xd699b6, 0xd3c6aa, 0xa6b0a0, 0x7a8478];
113 atom_one_light, "atom-one-light", "Atom One Light (light, from gitkraft)." =>
114 [0xf9f9f9, 0x2a2c33, 0x767676, 0xededed, 0x2f5af3, 0x2f5af3, 0x3f953a, 0xd2b67c, 0xde3e35, 0x2f5af3],
115 [0x2f5af3, 0x3f953a, 0xde3e35, 0xd2b67c, 0xa626a4, 0x0184bc, 0x2a2c33, 0xb4b4b4];
116 night_owl, "night-owl", "Night Owl (dark, from gitkraft)." =>
117 [0x011627, 0xd6deeb, 0x575656, 0x0c2337, 0x82aaff, 0x82aaff, 0x22da6e, 0xaddb67, 0xef5350, 0x82aaff],
118 [0x82aaff, 0x22da6e, 0xef5350, 0xaddb67, 0xc792ea, 0x7fdbca, 0xd6deeb, 0xffcb8b];
119 poimandres, "poimandres", "Poimandres (dark, from gitkraft)." =>
120 [0x1a1e28, 0xa6accd, 0x646a82, 0x262a37, 0x5de4c7, 0x89ddff, 0x5de4c7, 0xfffac2, 0xd0679d, 0x89ddff],
121 [0x5de4c7, 0x89ddff, 0xd0679d, 0xfffac2, 0xa6accd, 0xaddb67, 0x646a82, 0xffb478];
122 flexoki_dark, "flexoki-dark", "Flexoki Dark (dark, from gitkraft)." =>
123 [0x100f0f, 0xcecdc3, 0x575653, 0x1e1c1c, 0x4385be, 0x4385be, 0x879a39, 0xd0a215, 0xd14d41, 0x4385be],
124 [0x4385be, 0x879a39, 0xd14d41, 0xd0a215, 0xce5d97, 0x3aa99f, 0xcecdc3, 0xab8d48];
125 flexoki_light, "flexoki-light", "Flexoki Light (light, from gitkraft)." =>
126 [0xfffcf0, 0x100f0f, 0x6f6e69, 0xf2eede, 0x205ea6, 0x205ea6, 0x66800b, 0xad8301, 0xaf3029, 0x205ea6],
127 [0x205ea6, 0x66800b, 0xaf3029, 0xad8301, 0xa34077, 0x24837b, 0x100f0f, 0x85682e];
128 carbonfox, "carbonfox", "Carbonfox (dark, from gitkraft)." =>
129 [0x161616, 0xf2f4f8, 0x64646e, 0x232323, 0x78a9ff, 0x78a9ff, 0x25be6a, 0x08bdba, 0xee5396, 0x78a9ff],
130 [0x78a9ff, 0x25be6a, 0xee5396, 0x08bdba, 0xbe95ff, 0xff7eb6, 0xf2f4f8, 0xffaa78];
131 andromeda, "andromeda", "Andromeda (dark, from gitkraft)." =>
132 [0x262a33, 0xe5e5e5, 0x666666, 0x323742, 0x05bc79, 0x0fa8cd, 0x05bc79, 0xe5e512, 0xcd3131, 0x0fa8cd],
133 [0x05bc79, 0x0fa8cd, 0xcd3131, 0xe5e512, 0xbe95ff, 0xff7eb6, 0xe5e5e5, 0x666666];
134 synthwave, "synthwave", "Synthwave (dark, from gitkraft)." =>
135 [0x0a0810, 0xdad9c7, 0x7f7094, 0x14101e, 0xf6188f, 0x12c3e2, 0x1ebb2b, 0xfdf834, 0xf6188f, 0x12c3e2],
136 [0xf6188f, 0x1ebb2b, 0x12c3e2, 0xfdf834, 0xbe95ff, 0xff7eb6, 0xdad9c7, 0x7f7094];
137 ayu_dark, "ayu-dark", "Ayu Dark." =>
138 [0x0b0e14, 0xbfbdb6, 0x565b66, 0x1d1f24, 0x59c2ff, 0xd2a6ff, 0xaad94c, 0xe6b450, 0xf26d78, 0x95e6cb],
139 [0x59c2ff, 0xe6b450, 0xd2a6ff, 0xaad94c, 0xf26d78, 0x95e6cb, 0xff8f40, 0xd2a6ff];
140 github_dark, "github-dark", "Github Dark." =>
141 [0x0d1117, 0xc9d1d9, 0x8b949e, 0x1f242a, 0x79c0ff, 0xd2a8ff, 0x7ee787, 0xe3b341, 0xff7b72, 0xa5d6ff],
142 [0x79c0ff, 0xe3b341, 0xd2a8ff, 0x7ee787, 0xff7b72, 0xa5d6ff, 0xffa657, 0xd2a8ff];
143 github_light, "github-light", "Github Light." =>
144 [0xffffff, 0x24292f, 0x6e7781, 0xe9e9ea, 0x0969da, 0x8250df, 0x1a7f37, 0x9a6700, 0xcf222e, 0x1b7c83],
145 [0x0969da, 0x9a6700, 0x8250df, 0x1a7f37, 0xcf222e, 0x1b7c83, 0xbc4c00, 0x8250df];
146 zenburn, "zenburn", "Zenburn." =>
147 [0x3f3f3f, 0xdcdccc, 0x709080, 0x4e4e4d, 0x8cd0d3, 0xdc8cc3, 0x7f9f7f, 0xf0dfaf, 0xcc9393, 0x93e0e3],
148 [0x8cd0d3, 0xf0dfaf, 0xdc8cc3, 0x7f9f7f, 0xcc9393, 0x93e0e3, 0xdfaf8f, 0xdc8cc3];
149 super_mario, "super-mario", "Super Mario." =>
150 [0x0f0b24, 0xfdfdf5, 0x8a7f9a, 0x262338, 0x1aa5e6, 0xff77d4, 0x3fca3f, 0xffd21e, 0xff3b30, 0x49c6e8],
151 [0x1aa5e6, 0xffd21e, 0xff77d4, 0x3fca3f, 0xff3b30, 0x49c6e8, 0xff9c1a, 0x8a6be0];
152 tokyo_night_moon, "tokyo-night-moon", "Tokyo Night Moon." =>
153 [0x222436, 0xc8d3f5, 0x636da6, 0x323549, 0x82aaff, 0xc099ff, 0xc3e88d, 0xffc777, 0xff757f, 0x86e1fc],
154 [0x82aaff, 0xffc777, 0xc099ff, 0xc3e88d, 0xff757f, 0x86e1fc, 0xff966c, 0xfca7ea];
155 tokyo_night_day, "tokyo-night-day", "Tokyo Night Day." =>
156 [0xe1e2e7, 0x3760bf, 0x848cb5, 0xd0d5e3, 0x2e7de9, 0x9854f1, 0x587539, 0x8c6c3e, 0xf52a65, 0x007197],
157 [0x2e7de9, 0x8c6c3e, 0x9854f1, 0x587539, 0xf52a65, 0x007197, 0xb15c00, 0x7847bd];
158 gruvbox_material, "gruvbox-material", "Gruvbox Material." =>
159 [0x282828, 0xd4be98, 0x928374, 0x393733, 0x7daea3, 0xd3869b, 0xa9b665, 0xd8a657, 0xea6962, 0x89b482],
160 [0x7daea3, 0xd8a657, 0xd3869b, 0xa9b665, 0xea6962, 0x89b482, 0xe78a4e, 0xd3869b];
161 nightfox, "nightfox", "Nightfox." =>
162 [0x192330, 0xcdcecf, 0x738091, 0x2b343f, 0x719cd6, 0x9d79d6, 0x81b29a, 0xdbc074, 0xc94f6d, 0x63cdcf],
163 [0x719cd6, 0xdbc074, 0x9d79d6, 0x81b29a, 0xc94f6d, 0x63cdcf, 0xf4a261, 0x9d79d6];
164 dawnfox, "dawnfox", "Dawnfox." =>
165 [0xfaf4ed, 0x575279, 0xa8a3b3, 0xe9e3e1, 0x286983, 0x907aa9, 0x618774, 0xea9d34, 0xb4637a, 0x56949f],
166 [0x286983, 0xea9d34, 0x907aa9, 0x618774, 0xb4637a, 0x56949f, 0xd7827e, 0x907aa9];
167 melange, "melange", "Melange." =>
168 [0x292522, 0xece1d7, 0x867462, 0x3c3734, 0x7f91b2, 0xb380b0, 0x78997a, 0xebc06d, 0xd47766, 0x7b9695],
169 [0x7f91b2, 0xebc06d, 0xb380b0, 0x78997a, 0xd47766, 0x7b9695, 0xe49b5d, 0xb380b0];
170 material_palenight, "material-palenight", "Material Palenight." =>
171 [0x292d3e, 0xa6accd, 0x676e95, 0x35394c, 0x82aaff, 0xc792ea, 0xc3e88d, 0xffcb6b, 0xf07178, 0x89ddff],
172 [0x82aaff, 0xffcb6b, 0xc792ea, 0xc3e88d, 0xf07178, 0x89ddff, 0xf78c6c, 0xc792ea];
173 tomorrow_night, "tomorrow-night", "Tomorrow Night." =>
174 [0x1d1f21, 0xc5c8c6, 0x969896, 0x2d2f31, 0x81a2be, 0xb294bb, 0xb5bd68, 0xf0c674, 0xcc6666, 0x8abeb7],
175 [0x81a2be, 0xf0c674, 0xb294bb, 0xb5bd68, 0xcc6666, 0x8abeb7, 0xde935f, 0xb294bb];
176 snazzy, "snazzy", "Snazzy." =>
177 [0x282a36, 0xeff0eb, 0x686868, 0x3b3d48, 0x57c7ff, 0xff6ac1, 0x5af78e, 0xf3f99d, 0xff5c57, 0x9aedfe],
178 [0x57c7ff, 0xf3f99d, 0xff6ac1, 0x5af78e, 0xff5c57, 0x9aedfe, 0xff9f43, 0xbd93f9];
179 iceberg, "iceberg", "Iceberg." =>
180 [0x161821, 0xc6c8d1, 0x6b7089, 0x272932, 0x84a0c6, 0xa093c7, 0xb4be82, 0xe9b189, 0xe27878, 0x89b8c2],
181 [0x84a0c6, 0xe9b189, 0xa093c7, 0xb4be82, 0xe27878, 0x89b8c2, 0xe2a478, 0xa093c7];
182 papercolor_light, "papercolor-light", "Papercolor Light." =>
183 [0xeeeeee, 0x444444, 0x878787, 0xdddddd, 0x005f87, 0x8700af, 0x008700, 0xd78700, 0xaf0000, 0x0087af],
184 [0x005f87, 0xd78700, 0x8700af, 0x008700, 0xaf0000, 0x0087af, 0xd75f00, 0x8700af];
185 synthwave_outrun, "synthwave-outrun", "Synthwave Outrun." =>
186 [0x262335, 0xffffff, 0x848bbd, 0x3b3949, 0x36f9f6, 0xff7edb, 0x72f1b8, 0xfede5d, 0xfe4450, 0x03edf9],
187 [0x36f9f6, 0xfede5d, 0xff7edb, 0x72f1b8, 0xfe4450, 0x03edf9, 0xf97e72, 0xb893ce];
188 cobalt, "cobalt", "Cobalt." =>
189 [0x193549, 0xe1efff, 0x6f8fa3, 0x2d475b, 0x0088ff, 0xfb94ff, 0x3ad900, 0xffc600, 0xff628c, 0x80ffbb],
190 [0x0088ff, 0xffc600, 0xfb94ff, 0x3ad900, 0xff628c, 0x80ffbb, 0xff9d00, 0x9a5feb];
191 modus_vivendi, "modus-vivendi", "Modus Vivendi." =>
192 [0x000000, 0xffffff, 0x989898, 0x191919, 0x2fafff, 0xfeacd0, 0x44bc44, 0xd0bc00, 0xff5f59, 0x00d3d0],
193 [0x2fafff, 0xd0bc00, 0xfeacd0, 0x44bc44, 0xff5f59, 0x00d3d0, 0xef8b50, 0xb6a0ff];
194 modus_operandi, "modus-operandi", "Modus Operandi." =>
195 [0xffffff, 0x000000, 0x595959, 0xe5e5e5, 0x0031a9, 0x721045, 0x006800, 0x6f5500, 0xa60000, 0x00538b],
196 [0x0031a9, 0x6f5500, 0x721045, 0x006800, 0xa60000, 0x00538b, 0x884900, 0x531ab6];
197 horizon, "horizon", "Horizon." =>
198 [0x1c1e26, 0xd5d8da, 0x6c6f93, 0x2e3038, 0x26bbd9, 0xee64ac, 0x29d398, 0xfac29a, 0xe95678, 0x59e1e3],
199 [0x26bbd9, 0xfac29a, 0xee64ac, 0x29d398, 0xe95678, 0x59e1e3, 0xfab795, 0xb877db];
200 sonokai, "sonokai", "Sonokai." =>
201 [0x2c2e34, 0xe2e2e3, 0x7f8490, 0x3e4045, 0x7ec8e3, 0xb39df3, 0x9ed072, 0xe7c664, 0xfc5d7c, 0x76cce0],
202 [0x7ec8e3, 0xe7c664, 0xb39df3, 0x9ed072, 0xfc5d7c, 0x76cce0, 0xf39660, 0xb39df3];
203 clair_obscur, "clair-obscur", "Clair Obscur." =>
204 [0x0b0d17, 0xe9dfc7, 0x5d6178, 0x212228, 0x4a78c2, 0xc9708a, 0x8fae8b, 0xe3b95a, 0xd4343f, 0x7fd0e0],
205 [0x4a78c2, 0xe3b95a, 0xc9708a, 0x8fae8b, 0xd4343f, 0x7fd0e0, 0xd98a3d, 0x8a6bbf];
206 clair_obscur_canvas, "clair-obscur-canvas", "Clair Obscur Canvas." =>
207 [0xefe4cc, 0x2b2433, 0x8a7f72, 0xdbd0bc, 0x2a4f8f, 0x8f3b58, 0x4d6b4a, 0x8c6a12, 0xa3212c, 0x2a6f80],
208 [0x2a4f8f, 0x8c6a12, 0x8f3b58, 0x4d6b4a, 0xa3212c, 0x2a6f80, 0xb4601f, 0x5e3f8c];
209 mario_overworld, "mario-overworld", "Mario Overworld." =>
210 [0xa6d8ff, 0x14173d, 0x5b6a8a, 0x97c4eb, 0x0b4fa8, 0xa1307a, 0x1c7a2a, 0x8a6a00, 0xc4161c, 0x00738f],
211 [0x0b4fa8, 0x8a6a00, 0xa1307a, 0x1c7a2a, 0xc4161c, 0x00738f, 0xb85c00, 0x5a3da8];
212 mario_underground, "mario-underground", "Mario Underground." =>
213 [0x02030f, 0xe8f0ff, 0x5a6a9a, 0x191a27, 0x3b7bff, 0xff6fc8, 0x3fd16a, 0xfcd23a, 0xff4d3d, 0x3ee0e8],
214 [0x3b7bff, 0xfcd23a, 0xff6fc8, 0x3fd16a, 0xff4d3d, 0x3ee0e8, 0xf89b3a, 0x8f7bff];
215 pip_boy, "pip-boy", "Pip Boy." =>
216 [0x031208, 0x46ff90, 0x1f8f55, 0x092915, 0x29d97a, 0x9dffb0, 0x3dff8a, 0xe6ff7a, 0xff8a3d, 0x6dffd0],
217 [0x29d97a, 0xe6ff7a, 0x9dffb0, 0x3dff8a, 0xff8a3d, 0x6dffd0, 0xc8ff4d, 0x7fe0a0];
218 tarnished, "tarnished", "Tarnished." =>
219 [0x0e0c09, 0xe6d8b0, 0x6f654f, 0x232019, 0x5d7690, 0x9c5f6e, 0x7a8c52, 0xe3b24a, 0xa63a2f, 0x7fa8a0],
220 [0x5d7690, 0xe3b24a, 0x9c5f6e, 0x7a8c52, 0xa63a2f, 0x7fa8a0, 0xc77f2e, 0x77608f];
221 hyrule, "hyrule", "Hyrule." =>
222 [0x0f1a14, 0xe8e2c4, 0x5f7060, 0x242e25, 0x4aa3d6, 0xc06fa8, 0x6fbf5b, 0xf2d04a, 0xd6453a, 0x5ed1c7],
223 [0x4aa3d6, 0xf2d04a, 0xc06fa8, 0x6fbf5b, 0xd6453a, 0x5ed1c7, 0xe08a2c, 0x8a78c8];
224 doom, "doom", "Doom." =>
225 [0x120c0b, 0xd9cfc4, 0x6a5f58, 0x251f1d, 0x4a6ea8, 0xb0407a, 0x4aa83a, 0xffc21a, 0xe5251c, 0x3aa5a0],
226 [0x4a6ea8, 0xffc21a, 0xb0407a, 0x4aa83a, 0xe5251c, 0x3aa5a0, 0xff7a1a, 0x7a4a9a];
227 phantom, "phantom", "Phantom." =>
228 [0x0a0a0a, 0xf2f2f2, 0x6b6b6b, 0x212121, 0x2f6bff, 0xff2a8a, 0x4ad06a, 0xffd400, 0xe60012, 0x3fd0ff],
229 [0x2f6bff, 0xffd400, 0xff2a8a, 0x4ad06a, 0xe60012, 0x3fd0ff, 0xff5a36, 0x8a3fff];
230 cavern_hush, "cavern-hush", "Cavern Hush." =>
231 [0x080b14, 0xdfe7ef, 0x4a5568, 0x1d2129, 0x5b7bb5, 0xa58ac0, 0x7fb7a4, 0xd8c58a, 0xc8505a, 0x9ee6f0],
232 [0x5b7bb5, 0xd8c58a, 0xa58ac0, 0x7fb7a4, 0xc8505a, 0x9ee6f0, 0xd0905a, 0x7a6aa8];
233 test_chamber, "test-chamber", "Test Chamber." =>
234 [0x12151a, 0xe9edf2, 0x5d6773, 0x272a2f, 0x1d8cff, 0xd57bff, 0x5ed17a, 0xffd24a, 0xff4b4b, 0x3ec3ff],
235 [0x1d8cff, 0xffd24a, 0xd57bff, 0x5ed17a, 0xff4b4b, 0x3ec3ff, 0xff9a1f, 0x8e7bff];
236 ember, "ember", "Ember." =>
237 [0x0d0b0a, 0xd8cfc2, 0x6a6158, 0x211e1c, 0x5f7691, 0x94616e, 0x7c8a5b, 0xd9a441, 0xb5382d, 0x6d9a9a],
238 [0x5f7691, 0xd9a441, 0x94616e, 0x7c8a5b, 0xb5382d, 0x6d9a9a, 0xe0782a, 0x75618a];
239 meadow, "meadow", "Meadow." =>
240 [0xf6efdc, 0x4a3b2a, 0x9a8a70, 0xe4ddca, 0x3e6fa8, 0xa2566e, 0x4f7a3a, 0xa8821c, 0xb8433a, 0x2f7f87],
241 [0x3e6fa8, 0xa8821c, 0xa2566e, 0x4f7a3a, 0xb8433a, 0x2f7f87, 0xc4742a, 0x7a5a9a];
242 dojo, "dojo", "Dojo." =>
243 [0x0f0f14, 0xf1f1f1, 0x66666e, 0x25252a, 0x2f6fe8, 0xff3d9a, 0x35c759, 0xffe033, 0xe8222a, 0x3ac7ff],
244 [0x2f6fe8, 0xffe033, 0xff3d9a, 0x35c759, 0xe8222a, 0x3ac7ff, 0xff8a1f, 0x8a4dff];
245 underworld, "underworld", "Underworld." =>
246 [0x120b12, 0xecdcc8, 0x6b5a66, 0x271f24, 0x5a7fd6, 0xd86aa0, 0x6fbf8a, 0xf5c04a, 0xe0352b, 0x6ad5d0],
247 [0x5a7fd6, 0xf5c04a, 0xd86aa0, 0x6fbf8a, 0xe0352b, 0x6ad5d0, 0xf08a3a, 0x9a5fd0];
248 summit, "summit", "Summit." =>
249 [0x1c1b2e, 0xeae6ff, 0x6d6a8f, 0x302f42, 0x6d8cff, 0xff7ad9, 0x7ee8a2, 0xffe36e, 0xff5c7c, 0x6ad8ff],
250 [0x6d8cff, 0xffe36e, 0xff7ad9, 0x7ee8a2, 0xff5c7c, 0x6ad8ff, 0xff9e5e, 0xa07bff];
251 rain_noir, "rain-noir", "Rain Noir." =>
252 [0x14171c, 0xd9d4c7, 0x5f6670, 0x27292d, 0x5a7fa8, 0xa06a86, 0x6f9a7c, 0xd4b24e, 0xb24a3a, 0x5aa3a8],
253 [0x5a7fa8, 0xd4b24e, 0xa06a86, 0x6f9a7c, 0xb24a3a, 0x5aa3a8, 0xcf8a3a, 0x7e6c9a];
254 blocky, "blocky", "Blocky." =>
255 [0x12100d, 0xe9e6df, 0x6f6a60, 0x272522, 0x3d62d6, 0xd26ad6, 0x5fb23a, 0xf3d04a, 0xd9443a, 0x4de3dc],
256 [0x3d62d6, 0xf3d04a, 0xd26ad6, 0x5fb23a, 0xd9443a, 0x4de3dc, 0xe08a2c, 0x9a5fd0];
257 everforest_light, "everforest-light", "Everforest Light." =>
258 [0xfdf6e3, 0x5c6a72, 0xa6b0a0, 0xece8d7, 0x3a94c5, 0xdf69ba, 0x8da101, 0xdfa000, 0xf85552, 0x35a77c],
259 [0x3a94c5, 0xdfa000, 0xdf69ba, 0x8da101, 0xf85552, 0x35a77c, 0xf57d26, 0xdf69ba];
260 ayu_light, "ayu-light", "Ayu Light." =>
261 [0xfafafa, 0x5c6166, 0xadaeb1, 0xeaeaeb, 0x399ee6, 0xa37acc, 0x86b300, 0xf2ae49, 0xe65050, 0x4cbf99],
262 [0x399ee6, 0xf2ae49, 0xa37acc, 0x86b300, 0xe65050, 0x4cbf99, 0xfa8d3e, 0xa37acc];
263 duskfox, "duskfox", "Duskfox." =>
264 [0x232136, 0xe0def4, 0x6e6a86, 0x353349, 0x569fba, 0xc4a7e7, 0xa3be8c, 0xf6c177, 0xeb6f92, 0x9ccfd8],
265 [0x569fba, 0xf6c177, 0xc4a7e7, 0xa3be8c, 0xeb6f92, 0x9ccfd8, 0xea9a97, 0xa58ec7];
266}
267
268impl Theme {
269 #[must_use]
273 pub fn porsche() -> Self {
274 let mut t = Self::from_spec(
275 "porsche",
276 Spec {
277 bg: 0x000000,
278 fg: 0xffffff,
279 muted: 0x9b9ba0,
280 surface: 0x1a1a1c,
281 accent: 0xd5001c,
282 secondary: 0xe3e3e6,
283 success: 0x2e9e5b,
284 warning: 0xf5a623,
285 error: 0xff4d5e,
286 info: 0x4aa3ff,
287 palette: &[
288 0xd5001c, 0xffffff, 0x9b9ba0, 0xff5a6e, 0x6b6b70, 0xe3e3e6, 0x8c0014, 0xc4c4c8,
289 ],
290 },
291 );
292 t.bull = rgb(0xffffff);
293 t.bear = rgb(0xd5001c);
294 t
295 }
296
297 #[must_use]
300 pub fn colorblind() -> Self {
301 let mut t = Self::from_spec(
302 "colorblind",
303 Spec {
304 bg: 0x000000,
305 fg: 0xffffff,
306 muted: 0xbbbbbb,
307 surface: 0x222222,
308 accent: 0x56b4e9,
309 secondary: 0xcc79a7,
310 success: 0x0072b2,
311 warning: 0xf0e442,
312 error: 0xe69f00,
313 info: 0x56b4e9,
314 palette: &[
315 0x0072b2, 0xe69f00, 0x009e73, 0xf0e442, 0x56b4e9, 0xd55e00, 0xcc79a7, 0xbbbbbb,
316 ],
317 },
318 );
319 t.background = None;
320 t.surface = None;
321 t.tooltip_bg = Color::DarkGray;
322 t.neutral = rgb(0xbbbbbb);
323 t
324 }
325
326 #[must_use]
328 pub fn high_contrast() -> Self {
329 let mut t = Self::from_spec(
330 "high-contrast",
331 Spec {
332 bg: 0x000000,
333 fg: 0xffffff,
334 muted: 0xd0d0d0,
335 surface: 0x1c1c1c,
336 accent: 0xffff00,
337 secondary: 0x00ffff,
338 success: 0x00ff00,
339 warning: 0xffa500,
340 error: 0xff5050,
341 info: 0x00ffff,
342 palette: &[
343 0xffff00, 0x00ffff, 0xff00ff, 0x00ff00, 0xff5050, 0xffa500, 0x5f9fff, 0xffffff,
344 ],
345 },
346 );
347 t.border = rgb(0xffffff);
348 t.selection_bg = rgb(0xffffff);
349 t.selection_fg = rgb(0x000000);
350 t.disabled = rgb(0xa0a0a0);
351 t
352 }
353
354 #[must_use]
357 pub fn mono() -> Self {
358 Self {
359 name: "mono".into(),
360 background: None,
361 surface: None,
362 foreground: Color::White,
363 muted: Color::Gray,
364 disabled: Color::DarkGray,
365 border: Color::Gray,
366 border_focused: Color::White,
367 title: Color::White,
368 primary: Color::White,
369 secondary: Color::Gray,
370 accent: Color::White,
371 success: Color::White,
372 warning: Color::Gray,
373 error: Color::White,
374 info: Color::Gray,
375 selection_bg: Color::White,
376 selection_fg: Color::Black,
377 highlight: Color::White,
378 palette: vec![
379 Color::White,
380 Color::Gray,
381 Color::DarkGray,
382 Color::White,
383 Color::Gray,
384 Color::DarkGray,
385 Color::White,
386 Color::Gray,
387 ],
388 bull: Color::White,
389 bear: Color::DarkGray,
390 neutral: Color::Gray,
391 axis: Color::DarkGray,
392 grid: Color::DarkGray,
393 crosshair: Color::Gray,
394 tooltip_fg: Color::Black,
395 tooltip_bg: Color::White,
396 }
397 }
398
399 #[must_use]
401 pub fn all() -> Vec<Theme> {
402 let mut v = vec![Theme::default()];
403 v.extend(NAMED.iter().map(|(_, f)| f()));
404 v.push(Theme::porsche());
405 v.push(Theme::colorblind());
406 v.push(Theme::high_contrast());
407 v.push(Theme::mono());
408 v
409 }
410
411 #[must_use]
413 pub fn names() -> Vec<&'static str> {
414 let mut v = vec!["default"];
415 v.extend(NAMED.iter().map(|(n, _)| *n));
416 v.extend(["porsche", "colorblind", "high-contrast", "mono"]);
417 v
418 }
419
420 #[must_use]
423 pub fn by_name(name: &str) -> Option<Theme> {
424 let key: String = name
425 .trim()
426 .chars()
427 .map(|c| match c {
428 'é' | 'è' | 'É' => 'e',
429 c => c.to_ascii_lowercase(),
430 })
431 .collect::<String>()
432 .replace(['_', ' '], "-");
433 Self::all().into_iter().find(|t| t.name == key)
434 }
435
436 fn position(&self) -> Option<usize> {
437 Self::names().iter().position(|n| *n == self.name)
438 }
439
440 #[must_use]
442 pub fn next(&self) -> Theme {
443 let all = Self::all();
444 let i = self.position().map_or(0, |i| (i + 1) % all.len());
445 all[i].clone()
446 }
447
448 #[must_use]
450 pub fn prev(&self) -> Theme {
451 let all = Self::all();
452 let i = self
453 .position()
454 .map_or(all.len() - 1, |i| (i + all.len() - 1) % all.len());
455 all[i].clone()
456 }
457}
458
459#[cfg(test)]
460mod tests {
461 use super::*;
462
463 #[test]
464 fn names_match_all() {
465 let all: Vec<String> = Theme::all().into_iter().map(|t| t.name).collect();
466 assert_eq!(all, Theme::names());
467 }
468
469 #[test]
470 fn all_names_unique() {
471 let names = Theme::names();
472 assert_eq!(names.len(), 90);
473 let mut sorted = names.clone();
474 sorted.sort_unstable();
475 sorted.dedup();
476 assert_eq!(sorted.len(), names.len());
477 }
478
479 #[test]
480 fn by_name_accepts_variants() {
481 assert_eq!(Theme::by_name("Tokyo Night").unwrap().name, "tokyo-night");
482 assert_eq!(Theme::by_name("ROSE_PINE").unwrap().name, "rose-pine");
483 assert_eq!(
484 Theme::by_name("Catppuccin Frappé").unwrap().name,
485 "catppuccin-frappe"
486 );
487 assert!(Theme::by_name("nope").is_none());
488 assert!(Theme::by_name("").is_none());
489 }
490
491 #[test]
492 fn next_prev_inverse_and_wrap() {
493 let all = Theme::all();
494 for t in &all {
495 assert_eq!(t.next().prev(), *t);
496 }
497 assert_eq!(all.last().unwrap().next(), all[0]);
498 assert_eq!(all[0].prev(), *all.last().unwrap());
499 }
500
501 #[test]
502 fn custom_theme_cycles_into_builtins() {
503 let c = Theme::default().name("mine");
504 assert_eq!(c.next().name, "default");
505 assert_eq!(c.prev().name, "mono");
506 }
507
508 #[test]
509 fn porsche_bull_is_white() {
510 assert_eq!(Theme::porsche().bull, Color::Rgb(255, 255, 255));
511 assert_eq!(Theme::porsche().accent, Color::Rgb(0xd5, 0x00, 0x1c));
512 }
513
514 #[test]
515 fn colorblind_has_no_green_red_pair() {
516 let t = Theme::colorblind();
517 assert_eq!(t.background, None);
518 assert_eq!(t.bull, Color::Rgb(0, 0x72, 0xb2));
519 }
520}