A fork of the Materia GTK theme.

By using this site, you agree to have cookies stored on your device, strictly for functional purposes, such as storing your session and preferences.

Dismiss

 _theme-color.template.scss

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