From d915563677bb696a582cf85ef431f29940764aef Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Mon, 17 Feb 2025 02:11:33 -0500 Subject: [PATCH] refactor: small widget container colors --- cosmic-theme/src/model/theme.rs | 38 +++++++++------------------------ cosmic-theme/src/steps.rs | 34 +++++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/cosmic-theme/src/model/theme.rs b/cosmic-theme/src/model/theme.rs index 0740b4e5259..3a1d0c8308e 100644 --- a/cosmic-theme/src/model/theme.rs +++ b/cosmic-theme/src/model/theme.rs @@ -1,6 +1,6 @@ use crate::{ composite::over, - steps::{color_index, get_index, get_surface_color, get_text, steps}, + steps::{color_index, get_index, get_small_widget_color, get_surface_color, get_text, steps}, Component, Container, CornerRadii, CosmicPalette, CosmicPaletteInner, Spacing, ThemeMode, DARK_PALETTE, LIGHT_PALETTE, NAME, }; @@ -847,7 +847,7 @@ impl ThemeBuilder { color_index(bg_component, step_array.len()), &step_array, &p_ref.neutral_8, - text_steps_array.as_ref(), + text_steps_array.as_deref(), ); let primary = { @@ -879,7 +879,7 @@ impl ThemeBuilder { color_index(component_base, step_array.len()), &step_array, &p_ref.neutral_8, - text_steps_array.as_ref(), + text_steps_array.as_deref(), ), component_hovered_overlay, component_pressed_overlay, @@ -891,15 +891,9 @@ impl ThemeBuilder { base_index, &step_array, &p_ref.neutral_8, - text_steps_array.as_ref(), - ), - get_surface_color( - base_index, - 5, - &neutral_steps, - base_index <= 65, - &p_ref.neutral_6, + text_steps_array.as_deref(), ), + get_small_widget_color(base_index, 5, &neutral_steps, &p_ref.neutral_6), ); container @@ -971,15 +965,9 @@ impl ThemeBuilder { bg_index, &step_array, &p_ref.neutral_8, - text_steps_array.as_ref(), - ), - get_surface_color( - bg_index, - 5, - &neutral_steps, - bg_index <= 65, - &p_ref.neutral_6, + text_steps_array.as_deref(), ), + get_small_widget_color(bg_index, 5, &neutral_steps, &p_ref.neutral_6), ), primary, secondary: { @@ -1011,7 +999,7 @@ impl ThemeBuilder { color_index(secondary_component, step_array.len()), &step_array, &p_ref.neutral_8, - text_steps_array.as_ref(), + text_steps_array.as_deref(), ), component_hovered_overlay, component_pressed_overlay, @@ -1023,15 +1011,9 @@ impl ThemeBuilder { base_index, &step_array, &p_ref.neutral_8, - text_steps_array.as_ref(), - ), - get_surface_color( - base_index, - 5, - &neutral_steps, - base_index <= 65, - &p_ref.neutral_6, + text_steps_array.as_deref(), ), + get_small_widget_color(base_index, 5, &neutral_steps, &p_ref.neutral_6), ) }, accent: Component::colored_component( diff --git a/cosmic-theme/src/steps.rs b/cosmic-theme/src/steps.rs index 2c306e3c347..506b6fa8c40 100644 --- a/cosmic-theme/src/steps.rs +++ b/cosmic-theme/src/steps.rs @@ -1,7 +1,7 @@ use std::num::NonZeroUsize; use almost::equal; -use palette::{convert::FromColorUnclamped, ClampAssign, FromColor, Oklcha, Srgb, Srgba}; +use palette::{convert::FromColorUnclamped, ClampAssign, FromColor, Lch, Oklcha, Srgb, Srgba}; /// Get an array of 100 colors with a specific hue and chroma /// over the full range of lightness. @@ -35,7 +35,7 @@ pub fn get_index(base_index: usize, steps: usize, step_len: usize, is_dark: bool pub fn get_surface_color( base_index: usize, steps: usize, - step_array: &Vec, + step_array: &[Srgba], mut is_dark: bool, fallback: &Srgba, ) -> Srgba { @@ -48,12 +48,38 @@ pub fn get_surface_color( .unwrap_or(fallback) } +/// get surface color given a base and some steps +#[must_use] +pub fn get_small_widget_color( + base_index: usize, + steps: usize, + step_array: &[Srgba], + fallback: &Srgba, +) -> Srgba { + assert!(step_array.len() == 100); + + let is_dark = base_index <= 40 || (base_index > 51 && base_index < 65); + + let res = *get_index(base_index, steps, step_array.len(), is_dark) + .and_then(|i| step_array.get(i)) + .unwrap_or(fallback); + + let mut lch = Lch::from_color(res); + if lch.chroma / Lch::::max_chroma() > 0.03 { + lch.chroma = 0.03 * Lch::::max_chroma(); + lch.clamp_assign(); + Srgba::from_color(lch) + } else { + res + } +} + /// get text color given a base background color pub fn get_text( base_index: usize, - step_array: &Vec, + step_array: &[Srgba], fallback: &Srgba, - tint_array: Option<&Vec>, + tint_array: Option<&[Srgba]>, ) -> Srgba { assert!(step_array.len() == 100); let step_array = if let Some(tint_array) = tint_array {