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 },
276 slider: SliderThemePreference {
277 background: Preference::Reference("surface_primary"),
278 thumb_background: Preference::Reference("secondary"),
279 thumb_inner_background: Preference::Reference("primary"),
280 border_fill: Preference::Reference("surface_primary"),
281 },
282 color_picker: ColorPickerThemePreference {
283 background: Preference::Reference("surface_tertiary"),
284 border_fill: Preference::Reference("border"),
285 color: Preference::Reference("text_primary"),
286 },
287 select: SelectThemePreference {
288 width: Preference::Specific(Size::Inner),
289 margin: Preference::Specific(Gaps::new_all(0.)),
290 select_background: Preference::Reference("background"),
291 background_button: Preference::Reference("surface_tertiary"),
292 hover_background: Preference::Reference("hover"),
293 color: Preference::Reference("text_primary"),
294 border_fill: Preference::Reference("border"),
295 focus_border_fill: Preference::Reference("border_focus"),
296 arrow_fill: Preference::Reference("text_primary"),
297 },
298 popup: PopupThemePreference {
299 background: Preference::Reference("background"),
300 color: Preference::Reference("text_primary"),
301 },
302 table: TableThemePreference {
303 background: Preference::Reference("background"),
304 arrow_fill: Preference::Reference("text_primary"),
305 row_background: Preference::Specific(Color::TRANSPARENT),
306 hover_row_background: Preference::Reference("surface_secondary"),
307 divider_fill: Preference::Reference("surface_primary"),
308 corner_radius: Preference::Specific(CornerRadius::new_all(6.)),
309 color: Preference::Reference("text_primary"),
310 },
311
312 #[cfg(feature = "markdown")]
313 markdown_viewer: MarkdownViewerThemePreference {
314 color: Preference::Reference("text_primary"),
315 background_code: Preference::Reference("surface_tertiary"),
316 color_code: Preference::Reference("text_primary"),
317 background_blockquote: Preference::Reference("surface_tertiary"),
318 border_blockquote: Preference::Reference("surface_primary"),
319 background_divider: Preference::Reference("border"),
320 heading_h1: Preference::Specific(32.0),
321 heading_h2: Preference::Specific(28.0),
322 heading_h3: Preference::Specific(24.0),
323 heading_h4: Preference::Specific(20.0),
324 heading_h5: Preference::Specific(18.0),
325 heading_h6: Preference::Specific(16.0),
326 paragraph_size: Preference::Specific(16.0),
327 code_font_size: Preference::Specific(14.0),
328 table_font_size: Preference::Specific(14.0),
329 },
330 chip: ChipThemePreference {
331 background: Preference::Reference("background"),
332 hover_background: Preference::Reference("tertiary"),
333 selected_background: Preference::Reference("primary"),
334 border_fill: Preference::Reference("border"),
335 hover_border_fill: Preference::Reference("tertiary"),
336 selected_border_fill: Preference::Reference("primary"),
337 focus_border_fill: Preference::Reference("secondary"),
338 padding: Preference::Specific(Gaps::new(8., 14., 8., 14.)),
339 margin: Preference::Specific(0.),
340 corner_radius: Preference::Specific(CornerRadius::new_all(99.)),
341 width: Preference::Specific(Size::Inner),
342 height: Preference::Specific(Size::Inner),
343 color: Preference::Reference("text_primary"),
344 hover_color: Preference::Reference("text_inverse"),
345 selected_color: Preference::Reference("text_inverse"),
346 selected_icon_fill: Preference::Reference("secondary"),
347 hover_icon_fill: Preference::Reference("secondary"),
348 },
349 menu_item: MenuItemThemePreference {
350 background: Preference::Reference("background"),
351 hover_background: Preference::Reference("surface_secondary"),
352 select_background: Preference::Reference("surface_secondary"),
353 border_fill: Preference::Specific(Color::TRANSPARENT),
354 select_border_fill: Preference::Reference("border_focus"),
355 corner_radius: Preference::Specific(CornerRadius::new_all(6.)),
356 color: Preference::Reference("text_primary"),
357 },
358 menu_container: MenuContainerThemePreference {
359 background: Preference::Reference("background"),
360 padding: Preference::Specific(Gaps::new_all(4.)),
361 shadow: Preference::Reference("shadow"),
362 border_fill: Preference::Reference("surface_primary"),
363 corner_radius: Preference::Specific(CornerRadius::new_all(8.)),
364 },
365 button_segment: ButtonSegmentThemePreference {
366 background: Preference::Reference("surface_tertiary"),
367 hover_background: Preference::Reference("hover"),
368 disabled_background: Preference::Reference("disabled"),
369 selected_background: Preference::Reference("hover"),
370 focus_background: Preference::Reference("surface_secondary"),
371 padding: Preference::Specific(Gaps::new(8., 16., 8., 16.)),
372 selected_padding: Preference::Specific(Gaps::new(8., 12., 8., 12.)),
373 width: Preference::Specific(Size::Inner),
374 height: Preference::Specific(Size::Inner),
375 color: Preference::Reference("text_primary"),
376 selected_icon_fill: Preference::Reference("primary"),
377 },
378 segmented_button: SegmentedButtonThemePreference {
379 background: Preference::Reference("surface_tertiary"),
380 border_fill: Preference::Reference("border"),
381 corner_radius: Preference::Specific(CornerRadius::new_all(99.)),
382 },
383 #[cfg(feature = "calendar")]
384 calendar: CalendarThemePreference {
385 background: Preference::Reference("surface_tertiary"),
386 day_background: Preference::Specific(Color::TRANSPARENT),
387 day_hover_background: Preference::Reference("hover"),
388 day_selected_background: Preference::Reference("surface_primary"),
389 color: Preference::Reference("text_primary"),
390 day_other_month_color: Preference::Reference("text_placeholder"),
391 header_color: Preference::Reference("text_primary"),
392 corner_radius: Preference::Specific(CornerRadius::new_all(8.)),
393 padding: Preference::Specific(Gaps::new_all(12.)),
394 day_corner_radius: Preference::Specific(CornerRadius::new_all(6.)),
395 nav_button_hover_background: Preference::Reference("hover"),
396 },
397 #[cfg(feature = "titlebar")]
398 titlebar_button: TitlebarButtonThemePreference {
399 background: Preference::Specific(Color::TRANSPARENT),
400 hover_background: Preference::Reference("hover"),
401 corner_radius: Preference::Specific(CornerRadius::new_all(0.0)),
402 width: Preference::Specific(Size::Pixels(Length::new(46.0))),
403 height: Preference::Specific(Size::Fill),
404 },
405};
406
407pub const LIGHT_THEME: Theme = Theme {
408 name: "light",
409 colors: ColorsSheet {
410 primary: Color::from_rgb(103, 80, 164),
412 secondary: Color::from_rgb(202, 193, 227),
413 tertiary: Color::from_rgb(79, 61, 130),
414
415 success: Color::from_rgb(76, 175, 80),
417 warning: Color::from_rgb(255, 193, 7),
418 error: Color::from_rgb(244, 67, 54),
419 info: Color::from_rgb(33, 150, 243),
420
421 background: Color::from_rgb(250, 250, 250),
423 surface_primary: Color::from_rgb(210, 210, 210),
424 surface_secondary: Color::from_rgb(225, 225, 225),
425 surface_tertiary: Color::from_rgb(245, 245, 245),
426 surface_inverse: Color::from_rgb(125, 125, 125),
427 surface_inverse_secondary: Color::from_rgb(110, 110, 110),
428 surface_inverse_tertiary: Color::from_rgb(90, 90, 90),
429
430 border: Color::from_rgb(210, 210, 210),
432 border_focus: Color::from_rgb(180, 180, 180),
433 border_disabled: Color::from_rgb(210, 210, 210),
434
435 text_primary: Color::from_rgb(10, 10, 10),
437 text_secondary: Color::from_rgb(100, 100, 100),
438 text_placeholder: Color::from_rgb(150, 150, 150),
439 text_inverse: Color::WHITE,
440 text_highlight: Color::from_rgb(38, 89, 170),
441
442 hover: Color::from_rgb(235, 235, 235),
444 focus: Color::from_rgb(225, 225, 255),
445 active: Color::from_rgb(200, 200, 200),
446 disabled: Color::from_rgb(210, 210, 210),
447
448 overlay: Color::from_af32rgb(0.5, 0, 0, 0),
450 shadow: Color::from_af32rgb(0.2, 0, 0, 0),
451 },
452 ..BASE_THEME
453};
454
455pub const DARK_THEME: Theme = Theme {
456 name: "dark",
457 colors: ColorsSheet {
458 primary: Color::from_rgb(103, 80, 164),
460 secondary: Color::from_rgb(202, 193, 227),
461 tertiary: Color::from_rgb(79, 61, 130),
462
463 success: Color::from_rgb(129, 199, 132),
465 warning: Color::from_rgb(255, 213, 79),
466 error: Color::from_rgb(229, 115, 115),
467 info: Color::from_rgb(100, 181, 246),
468
469 background: Color::from_rgb(20, 20, 20),
471 surface_primary: Color::from_rgb(60, 60, 60),
472 surface_secondary: Color::from_rgb(45, 45, 45),
473 surface_tertiary: Color::from_rgb(25, 25, 25),
474 surface_inverse: Color::from_rgb(135, 135, 135),
475 surface_inverse_secondary: Color::from_rgb(150, 150, 150),
476 surface_inverse_tertiary: Color::from_rgb(170, 170, 170),
477
478 border: Color::from_rgb(60, 60, 60),
480 border_focus: Color::from_rgb(110, 110, 110),
481 border_disabled: Color::from_rgb(80, 80, 80),
482
483 text_primary: Color::from_rgb(250, 250, 250),
485 text_secondary: Color::from_rgb(210, 210, 210),
486 text_placeholder: Color::from_rgb(150, 150, 150),
487 text_inverse: Color::BLACK,
488 text_highlight: Color::from_rgb(96, 145, 224),
489
490 hover: Color::from_rgb(80, 80, 80),
492 focus: Color::from_rgb(100, 100, 120),
493 active: Color::from_rgb(70, 70, 70),
494 disabled: Color::from_rgb(50, 50, 50),
495
496 overlay: Color::from_af32rgb(0.2, 255, 255, 255),
498 shadow: Color::from_af32rgb(0.6, 0, 0, 0),
499 },
500 ..BASE_THEME
501};