1use freya_core::prelude::*;
2#[cfg(feature = "titlebar")]
3use torin::prelude::Length;
4use torin::{
5 gaps::Gaps,
6 size::Size,
7};
8
9#[cfg(feature = "calendar")]
10use crate::theming::component_themes::CalendarThemePreference;
11#[cfg(feature = "router")]
12use crate::theming::component_themes::LinkThemePreference;
13#[cfg(feature = "markdown")]
14use crate::theming::component_themes::MarkdownViewerThemePreference;
15#[cfg(feature = "titlebar")]
16use crate::theming::component_themes::TitlebarButtonThemePreference;
17use crate::theming::{
18 component_themes::{
19 AccordionThemePreference,
20 ButtonColorsThemePreference,
21 ButtonLayoutThemePreference,
22 ButtonSegmentThemePreference,
23 CardColorsThemePreference,
24 CardLayoutThemePreference,
25 CheckboxThemePreference,
26 ChipThemePreference,
27 CircularLoaderThemePreference,
28 ColorPickerThemePreference,
29 ColorsSheet,
30 FloatingTabThemePreference,
31 InputColorsThemePreference,
32 InputLayoutThemePreference,
33 MenuContainerThemePreference,
34 MenuItemThemePreference,
35 PopupThemePreference,
36 ProgressBarThemePreference,
37 RadioItemThemePreference,
38 ResizableHandleThemePreference,
39 ScrollBarThemePreference,
40 SegmentedButtonThemePreference,
41 SelectThemePreference,
42 SideBarItemThemePreference,
43 SliderThemePreference,
44 SwitchThemePreference,
45 TableThemePreference,
46 Theme,
47 TooltipThemePreference,
48 },
49 macros::Preference,
50};
51
52pub const BASE_THEME: Theme = Theme {
53 name: "base",
54 colors: ColorsSheet {
55 primary: Color::TRANSPARENT,
57 secondary: Color::TRANSPARENT,
58 tertiary: Color::TRANSPARENT,
59
60 success: Color::TRANSPARENT,
62 warning: Color::TRANSPARENT,
63 error: Color::TRANSPARENT,
64 info: Color::TRANSPARENT,
65
66 background: Color::TRANSPARENT,
68 surface_primary: Color::TRANSPARENT,
69 surface_secondary: Color::TRANSPARENT,
70 surface_tertiary: Color::TRANSPARENT,
71 surface_inverse: Color::TRANSPARENT,
72 surface_inverse_secondary: Color::TRANSPARENT,
73 surface_inverse_tertiary: Color::TRANSPARENT,
74
75 border: Color::TRANSPARENT,
77 border_focus: Color::TRANSPARENT,
78 border_disabled: Color::TRANSPARENT,
79
80 text_primary: Color::TRANSPARENT,
82 text_secondary: Color::TRANSPARENT,
83 text_placeholder: Color::TRANSPARENT,
84 text_inverse: Color::TRANSPARENT,
85 text_highlight: Color::TRANSPARENT,
86
87 hover: Color::TRANSPARENT,
89 focus: Color::TRANSPARENT,
90 active: Color::TRANSPARENT,
91 disabled: Color::TRANSPARENT,
92
93 overlay: Color::TRANSPARENT,
95 shadow: Color::TRANSPARENT,
96 },
97 button_layout: ButtonLayoutThemePreference {
98 padding: Preference::Specific(Gaps::new(6., 12., 6., 12.)),
99 margin: Preference::Specific(Gaps::new_all(0.)),
100 corner_radius: Preference::Specific(CornerRadius::new_all(6.)),
101 width: Preference::Specific(Size::Inner),
102 height: Preference::Specific(Size::Inner),
103 },
104 compact_button_layout: ButtonLayoutThemePreference {
105 padding: Preference::Specific(Gaps::new(3., 6., 3., 6.)),
106 margin: Preference::Specific(Gaps::new_all(0.)),
107 corner_radius: Preference::Specific(CornerRadius::new_all(6.)),
108 width: Preference::Specific(Size::Inner),
109 height: Preference::Specific(Size::Inner),
110 },
111 expanded_button_layout: ButtonLayoutThemePreference {
112 padding: Preference::Specific(Gaps::new(10., 16., 10., 16.)),
113 margin: Preference::Specific(Gaps::new_all(0.)),
114 corner_radius: Preference::Specific(CornerRadius::new_all(6.)),
115 width: Preference::Specific(Size::Inner),
116 height: Preference::Specific(Size::Inner),
117 },
118 button: ButtonColorsThemePreference {
119 background: Preference::Reference("surface_tertiary"),
120 hover_background: Preference::Reference("hover"),
121 border_fill: Preference::Reference("border"),
122 focus_border_fill: Preference::Reference("border_focus"),
123 color: Preference::Reference("text_primary"),
124 },
125 filled_button: ButtonColorsThemePreference {
126 background: Preference::Reference("primary"),
127 hover_background: Preference::Reference("tertiary"),
128 border_fill: Preference::Specific(Color::TRANSPARENT),
129 focus_border_fill: Preference::Reference("secondary"),
130 color: Preference::Reference("text_inverse"),
131 },
132 outline_button: ButtonColorsThemePreference {
133 background: Preference::Reference("surface_tertiary"),
134 hover_background: Preference::Reference("hover"),
135 border_fill: Preference::Reference("border"),
136 focus_border_fill: Preference::Reference("secondary"),
137 color: Preference::Reference("primary"),
138 },
139 flat_button: ButtonColorsThemePreference {
140 background: Preference::Specific(Color::TRANSPARENT),
141 hover_background: Preference::Reference("surface_tertiary"),
142 border_fill: Preference::Specific(Color::TRANSPARENT),
143 focus_border_fill: Preference::Reference("border"),
144 color: Preference::Reference("text_primary"),
145 },
146 card_layout: CardLayoutThemePreference {
147 padding: Preference::Specific(Gaps::new(16., 16., 16., 16.)),
148 corner_radius: Preference::Specific(CornerRadius::new_all(8.)),
149 },
150 compact_card_layout: CardLayoutThemePreference {
151 padding: Preference::Specific(Gaps::new(8., 12., 8., 12.)),
152 corner_radius: Preference::Specific(CornerRadius::new_all(8.)),
153 },
154 filled_card: CardColorsThemePreference {
155 background: Preference::Reference("primary"),
156 hover_background: Preference::Reference("tertiary"),
157 border_fill: Preference::Specific(Color::TRANSPARENT),
158 color: Preference::Reference("text_inverse"),
159 shadow: Preference::Reference("shadow"),
160 },
161 outline_card: CardColorsThemePreference {
162 background: Preference::Reference("surface_tertiary"),
163 hover_background: Preference::Reference("hover"),
164 border_fill: Preference::Reference("border"),
165 color: Preference::Reference("text_primary"),
166 shadow: Preference::Reference("shadow"),
167 },
168 accordion: AccordionThemePreference {
169 color: Preference::Reference("text_primary"),
170 background: Preference::Reference("surface_tertiary"),
171 border_fill: Preference::Reference("border"),
172 },
173 switch: SwitchThemePreference {
174 margin: Preference::Specific(Gaps::new_all(0.)),
175 background: Preference::Reference("surface_secondary"),
176 thumb_background: Preference::Reference("surface_inverse"),
177 toggled_background: Preference::Reference("secondary"),
178 toggled_thumb_background: Preference::Reference("primary"),
179 focus_border_fill: Preference::Reference("border_focus"),
180 },
181 scrollbar: ScrollBarThemePreference {
182 background: Preference::Reference("surface_primary"),
183 thumb_background: Preference::Reference("surface_inverse"),
184 hover_thumb_background: Preference::Reference("surface_inverse_secondary"),
185 active_thumb_background: Preference::Reference("surface_inverse_tertiary"),
186 size: Preference::Specific(15.),
187 },
188 progressbar: ProgressBarThemePreference {
189 color: Preference::Reference("text_inverse"),
190 background: Preference::Reference("surface_primary"),
191 progress_background: Preference::Reference("primary"),
192 height: Preference::Specific(20.),
193 },
194 sidebar_item: SideBarItemThemePreference {
195 color: Preference::Reference("text_primary"),
196 background: Preference::Reference("surface_tertiary"),
197 active_background: Preference::Reference("surface_secondary"),
198 hover_background: Preference::Reference("hover"),
199 corner_radius: Preference::Specific(CornerRadius::new_all(12.)),
200 margin: Preference::Specific(Gaps::new_all(0.)),
201 padding: Preference::Specific(Gaps::new(8., 12., 8., 12.)),
202 },
203 #[cfg(feature = "router")]
204 link: LinkThemePreference {
205 color: Preference::Reference("text_highlight"),
206 },
207 tooltip: TooltipThemePreference {
208 background: Preference::Reference("surface_tertiary"),
209 color: Preference::Reference("text_primary"),
210 border_fill: Preference::Reference("surface_primary"),
211 },
212 circular_loader: CircularLoaderThemePreference {
213 primary_color: Preference::Reference("surface_primary"),
214 inversed_color: Preference::Reference("surface_inverse"),
215 },
216 input_layout: InputLayoutThemePreference {
217 corner_radius: Preference::Specific(CornerRadius::new_all(6.)),
218 inner_margin: Preference::Specific(Gaps::new(8., 8., 8., 8.)),
219 },
220 compact_input_layout: InputLayoutThemePreference {
221 corner_radius: Preference::Specific(CornerRadius::new_all(4.)),
222 inner_margin: Preference::Specific(Gaps::new(4., 6., 4., 6.)),
223 },
224 expanded_input_layout: InputLayoutThemePreference {
225 corner_radius: Preference::Specific(CornerRadius::new_all(8.)),
226 inner_margin: Preference::Specific(Gaps::new(12., 12., 12., 12.)),
227 },
228 input: InputColorsThemePreference {
229 background: Preference::Reference("surface_tertiary"),
230 hover_background: Preference::Reference("background"),
231 color: Preference::Reference("text_primary"),
232 placeholder_color: Preference::Reference("text_secondary"),
233 border_fill: Preference::Reference("border"),
234 focus_border_fill: Preference::Reference("border_focus"),
235 },
236 filled_input: InputColorsThemePreference {
237 background: Preference::Reference("primary"),
238 hover_background: Preference::Reference("tertiary"),
239 color: Preference::Reference("text_inverse"),
240 placeholder_color: Preference::Reference("text_inverse"),
241 border_fill: Preference::Specific(Color::TRANSPARENT),
242 focus_border_fill: Preference::Reference("secondary"),
243 },
244 flat_input: InputColorsThemePreference {
245 background: Preference::Specific(Color::TRANSPARENT),
246 hover_background: Preference::Reference("surface_tertiary"),
247 color: Preference::Reference("text_primary"),
248 placeholder_color: Preference::Reference("text_secondary"),
249 border_fill: Preference::Specific(Color::TRANSPARENT),
250 focus_border_fill: Preference::Reference("border"),
251 },
252 radio: RadioItemThemePreference {
253 unselected_fill: Preference::Reference("surface_inverse_tertiary"),
254 selected_fill: Preference::Reference("primary"),
255 border_fill: Preference::Reference("surface_primary"),
256 },
257 checkbox: CheckboxThemePreference {
258 unselected_fill: Preference::Reference("surface_inverse_tertiary"),
259 selected_fill: Preference::Reference("primary"),
260 selected_icon_fill: Preference::Reference("secondary"),
261 border_fill: Preference::Reference("surface_primary"),
262 },
263 resizable_handle: ResizableHandleThemePreference {
264 background: Preference::Reference("surface_secondary"),
265 hover_background: Preference::Reference("surface_primary"),
266 corner_radius: Preference::Specific(CornerRadius::new_all(6.)),
267 },
268 floating_tab: FloatingTabThemePreference {
269 background: Preference::Specific(Color::TRANSPARENT),
270 hover_background: Preference::Reference("surface_secondary"),
271 color: Preference::Reference("text_primary"),
272 padding: Preference::Specific(Gaps::new(6., 12., 6., 12.)),
273 width: Preference::Specific(Size::Inner),
274 height: Preference::Specific(Size::Inner),
275 corner_radius: Preference::Specific(CornerRadius::new_all(99.)),
276 },
277 slider: SliderThemePreference {
278 background: Preference::Reference("surface_primary"),
279 thumb_background: Preference::Reference("secondary"),
280 thumb_inner_background: Preference::Reference("primary"),
281 border_fill: Preference::Reference("surface_primary"),
282 },
283 color_picker: ColorPickerThemePreference {
284 background: Preference::Reference("surface_tertiary"),
285 border_fill: Preference::Reference("border"),
286 color: Preference::Reference("text_primary"),
287 },
288 select: SelectThemePreference {
289 width: Preference::Specific(Size::Inner),
290 margin: Preference::Specific(Gaps::new_all(0.)),
291 select_background: Preference::Reference("background"),
292 background_button: Preference::Reference("surface_tertiary"),
293 hover_background: Preference::Reference("hover"),
294 color: Preference::Reference("text_primary"),
295 border_fill: Preference::Reference("border"),
296 focus_border_fill: Preference::Reference("border_focus"),
297 arrow_fill: Preference::Reference("text_primary"),
298 },
299 popup: PopupThemePreference {
300 background: Preference::Reference("background"),
301 color: Preference::Reference("text_primary"),
302 },
303 table: TableThemePreference {
304 background: Preference::Reference("background"),
305 arrow_fill: Preference::Reference("text_primary"),
306 row_background: Preference::Specific(Color::TRANSPARENT),
307 hover_row_background: Preference::Reference("surface_secondary"),
308 divider_fill: Preference::Reference("surface_primary"),
309 corner_radius: Preference::Specific(CornerRadius::new_all(6.)),
310 color: Preference::Reference("text_primary"),
311 },
312
313 #[cfg(feature = "markdown")]
314 markdown_viewer: MarkdownViewerThemePreference {
315 color: Preference::Reference("text_primary"),
316 background_code: Preference::Reference("surface_tertiary"),
317 color_code: Preference::Reference("text_primary"),
318 background_blockquote: Preference::Reference("surface_tertiary"),
319 border_blockquote: Preference::Reference("surface_primary"),
320 background_divider: Preference::Reference("border"),
321 heading_h1: Preference::Specific(32.0),
322 heading_h2: Preference::Specific(28.0),
323 heading_h3: Preference::Specific(24.0),
324 heading_h4: Preference::Specific(20.0),
325 heading_h5: Preference::Specific(18.0),
326 heading_h6: Preference::Specific(16.0),
327 paragraph_size: Preference::Specific(16.0),
328 code_font_size: Preference::Specific(14.0),
329 table_font_size: Preference::Specific(14.0),
330 },
331 chip: ChipThemePreference {
332 background: Preference::Reference("background"),
333 hover_background: Preference::Reference("tertiary"),
334 selected_background: Preference::Reference("primary"),
335 border_fill: Preference::Reference("border"),
336 hover_border_fill: Preference::Reference("tertiary"),
337 selected_border_fill: Preference::Reference("primary"),
338 focus_border_fill: Preference::Reference("secondary"),
339 padding: Preference::Specific(Gaps::new(8., 14., 8., 14.)),
340 margin: Preference::Specific(0.),
341 corner_radius: Preference::Specific(CornerRadius::new_all(99.)),
342 width: Preference::Specific(Size::Inner),
343 height: Preference::Specific(Size::Inner),
344 color: Preference::Reference("text_primary"),
345 hover_color: Preference::Reference("text_inverse"),
346 selected_color: Preference::Reference("text_inverse"),
347 selected_icon_fill: Preference::Reference("secondary"),
348 hover_icon_fill: Preference::Reference("secondary"),
349 },
350 menu_item: MenuItemThemePreference {
351 background: Preference::Reference("background"),
352 hover_background: Preference::Reference("surface_secondary"),
353 select_background: Preference::Reference("surface_secondary"),
354 border_fill: Preference::Specific(Color::TRANSPARENT),
355 select_border_fill: Preference::Reference("border_focus"),
356 corner_radius: Preference::Specific(CornerRadius::new_all(6.)),
357 color: Preference::Reference("text_primary"),
358 },
359 menu_container: MenuContainerThemePreference {
360 background: Preference::Reference("background"),
361 padding: Preference::Specific(Gaps::new_all(4.)),
362 shadow: Preference::Reference("shadow"),
363 border_fill: Preference::Reference("surface_primary"),
364 corner_radius: Preference::Specific(CornerRadius::new_all(8.)),
365 },
366 button_segment: ButtonSegmentThemePreference {
367 background: Preference::Reference("surface_tertiary"),
368 hover_background: Preference::Reference("hover"),
369 disabled_background: Preference::Reference("disabled"),
370 selected_background: Preference::Reference("hover"),
371 focus_background: Preference::Reference("surface_secondary"),
372 padding: Preference::Specific(Gaps::new(8., 16., 8., 16.)),
373 selected_padding: Preference::Specific(Gaps::new(8., 12., 8., 12.)),
374 width: Preference::Specific(Size::Inner),
375 height: Preference::Specific(Size::Inner),
376 color: Preference::Reference("text_primary"),
377 selected_icon_fill: Preference::Reference("primary"),
378 },
379 segmented_button: SegmentedButtonThemePreference {
380 background: Preference::Reference("surface_tertiary"),
381 border_fill: Preference::Reference("border"),
382 corner_radius: Preference::Specific(CornerRadius::new_all(99.)),
383 },
384 #[cfg(feature = "calendar")]
385 calendar: CalendarThemePreference {
386 background: Preference::Reference("surface_tertiary"),
387 day_background: Preference::Specific(Color::TRANSPARENT),
388 day_hover_background: Preference::Reference("hover"),
389 day_selected_background: Preference::Reference("surface_primary"),
390 color: Preference::Reference("text_primary"),
391 day_other_month_color: Preference::Reference("text_placeholder"),
392 header_color: Preference::Reference("text_primary"),
393 corner_radius: Preference::Specific(CornerRadius::new_all(8.)),
394 padding: Preference::Specific(Gaps::new_all(12.)),
395 day_corner_radius: Preference::Specific(CornerRadius::new_all(6.)),
396 nav_button_hover_background: Preference::Reference("hover"),
397 },
398 #[cfg(feature = "titlebar")]
399 titlebar_button: TitlebarButtonThemePreference {
400 background: Preference::Specific(Color::TRANSPARENT),
401 hover_background: Preference::Reference("hover"),
402 corner_radius: Preference::Specific(CornerRadius::new_all(0.0)),
403 width: Preference::Specific(Size::Pixels(Length::new(46.0))),
404 height: Preference::Specific(Size::Fill),
405 },
406};
407
408pub const LIGHT_THEME: Theme = Theme {
409 name: "light",
410 colors: ColorsSheet {
411 primary: Color::from_rgb(103, 80, 164),
413 secondary: Color::from_rgb(202, 193, 227),
414 tertiary: Color::from_rgb(79, 61, 130),
415
416 success: Color::from_rgb(76, 175, 80),
418 warning: Color::from_rgb(255, 193, 7),
419 error: Color::from_rgb(244, 67, 54),
420 info: Color::from_rgb(33, 150, 243),
421
422 background: Color::from_rgb(250, 250, 250),
424 surface_primary: Color::from_rgb(210, 210, 210),
425 surface_secondary: Color::from_rgb(225, 225, 225),
426 surface_tertiary: Color::from_rgb(245, 245, 245),
427 surface_inverse: Color::from_rgb(125, 125, 125),
428 surface_inverse_secondary: Color::from_rgb(110, 110, 110),
429 surface_inverse_tertiary: Color::from_rgb(90, 90, 90),
430
431 border: Color::from_rgb(210, 210, 210),
433 border_focus: Color::from_rgb(180, 180, 180),
434 border_disabled: Color::from_rgb(210, 210, 210),
435
436 text_primary: Color::from_rgb(10, 10, 10),
438 text_secondary: Color::from_rgb(100, 100, 100),
439 text_placeholder: Color::from_rgb(150, 150, 150),
440 text_inverse: Color::WHITE,
441 text_highlight: Color::from_rgb(38, 89, 170),
442
443 hover: Color::from_rgb(235, 235, 235),
445 focus: Color::from_rgb(225, 225, 255),
446 active: Color::from_rgb(200, 200, 200),
447 disabled: Color::from_rgb(210, 210, 210),
448
449 overlay: Color::from_af32rgb(0.5, 0, 0, 0),
451 shadow: Color::from_af32rgb(0.2, 0, 0, 0),
452 },
453 ..BASE_THEME
454};
455
456pub const DARK_THEME: Theme = Theme {
457 name: "dark",
458 colors: ColorsSheet {
459 primary: Color::from_rgb(103, 80, 164),
461 secondary: Color::from_rgb(202, 193, 227),
462 tertiary: Color::from_rgb(79, 61, 130),
463
464 success: Color::from_rgb(129, 199, 132),
466 warning: Color::from_rgb(255, 213, 79),
467 error: Color::from_rgb(229, 115, 115),
468 info: Color::from_rgb(100, 181, 246),
469
470 background: Color::from_rgb(20, 20, 20),
472 surface_primary: Color::from_rgb(60, 60, 60),
473 surface_secondary: Color::from_rgb(45, 45, 45),
474 surface_tertiary: Color::from_rgb(25, 25, 25),
475 surface_inverse: Color::from_rgb(135, 135, 135),
476 surface_inverse_secondary: Color::from_rgb(150, 150, 150),
477 surface_inverse_tertiary: Color::from_rgb(170, 170, 170),
478
479 border: Color::from_rgb(60, 60, 60),
481 border_focus: Color::from_rgb(110, 110, 110),
482 border_disabled: Color::from_rgb(80, 80, 80),
483
484 text_primary: Color::from_rgb(250, 250, 250),
486 text_secondary: Color::from_rgb(210, 210, 210),
487 text_placeholder: Color::from_rgb(150, 150, 150),
488 text_inverse: Color::BLACK,
489 text_highlight: Color::from_rgb(96, 145, 224),
490
491 hover: Color::from_rgb(80, 80, 80),
493 focus: Color::from_rgb(100, 100, 120),
494 active: Color::from_rgb(70, 70, 70),
495 disabled: Color::from_rgb(50, 50, 50),
496
497 overlay: Color::from_af32rgb(0.2, 255, 255, 255),
499 shadow: Color::from_af32rgb(0.6, 0, 0, 0),
500 },
501 ..BASE_THEME
502};