1use freya_core::prelude::*;
2use torin::{
3 gaps::Gaps,
4 size::Size,
5};
6
7#[cfg(feature = "router")]
8use crate::theming::component_themes::LinkThemePreference;
9use crate::theming::{
10 component_themes::{
11 AccordionThemePreference,
12 ButtonColorsThemePreference,
13 ButtonLayoutThemePreference,
14 CheckboxThemePreference,
15 ChipThemePreference,
16 CircularLoaderThemePreference,
17 ColorsSheet,
18 DropdownItemThemePreference,
19 DropdownThemePreference,
20 FloatingTabThemePreference,
21 InputThemePreference,
22 MenuContainerThemePreference,
23 MenuItemThemePreference,
24 PopupThemePreference,
25 ProgressBarThemePreference,
26 RadioItemThemePreference,
27 ResizableHandleThemePreference,
28 ScrollBarThemePreference,
29 SideBarItemThemePreference,
30 SideBarThemePreference,
31 SliderThemePreference,
32 SwitchThemePreference,
33 TableThemePreference,
34 Theme,
35 TooltipThemePreference,
36 },
37 macros::Preference,
38};
39
40pub(crate) const BASE_THEME: Theme = Theme {
41 name: "base",
42 colors: ColorsSheet {
43 primary: Color::TRANSPARENT,
45 secondary: Color::TRANSPARENT,
46 tertiary: Color::TRANSPARENT,
47
48 success: Color::TRANSPARENT,
50 warning: Color::TRANSPARENT,
51 error: Color::TRANSPARENT,
52 info: Color::TRANSPARENT,
53
54 background: Color::TRANSPARENT,
56 surface_primary: Color::TRANSPARENT,
57 surface_secondary: Color::TRANSPARENT,
58 surface_tertiary: Color::TRANSPARENT,
59 surface_inverse: Color::TRANSPARENT,
60 surface_inverse_secondary: Color::TRANSPARENT,
61 surface_inverse_tertiary: Color::TRANSPARENT,
62
63 border: Color::TRANSPARENT,
65 border_focus: Color::TRANSPARENT,
66 border_disabled: Color::TRANSPARENT,
67
68 text_primary: Color::TRANSPARENT,
70 text_secondary: Color::TRANSPARENT,
71 text_placeholder: Color::TRANSPARENT,
72 text_inverse: Color::TRANSPARENT,
73 text_highlight: Color::TRANSPARENT,
74
75 hover: Color::TRANSPARENT,
77 focus: Color::TRANSPARENT,
78 active: Color::TRANSPARENT,
79 disabled: Color::TRANSPARENT,
80
81 overlay: Color::TRANSPARENT,
83 shadow: Color::TRANSPARENT,
84 },
85 button_layout: ButtonLayoutThemePreference {
86 padding: Preference::Specific(Gaps::new(6., 12., 6., 12.)),
87 margin: Preference::Specific(Gaps::new_all(0.)),
88 corner_radius: Preference::Specific(CornerRadius::new_all(6.)),
89 width: Preference::Specific(Size::Inner),
90 height: Preference::Specific(Size::Inner),
91 },
92 compact_button_layout: ButtonLayoutThemePreference {
93 padding: Preference::Specific(Gaps::new(3., 6., 3., 6.)),
94 margin: Preference::Specific(Gaps::new_all(0.)),
95 corner_radius: Preference::Specific(CornerRadius::new_all(6.)),
96 width: Preference::Specific(Size::Inner),
97 height: Preference::Specific(Size::Inner),
98 },
99 expanded_button_layout: ButtonLayoutThemePreference {
100 padding: Preference::Specific(Gaps::new(10., 16., 10., 16.)),
101 margin: Preference::Specific(Gaps::new_all(0.)),
102 corner_radius: Preference::Specific(CornerRadius::new_all(6.)),
103 width: Preference::Specific(Size::Inner),
104 height: Preference::Specific(Size::Inner),
105 },
106 button: ButtonColorsThemePreference {
107 background: Preference::Reference("surface_tertiary"),
108 hover_background: Preference::Reference("hover"),
109 border_fill: Preference::Reference("border"),
110 focus_border_fill: Preference::Reference("border_focus"),
111 color: Preference::Reference("text_primary"),
112 },
113 filled_button: ButtonColorsThemePreference {
114 background: Preference::Reference("primary"),
115 hover_background: Preference::Reference("tertiary"),
116 border_fill: Preference::Specific(Color::TRANSPARENT),
117 focus_border_fill: Preference::Reference("secondary"),
118 color: Preference::Reference("text_inverse"),
119 },
120 outline_button: ButtonColorsThemePreference {
121 background: Preference::Reference("surface_tertiary"),
122 hover_background: Preference::Reference("hover"),
123 border_fill: Preference::Reference("border"),
124 focus_border_fill: Preference::Reference("secondary"),
125 color: Preference::Reference("primary"),
126 },
127 accordion: AccordionThemePreference {
128 color: Preference::Reference("text_primary"),
129 background: Preference::Reference("surface_tertiary"),
130 border_fill: Preference::Reference("border"),
131 },
132 switch: SwitchThemePreference {
133 margin: Preference::Specific(Gaps::new_all(0.)),
134 background: Preference::Reference("surface_secondary"),
135 thumb_background: Preference::Reference("surface_inverse"),
136 toggled_background: Preference::Reference("secondary"),
137 toggled_thumb_background: Preference::Reference("primary"),
138 focus_border_fill: Preference::Reference("border_focus"),
139 },
140 scrollbar: ScrollBarThemePreference {
141 background: Preference::Reference("surface_primary"),
142 thumb_background: Preference::Reference("surface_inverse"),
143 hover_thumb_background: Preference::Reference("surface_inverse_secondary"),
144 active_thumb_background: Preference::Reference("surface_inverse_tertiary"),
145 size: Preference::Specific(15.),
146 },
147 progressbar: ProgressBarThemePreference {
148 color: Preference::Reference("text_inverse"),
149 background: Preference::Reference("surface_primary"),
150 progress_background: Preference::Reference("primary"),
151 height: Preference::Specific(20.),
152 },
153 sidebar: SideBarThemePreference {
154 color: Preference::Reference("text_primary"),
155 background: Preference::Reference("surface_tertiary"),
156 padding: Preference::Specific(Gaps::new_all(8.)),
157 spacing: Preference::Specific(4.),
158 },
159 sidebar_item: SideBarItemThemePreference {
160 color: Preference::Reference("text_primary"),
161 background: Preference::Reference("surface_tertiary"),
162 active_background: Preference::Reference("surface_secondary"),
163 hover_background: Preference::Reference("hover"),
164 corner_radius: Preference::Specific(CornerRadius::new_all(99.)),
165 margin: Preference::Specific(Gaps::new_all(0.)),
166 padding: Preference::Specific(Gaps::new(8., 12., 8., 12.)),
167 },
168 #[cfg(feature = "router")]
169 link: LinkThemePreference {
170 color: Preference::Reference("text_highlight"),
171 },
172 tooltip: TooltipThemePreference {
173 background: Preference::Reference("surface_tertiary"),
174 color: Preference::Reference("text_primary"),
175 border_fill: Preference::Reference("surface_primary"),
176 },
177 circular_loader: CircularLoaderThemePreference {
178 primary_color: Preference::Reference("surface_primary"),
179 inversed_color: Preference::Reference("surface_inverse"),
180 },
181 input: InputThemePreference {
182 background: Preference::Reference("surface_tertiary"),
183 hover_background: Preference::Reference("background"),
184 color: Preference::Reference("text_primary"),
185 placeholder_color: Preference::Reference("text_secondary"),
186 border_fill: Preference::Reference("border"),
187 focus_border_fill: Preference::Reference("border_focus"),
188 corner_radius: Preference::Specific(CornerRadius::new_all(6.)),
189 inner_margin: Preference::Specific(Gaps::new(8., 8., 8., 8.)),
190 },
191 radio: RadioItemThemePreference {
192 unselected_fill: Preference::Reference("surface_inverse_tertiary"),
193 selected_fill: Preference::Reference("primary"),
194 border_fill: Preference::Reference("surface_primary"),
195 },
196 checkbox: CheckboxThemePreference {
197 unselected_fill: Preference::Reference("surface_inverse_tertiary"),
198 selected_fill: Preference::Reference("primary"),
199 selected_icon_fill: Preference::Reference("secondary"),
200 border_fill: Preference::Reference("surface_primary"),
201 },
202 resizable_handle: ResizableHandleThemePreference {
203 background: Preference::Reference("surface_secondary"),
204 hover_background: Preference::Reference("surface_primary"),
205 corner_radius: Preference::Specific(CornerRadius::new_all(6.)),
206 },
207 floating_tab: FloatingTabThemePreference {
208 background: Preference::Specific(Color::TRANSPARENT),
209 hover_background: Preference::Reference("surface_secondary"),
210 color: Preference::Reference("text_primary"),
211 padding: Preference::Specific(Gaps::new(6., 12., 6., 12.)),
212 width: Preference::Specific(Size::Inner),
213 height: Preference::Specific(Size::Inner),
214 },
215 slider: SliderThemePreference {
216 background: Preference::Reference("surface_primary"),
217 thumb_background: Preference::Reference("secondary"),
218 thumb_inner_background: Preference::Reference("primary"),
219 border_fill: Preference::Reference("surface_primary"),
220 },
221 dropdown: DropdownThemePreference {
222 width: Preference::Specific(Size::Inner),
223 margin: Preference::Specific(Gaps::new_all(0.)),
224 dropdown_background: Preference::Reference("background"),
225 background_button: Preference::Reference("surface_tertiary"),
226 hover_background: Preference::Reference("hover"),
227 color: Preference::Reference("text_primary"),
228 border_fill: Preference::Reference("border"),
229 focus_border_fill: Preference::Reference("border_focus"),
230 arrow_fill: Preference::Reference("text_primary"),
231 },
232 dropdown_item: DropdownItemThemePreference {
233 background: Preference::Reference("background"),
234 select_background: Preference::Reference("surface_secondary"),
235 hover_background: Preference::Reference("hover"),
236 border_fill: Preference::Specific(Color::TRANSPARENT),
237 select_border_fill: Preference::Reference("border_focus"),
238 color: Preference::Reference("text_primary"),
239 },
240 popup: PopupThemePreference {
241 background: Preference::Reference("background"),
242 color: Preference::Reference("text_primary"),
243 },
244 table: TableThemePreference {
245 background: Preference::Reference("background"),
246 arrow_fill: Preference::Reference("text_primary"),
247 row_background: Preference::Specific(Color::TRANSPARENT),
248 hover_row_background: Preference::Reference("surface_secondary"),
249 divider_fill: Preference::Reference("surface_primary"),
250 corner_radius: Preference::Specific(CornerRadius::new_all(6.)),
251 color: Preference::Reference("text_primary"),
252 },
253 chip: ChipThemePreference {
254 background: Preference::Reference("background"),
255 hover_background: Preference::Reference("tertiary"),
256 selected_background: Preference::Reference("primary"),
257 border_fill: Preference::Reference("border"),
258 hover_border_fill: Preference::Reference("tertiary"),
259 selected_border_fill: Preference::Reference("primary"),
260 focus_border_fill: Preference::Reference("secondary"),
261 padding: Preference::Specific(Gaps::new(8., 14., 8., 14.)),
262 margin: Preference::Specific(0.),
263 corner_radius: Preference::Specific(CornerRadius::new_all(99.)),
264 width: Preference::Specific(Size::Inner),
265 height: Preference::Specific(Size::Inner),
266 color: Preference::Reference("text_primary"),
267 hover_color: Preference::Reference("text_inverse"),
268 selected_color: Preference::Reference("text_inverse"),
269 selected_icon_fill: Preference::Reference("secondary"),
270 hover_icon_fill: Preference::Reference("secondary"),
271 },
272 menu_item: MenuItemThemePreference {
273 hover_background: Preference::Reference("surface_secondary"),
274 corner_radius: Preference::Specific(CornerRadius::new_all(6.)),
275 color: Preference::Reference("text_primary"),
276 },
277 menu_container: MenuContainerThemePreference {
278 background: Preference::Reference("background"),
279 padding: Preference::Specific(Gaps::new_all(4.)),
280 shadow: Preference::Reference("shadow"),
281 border_fill: Preference::Reference("surface_primary"),
282 corner_radius: Preference::Specific(CornerRadius::new_all(6.)),
283 },
284};
285
286pub const LIGHT_THEME: Theme = Theme {
287 name: "light",
288 colors: ColorsSheet {
289 primary: Color::from_rgb(103, 80, 164),
291 secondary: Color::from_rgb(202, 193, 227),
292 tertiary: Color::from_rgb(79, 61, 130),
293
294 success: Color::from_rgb(76, 175, 80),
296 warning: Color::from_rgb(255, 193, 7),
297 error: Color::from_rgb(244, 67, 54),
298 info: Color::from_rgb(33, 150, 243),
299
300 background: Color::from_rgb(250, 250, 250),
302 surface_primary: Color::from_rgb(210, 210, 210),
303 surface_secondary: Color::from_rgb(225, 225, 225),
304 surface_tertiary: Color::from_rgb(245, 245, 245),
305 surface_inverse: Color::from_rgb(125, 125, 125),
306 surface_inverse_secondary: Color::from_rgb(110, 110, 110),
307 surface_inverse_tertiary: Color::from_rgb(90, 90, 90),
308
309 border: Color::from_rgb(210, 210, 210),
311 border_focus: Color::from_rgb(180, 180, 180),
312 border_disabled: Color::from_rgb(210, 210, 210),
313
314 text_primary: Color::from_rgb(10, 10, 10),
316 text_secondary: Color::from_rgb(100, 100, 100),
317 text_placeholder: Color::from_rgb(150, 150, 150),
318 text_inverse: Color::WHITE,
319 text_highlight: Color::from_rgb(38, 89, 170),
320
321 hover: Color::from_rgb(235, 235, 235),
323 focus: Color::from_rgb(225, 225, 255),
324 active: Color::from_rgb(200, 200, 200),
325 disabled: Color::from_rgb(210, 210, 210),
326
327 overlay: Color::from_af32rgb(0.5, 0, 0, 0),
329 shadow: Color::from_af32rgb(0.2, 0, 0, 0),
330 },
331 ..BASE_THEME
332};
333
334pub const DARK_THEME: Theme = Theme {
335 name: "dark",
336 colors: ColorsSheet {
337 primary: Color::from_rgb(103, 80, 164),
339 secondary: Color::from_rgb(202, 193, 227),
340 tertiary: Color::from_rgb(79, 61, 130),
341
342 success: Color::from_rgb(129, 199, 132),
344 warning: Color::from_rgb(255, 213, 79),
345 error: Color::from_rgb(229, 115, 115),
346 info: Color::from_rgb(100, 181, 246),
347
348 background: Color::from_rgb(20, 20, 20),
350 surface_primary: Color::from_rgb(60, 60, 60),
351 surface_secondary: Color::from_rgb(45, 45, 45),
352 surface_tertiary: Color::from_rgb(25, 25, 25),
353 surface_inverse: Color::from_rgb(135, 135, 135),
354 surface_inverse_secondary: Color::from_rgb(150, 150, 150),
355 surface_inverse_tertiary: Color::from_rgb(170, 170, 170),
356
357 border: Color::from_rgb(60, 60, 60),
359 border_focus: Color::from_rgb(110, 110, 110),
360 border_disabled: Color::from_rgb(80, 80, 80),
361
362 text_primary: Color::from_rgb(250, 250, 250),
364 text_secondary: Color::from_rgb(210, 210, 210),
365 text_placeholder: Color::from_rgb(150, 150, 150),
366 text_inverse: Color::BLACK,
367 text_highlight: Color::from_rgb(96, 145, 224),
368
369 hover: Color::from_rgb(80, 80, 80),
371 focus: Color::from_rgb(100, 100, 120),
372 active: Color::from_rgb(70, 70, 70),
373 disabled: Color::from_rgb(50, 50, 50),
374
375 overlay: Color::from_af32rgb(0.2, 255, 255, 255),
377 shadow: Color::from_af32rgb(0.6, 0, 0, 0),
378 },
379 ..BASE_THEME
380};