theme_gallery/
theme_gallery.rs1use 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}