clankerdiff-theme 0.1.1

Renderer-neutral themes and palettes for Diff
Documentation
use clankerdiff_theme::{
    ButtonVariant, ControlState, DiffPalette, InteractionState, NoticeTone, SCRIM_ALPHA,
    SelectionState, UiPalette,
};

#[test]
fn ui_palette_uses_stable_semantic_roles() {
    let diff = DiffPalette::default();
    let ui = UiPalette::from(&diff);
    assert_eq!(ui.canvas, diff.background);
    assert_eq!(ui.surface_selected, diff.selection);
    assert_eq!(ui.text_muted, diff.muted);
    assert_eq!(ui.positive, diff.addition);
    assert_eq!(ui.destructive, diff.deletion);
    assert_eq!(ui.scrim.a, SCRIM_ALPHA);
}

#[test]
fn semantic_states_resolve_before_renderer_conversion() {
    let ui = UiPalette::from(&DiffPalette::default());
    let primary = ui.control_style(
        ButtonVariant::Primary,
        ControlState::new(InteractionState::Rest),
    );
    assert_eq!(
        primary,
        ui.control_style(
            ButtonVariant::Primary,
            ControlState::new(InteractionState::Hovered)
        )
    );
    assert_eq!(primary.background, Some(ui.accent));
    assert_eq!(primary.foreground, ui.accent_foreground);

    let selected_hover = ui.control_style(
        ButtonVariant::Ghost,
        ControlState::new(InteractionState::Hovered).selected(true),
    );
    assert_eq!(selected_hover.background, Some(ui.surface_selected));
    assert_eq!(selected_hover.foreground, ui.accent);

    let focused = ui.selection_style(SelectionState::Focused);
    assert_eq!(focused.background, Some(ui.accent));
    assert!(focused.emphasized);

    let warning = ui.notice_style(NoticeTone::Warning);
    assert_eq!(warning.foreground, ui.accent);
    assert!(warning.emphasized);
}