/* Ensure elements are hidden before JavaScript runs */
[data-animate] {
	opacity: 1;
	visibility: visible;
	will-change: opacity, visibility, transform;
}

/* 
   Continuous & Attention Seeker Animations 
   These still use CSS Keyframes as they are timed, not scroll-progress based.
*/
[data-animate="float"],
[data-animate="floatHorizontal"],
[data-animate="pulse"],
[data-animate="glow"],
[data-animate="bounce"],
[data-animate="heartBeat"],
[data-animate="wobble"],
[data-animate="shake"],
[data-animate="swing"],
[data-animate="tada"],
[data-animate="rubberBand"],
[data-animate="flash"],
[data-animate="jello"] {
	animation-name: var(--animation-name);
	animation-duration: var(--animation-speed);
	animation-timing-function: ease-in-out;
	animation-fill-mode: forwards;
	animation-delay: var(--animation-delay);
	animation-iteration-count: var(--animation-repeat, 1);
}

@media (prefers-reduced-motion:reduce),
print {
	.animated {
		animation-duration: 1ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: 1ms !important;
	}
}

/* Entrance animations - hidden until progress starts or .animated is added */
[data-animate="fadeIn"],
[data-animate="fadeInDown"],
[data-animate="fadeInDownBig"],
[data-animate="fadeInLeft"],
[data-animate="fadeInLeftBig"],
[data-animate="fadeInRight"],
[data-animate="fadeInRightBig"],
[data-animate="fadeInUp"],
[data-animate="fadeInUpBig"],
[data-animate="zoomIn"],
[data-animate="zoomOut"],
[data-animate="flipInX"],
[data-animate="flipInY"],
[data-animate="rotateIn"],
[data-animate="slideUp"],
[data-animate="slideLeft"] {
	opacity: 0;
	visibility: hidden;
}

/* Triggered entrance animations (In Editor or Fixed mode) */
.animated.animate-active,
.is-editor .animated {
	animation-name: var(--animation-name);
	animation-duration: var(--animation-speed);
	animation-timing-function: ease-in-out;
	animation-fill-mode: forwards;
	animation-delay: var(--animation-delay);
	animation-iteration-count: var(--animation-repeat, 1);
}

.animated.animate-active[data-animate="fadeIn"],
.is-editor .animated[data-animate="fadeIn"],
.animated.animate-active[data-animate="fadeInDown"],
.is-editor .animated[data-animate="fadeInDown"],
.animated.animate-active[data-animate="fadeInDownBig"],
.is-editor .animated[data-animate="fadeInDownBig"],
.animated.animate-active[data-animate="fadeInLeft"],
.is-editor .animated[data-animate="fadeInLeft"],
.animated.animate-active[data-animate="fadeInLeftBig"],
.is-editor .animated[data-animate="fadeInLeftBig"],
.animated.animate-active[data-animate="fadeInRight"],
.is-editor .animated[data-animate="fadeInRight"],
.animated.animate-active[data-animate="fadeInRightBig"],
.is-editor .animated[data-animate="fadeInRightBig"],
.animated.animate-active[data-animate="fadeInUp"],
.is-editor .animated[data-animate="fadeInUp"],
.animated.animate-active[data-animate="fadeInUpBig"],
.is-editor .animated[data-animate="fadeInUpBig"],
.animated.animate-active[data-animate="zoomIn"],
.is-editor .animated[data-animate="zoomIn"],
.animated.animate-active[data-animate="zoomOut"],
.is-editor .animated[data-animate="zoomOut"],
.animated.animate-active[data-animate="flipInX"],
.is-editor .animated[data-animate="flipInX"],
.animated.animate-active[data-animate="flipInY"],
.is-editor .animated[data-animate="flipInY"],
.animated.animate-active[data-animate="rotateIn"],
.is-editor .animated[data-animate="rotateIn"],
.animated.animate-active[data-animate="slideUp"],
.is-editor .animated[data-animate="slideUp"],
.animated.animate-active[data-animate="slideLeft"],
.is-editor .animated[data-animate="slideLeft"] {
	visibility: visible;
}

