_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 100%); 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 0px; 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 100% 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; 113background-image: radial-gradient(circle, transparent 10%, transparent 10%); 114background-repeat: no-repeat; 115background-position: center; 116background-size: 1000% 1000%; 117 118&:active { 119transition-duration: $ripple-active-transition-duration; 120animation: ripple $ripple-fade-in-duration $ease-out forwards; 121background-size: 0% 0%; 122} 123} 124 125@mixin ink-color($color, $on: transparent, $button-style: "none", $hover-alt: false, $opacity-modifier: 0) { 126@if $button-style == "raised" { 127$hover-alt: true; 128} 129 130@if $button-style == "flat" { 131box-shadow: none; 132} @else if $button-style == "outlined" { 133box-shadow: inset 0 0 0 1px stroke($on-surface); 134} @else if $button-style == "raised" { 135box-shadow: $shadow-z2; 136} 137 138@if $button-style != "none" or $on != transparent { 139background-color: $on; 140} 141 142&:drop(active), 143&:hover { 144@if $button-style == "flat" { 145box-shadow: none; 146} @else if $button-style == "outlined" { 147box-shadow: inset 0 0 0 1px stroke($on-surface); 148} @else if $button-style == "raised" { 149box-shadow: $shadow-z4; 150} 151 152background-color: hover-overlay($color, $opacity-modifier: $opacity-modifier, $on: $on, $alt: $hover-alt); 153} 154 155&:focus { 156@if $button-style == "flat" { 157box-shadow: none; 158} @else if $button-style == "outlined" { 159box-shadow: inset 0 0 0 1px stroke($on-surface); 160} @else if $button-style == "raised" { 161box-shadow: $shadow-z4; 162} 163 164background-color: focus-overlay($color, $opacity-modifier: $opacity-modifier, $on: $on); 165} 166 167&:active { 168@if $button-style == "flat" { 169box-shadow: none; 170} @else if $button-style == "outlined" { 171box-shadow: inset 0 0 0 1px stroke($on-surface); 172} @else if $button-style == "raised" { 173box-shadow: $shadow-z8; 174} 175 176background-image: radial-gradient(circle, pressed-overlay($color, $opacity-modifier: $opacity-modifier) 10%, transparent 10%); 177} 178} 179 180@mixin list-item { 181&:drop(active):not(:active), 182&:hover:not(:active) { 183transition-property: $ripple-transition-property, background-color; 184transition-duration: $ripple-transition-duration, 0ms; 185} 186} 187 188 189@mixin overshoot($position) { 190$valid-positions: top, bottom, left, right; 191 192@if not index($valid-positions, $position) { 193@error "#{$position} is not a valid position. Expected one of #{$valid-positions}."; 194} 195 196$background-size: 200% 75%; 197 198@if $position == left or $position == right { 199$background-size: 75% 200%; 200} 201 202background-image: 203radial-gradient( 204farthest-side at $position, 205rgba($primary, .24) 99%, // For better antialiasing 206rgba($primary, 0) 100% // Don't use transparent i.e. rgba(0, 0, 0, 0) 207); 208background-size: $background-size; 209background-repeat: no-repeat; 210background-position: $position; 211} 212 213 214@mixin undershoot($side) { 215$valid-sides: top, bottom, left, right; 216 217@if not index($valid-sides, $side) { 218@error "#{$side} is not a valid side. Expected one of #{$valid-sides}."; 219} 220 221$_undershoot_color_dark: stroke($on-surface); 222$_undershoot_color_light: transparent; 223 224$_gradient_dir: left; 225$_dash_bg_size: 12px 1px; 226$_gradient_repeat: repeat-x; 227$_bg_pos: left $side; 228 229@if $side == left or $side == right { 230$_gradient_dir: top; 231$_dash_bg_size: 1px 12px; 232$_gradient_repeat: repeat-y; 233$_bg_pos: $side top; 234} 235 236background-color: transparent; // shouldn't be needed, but better to be sure 237 238background-image: linear-gradient(to $_gradient_dir, // this is the dashed line 239$_undershoot_color_light 50%, 240$_undershoot_color_dark 50%); 241 242margin-#{$side}: 1px; 243background-size: $_dash_bg_size; 244background-repeat: $_gradient_repeat; 245background-origin: content-box; 246background-position: $_bg_pos; 247} 248