orbital-theme 0.1.1

Theme provider and design tokens for Orbital
Documentation
use crate::baseline::{
    default_first_paint_baseline_css, is_baseline_theme, theme_baseline_css, theme_scoped_vars_css,
    ROOT_THEME_SCOPE_ID,
};
use crate::context::scoped_css;
use crate::{BrandPalette, Density, Theme, ThemeMode, ThemeOverrides};

#[test]
fn default_baseline_contains_font_faces() {
    let css = default_first_paint_baseline_css(ROOT_THEME_SCOPE_ID);
    assert!(css.contains("@font-face"));
    assert!(css.contains("League Spartan"));
}

#[test]
fn default_baseline_contains_key_vars() {
    let css = default_first_paint_baseline_css(ROOT_THEME_SCOPE_ID);
    assert!(css.contains("--orb-type-family-sans"));
    assert!(css.contains("--orb-color-brand-bg"));
}

#[test]
fn scoped_selector_matches_root_markup() {
    let css = default_first_paint_baseline_css(ROOT_THEME_SCOPE_ID);
    assert!(css.contains(r#"[data-orbital-theme-id="0"]"#));
}

#[test]
fn different_scope_id_changes_selector() {
    let css_zero = default_first_paint_baseline_css("0");
    let css_one = default_first_paint_baseline_css("1");
    assert!(css_zero.contains(r#"[data-orbital-theme-id="0"]"#));
    assert!(css_one.contains(r#"[data-orbital-theme-id="1"]"#));
    assert_ne!(css_zero, css_one);
}

#[test]
fn theme_baseline_css_matches_runtime_provider_output() {
    let theme = Theme::light();
    let mut css_vars = String::new();
    theme.write_css_vars(&mut css_vars);
    let expected = scoped_css(ROOT_THEME_SCOPE_ID, &css_vars);
    let baseline = theme_scoped_vars_css(ROOT_THEME_SCOPE_ID, &theme);
    assert_eq!(baseline, expected);
}

#[test]
fn dark_theme_baseline_differs_from_light() {
    let light = theme_baseline_css(ROOT_THEME_SCOPE_ID, &Theme::light());
    let dark = theme_baseline_css(ROOT_THEME_SCOPE_ID, &Theme::dark());
    assert_ne!(light, dark);
}

#[test]
fn is_baseline_theme_detects_overrides() {
    assert!(is_baseline_theme(&Theme::light()));

    let dark = Theme::dark();
    assert!(!is_baseline_theme(&dark));

    let branded = Theme::with_brand(
        ThemeMode::Light,
        BrandPalette {
            primary: "#FF0000".into(),
        },
    );
    assert!(!is_baseline_theme(&branded));

    let compact = Theme::custom(
        ThemeMode::Light,
        ThemeOverrides {
            density: Some(Density::Compact),
            ..Default::default()
        },
    );
    assert!(!is_baseline_theme(&compact));
}