diff --git a/cosmic-theme/src/model/theme.rs b/cosmic-theme/src/model/theme.rs index 730c00f8..2fc613cc 100644 --- a/cosmic-theme/src/model/theme.rs +++ b/cosmic-theme/src/model/theme.rs @@ -1069,6 +1069,12 @@ impl ThemeBuilder { } = self; let container_alpha = frosted.alpha(); + let actual_alpha = + if (frosted_windows || frosted_system_interface || frosted_panel || frosted_applets) { + container_alpha + } else { + 1.0 + }; let is_dark = palette.is_dark(); let is_high_contrast = palette.is_high_contrast(); @@ -1152,6 +1158,7 @@ impl ThemeBuilder { &step_array, &control_steps_array[8], text_steps_array.as_deref(), + actual_alpha, ); let transparent_bg_component = get_surface_color( @@ -1166,6 +1173,7 @@ impl ThemeBuilder { &transparent_bg_steps_array, &control_steps_array[8], text_steps_array.as_deref(), + actual_alpha, ); let primary = { @@ -1199,6 +1207,7 @@ impl ThemeBuilder { &step_array, &control_steps_array[8], text_steps_array.as_deref(), + container_alpha, ), component_hovered_overlay, component_pressed_overlay, @@ -1211,6 +1220,7 @@ impl ThemeBuilder { &step_array, &control_steps_array[8], text_steps_array.as_deref(), + container_alpha, ), get_small_widget_color(base_index, 5, &neutral_steps, &control_steps_array[6]), is_high_contrast, @@ -1238,6 +1248,7 @@ impl ThemeBuilder { &step_array, &control_steps_array[8], text_steps_array.as_deref(), + actual_alpha, ), Srgba::new(0., 0., 0., 0.0), Srgba::new(0., 0., 0., 0.0), @@ -1250,6 +1261,7 @@ impl ThemeBuilder { &step_array, &control_steps_array[8], text_steps_array.as_deref(), + actual_alpha, ), get_small_widget_color(base_index, 5, &neutral_steps, &control_steps_array[6]), is_high_contrast, @@ -1323,6 +1335,7 @@ impl ThemeBuilder { &step_array, &control_steps_array[8], text_steps_array.as_deref(), + actual_alpha, ), get_small_widget_color(bg_index, 5, &neutral_steps, &control_steps_array[6]), is_high_contrast, @@ -1359,6 +1372,7 @@ impl ThemeBuilder { &step_array, &control_steps_array[8], text_steps_array.as_deref(), + actual_alpha, ), component_hovered_overlay, component_pressed_overlay, @@ -1371,6 +1385,7 @@ impl ThemeBuilder { &step_array, &control_steps_array[8], text_steps_array.as_deref(), + actual_alpha, ), get_small_widget_color(base_index, 5, &neutral_steps, &control_steps_array[6]), is_high_contrast, @@ -1383,14 +1398,24 @@ impl ThemeBuilder { button_hovered_overlay, button_pressed_overlay, ), - accent_button: Component::colored_button( - accent, - control_steps_array[1], - control_steps_array[0], - accent, - button_hovered_overlay, - button_pressed_overlay, - ), + accent_button: { + let step_array = steps(control_steps_array[5], NonZeroUsize::new(100).unwrap()); + + Component::colored_button( + accent, + control_steps_array[1], + get_text( + color_index(accent, step_array.len()), + &step_array, + &step_array[0], + text_steps_array.as_deref(), + 1., // accent is opaque anyway + ), + accent, + button_hovered_overlay, + button_pressed_overlay, + ) + }, button: Component::component( button_bg, accent, @@ -1518,6 +1543,7 @@ impl ThemeBuilder { &transparent_bg_steps_array, &control_steps_array[8], text_steps_array.as_deref(), + actual_alpha, ), get_small_widget_color(bg_index, 5, &neutral_steps, &control_steps_array[6]), is_high_contrast, @@ -1546,6 +1572,7 @@ impl ThemeBuilder { &step_array, &control_steps_array[8], text_steps_array.as_deref(), + actual_alpha, ), Srgba::new(0., 0., 0., 0.0), Srgba::new(0., 0., 0., 0.0), @@ -1558,6 +1585,7 @@ impl ThemeBuilder { &step_array, &control_steps_array[8], text_steps_array.as_deref(), + actual_alpha, ), get_small_widget_color(base_index, 5, &neutral_steps, &control_steps_array[6]), is_high_contrast, diff --git a/cosmic-theme/src/steps.rs b/cosmic-theme/src/steps.rs index d156722c..e595d8f8 100644 --- a/cosmic-theme/src/steps.rs +++ b/cosmic-theme/src/steps.rs @@ -81,6 +81,7 @@ pub fn get_text( step_array: &[Srgba], fallback: &Srgba, tint_array: Option<&[Srgba]>, + alpha: f32, ) -> Srgba { assert!(step_array.len() == 100); let step_array = if let Some(tint_array) = tint_array { @@ -90,11 +91,28 @@ pub fn get_text( step_array }; + let alpha_extra_steps = if alpha < 1.0 { + ((1. - alpha) * 100.0).round() as usize + } else { + 0 + }; let is_dark = base_index < 60; - let index = get_index(base_index, 70, step_array.len(), is_dark) - .or_else(|| get_index(base_index, 50, step_array.len(), is_dark)) - .unwrap_or(if is_dark { 99 } else { 0 }); + let index = get_index( + base_index, + 70 + alpha_extra_steps, + step_array.len(), + is_dark, + ) + .or_else(|| { + get_index( + base_index, + 50 + alpha_extra_steps, + step_array.len(), + is_dark, + ) + }) + .unwrap_or(if is_dark { 99 } else { 0 }); *step_array.get(index).unwrap_or(fallback) }