/* 7heaven.cloud — motion. Class names match tools/iso.py output (sl, sltop, pl, fp).
   Decision (2026-10-10, owner): animations always play, regardless of the OS
   "reduce motion" setting. Visitors stop them with the footer button, which sets
   <html data-motion="paused"> (remembered per browser). */

@keyframes bob     { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-7px); } }
@keyframes bobtop  { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-18px); } }
@keyframes breathe { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(calc(var(--i) * -5px)); } }
@keyframes fanin {
  0%      { opacity: 0; transform: translate(-14px, 8px); }
  12%, 85% { opacity: 1; transform: translate(0, 0); }
  100%    { opacity: 0; transform: translate(0, 0); }
}
@keyframes glow  { 0%, 100% { opacity: .7; transform: scale(1); } 50% { opacity: 1; transform: scale(1.08); } }
@keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(92, 184, 140, .6); } 100% { box-shadow: 0 0 0 10px rgba(92, 184, 140, 0); } }
@keyframes pulse-ember { 0% { box-shadow: 0 0 0 0 rgba(232, 116, 58, .6); } 100% { box-shadow: 0 0 0 10px rgba(232, 116, 58, 0); } }
@keyframes blink { 0%, 49% { opacity: 1; } 50%, 100% { opacity: 0; } }
@keyframes line {
  0%, 8%   { opacity: 0; transform: translateX(-6px); }
  14%, 92% { opacity: 1; transform: none; }
  100%     { opacity: 0; }
}
@keyframes rise { from { opacity: 0; transform: translateY(24px); } to { opacity: 1; transform: none; } }

/* 3D "7": plates bob in a wave, top plate floats higher */
.sl    { animation: bob 5s ease-in-out infinite; }
.sltop { animation: bobtop 5s ease-in-out infinite; }
/* Plate stack breathes; set --i per plate */
.pl    { animation: breathe 4.5s ease-in-out infinite; }
/* Backup / migration fan */
.fp    { animation: fanin 6s ease-out infinite both; }
/* Hero glow behind the 3D "7" (the only allowed glow) */
.glow  { animation: glow 6s ease-in-out infinite; }
/* Status dots */
.live  { animation: pulse 1.8s ease-out infinite; }
.live-ember { animation: pulse-ember 1.8s ease-out infinite; }
/* Terminal */
.cur   { animation: blink 1s step-end infinite; }
.ln    { display: block; animation: line 8s ease-out infinite both; }
/* Headline reveal */
.rise  { animation: rise .9s cubic-bezier(.2, .7, .2, 1) both; }
.rise--late { animation-delay: .15s; }

/* Paused by the visitor: looping and entrance animations stop, everything stays visible.
   Hover/press transitions remain — they only run on the visitor's own action. */
[data-motion="paused"] *,
[data-motion="paused"] *::before,
[data-motion="paused"] *::after { animation: none !important; }
