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}