sass: Add overlay() function
This will replace all the $overlay-* variables.
For now, adopt it for GTK.
This will replace all the $overlay-* variables.
For now, adopt it for GTK.
by roundabout, Friday, 24 July 2020, 02:21:58 (1595557318), pushed by roundabout, Sunday, 11 May 2025, 13:22:53 (1746969773)
Author identity: nana-4 <hnmaigo@gmail.com>
c0a8b464be5ca921509bf2a64804cb5db19fa78a
@return mix(change-color($color, $alpha: 1), $bg, alpha($color) * 100%);
}
// Set the accessible opacity for the overlay depending on the given color.
@function overlay($state, $color, $background: transparent, $opacity-modifier: 0) {
@if saturation($color) > 50% or saturation($background) > 50% {
$opacity-modifier: .04;
}
$opacity: ();
@if $state == "hover" {
$opacity: .08 + $opacity-modifier;
} @else if $state == "hover-alt" {
$opacity: .04 + $opacity-modifier;
} @else if $state == "focus" {
$opacity: .08 + $opacity-modifier;
} @else if $state == "pressed" {
$opacity: .12 + $opacity-modifier;
} @else if $state == "activated" {
$opacity: .12 + $opacity-modifier;
} @else if $state == "selected" {
@return rgba($color, .24);
} @else {
@error "Invalid type: '#{$state}'";
}
@return mix(rgba($color, 1), $background, $opacity * 100%);
}
// Private variables for dark background colors
$-dark-background: #181818;
$-dark-surface-1dp: mix(white, $-dark-background, 5%);
// Overlay state colors
//
$overlay-hover-opacity: .08;
$overlay-focus-opacity: .08;
$overlay-active-opacity: .12;
$overlay-checked-opacity: .12;
$overlay-selected-opacity: .24;
$overlay-hover: gtkalpha(currentcolor, .08);
$overlay-focus: gtkalpha(currentcolor, .08);
$overlay-focus-hover: gtkalpha(currentcolor, .16);
$overlay-active: gtkalpha(currentcolor, .12);
$overlay-checked: gtkalpha(currentcolor, .12);
$overlay-selected: rgba($primary, .24);
//
-gtk-outline-radius: $corner-radius;
&:focus {
outline-color: $overlay-checked;
outline-color: overlay("focus", $text);
}
}
color: $text;
&:hover {
box-shadow: inset 0 0 0 9999px $overlay-hover;
box-shadow: inset 0 0 0 9999px overlay("hover", $text);
}
&:selected:hover {
box-shadow: inset 0 0 0 9999px rgba($primary, .08);
box-shadow: inset 0 0 0 9999px overlay("hover", $primary);
}
&:disabled {
color: $text;
&:hover {
background-image: image($overlay-hover);
background-image: image(overlay("hover", $text));
}
// side margins: compensate the entry padding with a negative margin
}
&:checked {
background-color: mix($primary, $surface, percentage($overlay-checked-opacity + .04));
background-color: overlay("activated", $primary, $background: $surface);
color: $primary;
@include raised-ink-color($primary);
&:disabled {
box-shadow: inset 0 0 0 9999px $overlay-checked;
background-color: $fill;
box-shadow: none;
background-color: overlay("activated", $text, $background: $fill);
color: $text-disabled;
}
}
@extend %button-flat-basic;
&:checked {
background-color: $overlay-checked;
background-color: overlay("activated", $text);
color: $text;
@include ink-color($text);
}
&:checked {
background-color: mix(on($color), $color, percentage($overlay-checked-opacity));
background-color: overlay("activated", on($color), $background: $color);
}
&.flat {
}
&:checked {
background-color: rgba($color, $overlay-checked-opacity);
background-color: overlay("activated", $color);
}
}
// FIXME: box-shadow, background-color and background-image are not available here.
border-style: solid none;
border-width: 9999px;
border-color: $overlay-hover;
border-color: overlay("hover", $text);
&.after {
border-top-style: none;
&:hover { // Seems like it :hover even with keyboard focus
transition: none;
background-color: $overlay-checked;
background-color: overlay("activated", $titlebar-text);
color: $titlebar-text;
}
&:hover {
transition: none;
background-color: $overlay-hover;
background-color: overlay("hover", $text);
}
&:disabled {
}
&:hover {
background-image: image($overlay-hover);
background-image: image(overlay("hover", $text));
}
&:disabled {
font-weight: 500;
&:hover {
background-color: $overlay-hover;
background-color: overlay("hover", $text);
}
&:disabled {
padding: $container-padding 12px;
&:drop(active) {
background-color: $overlay-hover;
background-color: overlay("hover", $text);
}
}
}
&:hover slider {
box-shadow: 0 0 0 10px $overlay-hover, $shadow-z1;
box-shadow: 0 0 0 10px overlay("hover", $text), $shadow-z1;
}
&:focus slider {
box-shadow: 0 0 0 10px $overlay-focus, $shadow-z1;
box-shadow: 0 0 0 10px overlay("focus", $text), $shadow-z1;
}
&:checked slider {
background-color: $primary;
color: $primary;
}
&:checked:hover slider {
box-shadow: 0 0 0 10px overlay("hover", $primary), $shadow-z1;
}
&:checked:focus slider {
box-shadow: 0 0 0 10px overlay("focus", $primary), $shadow-z1;
}
row:selected & {
}
&:hover {
background-color: $overlay-hover;
background-color: overlay("hover", $primary);
}
&:focus {
background-color: $overlay-focus;
background-color: overlay("focus", $primary);
}
&:active {
animation: ripple-on-slider $ripple-fade-in-duration $ease-out forwards;
background-image:
-gtk-scaled(url('#{$_url}.png'), url('#{$_url}@2.png')),
radial-gradient(circle, $overlay-active 10%, transparent 0%);
radial-gradient(circle, overlay("pressed", $primary) 10%, transparent 0%);
background-size: auto, 0% 0%;
}
}
background-image:
-gtk-scaled(url('#{$_scale_asset}.png'), url('#{$_scale_asset}@2.png')),
radial-gradient(circle, $overlay-active 10%, transparent 0%);
radial-gradient(circle, overlay("pressed", $primary) 10%, transparent 0%);
}
}
}
// this is for indicathing which row generated a popover
// see https://bugzilla.gnome.org/show_bug.cgi?id=754411
&.has-open-popup {
background-color: $overlay-checked;
background-color: overlay("activated", $text);
}
}
@extend %selected_items;
@include ink-color($primary, $fg: false);
&.has-open-popup {
background-color: overlay("activated", $primary, $background: $overlay-selected);
}
}
}
color: $text2;
&:hover {
background-image: image($overlay-hover);
background-image: image(overlay("hover", $text));
}
&:disabled {
}
&.sidebar-placeholder-row {
background-color: $overlay-hover;
background-color: overlay("hover", $text);
}
&.sidebar-new-bookmark-row {
border-radius: $corner-radius;
&:hover {
background-color: $overlay-hover;
background-color: overlay("hover", $text);
}
}
}
}
.emoji:hover {
background-color: $overlay-hover;
background-color: overlay("hover", $text);
}
}
}
@if $t == hover {
box-shadow: inset 0 0 0 9999px $overlay-hover, inset 0 -1px if($fc == $primary, $stroke, $fc);
box-shadow: inset 0 0 0 9999px overlay("hover", $text), inset 0 -1px if($fc == $primary, $stroke, $fc);
}
@if $t == focus {
box-shadow: inset 0 0 0 9999px $overlay-focus, inset 0 -1px if($fc == $primary, $stroke, $fc);
box-shadow: inset 0 0 0 9999px overlay("focus", $text), inset 0 -1px if($fc == $primary, $stroke, $fc);
}
@if $t == checked {
}
@mixin ink-color($color, $opacity-modifier: 0, $fg: true, $activated: false) {
@if saturation($color) > 50% {
$opacity-modifier: .04;
}
@if $fg {
color: $color;
}
@if $activated {
background-color: rgba($color, $overlay-checked-opacity + $opacity-modifier);
background-color: overlay("activated", $color, $opacity-modifier: $opacity-modifier);
}
box-shadow: inset 0 0 0 9999px transparent;
&:drop(active),
&:hover {
box-shadow: inset 0 0 0 9999px rgba($color, $overlay-hover-opacity + $opacity-modifier);
box-shadow: inset 0 0 0 9999px overlay("hover", $color, $opacity-modifier: $opacity-modifier);
}
&:focus {
box-shadow: inset 0 0 0 9999px rgba($color, $overlay-focus-opacity + $opacity-modifier);
box-shadow: inset 0 0 0 9999px overlay("focus", $color, $opacity-modifier: $opacity-modifier);
}
&:active {
background-image: radial-gradient(circle, rgba($color, $overlay-active-opacity + $opacity-modifier) 10%, transparent 0%);
background-image: radial-gradient(circle, overlay("pressed", $color, $opacity-modifier: $opacity-modifier) 10%, transparent 0%);
}
}
transition: $transition;
&.current-workspace {
background-color: $overlay-checked;
background-color: overlay("activated", on($panel));
}
}
@keyframes nautilus-operations-button-needs-attention {
to {
background-color: $overlay-focus;
background-color: overlay("focus", $titlebar-text);
}
}
font-weight: 500;
&:hover {
background-color: $overlay-hover;
background-color: overlay("hover", $text);
}
&:checked {
}
&:hover image {
box-shadow: inset 0 0 0 9999px $overlay-hover;
box-shadow: inset 0 0 0 9999px overlay("hover", $titlebar-text);
}
&:focus image {
box-shadow: inset 0 0 0 9999px $overlay-focus;
box-shadow: inset 0 0 0 9999px overlay("focus", $titlebar-text);
}
&:active image {
background-color: $overlay-active;
background-color: overlay("pressed", $titlebar-text);
}
}
// background-color: @theme_bg_color;
&:hover {
background-image: image($overlay-hover);
background-image: image(overlay("hover", $text));
}
}
color: on($panel, primary);
&:hover {
background-color: $overlay-hover;
background-color: overlay("hover", on($panel));
}
&:active {
background-color: $overlay-active;
background-color: overlay("pressed", on($panel));
}
&:selected {
}
&:selected > box {
background-color: $overlay-checked;
background-color: overlay("activated", on($panel));
color: on($panel);
}
}
font-weight: normal;
&:not(.flat) {
background-color: $overlay-checked;
background-color: overlay("activated", $text);
}
image,
// Workaround for non-animatable buttons in headerbar
headerbar button:active {
background-color: $overlay-active;
background-color: overlay("pressed", $titlebar-text);
}
spinner {
background-size: auto;
&:hover {
box-shadow: inset 0 0 0 9999px $overlay-hover;
box-shadow: inset 0 0 0 9999px overlay("hover", $text);
}
&:active {
background-image: image($overlay-active);
background-image: image(overlay("pressed", $text));
}
}
color: $titlebar-text2;
&:hover {
background-color: $overlay-checked;
background-color: overlay("activated", $titlebar-text);
color: $titlebar-text;
}
}
.unity-panel.menubar.menuitem:hover,
.unity-panel.menubar .menuitem *:hover {
background-color: $overlay-checked;
background-color: overlay("activated", $titlebar-text);
color: $titlebar-text;
}
// Workspace switcher provided by libwnck
wnck-pager {
&:hover {
background-color: $overlay-hover;
background-color: overlay("hover", on($panel));
}
&:active {
background-color: $overlay-active;
background-color: overlay("pressed", on($panel));
}
&:selected {