_drawing.scss
ASCII text
1// generic drawing of more complex things 2 3// 4// Ripple keyframes 5// 6 7@keyframes ripple { 8to { 9background-size: 1000% 1000%; 10} 11} 12 13@keyframes ripple-on-slider { 14to { 15background-size: auto, 1000% 1000%; 16} 17} 18 19@keyframes ripple-on-headerbar { 20from { 21background-image: radial-gradient(circle, $primary 0%, transparent 0%); 22} 23 24to { 25background-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 { 39transition: $transition, border-image $ripple-fade-in-duration $ease-out; 40border-image: 41radial-gradient( 42circle closest-corner at center calc(100% - 1px), 43$fc 0%, 44transparent 0% 45) 2 / 0 0 0; 46box-shadow: inset 0 -1px if($fc == $primary, stroke($on-surface), $fc); 47background-color: entry-fill($on-surface); 48color: $on-surface; 49caret-color: $fc; 50} 51 52@if $t == hover { 53box-shadow: inset 0 -1px if($fc == $primary, stroke($on-surface), $fc); 54background-color: hover-overlay($on-surface, $on: entry-fill($on-surface), $alt: true); 55} 56 57@if $t == focus { 58box-shadow: inset 0 -1px if($fc == $primary, stroke($on-surface), $fc); 59background-color: focus-overlay($on-surface, $on: entry-fill($on-surface)); 60} 61 62@if $t == checked { 63border-image: 64radial-gradient( 65circle closest-corner at center calc(100% - 1px), 66$fc 100%, 67transparent 0% 68) 2 / 0 0 2px; 69box-shadow: inset 0 -1px if($fc == $primary, stroke($on-surface), $fc); 70background-color: focus-overlay($on-surface, $on: entry-fill($on-surface)); 71} 72 73@if $t == disabled { 74box-shadow: inset 0 -1px disabled-stroke($on-surface); 75background-color: entry-fill($on-surface); 76color: disabled($on-surface); 77} 78 79@if $t == raised-normal { 80transition: $transition; 81border-image: none; 82box-shadow: $shadow-z1; 83background-color: if($fc == $primary, $surface-z8, $fc); 84color: if($fc == $primary, $on-surface, on($fc)); 85caret-color: if($fc == $primary, $fc, on($fc)); 86} 87 88@if $t == raised-hover { 89box-shadow: $shadow-z3; 90} 91 92@if $t == raised-focus { 93border-image: none; 94box-shadow: $shadow-z3; 95} 96 97@if $t == raised-disabled { 98box-shadow: $shadow-z1; 99background-color: $surface-z1; 100color: 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 { 110transition-property: $ripple-transition-property; 111transition-duration: $ripple-transition-duration; 112transition-timing-function: $ease-out; 113outline: none; 114background-image: radial-gradient(circle, transparent 10%, transparent 0%); 115background-repeat: no-repeat; 116background-position: center; 117background-size: 1000% 1000%; 118 119&:active { 120transition-duration: $ripple-active-transition-duration; 121animation: ripple $ripple-fade-in-duration $ease-out forwards; 122background-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" { 132box-shadow: none; 133} @else if $button-style == "outlined" { 134box-shadow: inset 0 0 0 1px stroke($on-surface); 135} @else if $button-style == "raised" { 136box-shadow: $shadow-z2; 137} 138 139@if $button-style != "none" or $on != transparent { 140background-color: $on; 141} 142 143&:drop(active), 144&:hover { 145@if $button-style == "flat" { 146box-shadow: none; 147} @else if $button-style == "outlined" { 148box-shadow: inset 0 0 0 1px stroke($on-surface); 149} @else if $button-style == "raised" { 150box-shadow: $shadow-z4; 151} 152 153background-color: hover-overlay($color, $opacity-modifier: $opacity-modifier, $on: $on, $alt: $hover-alt); 154} 155 156&:focus { 157@if $button-style == "flat" { 158box-shadow: none; 159} @else if $button-style == "outlined" { 160box-shadow: inset 0 0 0 1px stroke($on-surface); 161} @else if $button-style == "raised" { 162box-shadow: $shadow-z4; 163} 164 165background-color: focus-overlay($color, $opacity-modifier: $opacity-modifier, $on: $on); 166} 167 168&:active { 169@if $button-style == "flat" { 170box-shadow: none; 171} @else if $button-style == "outlined" { 172box-shadow: inset 0 0 0 1px stroke($on-surface); 173} @else if $button-style == "raised" { 174box-shadow: $shadow-z8; 175} 176 177background-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) { 184transition-property: $ripple-transition-property, background-color; 185transition-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 203background-image: 204-gtk-gradient( 205radial, 206$_position, 0, 207$_position, .75, 208to(rgba($primary, .24)), 209to(transparent) 210); 211 212background-repeat: no-repeat; 213background-position: $_position; 214 215background-color: transparent; // reset some properties to be sure to not inherit them somehow 216border: none; // 217box-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 243background-color: transparent; // shouldn't be needed, but better to be sure 244 245background-image: linear-gradient(to $_gradient_dir, // this is the dashed line 246$_undershoot_color_light 50%, 247$_undershoot_color_dark 50%); 248 249padding-#{$side}: 1px; 250background-size: $_dash_bg_size; 251background-repeat: $_gradient_repeat; 252background-origin: content-box; 253background-position: $_bg_pos; 254} 255