orbital-theme 0.1.1

Theme provider and design tokens for Orbital
Documentation
use leptos::prelude::*;

use crate::{
    BrandPalette, Density, ElevationScale, SpacingScale, Theme, ThemeMode, ThemeOptions,
    ThemeOverrides, TypographyOverrides,
};

pub fn use_set_theme() -> WriteSignal<Theme> {
    Theme::use_rw_theme().write_only()
}

pub fn use_theme_mode() -> (Signal<ThemeMode>, impl Fn(ThemeMode) + Clone) {
    let theme = Theme::use_rw_theme();
    let read = Signal::derive(move || theme.with(|t| t.mode));
    let set = move |mode: ThemeMode| set_theme_mode(theme, mode);
    (read, set)
}

pub fn use_theme_options() -> Signal<ThemeOptions> {
    let theme = Theme::use_rw_theme();
    Signal::derive(move || theme.with(|t| t.options.clone()))
}

pub fn use_update_theme() -> impl Fn(ThemeOverrides) + Clone {
    let theme = Theme::use_rw_theme();
    move |overrides: ThemeOverrides| {
        theme.update(|t| t.apply_overrides(overrides));
    }
}

pub fn set_theme_mode(theme: RwSignal<Theme>, mode: ThemeMode) {
    theme.update(|t| {
        t.mode = mode;
        t.rebuild_color_tokens();
    });
}

pub fn set_brand_palette(theme: RwSignal<Theme>, brand: BrandPalette) {
    theme.update(|t| {
        t.apply_overrides(ThemeOverrides {
            brand: Some(brand),
            ..Default::default()
        });
    });
}

pub fn set_density(theme: RwSignal<Theme>, density: Density) {
    theme.update(|t| {
        t.apply_overrides(ThemeOverrides {
            density: Some(density),
            ..Default::default()
        });
    });
}

pub fn set_typography(theme: RwSignal<Theme>, typography: TypographyOverrides) {
    theme.update(|t| {
        t.apply_overrides(ThemeOverrides {
            typography: Some(typography),
            ..Default::default()
        });
    });
}

pub fn set_spacing_scale(theme: RwSignal<Theme>, scale: SpacingScale) {
    theme.update(|t| {
        t.apply_overrides(ThemeOverrides {
            spacing: Some(scale),
            ..Default::default()
        });
    });
}

pub fn set_elevation_scale(theme: RwSignal<Theme>, scale: ElevationScale) {
    theme.update(|t| {
        t.apply_overrides(ThemeOverrides {
            elevation: Some(scale),
            ..Default::default()
        });
    });
}