Aurore
A Switch-like interface for your app, on every screen
Loading...
Searching...
No Matches
cadran_palette.hpp
Go to the documentation of this file.
1// cadran_palette — the boards' two palettes as plain values (no view, no
2// nanovg), every colour Cadran draws with: cadran::install_theme puts them
3// in Aurore's themes under their keys (KEYS below), where a theme file
4// can change any of them (docs/themes.md), and a host suite checks the
5// contrast of every ink on every surface it is drawn on (tests/host;
6// Theme::checkContrast does the same at run time, with CONTRAST below).
7// Copyright (C) 2026 JigSawFr. GPLv3-or-later (see LICENSE.GPL).
8#pragma once
9
10#include <cstdint>
11
13{
15struct Rgba
16{
17 uint8_t r, g, b, a;
18};
19
69
70constexpr Rgba NAVY = { 0x0B, 0x14, 0x24, 255 };
71
72constexpr Palette DARK = {
73 NAVY, // bg
74 { 0xEE, 0xF2, 0xF8, 255 }, // text
75 { 0xA9, 0xB5, 0xC9, 255 }, // text2
76 { 0x83, 0x92, 0xAA, 255 }, // text3
77 { 0x12, 0x1E, 0x33, 255 }, // surf
78 { 0x1A, 0x2A, 0x45, 255 }, // surf2
79 { 255, 255, 255, 36 }, // line
80 { 0x2E, 0xC4, 0xA6, 255 }, // teal
81 { 0x2E, 0xC4, 0xA6, 255 }, // teal_fill
82 { 0x2E, 0xC4, 0xA6, 26 }, // teal_soft
83 { 0xFF, 0xB5, 0x47, 255 }, // amber
84 { 0xFF, 0xB5, 0x47, 255 }, // amber_fill
85 { 0xFF, 0x7A, 0x7A, 255 }, // coral
86 { 0xFF, 0x7A, 0x7A, 255 }, // coral_fill
87 { 0xFF, 0x7A, 0x7A, 140 }, // coral_line
88 { 255, 255, 255, 23 }, // track
89 { 0x2E, 0xC4, 0xA6, 31 }, // glow
90 { 0x2E, 0xC4, 0xA6, 51 }, // glow_strong
91 { 0xFF, 0xB5, 0x47, 26 }, // amber_surf
92 { 0xFF, 0xB5, 0x47, 90 }, // amber_line
93 { 0x2E, 0xC4, 0xA6, 41 }, // pill_ok
94 { 0x2E, 0xC4, 0xA6, 255 }, // pill_ok_ink
95 { 0x2E, 0xC4, 0xA6, 36 }, // rail_active
96 { 0xEE, 0xF2, 0xF8, 255 }, // key_bg
97 NAVY, // key_fg
98 { 0x2E, 0xC4, 0xA6, 255 }, // hl1
99 { 0x9A, 0xF0, 0xDC, 255 }, // hl2
100 { 255, 255, 255, 60 }, // border
101 { 0x4F, 0xA3, 0xFF, 255 }, // blue
102 { 0x9B, 0x8C, 0xF5, 255 }, // violet
103 { 0xFF, 0x7A, 0x7A, 36 }, // coral_soft
104 { 255, 255, 255, 46 }, // well
105 { 0xE9, 0x6A, 0xA8, 255 }, // pink
106 { 0x7C, 0x6C, 0xF2, 255 }, // avatar0
107 { 0xFF, 0xB5, 0x47, 255 }, // avatar1
108 { 0x4F, 0xA3, 0xFF, 255 }, // avatar2
109 { 0xE9, 0x6A, 0xA8, 255 }, // avatar3
110 { 0xFF, 0xFF, 0xFF, 255 }, // knob
111 { 0x0B, 0x14, 0x24, 40 }, // knob_line
112 { 0x5A, 0x71, 0x96, 255 }, // bar
113 { 0x9F, 0xB4, 0xD4, 255 }, // bar_today
114 { 3, 8, 18, 225 }, // backdrop
115 { 0x1A, 0x2A, 0x45, 250 }, // toast
116 { 0xEE, 0xF2, 0xF8, 255 }, // toast_text
117 NAVY, // on_fill
118 { 255, 255, 255, 70 }, // hold_fill
119 { 0, 0, 0, 70 }, // rail_shadow
120 { 0x2E, 0xC4, 0xA6, 38 }, // click_pulse
121 { 0xEE, 0xF2, 0xF8, 110 }, // text_off
122 { 0x1F, 0x33, 0x55, 255 }, // brand_track
123 { 0x2E, 0xC4, 0xA6, 255 }, // brand_fill
124 { 0x9A, 0xF0, 0xDC, 255 } // brand_glow
125};
126
127constexpr Palette LIGHT = {
128 { 0xED, 0xF0, 0xF4, 255 }, // bg
129 NAVY, // text
130 { 0x3F, 0x4C, 0x63, 255 }, // text2
131 { 0x5F, 0x6E, 0x88, 255 }, // text3
132 { 0xFF, 0xFF, 0xFF, 255 }, // surf
133 { 0xF3, 0xF5, 0xF8, 255 }, // surf2
134 { 0x0B, 0x14, 0x24, 26 }, // line
135 { 0x0A, 0x70, 0x5F, 255 }, // teal
136 { 0x14, 0xA3, 0x8A, 255 }, // teal_fill
137 { 0x14, 0xA3, 0x8A, 26 }, // teal_soft
138 { 0x8A, 0x52, 0x00, 255 }, // amber
139 { 0xE0, 0x93, 0x1B, 255 }, // amber_fill
140 { 0xB7, 0x1C, 0x1C, 255 }, // coral
141 { 0xE5, 0x48, 0x4D, 255 }, // coral_fill
142 { 0xE3, 0x9A, 0x9A, 255 }, // coral_line
143 { 0x0B, 0x14, 0x24, 26 }, // track
144 { 0x2E, 0xC4, 0xA6, 41 }, // glow
145 { 0x2E, 0xC4, 0xA6, 56 }, // glow_strong
146 { 0xFF, 0xF3, 0xDF, 255 }, // amber_surf
147 { 0xF3, 0xD5, 0x9C, 255 }, // amber_line
148 { 0xD8, 0xF3, 0xEC, 255 }, // pill_ok
149 { 0x0A, 0x6E, 0x5C, 255 }, // pill_ok_ink
150 { 0x14, 0xA3, 0x8A, 36 }, // rail_active
151 NAVY, // key_bg
152 { 0xFF, 0xFF, 0xFF, 255 }, // key_fg
153 { 0x0A, 0x70, 0x5F, 255 }, // hl1
154 { 0x0F, 0x8A, 0x74, 255 }, // hl2
155 { 0x0B, 0x14, 0x24, 60 }, // border
156 { 0x1F, 0x5F, 0xC4, 255 }, // blue
157 { 0x5B, 0x47, 0xC9, 255 }, // violet
158 { 0xE5, 0x48, 0x4D, 28 }, // coral_soft
159 { 0, 0, 0, 34 }, // well
160 { 0xC2, 0x45, 0x7F, 255 }, // pink
161 { 0x7C, 0x6C, 0xF2, 255 }, // avatar0
162 { 0xFF, 0xB5, 0x47, 255 }, // avatar1
163 { 0x4F, 0xA3, 0xFF, 255 }, // avatar2
164 { 0xE9, 0x6A, 0xA8, 255 }, // avatar3
165 { 0xFF, 0xFF, 0xFF, 255 }, // knob
166 { 0x0B, 0x14, 0x24, 40 }, // knob_line
167 { 0x7E, 0x90, 0xAE, 255 }, // bar
168 { 0x4A, 0x5D, 0x7E, 255 }, // bar_today
169 { 0x0B, 0x14, 0x24, 160 }, // backdrop
170 { 0x0B, 0x14, 0x24, 240 }, // toast
171 { 0xEE, 0xF2, 0xF8, 255 }, // toast_text
172 NAVY, // on_fill
173 { 255, 255, 255, 70 }, // hold_fill
174 { 0, 0, 0, 70 }, // rail_shadow
175 { 0x14, 0xA3, 0x8A, 38 }, // click_pulse
176 { 0x0B, 0x14, 0x24, 110 }, // text_off
177 { 0x1F, 0x33, 0x55, 255 }, // brand_track
178 { 0x2E, 0xC4, 0xA6, 255 }, // brand_fill
179 { 0x9A, 0xF0, 0xDC, 255 } // brand_glow
180};
181
184struct Key
185{
186 const char* name;
188};
189
190constexpr Key KEYS[] = {
191 { "aurore/background", &Palette::bg },
192 { "aurore/clear", &Palette::bg },
193 { "aurore/text", &Palette::text },
194 // A secondary text (a switch's Off, a placeholder) in the third ink,
195 // what cannot be used now in the faded one
196 { "aurore/text_secondary", &Palette::text3 },
197 { "aurore/text_disabled", &Palette::text_off },
198 { "aurore/sidebar/background", &Palette::bg },
199 { "aurore/sidebar/separator", &Palette::line },
200 { "aurore/sidebar/active_item", &Palette::teal },
201 { "aurore/applet_frame/separator", &Palette::line },
202 { "aurore/header/border", &Palette::line },
203 { "aurore/highlight/background", &Palette::surf },
204 { "aurore/highlight/color1", &Palette::hl1 },
205 { "aurore/highlight/color2", &Palette::hl2 },
206 { "aurore/click_pulse", &Palette::click_pulse },
207 { "aurore/button/primary_enabled_background", &Palette::teal_fill },
208 { "aurore/button/primary_enabled_text", &Palette::on_fill },
209 { "aurore/button/default_enabled_background", &Palette::surf2 },
210 { "aurore/button/default_enabled_text", &Palette::text },
211 { "aurore/button/enabled_border_color", &Palette::border },
212 { "aurore/button/highlight_enabled_text", &Palette::teal },
213 // A list line's plain value in the second ink, so the list screens
214 // (cadran::List) take it as it is.
215 { "aurore/list/listItem_value_color", &Palette::text2 },
216 { "aurore/backdrop", &Palette::backdrop },
217 { "aurore/notification/background", &Palette::toast },
218 { "aurore/notification/text", &Palette::toast_text },
219 { "cadran/navy", &Palette::on_fill },
220 { "cadran/text", &Palette::text },
221 { "cadran/text2", &Palette::text2 },
222 { "cadran/text3", &Palette::text3 },
223 { "cadran/text_off", &Palette::text_off },
224 { "cadran/teal", &Palette::teal },
225 { "cadran/teal_fill", &Palette::teal_fill },
226 { "cadran/teal_soft", &Palette::teal_soft },
227 { "cadran/amber", &Palette::amber },
228 { "cadran/amber_fill", &Palette::amber_fill },
229 { "cadran/coral", &Palette::coral },
230 { "cadran/coral_fill", &Palette::coral_fill },
231 { "cadran/coral_line", &Palette::coral_line },
232 { "cadran/coral_soft", &Palette::coral_soft },
233 { "cadran/track", &Palette::track },
234 { "cadran/surf", &Palette::surf },
235 { "cadran/surf2", &Palette::surf2 },
236 { "cadran/line", &Palette::line },
237 { "cadran/border", &Palette::border },
238 { "cadran/glow", &Palette::glow },
239 { "cadran/glow_strong", &Palette::glow_strong },
240 { "cadran/amber_surf", &Palette::amber_surf },
241 { "cadran/amber_line", &Palette::amber_line },
242 { "cadran/pill_ok", &Palette::pill_ok },
243 { "cadran/pill_ok_ink", &Palette::pill_ok_ink },
244 { "cadran/rail_active", &Palette::rail_active },
245 { "cadran/key_bg", &Palette::key_bg },
246 { "cadran/key_fg", &Palette::key_fg },
247 { "cadran/hl1", &Palette::hl1 },
248 { "cadran/hl2", &Palette::hl2 },
249 { "cadran/well", &Palette::well },
250 { "cadran/blue", &Palette::blue },
251 { "cadran/violet", &Palette::violet },
252 { "cadran/pink", &Palette::pink },
253 { "cadran/avatar0", &Palette::avatar0 },
254 { "cadran/avatar1", &Palette::avatar1 },
255 { "cadran/avatar2", &Palette::avatar2 },
256 { "cadran/avatar3", &Palette::avatar3 },
257 { "cadran/knob", &Palette::knob },
258 { "cadran/knob_line", &Palette::knob_line },
259 { "cadran/bar", &Palette::bar },
260 { "cadran/bar_today", &Palette::bar_today },
261 { "cadran/hold_fill", &Palette::hold_fill },
262 { "cadran/rail_shadow", &Palette::rail_shadow },
263 { "cadran/brand/track", &Palette::brand_track },
264 { "cadran/brand/fill", &Palette::brand_fill },
265 { "cadran/brand/glow", &Palette::brand_glow },
266};
267
273{
274 const char* ink;
275 const char* surface;
276 float minimum;
277};
278
279constexpr Contrast CONTRAST[] = {
280 // The text and the inks, on the background, a card and the second surface.
281 { "cadran/text", "aurore/background", 4.5f },
282 { "cadran/text", "cadran/surf", 4.5f },
283 { "cadran/text", "cadran/surf2", 4.5f },
284 { "cadran/text2", "aurore/background", 4.5f },
285 { "cadran/text2", "cadran/surf", 4.5f },
286 { "cadran/text2", "cadran/surf2", 4.5f },
287 { "cadran/text3", "aurore/background", 4.5f },
288 { "cadran/text3", "cadran/surf", 4.5f },
289 { "cadran/text3", "cadran/surf2", 4.5f },
290 { "cadran/teal", "aurore/background", 4.5f },
291 { "cadran/teal", "cadran/surf", 4.5f },
292 { "cadran/teal", "cadran/surf2", 4.5f },
293 { "cadran/amber", "aurore/background", 4.5f },
294 { "cadran/amber", "cadran/surf", 4.5f },
295 { "cadran/amber", "cadran/surf2", 4.5f },
296 { "cadran/coral", "aurore/background", 4.5f },
297 { "cadran/coral", "cadran/surf", 4.5f },
298 { "cadran/coral", "cadran/surf2", 4.5f },
299 { "cadran/blue", "aurore/background", 4.5f },
300 { "cadran/blue", "cadran/surf", 4.5f },
301 { "cadran/blue", "cadran/surf2", 4.5f },
302 { "cadran/violet", "aurore/background", 4.5f },
303 { "cadran/violet", "cadran/surf", 4.5f },
304 { "cadran/violet", "cadran/surf2", 4.5f },
305 // Where the palettes put an ink on a fill of their own.
306 { "cadran/amber", "cadran/amber_surf", 4.5f },
307 { "cadran/pill_ok_ink", "cadran/pill_ok", 4.5f },
308 { "cadran/teal", "cadran/rail_active", 4.5f },
309 { "cadran/key_fg", "cadran/key_bg", 4.5f },
310 { "cadran/navy", "cadran/teal_fill", 4.5f },
311 { "cadran/navy", "cadran/coral_fill", 4.5f },
312 // The focus ring, both ends of its pulse, on the screen and on a card.
313 { "aurore/highlight/color1", "aurore/background", 3.0f },
314 { "aurore/highlight/color2", "aurore/background", 3.0f },
315 { "aurore/highlight/color1", "cadran/surf", 3.0f },
316 { "aurore/highlight/color2", "cadran/surf", 3.0f },
317 // Secondary text in Aurore's cells, on a card too.
318 { "aurore/text_secondary", "cadran/surf", 4.5f },
319 { "aurore/list/listItem_value_color", "cadran/surf", 4.5f },
320 // Shapes that carry meaning, at 3:1 (WCAG 1.4.11): a tile's icon, a
321 // chart's bars. A switch off is told by its knob and outline, in text3.
322 { "cadran/pink", "cadran/surf", 3.0f },
323 { "cadran/bar", "cadran/surf", 3.0f },
324 { "cadran/bar_today", "cadran/surf", 3.0f },
325};
326} // namespace cadran::palette
Definition cadran_palette.hpp:13
constexpr Rgba NAVY
Definition cadran_palette.hpp:70
constexpr Key KEYS[]
Definition cadran_palette.hpp:190
constexpr Palette DARK
Definition cadran_palette.hpp:72
constexpr Contrast CONTRAST[]
Definition cadran_palette.hpp:279
constexpr Palette LIGHT
Definition cadran_palette.hpp:127
Definition cadran_palette.hpp:273
const char * surface
Definition cadran_palette.hpp:275
const char * ink
Definition cadran_palette.hpp:274
float minimum
Definition cadran_palette.hpp:276
Definition cadran_palette.hpp:185
const char * name
Definition cadran_palette.hpp:186
Rgba Palette::* color
Definition cadran_palette.hpp:187
Definition cadran_palette.hpp:29
Rgba teal
Definition cadran_palette.hpp:30
Rgba text_off
Definition cadran_palette.hpp:64
Rgba track
Definition cadran_palette.hpp:31
Rgba violet
Definition cadran_palette.hpp:33
Rgba on_fill
Definition cadran_palette.hpp:55
Rgba brand_fill
Definition cadran_palette.hpp:67
Rgba rail_active
Definition cadran_palette.hpp:31
Rgba knob_line
Definition cadran_palette.hpp:45
Rgba well
The empty part of a progress bar, behind a game's missing cover.
Definition cadran_palette.hpp:37
Rgba brand_track
Definition cadran_palette.hpp:67
Rgba amber_surf
Definition cadran_palette.hpp:31
Rgba coral_line
Definition cadran_palette.hpp:31
Rgba hl2
Definition cadran_palette.hpp:32
Rgba border
Definition cadran_palette.hpp:32
Rgba glow
Definition cadran_palette.hpp:31
Rgba click_pulse
A press's flash: the fill teal, faint.
Definition cadran_palette.hpp:61
Rgba coral_soft
A removal's soft fill (the header's pill in danger).
Definition cadran_palette.hpp:35
Rgba glow_strong
Definition cadran_palette.hpp:31
Rgba toast_text
Definition cadran_palette.hpp:52
Rgba coral
Definition cadran_palette.hpp:30
Rgba avatar0
Definition cadran_palette.hpp:43
Rgba pill_ok
Definition cadran_palette.hpp:31
Rgba amber_fill
Definition cadran_palette.hpp:30
Rgba pill_ok_ink
Definition cadran_palette.hpp:31
Rgba key_fg
Definition cadran_palette.hpp:32
Rgba rail_shadow
The rail's shadow over the tab while it is out (its darkest).
Definition cadran_palette.hpp:59
Rgba key_bg
Definition cadran_palette.hpp:31
Rgba surf
Definition cadran_palette.hpp:30
Rgba line
Definition cadran_palette.hpp:30
Rgba text2
Definition cadran_palette.hpp:30
Rgba teal_soft
Definition cadran_palette.hpp:30
Rgba text
Definition cadran_palette.hpp:30
Rgba hl1
Definition cadran_palette.hpp:32
Rgba teal_fill
Definition cadran_palette.hpp:30
Rgba text3
Definition cadran_palette.hpp:30
Rgba amber_line
Definition cadran_palette.hpp:31
Rgba hold_fill
A held button filling up (ui::hold_confirm), over its own colour.
Definition cadran_palette.hpp:57
Rgba backdrop
Definition cadran_palette.hpp:52
Rgba brand_glow
Definition cadran_palette.hpp:67
Rgba toast
Definition cadran_palette.hpp:52
Rgba surf2
Definition cadran_palette.hpp:30
Rgba bar
A chart's bars, today's lighter.
Definition cadran_palette.hpp:47
Rgba pink
Definition cadran_palette.hpp:40
Rgba blue
Definition cadran_palette.hpp:33
Rgba amber
Definition cadran_palette.hpp:30
Rgba bar_today
Definition cadran_palette.hpp:47
Rgba avatar2
Definition cadran_palette.hpp:43
Rgba avatar3
Definition cadran_palette.hpp:43
Rgba avatar1
Definition cadran_palette.hpp:43
Rgba bg
Definition cadran_palette.hpp:30
Rgba knob
A switch's knob, white on either track, and its edge while off.
Definition cadran_palette.hpp:45
Rgba coral_fill
Definition cadran_palette.hpp:30
A colour, 0 to 255 per channel.
Definition cadran_palette.hpp:16
uint8_t a
Definition cadran_palette.hpp:17
uint8_t r
Definition cadran_palette.hpp:17
uint8_t b
Definition cadran_palette.hpp:17
uint8_t g
Definition cadran_palette.hpp:17