1use super::color::Color;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9pub enum ColorName {
10 Dark,
11 Gray,
12 Red,
13 Pink,
14 Grape,
15 Violet,
16 Indigo,
17 Blue,
18 Cyan,
19 Teal,
20 Green,
21 Lime,
22 Yellow,
23 Orange,
24}
25
26impl ColorName {
27 pub const ALL: [ColorName; 14] = [
28 ColorName::Dark,
29 ColorName::Gray,
30 ColorName::Red,
31 ColorName::Pink,
32 ColorName::Grape,
33 ColorName::Violet,
34 ColorName::Indigo,
35 ColorName::Blue,
36 ColorName::Cyan,
37 ColorName::Teal,
38 ColorName::Green,
39 ColorName::Lime,
40 ColorName::Yellow,
41 ColorName::Orange,
42 ];
43
44 pub fn label(self) -> &'static str {
45 match self {
46 ColorName::Dark => "dark",
47 ColorName::Gray => "gray",
48 ColorName::Red => "red",
49 ColorName::Pink => "pink",
50 ColorName::Grape => "grape",
51 ColorName::Violet => "violet",
52 ColorName::Indigo => "indigo",
53 ColorName::Blue => "blue",
54 ColorName::Cyan => "cyan",
55 ColorName::Teal => "teal",
56 ColorName::Green => "green",
57 ColorName::Lime => "lime",
58 ColorName::Yellow => "yellow",
59 ColorName::Orange => "orange",
60 }
61 }
62}
63
64#[derive(Debug, Clone, Copy)]
66pub struct Shades(pub [Color; 10]);
67
68impl Shades {
69 pub fn get(&self, shade: usize) -> Color {
71 self.0[shade.min(9)]
72 }
73}
74
75#[derive(Debug, Clone, Copy)]
77pub struct Palette {
78 shades: [Shades; 14],
79}
80
81impl Palette {
82 pub fn shades(&self, name: ColorName) -> Shades {
84 self.shades[name as usize]
85 }
86
87 pub fn get(&self, name: ColorName, shade: usize) -> Color {
89 self.shades(name).get(shade)
90 }
91
92 pub fn set_shades(&mut self, name: ColorName, shades: Shades) {
95 self.shades[name as usize] = shades;
96 }
97}
98
99impl Default for Palette {
100 fn default() -> Self {
101 open_color()
102 }
103}
104
105pub fn open_color() -> Palette {
107 let ramp = |hexes: [&str; 10]| Shades(hexes.map(Color::hex));
108 Palette {
109 shades: [
110 ramp([
112 "#C9C9C9", "#b8b8b8", "#828282", "#696969", "#424242", "#3b3b3b", "#2e2e2e", "#242424",
113 "#1f1f1f", "#141414",
114 ]),
115 ramp([
117 "#f8f9fa", "#f1f3f5", "#e9ecef", "#dee2e6", "#ced4da", "#adb5bd", "#868e96", "#495057",
118 "#343a40", "#212529",
119 ]),
120 ramp([
122 "#fff5f5", "#ffe3e3", "#ffc9c9", "#ffa8a8", "#ff8787", "#ff6b6b", "#fa5252", "#f03e3e",
123 "#e03131", "#c92a2a",
124 ]),
125 ramp([
127 "#fff0f6", "#ffdeeb", "#fcc2d7", "#faa2c1", "#f783ac", "#f06595", "#e64980", "#d6336c",
128 "#c2255c", "#a61e4d",
129 ]),
130 ramp([
132 "#f8f0fc", "#f3d9fa", "#eebefa", "#e599f7", "#da77f2", "#cc5de8", "#be4bdb", "#ae3ec9",
133 "#9c36b5", "#862e9c",
134 ]),
135 ramp([
137 "#f3f0ff", "#e5dbff", "#d0bfff", "#b197fc", "#9775fa", "#845ef7", "#7950f2", "#7048e8",
138 "#6741d9", "#5f3dc4",
139 ]),
140 ramp([
142 "#edf2ff", "#dbe4ff", "#bac8ff", "#91a7ff", "#748ffc", "#5c7cfa", "#4c6ef5", "#4263eb",
143 "#3b5bdb", "#364fc7",
144 ]),
145 ramp([
147 "#e7f5ff", "#d0ebff", "#a5d8ff", "#74c0fc", "#4dabf7", "#339af0", "#228be6", "#1c7ed6",
148 "#1971c2", "#1864ab",
149 ]),
150 ramp([
152 "#e3fafc", "#c5f6fa", "#99e9f2", "#66d9e8", "#3bc9db", "#22b8cf", "#15aabf", "#1098ad",
153 "#0c8599", "#0b7285",
154 ]),
155 ramp([
157 "#e6fcf5", "#c3fae8", "#96f2d7", "#63e6be", "#38d9a9", "#20c997", "#12b886", "#0ca678",
158 "#099268", "#087f5b",
159 ]),
160 ramp([
162 "#ebfbee", "#d3f9d8", "#b2f2bb", "#8ce99a", "#69db7c", "#51cf66", "#40c057", "#37b24d",
163 "#2f9e44", "#2b8a3e",
164 ]),
165 ramp([
167 "#f4fce3", "#e9fac8", "#d8f5a2", "#c0eb75", "#a9e34b", "#94d82d", "#82c91e", "#74b816",
168 "#66a80f", "#5c940d",
169 ]),
170 ramp([
172 "#fff9db", "#fff3bf", "#ffec99", "#ffe066", "#ffd43b", "#fcc419", "#fab005", "#f59f00",
173 "#f08c00", "#e67700",
174 ]),
175 ramp([
177 "#fff4e6", "#ffe8cc", "#ffd8a8", "#ffc078", "#ffa94d", "#ff922b", "#fd7e14", "#f76707",
178 "#e8590c", "#d9480f",
179 ]),
180 ],
181 }
182}