_drawing.scss
ASCII text
1
// generic drawing of more complex things
2
3
//
4
// Ripple keyframes
5
//
6
7
@keyframes ripple {
8
to {
9
background-size: 1000% 1000%;
10
}
11
}
12
13
@keyframes ripple-on-slider {
14
to {
15
background-size: auto, 1000% 1000%;
16
}
17
}
18
19
@keyframes ripple-on-headerbar {
20
from {
21
background-image: radial-gradient(circle, $primary 0%, transparent 0%);
22
}
23
24
to {
25
background-image: radial-gradient(circle, $primary 100%, transparent 0%);
26
}
27
}
28
29
30
@mixin entry($t, $fc: $primary) {
31
//
32
// entry
33
//
34
// $t: entry type
35
// $fc: focus color
36
//
37
38
@if $t == normal {
39
transition: $transition, border-image $ripple-fade-in-duration $ease-out;
40
border-image:
41
radial-gradient(
42
circle closest-corner at center calc(100% - 1px),
43
$fc 0%,
44
transparent 0%
45
) 2 / 0 0 0;
46
box-shadow: inset 0 -1px if($fc == $primary, stroke($on-surface), $fc);
47
background-color: entry-fill($on-surface);
48
color: $on-surface;
49
caret-color: $fc;
50
}
51
52
@if $t == hover {
53
box-shadow: inset 0 -1px if($fc == $primary, stroke($on-surface), $fc);
54
background-color: hover-overlay($on-surface, $on: entry-fill($on-surface), $alt: true);
55
}
56
57
@if $t == focus {
58
box-shadow: inset 0 -1px if($fc == $primary, stroke($on-surface), $fc);
59
background-color: focus-overlay($on-surface, $on: entry-fill($on-surface));
60
}
61
62
@if $t == checked {
63
border-image:
64
radial-gradient(
65
circle closest-corner at center calc(100% - 1px),
66
$fc 100%,
67
transparent 0%
68
) 2 / 0 0 2px;
69
box-shadow: inset 0 -1px if($fc == $primary, stroke($on-surface), $fc);
70
background-color: focus-overlay($on-surface, $on: entry-fill($on-surface));
71
}
72
73
@if $t == disabled {
74
box-shadow: inset 0 -1px disabled-stroke($on-surface);
75
background-color: entry-fill($on-surface);
76
color: disabled($on-surface);
77
}
78
79
@if $t == raised-normal {
80
transition: $transition;
81
border-image: none;
82
box-shadow: $shadow-z1;
83
background-color: if($fc == $primary, $surface-z8, $fc);
84
color: if($fc == $primary, $on-surface, on($fc));
85
caret-color: if($fc == $primary, $fc, on($fc));
86
}
87
88
@if $t == raised-hover {
89
box-shadow: $shadow-z3;
90
}
91
92
@if $t == raised-focus {
93
border-image: none;
94
box-shadow: $shadow-z3;
95
}
96
97
@if $t == raised-disabled {
98
box-shadow: $shadow-z1;
99
background-color: $surface-z1;
100
color: disabled($on-surface);
101
}
102
}
103
104
105
$ripple-transition-property: all, border-image, background-size, background-image;
106
$ripple-transition-duration: $duration, $ripple-fade-in-duration, $ripple-fade-out-duration, $ripple-fade-out-opacity-duration;
107
$ripple-active-transition-duration: $duration, $ripple-fade-in-duration, 0ms, 0ms;
108
109
%ripple {
110
transition-property: $ripple-transition-property;
111
transition-duration: $ripple-transition-duration;
112
transition-timing-function: $ease-out;
113
outline: none;
114
background-image: radial-gradient(circle, transparent 10%, transparent 0%);
115
background-repeat: no-repeat;
116
background-position: center;
117
background-size: 1000% 1000%;
118
119
&:active {
120
transition-duration: $ripple-active-transition-duration;
121
animation: ripple $ripple-fade-in-duration $ease-out forwards;
122
background-size: 0% 0%;
123
}
124
}
125
126
@mixin ink-color($color, $on: transparent, $button-style: "none", $hover-alt: false, $opacity-modifier: 0) {
127
@if $button-style == "raised" {
128
$hover-alt: true;
129
}
130
131
@if $button-style == "flat" {
132
box-shadow: none;
133
} @else if $button-style == "outlined" {
134
box-shadow: inset 0 0 0 1px stroke($on-surface);
135
} @else if $button-style == "raised" {
136
box-shadow: $shadow-z2;
137
}
138
139
@if $button-style != "none" or $on != transparent {
140
background-color: $on;
141
}
142
143
&:drop(active),
144
&:hover {
145
@if $button-style == "flat" {
146
box-shadow: none;
147
} @else if $button-style == "outlined" {
148
box-shadow: inset 0 0 0 1px stroke($on-surface);
149
} @else if $button-style == "raised" {
150
box-shadow: $shadow-z4;
151
}
152
153
background-color: hover-overlay($color, $opacity-modifier: $opacity-modifier, $on: $on, $alt: $hover-alt);
154
}
155
156
&:focus {
157
@if $button-style == "flat" {
158
box-shadow: none;
159
} @else if $button-style == "outlined" {
160
box-shadow: inset 0 0 0 1px stroke($on-surface);
161
} @else if $button-style == "raised" {
162
box-shadow: $shadow-z4;
163
}
164
165
background-color: focus-overlay($color, $opacity-modifier: $opacity-modifier, $on: $on);
166
}
167
168
&:active {
169
@if $button-style == "flat" {
170
box-shadow: none;
171
} @else if $button-style == "outlined" {
172
box-shadow: inset 0 0 0 1px stroke($on-surface);
173
} @else if $button-style == "raised" {
174
box-shadow: $shadow-z8;
175
}
176
177
background-image: radial-gradient(circle, pressed-overlay($color, $opacity-modifier: $opacity-modifier) 10%, transparent 0%);
178
}
179
}
180
181
@mixin list-item {
182
&:drop(active):not(:active),
183
&:hover:not(:active) {
184
transition-property: $ripple-transition-property, background-color;
185
transition-duration: $ripple-transition-duration, 0ms;
186
}
187
}
188
189
190
@mixin overshoot($side) {
191
$valid-sides: top, bottom, left, right;
192
193
@if not index($valid-sides, $side) {
194
@error "#{$side} is not a valid side. Expected one of #{$valid-sides}.";
195
}
196
197
$_position: center $side;
198
199
@if $side == left or $side == right {
200
$_position: $side center;
201
}
202
203
background-image:
204
-gtk-gradient(
205
radial,
206
$_position, 0,
207
$_position, .75,
208
to(rgba($primary, .24)),
209
to(transparent)
210
);
211
212
background-repeat: no-repeat;
213
background-position: $_position;
214
215
background-color: transparent; // reset some properties to be sure to not inherit them somehow
216
border: none; //
217
box-shadow: none; //
218
}
219
220
221
@mixin undershoot($side) {
222
$valid-sides: top, bottom, left, right;
223
224
@if not index($valid-sides, $side) {
225
@error "#{$side} is not a valid side. Expected one of #{$valid-sides}.";
226
}
227
228
$_undershoot_color_dark: stroke($on-surface);
229
$_undershoot_color_light: transparent;
230
231
$_gradient_dir: left;
232
$_dash_bg_size: 12px 1px;
233
$_gradient_repeat: repeat-x;
234
$_bg_pos: left $side;
235
236
@if $side == left or $side == right {
237
$_gradient_dir: top;
238
$_dash_bg_size: 1px 12px;
239
$_gradient_repeat: repeat-y;
240
$_bg_pos: $side top;
241
}
242
243
background-color: transparent; // shouldn't be needed, but better to be sure
244
245
background-image: linear-gradient(to $_gradient_dir, // this is the dashed line
246
$_undershoot_color_light 50%,
247
$_undershoot_color_dark 50%);
248
249
padding-#{$side}: 1px;
250
background-size: $_dash_bg_size;
251
background-repeat: $_gradient_repeat;
252
background-origin: content-box;
253
background-position: $_bg_pos;
254
}
255