/* Entrance Keyframes */
@keyframes fadeIn {
	0% {
		opacity: 0;
	}

	100% {
		opacity: 1;
	}
}

@keyframes fadeInDown {
	0% {
		opacity: 0;
		transform: translate3d(0, -20px, 0);
	}

	100% {
		opacity: 1;
		transform: translate3d(0, 0, 0);
	}
}

@keyframes fadeInDownBig {
	0% {
		opacity: 0;
		transform: translate3d(0, -100px, 0);
	}

	100% {
		opacity: 1;
		transform: translate3d(0, 0, 0);
	}
}

@keyframes fadeInLeft {
	0% {
		opacity: 0;
		transform: translate3d(-20px, 0, 0);
	}

	100% {
		opacity: 1;
		transform: translate3d(0, 0, 0);
	}
}

@keyframes fadeInLeftBig {
	0% {
		opacity: 0;
		transform: translate3d(-100%, 0, 0);
	}

	100% {
		opacity: 1;
		transform: translate3d(0, 0, 0);
	}
}

@keyframes fadeInRight {
	0% {
		opacity: 0;
		transform: translate3d(20px, 0, 0);
	}

	100% {
		opacity: 1;
		transform: translate3d(0, 0, 0);
	}
}

@keyframes fadeInRightBig {
	0% {
		opacity: 0;
		transform: translate3d(100%, 0, 0);
	}

	100% {
		opacity: 1;
		transform: translate3d(0, 0, 0);
	}
}

@keyframes fadeInUp {
	0% {
		opacity: 0;
		transform: translate3d(0, 20px, 0);
	}

	100% {
		opacity: 1;
		transform: translate3d(0, 0, 0);
	}
}

@keyframes fadeInUpBig {
	0% {
		opacity: 0;
		transform: translate3d(0, 100px, 0);
	}

	100% {
		opacity: 1;
		transform: translate3d(0, 0, 0);
	}
}

@keyframes zoomIn {
	0% {
		opacity: 0;
		transform: scale(0.85);
	}

	100% {
		opacity: 1;
		transform: scale(1);
	}
}

@keyframes zoomOut {
	0% {
		opacity: 0;
		transform: scale(1.15);
	}

	100% {
		opacity: 1;
		transform: scale(1);
	}
}

@keyframes slideUp {
	0% {
		opacity: 0;
		transform: translate3d(0, 30px, 0);
	}

	100% {
		opacity: 1;
		transform: translate3d(0, 0, 0);
	}
}

@keyframes slideLeft {
	0% {
		opacity: 0;
		transform: translate3d(30px, 0, 0);
	}

	100% {
		opacity: 1;
		transform: translate3d(0, 0, 0);
	}
}

@keyframes rotateIn {
	0% {
		opacity: 0;
		transform: rotate(-200deg);
	}

	100% {
		opacity: 1;
		transform: rotate(0);
	}
}

@keyframes flipInX {
	0% {
		opacity: 0;
		transform: perspective(400px) rotateX(90deg);
	}

	100% {
		opacity: 1;
		transform: perspective(400px) rotateX(0);
	}
}

@keyframes flipInY {
	0% {
		opacity: 0;
		transform: perspective(400px) rotateY(90deg);
	}

	100% {
		opacity: 1;
		transform: perspective(400px) rotateY(0);
	}
}

/* ========================================
   CONTINUOUS/LOOPING ANIMATIONS
   ======================================== */

@keyframes float {

	0%,
	100% {
		transform: translateY(0);
	}

	50% {
		transform: translateY(-4px);
	}
}

@keyframes floatHorizontal {

	0%,
	100% {
		transform: translateX(0);
	}

	50% {
		transform: translateX(4px);
	}
}

@keyframes pulse {

	0%,
	100% {
		transform: scale(1);
	}

	50% {
		transform: scale(1.03);
	}
}

@keyframes glow {

	0%,
	100% {
		opacity: 1;
	}

	50% {
		opacity: 0.7;
	}
}

/* ========================================
   ATTENTION SEEKER ANIMATIONS
   ======================================== */

