Skip to main content

orbital_theme/
hooks.rs

1use leptos::prelude::*;
2
3use crate::{
4    BrandPalette, Density, ElevationScale, SpacingScale, Theme, ThemeMode, ThemeOptions,
5    ThemeOverrides, TypographyOverrides,
6};
7
8pub fn use_set_theme() -> WriteSignal<Theme> {
9    Theme::use_rw_theme().write_only()
10}
11
12pub fn use_theme_mode() -> (Signal<ThemeMode>, impl Fn(ThemeMode) + Clone) {
13    let theme = Theme::use_rw_theme();
14    let read = Signal::derive(move || theme.with(|t| t.mode));
15    let set = move |mode: ThemeMode| set_theme_mode(theme, mode);
16    (read, set)
17}
18
19pub fn use_theme_options() -> Signal<ThemeOptions> {
20    let theme = Theme::use_rw_theme();
21    Signal::derive(move || theme.with(|t| t.options.clone()))
22}
23
24pub fn use_update_theme() -> impl Fn(ThemeOverrides) + Clone {
25    let theme = Theme::use_rw_theme();
26    move |overrides: ThemeOverrides| {
27        theme.update(|t| t.apply_overrides(overrides));
28    }
29}
30
31pub fn set_theme_mode(theme: RwSignal<Theme>, mode: ThemeMode) {
32    theme.update(|t| {
33        t.mode = mode;
34        t.rebuild_color_tokens();
35    });
36}
37
38pub fn set_brand_palette(theme: RwSignal<Theme>, brand: BrandPalette) {
39    theme.update(|t| {
40        t.apply_overrides(ThemeOverrides {
41            brand: Some(brand),
42            ..Default::default()
43        });
44    });
45}
46
47pub fn set_density(theme: RwSignal<Theme>, density: Density) {
48    theme.update(|t| {
49        t.apply_overrides(ThemeOverrides {
50            density: Some(density),
51            ..Default::default()
52        });
53    });
54}
55
56pub fn set_typography(theme: RwSignal<Theme>, typography: TypographyOverrides) {
57    theme.update(|t| {
58        t.apply_overrides(ThemeOverrides {
59            typography: Some(typography),
60            ..Default::default()
61        });
62    });
63}
64
65pub fn set_spacing_scale(theme: RwSignal<Theme>, scale: SpacingScale) {
66    theme.update(|t| {
67        t.apply_overrides(ThemeOverrides {
68            spacing: Some(scale),
69            ..Default::default()
70        });
71    });
72}
73
74pub fn set_elevation_scale(theme: RwSignal<Theme>, scale: ElevationScale) {
75    theme.update(|t| {
76        t.apply_overrides(ThemeOverrides {
77            elevation: Some(scale),
78            ..Default::default()
79        });
80    });
81}