_colors.scss.template
Unicode text, UTF-8 text
1// When color definition differs for dark and light variant, 2// it gets @if ed depending on $variant 3 4@import 'color-palette'; 5 6$dark-theme: false !default; 7$light-topbar: false !default; 8 9@function gtkalpha($color, $alpha) { 10@return unquote("alpha(#{$color}, #{$alpha})"); 11} 12 13// Determine whether the color has alpha. 14@function has-alpha($color) { 15@return if(alpha($color) < 1, true, false); 16} 17 18// Determine whether the color is "light" or "dark". 19@function tone($color) { 20// Calculate color brightness as per https://www.w3.org/TR/AERT/#color-contrast 21$brightness: (red($color) * 299 + green($color) * 587 + blue($color) * 114) / 1000; 22 23@if $brightness >= 128 { 24@return "light"; 25} @else { 26@return "dark"; 27} 28} 29 30$on-light: #000; 31$on-dark: #fff; 32 33// Determine whether to use dark or light color on top of given color 34// to meet accessibility standards for contrast. 35@function on($color) { 36$contrast-color: if(tone($color) == "dark", $on-dark, $on-light); 37 38@if saturation($color) > 50% or alpha($color) < 1 { 39@return $contrast-color; 40} @else { 41@return rgba($contrast-color, .87); 42} 43} 44 45// Determine the strength of highlight on top of given color. 46@function highlight($color) { 47@if lightness($color) >= 80% { 48@return rgba(white, .4); 49} @else if lightness($color) >= 40% { 50@return rgba(white, .2); 51} @else { 52@return rgba(white, .05); 53} 54} 55 56// Make translucent color opaque by blending with the background color. 57@function opacify($color, $on) { 58@return mix(change-color($color, $alpha: 1), $on, alpha($color) * 100%); 59} 60 61$state-overlay-opacities: ( 62"hover": .08, 63"hover-alt": .04, 64"focus": .08, 65"pressed": .12, 66"dragged": .08, 67"activated": .12, 68"selected": .24, 69); 70 71// Determine the overlay color depending on the given state and color. 72@function overlay($state, $color, $on: transparent, $opacity-modifier: 0) { 73@if not map-has-key($state-overlay-opacities, $state) { 74@error "Invalid state: '#{$state}'. Choose one of: #{map-keys($state-overlay-opacities)}"; 75} 76 77@if saturation($color) > 50% or saturation($on) > 50% { 78$opacity-modifier: .04; 79} 80 81$opacity: map-get($state-overlay-opacities, $state) + $opacity-modifier; 82 83@return mix(rgba($color, 1), $on, $opacity * 100%); 84} 85 86// 87// Main colors 88// 89 90$surface-z0: %BG%; 91$surface-z1: %MATERIA_VIEW%; 92$surface-z8: %MATERIA_SURFACE%; 93$surface-switch-thumb: %MATERIA_SURFACE%; 94$on-surface: %FG%; 95 96$primary-on-light: %SEL_BG%; 97$primary-on-dark: %SEL_BG%; 98$primary: $primary-on-light; 99$on-primary: on($primary); 100 101$error-on-light: %TERMINAL_COLOR9%; 102$error-on-dark: %TERMINAL_COLOR9%; 103$error: $error-on-light; 104$on-error: on($error); 105 106$warning-on-light: %TERMINAL_COLOR11%; 107$warning-on-dark: %TERMINAL_COLOR11%; 108$warning: $warning-on-light; 109$on-warning: on($warning); 110 111$success-on-light: %TERMINAL_COLOR10%; 112$success-on-dark: %TERMINAL_COLOR10%; 113$success: $success-on-light; 114$on-success: on($success); 115 116$visited-on-light: %TERMINAL_COLOR5%; 117$visited-on-dark: %TERMINAL_COLOR5%; 118$visited: $visited-on-light; 119$on-visited: on($visited); 120 121$system: %HDR_BG3%; 122$on-system: %HDR_FG%; 123 124$tooltip: rgba(%HDR_BG%, .9); 125$on-tooltip: %HDR_FG%; 126 127$scrim: rgba(black, %MATERIA_PANEL_OPACITY%); 128$on-scrim: on($scrim); 129 130$scrim-alt: rgba(black, .3); 131$on-scrim-alt: on($scrim-alt); 132 133$panel: %HDR_BG3%; 134$on-panel: %HDR_FG%; 135 136// for Unity panel which doesn't allow translucent colors 137$panel-solid: %HDR_BG3%; 138$on-panel-solid: %HDR_FG%; 139 140$titlebar: %HDR_BG%; 141$titlebar-backdrop: %HDR_BG2%; 142$on-titlebar: %HDR_FG%; 143 144$titlebar-indicator: currentcolor; 145 146@if $dark-theme { 147$surface-z0: if(tone(%BG%) == "dark", %BG%, %FG%); 148$surface-z1: if(tone(%BG%) == "dark", %MATERIA_VIEW%, mix(white, $surface-z0, 5%)); 149$surface-z8: if(tone(%BG%) == "dark", %MATERIA_SURFACE%, mix(white, $surface-z0, 12%)); 150$surface-switch-thumb: if(tone(%BG%) == "dark", %MATERIA_SURFACE%, mix(white, $surface-z0, 60%)); 151$on-surface: if(tone(%BG%) == "dark", %FG%, on($surface-z0)); 152 153$primary: $primary-on-dark; 154$on-primary: on($primary); 155 156$error: $error-on-dark; 157$on-error: on($error); 158 159$warning: $warning-on-dark; 160$on-warning: on($warning); 161 162$success: $success-on-dark; 163$on-success: on($success); 164 165$visited: $visited-on-dark; 166$on-visited: on($visited); 167 168$titlebar: if(tone(%BG%) == "dark", %HDR_BG%, mix(white, $surface-z0, 9%)); 169$titlebar-backdrop: if(tone(%BG%) == "dark", %HDR_BG2%, $surface-z1); 170$on-titlebar: if(tone(%BG%) == "dark", %HDR_FG%, on($titlebar)); 171} 172 173@if $light-topbar { 174$panel: $scrim; 175$on-panel: on($panel); 176 177$titlebar-indicator: $primary; 178} 179 180// 181// Overlay state colors 182// 183 184$overlay-selected: rgba($primary, %MATERIA_SELECTION_OPACITY%); 185 186// 187// For “on” colors 188// 189 190@function primary($color) { 191@return if(tone($color) == "dark", $primary-on-light, $primary-on-dark); 192} 193 194@function error($color) { 195@return if(tone($color) == "dark", $error-on-light, $error-on-dark); 196} 197 198@function hint($color) { 199@return rgba($color, if(has-alpha($color), .6, .7)); 200} 201 202@function disabled($color) { 203@return rgba($color, if(has-alpha($color), .38, .5)); 204} 205 206@function disabled-hint($color) { 207@return rgba($color, if(has-alpha($color), .26, .3)); 208} 209 210@function stroke($color) { 211@return rgba($color, if(has-alpha($color), .26, .3)); 212} 213 214@function disabled-stroke($color) { 215@return rgba($color, if(has-alpha($color), .12, .2)); 216} 217 218@function divider($color) { 219@return rgba($color, if(has-alpha($color), .12, .2)); 220} 221 222@function fill($color) { 223@return rgba($color, if(has-alpha($color), .08, .08)); 224} 225 226@function entry-fill($color) { 227@return rgba($color, if(has-alpha($color), .04, .04)); 228} 229 230@function scrollbar-thumb($color, $state: null) { 231@if $state == null { 232@return rgba($color, if(has-alpha($color), .38, .5)); 233} @else if $state == "hover" { 234@return rgba($color, if(has-alpha($color), .48, .6)); 235} @else if $state == "pressed" { 236@return rgba($color, if(has-alpha($color), .6, .7)); 237} @else if $state == "disabled" { 238@return rgba($color, if(has-alpha($color), .26, .3)); 239} @else { 240@error "Invalid type: '#{$state}'"; 241} 242} 243