// keyframes mixin @mixin keyframes($name) { @-webkit-keyframes #{$name} { @content; } @-moz-keyframes #{$name} { @content; } @-ms-keyframes #{$name} { @content; } @keyframes #{$name} { @content; } } // slide in and show ============================================================================== .pf-animation-slide-in { -moz-animation-duration: 1.2s; -webkit-animation-duration: 1.2s; -moz-animation-name: pfSlideIn; -webkit-animation-name: pfSlideIn; position:relative; } @include keyframes(pfSlideIn){ from { opacity: 0; top: -20px; } to { opacity: 1; top:0px; } }; // flexBox grow/shrink ============================================================================ @keyframes flexGrow { to { flex: 1; opacity: 1; } } @keyframes flexShrink { to { flex: .01; flex: .00001; opacity: 0; } } // svg path draw ================================================================================== .pf-animation-path-draw { stroke-dasharray: 500; stroke-dashoffset: 500; animation: pfPathDraw 3s linear alternate infinite; } @include keyframes(pfPathDraw){ from { stroke-dashoffset: 500; } to { stroke-dashoffset: 0; } } // bubble ========================================================================================= @include keyframes(pfBubbleWobble){ from { transform: scale(1, 1); } 6.5% { transform: scale(1, 1.4); } 13% { transform: scale(1.4, 1); } 20% { transform: scale(1, 1); } to { transform: scale(1, 1); } } @include keyframes(pfBubblePop){ from { opacity: 1; transform: translateZ(0) scale(1, 1); } to { opacity: 0; transform: translateZ(0) scale(1.75, 1.75); } } // SVG pulse "fill" =============================================================================== @include keyframes(pfPulseDanger){ 0% { fill: $red; } 50% { fill: $red-darker; } 100% { fill: $red; } } // pulse-out ====================================================================================== @mixin pf-pulse-keyframes($name, $color, $backgroundColor, $keepVisible: false){ @include keyframes($name){ 0% { @if $keepVisible { color: inherit; } } 10% { background-color: $backgroundColor; color: $color; } 100% { @if $keepVisible { background-color: rgba($backgroundColor, 0.3); } } }; } @mixin pf-pulse-Background($status, $keepVisible: false){ $statusMap: ( success: ( color: $gray-dark, backgroundColor: $green-dark ), warning: ( color: $gray-darker, backgroundColor: $orange ), danger: ( color: $gray-darker, backgroundColor: $red ) ); $map: map-get($statusMap, $status); $name: pulseBackground + capitalize($status); $nameActive: $name + 'Active'; $className: 'pf-animation-pulse-' + $status; @if $keepVisible { $className: str-insert($className, '-keep', -1); $name: str-insert($name, 'Keep', -1); $nameActive: str-insert($nameActive, 'Keep', -1); } @include pf-pulse-keyframes($name, map-get($map, 'color'), map-get($map, 'backgroundColor'), $keepVisible); @include pf-pulse-keyframes($nameActive, map-get($map, 'color'), darken(map-get($map, 'backgroundColor'), 5%), $keepVisible); .#{$className}{ @include animation($name 1s 1); @include animation-timing-function(cubic-bezier(0.53, -0.03, 0.68, 0.38)); will-change: color, background-color; animation-fill-mode: forwards; .sorting_1{ @include animation($nameActive 1s 1); @include animation-timing-function(cubic-bezier(0.53, -0.03, 0.68, 0.38)); will-change: color, background-color; animation-fill-mode: forwards; } } } @include pf-pulse-Background('success'); @include pf-pulse-Background('success', true); @include pf-pulse-Background('warning'); @include pf-pulse-Background('warning', true); @include pf-pulse-Background('danger'); @include pf-pulse-Background('danger', true); // rotate ========================================================================================= .pf-animate-rotate{ @include transition( all 0.08s linear ); } .pf-animate-rotate.right{ @include rotate( 90deg ); } .pf-animate-rotate.left{ @include rotate( -90deg ); } // rainbow background ============================================================================= @keyframes rotateRainbow{ 0%{ background-position-x: 0; } 100%{ background-position-x: 100vw; } } @mixin rainbow(){ background: repeating-linear-gradient(-45deg, $green-light 0%, $teal-lighter 12.5%, $teal-lightest 25%, $green 37.5%, $green-light 50%); background-size:100vw 100vw; @include animation(rotateRainbow 3s infinite linear forwards); } // navigation link active/hover indicator ========================================================= @mixin pf-navigation-indicator($position){ &:not(.disabled){ position: relative; // otherwise :before indicator gets to height &:before { content: ''; position: absolute; #{$position}: 0; background-color: $green; opacity: 0; @include transition( $position 0.15s ease-out, opacity 0.15s ease-out ); will-change: opacity, $position; @if $position == 'left' { width: 2px; height: 100%; } @else if $position == 'top' { width: 100%; height: 2px; } @else if $position == 'bottom' { width: 100%; height: 2px; } } &:hover, &.active { &:before { #{$position}: -4px; opacity: 1; } } } }