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

 _colors.scss.template

View raw Download
text/plain • 5.94 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
@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