@keyframes bounce {

	0%,
	20%,
	53%,
	to {
		animation-timing-function: cubic-bezier(.215, .61, .355, 1);
		transform: translateZ(0);
	}

	40%,
	43% {
		animation-timing-function: cubic-bezier(.755, .05, .855, .06);
		transform: translate3d(0, -30px, 0) scaleY(1.1);
	}

	70% {
		animation-timing-function: cubic-bezier(.755, .05, .855, .06);
		transform: translate3d(0, -15px, 0) scaleY(1.05);
	}

	80% {
		transform: translateZ(0) scaleY(.95);
		transition-timing-function: cubic-bezier(.215, .61, .355, 1);
	}

	90% {
		transform: translate3d(0, -4px, 0) scaleY(1.02);
	}
}

@keyframes heartBeat {
	0% {
		transform: scale(1);
	}

	14% {
		transform: scale(1.3);
	}

	28% {
		transform: scale(1);
	}

	42% {
		transform: scale(1.3);
	}

	70% {
		transform: scale(1);
	}
}

@keyframes wobble {
	0% {
		transform: translateZ(0);
	}

	15% {
		transform: translate3d(-25%, 0, 0) rotate(-5deg);
	}

	30% {
		transform: translate3d(20%, 0, 0) rotate(3deg);
	}

	45% {
		transform: translate3d(-15%, 0, 0) rotate(-3deg);
	}

	60% {
		transform: translate3d(10%, 0, 0) rotate(2deg);
	}

	75% {
		transform: translate3d(-5%, 0, 0) rotate(-1deg);
	}

	to {
		transform: translateZ(0);
	}
}

@keyframes shake {

	0%,
	100% {
		transform: translateX(0);
	}

	10%,
	30%,
	50%,
	70%,
	90% {
		transform: translateX(-6px);
	}

	20%,
	40%,
	60%,
	80% {
		transform: translateX(6px);
	}
}

@keyframes swing {
	20% {
		transform: rotate(15deg);
	}

	40% {
		transform: rotate(-10deg);
	}

	60% {
		transform: rotate(5deg);
	}

	80% {
		transform: rotate(-5deg);
	}

	100% {
		transform: rotate(0deg);
	}
}

@keyframes tada {
	0% {
		transform: scale(1);
	}

	10%,
	20% {
		transform: scale(0.9) rotate(-3deg);
	}

	30%,
	50%,
	70%,
	90% {
		transform: scale(1.1) rotate(3deg);
	}

	40%,
	60%,
	80% {
		transform: scale(1.1) rotate(-3deg);
	}

	100% {
		transform: scale(1) rotate(0);
	}
}

@keyframes rubberBand {
	0% {
		transform: scale(1);
	}

	30% {
		transform: scaleX(1.25) scaleY(0.75);
	}

	40% {
		transform: scaleX(0.75) scaleY(1.25);
	}

	50% {
		transform: scaleX(1.15) scaleY(0.85);
	}

	65% {
		transform: scaleX(0.95) scaleY(1.05);
	}

	75% {
		transform: scaleX(1.05) scaleY(0.95);
	}

	100% {
		transform: scale(1);
	}
}

@keyframes flash {

	0%,
	50%,
	100% {
		opacity: 1;
	}

	25%,
	75% {
		opacity: 0;
	}
}

@keyframes jello {

	0%,
	11.1%,
	100% {
		transform: translateZ(0);
	}

	22.2% {
		transform: skewX(-12.5deg) skewY(-12.5deg);
	}

	33.3% {
		transform: skewX(6.25deg) skewY(6.25deg);
	}

	44.4% {
		transform: skewX(-3.125deg) skewY(-3.125deg);
	}

	55.5% {
		transform: skewX(1.5625deg) skewY(1.5625deg);
	}

	66.6% {
		transform: skewX(-0.78125deg) skewY(-0.78125deg);
	}

	77.7% {
		transform: skewX(0.390625deg) skewY(0.390625deg);
	}

	88.8% {
		transform: skewX(-0.1953125deg) skewY(-0.1953125deg);
	}
}