/* ==========================================================================
 * Animations — all @keyframes used across the app
 * ========================================================================== */
@keyframes tap {
0% {
	transform: translateY(0);
	opacity: 0.5;
}
50% {
	transform: translateY(-3.125vw);
	opacity: 1;
}
100% {
	transform: translateY(0);
	opacity: 0.5;
}
}

@keyframes vibes-wow {
0% {
	transform: scale(1) rotate(0deg);
}
40% {
	transform: scale(1.35) rotate(-12deg);
}
70% {
	transform: scale(.9) rotate(8deg);
}
100% {
	transform: scale(1) rotate(0deg);
}
}

@keyframes vibe-spark {
0% {
	opacity: 1;
	transform: translate(0,0) scale(.7);
}
100% {
	opacity: 0;
	transform: translate(var(--spark-x),var(--spark-y)) scale(1.3);
}
}

@keyframes smartie-burst {
0% {
	opacity: 0;
	transform: translate(-50%, -50%) scale(0.25);
}
14% {
	opacity: 1;
	transform: translate(-50%, -50%) scale(1.08);
}
34% {
	opacity: 1;
	transform: translate(calc(-50% + (var(--smartie-x) * .28)), calc(-50% + (var(--smartie-y) * .28))) scale(1);
}
100% {
	opacity: 0;
	transform: translate(calc(-50% + var(--smartie-x)), calc(-50% + var(--smartie-y))) scale(0.72);
}
}

@keyframes hivergo-tray-ripple {
0% {
	opacity: .52;
	transform: translate(-50%,-50%) scale(1);
}
100% {
	opacity: 0;
	transform: translate(-50%,-50%) scale(2);
}
}

@keyframes add-on-bounce {
0% {
	scale: 1;
}
45% {
	scale: .72;
}
72% {
	scale: 1.16;
}
100% {
	scale: 1;
}
}

@keyframes add-on-ripple {
to {
	opacity: 0;
	transform: translate(-50%, -50%) scale(2);
}
}

@keyframes widget-glissando {
0% {
	transform: translateX(-110%);
	opacity: 0;
}
16% {
	opacity: 1;
}
100% {
	transform: translateX(110%);
	opacity: 0;
}
}

@keyframes speech-wave-idle {
from {
	transform: scaleY(.28);
}
to {
	transform: scaleY(.72);
}
}

@keyframes anchor-target-glissando {
to {
	transform: translateX(100%);
}
}

@keyframes speech-transcript-in {
from {
	opacity: 0;
	filter: blur(1.25vw);
	color: var(--app-accent);
	transform: translateY(0.625vw);
}
to {
	opacity: 1;
	filter: blur(0);
	color: #fff;
	transform: translateY(0);
}
}

@keyframes notepad-send-burst {
to {
	opacity: 0;
	transform: translate(calc(-50% + var(--bubble-x)), calc(-50% + var(--bubble-y))) scale(1.35);
}
}

@keyframes anchor-note-flash {
0% {
	background: rgb(136 214 255 / 30%);
}
100% {
	background: transparent;
}
}

@keyframes follow-pop {
from {
	opacity: 0;
	transform: translateY(2vw) scale(.8);
}
35% {
	opacity: 1;
	transform: translateY(-2vw) scale(1.1);
}
to {
	opacity: 0;
	transform: translateY(-8vw) scale(.9);
}
}

@keyframes follow-star {
from {
	opacity: 1;
	transform: translate(0,0) scale(1);
}
to {
	opacity: 0;
	transform: translate(var(--star-x),var(--star-y)) scale(.1);
}
}

@keyframes bell-ring {
0%,
100% {
	transform: rotate(0deg) scale(1);
}
20% {
	transform: rotate(-16deg) scale(1.08);
}
40% {
	transform: rotate(14deg) scale(1.12);
}
60% {
	transform: rotate(-10deg) scale(1.08);
}
80% {
	transform: rotate(7deg) scale(1.03);
}
}

@keyframes fellowship-heart {
0% {
	opacity: 0;
	transform: translate(-50%,-50%) scale(.35) rotate(0deg);
}
16% {
	opacity: 1;
}
100% {
	opacity: 0;
	transform: translate(calc(-50% + var(--heart-x)),calc(-50% + var(--heart-y))) scale(1.18) rotate(var(--heart-r));
}
}

@keyframes fellowship-spin {
to {
	transform: rotate(360deg);
}
}

@keyframes our-app-tier-breathe {
0%,
100% {
	filter: brightness(1);
	opacity: 0.92;
}
50% {
	filter: brightness(1.08);
	opacity: 1;
}
}
