_colors.scss
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
// Private variables for dark background colors
87
$-dark-surface-z0: #121212;
88
$-dark-surface-z1: mix(white, $-dark-surface-z0, 5%);
89
$-dark-surface-z4: mix(white, $-dark-surface-z0, 9%);
90
$-dark-surface-z8: mix(white, $-dark-surface-z0, 12%);
91
$-dark-surface-switch-thumb: mix(white, $-dark-surface-z0, 60%);
92
93
//
94
// Main colors
95
//
96
97
$surface-z0: #f9f9f9;
98
$surface-z1: #fff;
99
$surface-z8: #fff;
100
$surface-switch-thumb: #fff;
101
$on-surface: on($surface-z0);
102
103
$primary-on-light: #1967d2;
104
$primary-on-dark: #8ab4f8;
105
$primary: $primary-on-light;
106
$on-primary: on($primary);
107
108
$error-on-light: #d93025;
109
$error-on-dark: #f28b82;
110
$error: $error-on-light;
111
$on-error: on($error);
112
113
$warning-on-light: #f9ab00;
114
$warning-on-dark: #fdd663;
115
$warning: $warning-on-light;
116
$on-warning: on($warning);
117
118
$success-on-light: #1e8e3e;
119
$success-on-dark: #81c995;
120
$success: $success-on-light;
121
$on-success: on($success);
122
123
$visited-on-light: #9334e6;
124
$visited-on-dark: #c58af9;
125
$visited: $visited-on-light;
126
$on-visited: on($visited);
127
128
$system: #212121;
129
$on-system: on($system);
130
131
$tooltip: rgba(#616161, .9);
132
$on-tooltip: on($tooltip);
133
134
$scrim: rgba(black, .6);
135
$on-scrim: on($scrim);
136
137
$scrim-alt: rgba(black, .3);
138
$on-scrim-alt: on($scrim-alt);
139
140
$panel: #212121;
141
$on-panel: on($panel);
142
143
// for Unity panel which doesn't allow translucent colors
144
$panel-solid: $panel;
145
$on-panel-solid: on($panel-solid);
146
147
$titlebar: #424242;
148
$titlebar-backdrop: #303030;
149
$on-titlebar: on($titlebar);
150
151
$titlebar-indicator: currentcolor;
152
153
@if $dark-theme {
154
$surface-z0: $-dark-surface-z0;
155
$surface-z1: $-dark-surface-z1;
156
$surface-z8: $-dark-surface-z8;
157
$surface-switch-thumb: $-dark-surface-switch-thumb;
158
$on-surface: on($surface-z0);
159
160
$primary: $primary-on-dark;
161
$on-primary: on($primary);
162
163
$error: $error-on-dark;
164
$on-error: on($error);
165
166
$warning: $warning-on-dark;
167
$on-warning: on($warning);
168
169
$success: $success-on-dark;
170
$on-success: on($success);
171
172
$visited: $visited-on-dark;
173
$on-visited: on($visited);
174
175
$titlebar: $-dark-surface-z4;
176
$titlebar-backdrop: $-dark-surface-z1;
177
$on-titlebar: on($titlebar);
178
}
179
180
@if $light-topbar {
181
$panel: $scrim;
182
$on-panel: on($panel);
183
184
$panel-solid: #e0e0e0;
185
$on-panel-solid: on($panel-solid);
186
187
$titlebar: #f0f0f0;
188
$titlebar-backdrop: #ebebeb;
189
$on-titlebar: on($titlebar);
190
191
$titlebar-indicator: $primary;
192
}
193
194
//
195
// Overlay state colors
196
//
197
198
$overlay-selected: rgba($primary, .24);
199
200
//
201
// For “on” colors
202
//
203
204
@function primary($color) {
205
@return if(tone($color) == "dark", $primary-on-light, $primary-on-dark);
206
}
207
208
@function error($color) {
209
@return if(tone($color) == "dark", $error-on-light, $error-on-dark);
210
}
211
212
@function hint($color) {
213
@return rgba($color, if(has-alpha($color), .6, .7));
214
}
215
216
@function disabled($color) {
217
@return rgba($color, if(has-alpha($color), .38, .5));
218
}
219
220
@function disabled-hint($color) {
221
@return rgba($color, if(has-alpha($color), .26, .3));
222
}
223
224
@function stroke($color) {
225
@return rgba($color, if(has-alpha($color), .26, .3));
226
}
227
228
@function disabled-stroke($color) {
229
@return rgba($color, if(has-alpha($color), .12, .2));
230
}
231
232
@function divider($color) {
233
@return rgba($color, if(has-alpha($color), .12, .2));
234
}
235
236
@function fill($color) {
237
@return rgba($color, if(has-alpha($color), .08, .08));
238
}
239
240
@function entry-fill($color) {
241
@return rgba($color, if(has-alpha($color), .04, .04));
242
}
243
244
@function scrollbar-thumb($color, $state: null) {
245
@if $state == null {
246
@return rgba($color, if(has-alpha($color), .38, .5));
247
} @else if $state == "hover" {
248
@return rgba($color, if(has-alpha($color), .48, .6));
249
} @else if $state == "pressed" {
250
@return rgba($color, if(has-alpha($color), .6, .7));
251
} @else if $state == "disabled" {
252
@return rgba($color, if(has-alpha($color), .26, .3));
253
} @else {
254
@error "Invalid type: '#{$state}'";
255
}
256
}
257