_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: overlay("hover-alt", $on-surface, $on: entry-fill($on-surface)); 55} 56 57@if $t == focus { 58box-shadow: inset 0 -1px if($fc == $primary, stroke($on-surface), $fc); 59background-color: overlay("focus", $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: overlay("focus", $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$hover: "hover"; 128 129@if $hover-alt or $button-style == "raised" { 130$hover: "hover-alt"; 131} 132 133@if $button-style == "flat" { 134box-shadow: none; 135} @else if $button-style == "outlined" { 136box-shadow: inset 0 0 0 1px stroke($on-surface); 137} @else if $button-style == "raised" { 138box-shadow: $shadow-z2; 139} 140 141@if $button-style != "none" or $on != transparent { 142background-color: $on; 143} 144 145&:drop(active), 146&:hover { 147@if $button-style == "flat" { 148box-shadow: none; 149} @else if $button-style == "outlined" { 150box-shadow: inset 0 0 0 1px stroke($on-surface); 151} @else if $button-style == "raised" { 152box-shadow: $shadow-z4; 153} 154 155background-color: overlay($hover, $color, $opacity-modifier: $opacity-modifier, $on: $on); 156} 157 158&:focus { 159@if $button-style == "flat" { 160box-shadow: none; 161} @else if $button-style == "outlined" { 162box-shadow: inset 0 0 0 1px stroke($on-surface); 163} @else if $button-style == "raised" { 164box-shadow: $shadow-z4; 165} 166 167background-color: overlay("focus", $color, $opacity-modifier: $opacity-modifier, $on: $on); 168} 169 170&:active { 171@if $button-style == "flat" { 172box-shadow: none; 173} @else if $button-style == "outlined" { 174box-shadow: inset 0 0 0 1px stroke($on-surface); 175} @else if $button-style == "raised" { 176box-shadow: $shadow-z8; 177} 178 179background-image: radial-gradient(circle, overlay("pressed", $color, $opacity-modifier: $opacity-modifier) 10%, transparent 0%); 180} 181} 182 183@mixin list-item { 184&:drop(active):not(:active), 185&:hover:not(:active) { 186transition-property: $ripple-transition-property, background-color; 187transition-duration: $ripple-transition-duration, 0ms; 188} 189} 190 191 192@mixin overshoot($side) { 193$valid-sides: top, bottom, left, right; 194 195@if not index($valid-sides, $side) { 196@error "#{$side} is not a valid side. Expected one of #{$valid-sides}."; 197} 198 199$_position: center $side; 200 201@if $side == left or $side == right { 202$_position: $side center; 203} 204 205background-image: 206-gtk-gradient( 207radial, 208$_position, 0, 209$_position, .75, 210to(rgba($primary, .24)), 211to(transparent) 212); 213 214background-repeat: no-repeat; 215background-position: $_position; 216 217background-color: transparent; // reset some properties to be sure to not inherit them somehow 218border: none; // 219box-shadow: none; // 220} 221 222 223@mixin undershoot($side) { 224$valid-sides: top, bottom, left, right; 225 226@if not index($valid-sides, $side) { 227@error "#{$side} is not a valid side. Expected one of #{$valid-sides}."; 228} 229 230$_undershoot_color_dark: stroke($on-surface); 231$_undershoot_color_light: transparent; 232 233$_gradient_dir: left; 234$_dash_bg_size: 12px 1px; 235$_gradient_repeat: repeat-x; 236$_bg_pos: left $side; 237 238@if $side == left or $side == right { 239$_gradient_dir: top; 240$_dash_bg_size: 1px 12px; 241$_gradient_repeat: repeat-y; 242$_bg_pos: $side top; 243} 244 245background-color: transparent; // shouldn't be needed, but better to be sure 246 247background-image: linear-gradient(to $_gradient_dir, // this is the dashed line 248$_undershoot_color_light 50%, 249$_undershoot_color_dark 50%); 250 251padding-#{$side}: 1px; 252background-size: $_dash_bg_size; 253background-repeat: $_gradient_repeat; 254background-origin: content-box; 255background-position: $_bg_pos; 256} 257