//! The normalized snapshot a platform adapter produces. use gpui::{Hsla, Pixels}; use crate::ThemeVariant; /// Accessibility preferences read from the OS, forwarded into resolution. #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] pub struct AccessibilityPreferences { pub high_contrast: bool, pub reduce_motion: bool, pub reduce_transparency: bool, } /// Which adapter produced a [`SystemTheme`]. #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] pub enum SourceKind { #[default] Fallback, Macos, } impl SourceKind { pub fn label(self) -> &'static str { match self { Self::Fallback => "neutral fallback", Self::Macos => "macOS (NSColor)", } } } /// A partial palette with optional colors. #[derive(Clone, Copy, Debug, Default, PartialEq)] pub struct PartialPalette { pub background: Option, pub foreground: Option, pub surface: Option, pub surface_foreground: Option, pub primary_foreground: Option, pub accent_foreground: Option, pub secondary: Option, pub secondary_foreground: Option, pub muted: Option, pub muted_foreground: Option, pub destructive: Option, pub border: Option, pub input: Option, pub ring: Option, pub selection: Option, /// No platform states a scrim color; preset and user files override it. pub overlay: Option, /// No platform states a scrollbar thumb color; presets override it. pub scrollbar_thumb: Option, } /// A normalized snapshot of the running system's theme. #[derive(Clone, Copy, Debug, PartialEq)] pub struct SystemTheme { pub variant: ThemeVariant, pub accent: Option, pub palette: PartialPalette, /// The platform's stated control corner radius, if it has one. pub control_radius: Option, /// The platform's stated text-field height, if it has one. pub input_height: Option, /// The platform's native root font size, if it has one. pub root_font_size: Option, pub accessibility: AccessibilityPreferences, pub source: SourceKind, } impl SystemTheme { pub fn fallback(variant: ThemeVariant) -> Self { Self { variant, accent: None, palette: PartialPalette::default(), control_radius: None, input_height: None, root_font_size: None, accessibility: AccessibilityPreferences::default(), source: SourceKind::Fallback, } } }