//! Colours and widget style. A light theme in the spirit of desktop CAD tools; every colour //! the UI uses comes from [`Tokens`]. use egui::{Color32, Stroke}; #[derive(Clone, Copy, Debug)] pub struct Tokens { pub app_bar: Color32, pub toolbar: Color32, pub tab_active: Color32, pub panel: Color32, pub panel_header: Color32, pub border: Color32, pub text: Color32, pub text_dim: Color32, pub accent: Color32, pub accent_soft: Color32, pub sketch_accent: Color32, pub error: Color32, pub warning: Color32, pub icon: Color32, pub icon_fill: Color32, pub timeline: Color32, pub hover: Color32, } impl Tokens { pub const fn get() -> Tokens { Tokens { app_bar: Color32::from_rgb(52, 56, 64), toolbar: Color32::from_rgb(246, 247, 249), tab_active: Color32::from_rgb(255, 255, 255), panel: Color32::from_rgb(250, 251, 252), panel_header: Color32::from_rgb(236, 238, 242), border: Color32::from_rgb(208, 212, 220), text: Color32::from_rgb(38, 42, 50), text_dim: Color32::from_rgb(110, 116, 128), accent: Color32::from_rgb(38, 120, 218), accent_soft: Color32::from_rgb(214, 230, 250), sketch_accent: Color32::from_rgb(46, 150, 90), error: Color32::from_rgb(214, 54, 54), warning: Color32::from_rgb(222, 150, 30), icon: Color32::from_rgb(70, 78, 92), icon_fill: Color32::from_rgb(178, 196, 222), timeline: Color32::from_rgb(232, 235, 240), hover: Color32::from_rgb(226, 234, 246), } } } pub fn apply(ctx: &egui::Context) { let t = Tokens::get(); let mut v = egui::Visuals::light(); v.panel_fill = t.panel; v.window_fill = t.panel; v.extreme_bg_color = Color32::WHITE; v.selection.bg_fill = t.accent_soft; v.selection.stroke = Stroke::new(1.0, t.accent); v.widgets.noninteractive.bg_stroke = Stroke::new(1.0, t.border); v.widgets.noninteractive.fg_stroke = Stroke::new(1.0, t.text); v.widgets.inactive.fg_stroke = Stroke::new(1.0, t.text); v.widgets.hovered.weak_bg_fill = t.hover; v.widgets.hovered.bg_fill = t.hover; v.window_corner_radius = egui::CornerRadius::same(6); ctx.set_visuals(v); ctx.global_style_mut(|s| { s.spacing.item_spacing = egui::vec2(6.0, 4.0); s.spacing.button_padding = egui::vec2(6.0, 3.0); }); }