use teksilo_tokens::{
ColorTokens, InputTokens, LayoutTokens, MotionTokens, OsThemeColors, ShapeTokens,
TypographyTokens,
};
use crate::styles::{ComponentStyleSlots, Theme, ThemeAppearance, ThemeExtensions, ThemeId};
pub fn light() -> Theme {
Theme {
id: ThemeId::new("intui.light"),
appearance: ThemeAppearance::Light,
colors: ColorTokens::light_default(),
layout: LayoutTokens::default(),
typography: TypographyTokens::default(),
shape: ShapeTokens::light_default(),
motion: MotionTokens::default(),
input: InputTokens::default(),
style_slots: ComponentStyleSlots::default(),
extensions: ThemeExtensions::new(),
}
}
pub fn dark() -> Theme {
Theme {
id: ThemeId::new("intui.dark"),
appearance: ThemeAppearance::Dark,
colors: ColorTokens::dark_default(),
layout: LayoutTokens::default(),
typography: TypographyTokens::default(),
shape: ShapeTokens::dark_default(),
motion: MotionTokens::default(),
input: InputTokens::default(),
style_slots: ComponentStyleSlots::default(),
extensions: ThemeExtensions::new(),
}
}
pub fn from_os(os: &OsThemeColors, dark: bool) -> Theme {
let base = if dark { self::dark() } else { light() };
Theme {
colors: ColorTokens::from_os_colors(os),
..base
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn light_reports_light_appearance() {
assert_eq!(light().appearance, ThemeAppearance::Light);
assert!(light().appearance.is_light());
assert!(!light().is_dark());
}
#[test]
fn dark_reports_dark_appearance() {
assert_eq!(dark().appearance, ThemeAppearance::Dark);
assert!(dark().appearance.is_dark());
assert!(dark().is_dark());
}
#[test]
fn light_and_dark_have_distinct_surfaces() {
assert_ne!(light().colors.surface_main, dark().colors.surface_main);
}
#[test]
fn dark_shadows_are_stronger_than_light() {
let l = light();
let d = dark();
assert!(d.shape.shadow_lg.color.a() > l.shape.shadow_lg.color.a());
}
#[test]
fn from_os_keeps_the_preset_and_takes_the_report_colours() {
use teksilo_tokens::{Color, ColorSchemePreference};
let mut os = OsThemeColors::new(ColorSchemePreference::Dark);
os.window_bg = Some(Color::from_rgb(0.1, 0.2, 0.3));
let theme = from_os(&os, true);
assert_eq!(theme.colors, ColorTokens::from_os_colors(&os));
assert_eq!(
Theme {
colors: dark().colors,
..theme
},
dark()
);
let plain = OsThemeColors::new(ColorSchemePreference::Light);
assert_eq!(from_os(&plain, false), light());
}
}