Skip to main content

theme_gallery/
theme_gallery.rs

1use clankerdiff_theme::{
2    ButtonVariant, ControlState, InteractionState, ReviewTheme, Rgba, SelectionState, ThemeError,
3};
4
5fn main() -> Result<(), ThemeError> {
6    println!(
7        "<!doctype html><meta charset=\"utf-8\"><title>Clankerdiff UI palette gallery</title><style>body{{margin:0;background:#888;font:14px monospace;display:grid;grid-template-columns:repeat(auto-fit,minmax(390px,1fr))}}section{{padding:24px}}p{{padding:8px}}button{{border:0;padding:8px;margin:4px;font:inherit}}h2{{font-size:18px}}</style>"
8    );
9    for descriptor in ReviewTheme::catalog() {
10        let ui = ReviewTheme::builtin(&descriptor.id)?.ui;
11        println!(
12            "<section style=\"background:{};color:{}\"><h2>{}</h2>",
13            css(ui.canvas),
14            css(ui.text),
15            descriptor.name
16        );
17        for (label, foreground) in [
18            ("Primary content", ui.text),
19            ("Secondary metadata", ui.text_secondary),
20            ("Muted hints / disabled", ui.text_muted),
21            ("Info: running tool", ui.info),
22            ("Positive: completed", ui.positive),
23            ("Warning: context pressure", ui.warning),
24            ("Destructive: failed", ui.destructive),
25        ] {
26            println!("<p style=\"color:{}\">{label}</p>", css(foreground));
27        }
28        println!(
29            "<p style=\"background:{};border:1px solid {}\">Ordinary input / message surface</p>",
30            css(ui.surface),
31            css(ui.border)
32        );
33        println!(
34            "<p style=\"background:{}\">Hovered surface</p>",
35            css(ui.surface_hover)
36        );
37        for state in [SelectionState::Selected, SelectionState::Focused] {
38            let style = ui.selection_style(state);
39            println!(
40                "<p style=\"background:{};color:{}\">{state:?} row</p>",
41                css(style.background.unwrap_or(ui.canvas)),
42                css(style.foreground)
43            );
44        }
45        for variant in [
46            ButtonVariant::Primary,
47            ButtonVariant::Secondary,
48            ButtonVariant::Destructive,
49        ] {
50            let style = ui.control_style(variant, ControlState::new(InteractionState::Rest));
51            println!(
52                "<button style=\"background:{};color:{}\">{variant:?}</button>",
53                css(style.background.unwrap_or(ui.canvas)),
54                css(style.foreground)
55            );
56        }
57        println!("</section>");
58    }
59    Ok(())
60}
61
62fn css(color: Rgba) -> String {
63    format!(
64        "#{:02x}{:02x}{:02x}{:02x}",
65        color.r, color.g, color.b, color.a
66    )
67}