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