/* Full-screen arrival scenes for the public site, chosen under Site settings → Preloader.
   Characters are always the owner's mascot images. Every scene ends on its own, even if the page's
   script stops, and day and night share one set of tokens. */
@property --pl-hole {syntax:'<percentage>';inherits:false;initial-value:-4%}

.nova-preloader {
  --pl-u:1;
  --pl-sky-1:#f6f9ff;
  --pl-sky-2:#dbe6ff;
  --pl-sky-3:#b9ccff;
  --pl-ink:var(--nova-ink,#142442);
  --pl-accent:var(--nova-signal,#3459e6);
  --pl-star:#3459e6;
  --pl-glow:#3459e666;
  --pl-smoke:#d5dff2;
  --pl-planet-a:#7ea2ff;
  --pl-planet-b:#3459e6;
  --pl-panel:#ffffff;
  --pl-panel-line:#dce3ef;
  position:fixed;
  inset:0;
  z-index:2147483000;
  overflow:hidden;
  color:var(--pl-ink);
  animation:pl-done 0s linear calc(var(--pl-u) * var(--pl-total,2.8s)) forwards;
}
[data-nova-theme=dark] .nova-preloader {
  --pl-sky-1:#070f1d;
  --pl-sky-2:#0d1a30;
  --pl-sky-3:#1a3160;
  --pl-star:#ffffff;
  --pl-glow:#9eb6ff73;
  --pl-smoke:#8a9ab8;
  --pl-planet-a:#5c7fe8;
  --pl-planet-b:#1c2f66;
  --pl-panel:#101e32;
  --pl-panel-line:#2c405a;
}
.nova-preloader[data-speed=fast] {--pl-u:.72}
.nova-preloader[data-speed=calm] {--pl-u:1.35}
.nova-preloader.is-skip {opacity:0;transition:opacity .18s ease}
/* The clock starts once the mascot is ready to be seen. */
.nova-preloader:not([data-ready]),.nova-preloader:not([data-ready]) * {animation-play-state:paused!important}
.nova .nova-preloader img {display:block;max-width:none;width:100%;height:auto}
.nova-preloader .nova-brand-images {display:block}
.nova .nova-preloader .nova-brand-images .nova-brand-logo {width:clamp(170px,24vw,280px);max-width:none;height:auto}
.nova-preloader .nova-brand-mark {font-size:clamp(56px,9vw,96px);color:var(--pl-accent)}

.pl-space {position:absolute;inset:0;background:radial-gradient(circle at 50% 50%,var(--pl-sky-3),var(--pl-sky-2) 38%,var(--pl-sky-1) 78%)}
.pl-stars i {position:absolute;left:calc(var(--x) * 1%);top:calc(var(--y) * 1%);width:calc(var(--s) * 1px);height:calc(var(--s) * 1px);border-radius:50%;background:var(--pl-star);opacity:.2;animation:pl-twinkle 1.3s ease-in-out calc(var(--d) * -1s) infinite alternate}
@keyframes pl-twinkle {to {opacity:.85}}
@keyframes pl-done {to {visibility:hidden}}
@keyframes pl-fade {to {opacity:0}}
.pl-opens {-webkit-mask:radial-gradient(circle at 50% 50%,transparent var(--pl-hole),#000 calc(var(--pl-hole) + 3%));mask:radial-gradient(circle at 50% 50%,transparent var(--pl-hole),#000 calc(var(--pl-hole) + 3%));animation:pl-hole calc(var(--pl-u) * .85s) cubic-bezier(.7,0,.3,1) calc(var(--pl-u) * 2.1s) forwards}
@keyframes pl-hole {
  85% {opacity:1}
  to {--pl-hole:110%;opacity:0}
}

/* 1. The mascot badge arrives, a seam of light appears, and the site opens down the middle. */
.nova-preloader[data-style=logo_split] {--pl-total:3s}
.pl-door {position:absolute;top:0;bottom:0;width:50.2%;overflow:hidden;background:radial-gradient(120% 130% at var(--pl-cx) 50%,var(--pl-sky-2),var(--pl-sky-1) 64%);animation:pl-door calc(var(--pl-u) * .85s) cubic-bezier(.76,0,.24,1) calc(var(--pl-u) * 2.05s) forwards}
.pl-left {left:0;--pl-cx:100%;--pl-to:-101%}
.pl-right {right:0;--pl-cx:0%;--pl-to:101%}
@keyframes pl-door {to {transform:translateX(var(--pl-to))}}
.pl-center {position:absolute;top:0;bottom:0;width:199.3%;display:grid;place-items:center}
.pl-left .pl-center {left:0}
.pl-right .pl-center {right:0}
.pl-center>* {grid-area:1/1}
.pl-logo {width:clamp(190px,34vmin,330px);animation:pl-logo calc(var(--pl-u) * 1.3s) cubic-bezier(.16,1,.3,1) calc(var(--pl-u) * .15s) both}
@keyframes pl-logo {
  0% {opacity:0;transform:scale(.62) rotate(-8deg);filter:blur(16px)}
  55% {opacity:1;filter:blur(0)}
  100% {opacity:1;transform:none;filter:drop-shadow(0 18px 42px var(--pl-glow))}
}
.pl-ring {width:clamp(340px,74vmin,720px);overflow:visible;pointer-events:none}
.pl-ring ellipse {stroke:var(--pl-accent);stroke-width:1;stroke-dasharray:100;stroke-dashoffset:100;opacity:.8;animation:pl-ring calc(var(--pl-u) * 1.5s) cubic-bezier(.65,0,.35,1) calc(var(--pl-u) * .3s) forwards}
@keyframes pl-ring {to {stroke-dashoffset:0}}
.pl-seam {position:absolute;left:50%;top:0;bottom:0;width:2px;margin-left:-1px;background:linear-gradient(transparent,var(--pl-accent) 18%,var(--pl-accent) 82%,transparent);box-shadow:0 0 26px 5px var(--pl-glow);transform:scaleY(0);animation:pl-seam calc(var(--pl-u) * 1.05s) ease-in-out calc(var(--pl-u) * 1.55s) forwards}
@keyframes pl-seam {
  0% {transform:scaleY(0);opacity:1}
  48% {transform:scaleY(1);opacity:1}
  100% {transform:scaleY(1);opacity:0}
}

/* 2. Flying through space with the mascot until the site opens at the centre. */
.nova-preloader[data-style=warp] {--pl-total:3s}
.pl-warp i {position:absolute;left:50%;top:50%;width:calc(var(--l) * 1vmin);height:2px;border-radius:2px;transform-origin:0 50%;background:linear-gradient(90deg,transparent,var(--pl-star));opacity:0;animation:pl-streak calc(var(--pl-u) * .62s) cubic-bezier(.55,0,1,.45) calc(var(--pl-u) * (var(--d) * 1s + .35s)) 3 both}
@keyframes pl-streak {
  0% {opacity:0;transform:rotate(var(--a)) translateX(2vmin) scaleX(.05)}
  14% {opacity:.95}
  100% {opacity:.9;transform:rotate(var(--a)) translateX(80vmax) scaleX(1.7)}
}
.pl-flyer {position:absolute;left:50%;top:50%;width:clamp(200px,44vmin,420px);margin:calc(clamp(200px,44vmin,420px) / -2);opacity:0;filter:drop-shadow(0 18px 40px var(--pl-glow));animation:pl-flyer calc(var(--pl-u) * 1.95s) cubic-bezier(.45,0,.9,.55) calc(var(--pl-u) * .1s) forwards}
@keyframes pl-flyer {
  0% {opacity:0;transform:translate(6vw,-6vh) scale(.08) rotate(16deg)}
  18% {opacity:1}
  72% {opacity:1;transform:translate(-8vw,5vh) scale(1) rotate(-6deg)}
  100% {opacity:1;transform:translate(-70vw,46vh) scale(3.2) rotate(-18deg)}
}
.pl-core {position:absolute;left:50%;top:50%;width:12vmin;height:12vmin;margin:-6vmin;border-radius:50%;background:radial-gradient(circle,#fff,var(--pl-accent) 34%,transparent 70%);transform:scale(.3);opacity:.7;animation:pl-core calc(var(--pl-u) * 2.3s) cubic-bezier(.7,0,.5,1) forwards}
@keyframes pl-core {
  70% {opacity:.9;transform:scale(1.3)}
  100% {opacity:1;transform:scale(16)}
}

/* 3. The mascot drifts in weightless and the view dives through its visor. */
.nova-preloader[data-style=astronaut] {--pl-total:3s}
.pl-dissolves {animation:pl-fade calc(var(--pl-u) * .5s) ease calc(var(--pl-u) * 2.45s) forwards}
.pl-astro-move {position:absolute;left:50%;top:50%;width:clamp(240px,52vmin,460px);translate:-50% -50%;transform-origin:57.6% 33.6%;animation:pl-astro-in calc(var(--pl-u) * 1.25s) cubic-bezier(.16,1,.3,1) both,pl-astro-dive calc(var(--pl-u) * .9s) cubic-bezier(.6,0,.8,.4) calc(var(--pl-u) * 1.95s) forwards}
@keyframes pl-astro-in {
  from {opacity:0;transform:translate(-36vw,28vh) rotate(-30deg) scale(.6)}
  to {opacity:1;transform:none}
}
@keyframes pl-astro-dive {to {translate:-57.6% -33.6%;transform:scale(20)}}
.pl-float {filter:drop-shadow(0 18px 42px var(--pl-glow));animation:pl-float calc(var(--pl-u) * 1.4s) ease-in-out calc(var(--pl-u) * .7s) infinite alternate}
@keyframes pl-float {to {transform:translateY(-14px) rotate(4deg)}}

/* 4. The mascot takes off on a jet of light and the sky lifts away behind it. */
.nova-preloader[data-style=rocket] {--pl-total:2.9s}
.pl-lifts {animation:pl-lift calc(var(--pl-u) * .85s) cubic-bezier(.7,0,.25,1) calc(var(--pl-u) * 1.95s) forwards}
@keyframes pl-lift {to {transform:translateY(-104%);border-radius:0 0 50% 50%/0 0 14% 14%}}
.pl-upper-logo {position:absolute;left:50%;top:13%;transform:translateX(-50%);animation:pl-rise calc(var(--pl-u) * .7s) ease calc(var(--pl-u) * .1s) both}
@keyframes pl-rise {from {opacity:0;margin-top:12px}}
.pl-launch-move {position:absolute;left:50%;bottom:2vh;width:clamp(210px,44vmin,400px);translate:-50% 0;filter:drop-shadow(0 16px 36px var(--pl-glow));animation:pl-shake .09s linear 11 alternate,pl-launch calc(var(--pl-u) * 1.2s) cubic-bezier(.65,0,.9,.5) calc(var(--pl-u) * 1s) forwards}
@keyframes pl-shake {from {margin-left:-1.5px} to {margin-left:1.5px}}
@keyframes pl-launch {to {transform:translateY(-135vh) rotate(5deg)}}
.pl-launch-move img {position:relative}
.pl-jet {position:absolute;left:18%;top:72%;width:30%;height:58%;border-radius:50% 50% 45% 45%;background:linear-gradient(#fff3c4,#ffd166 18%,#ff7a45 52%,transparent);filter:blur(7px);transform-origin:50% 0;transform:rotate(14deg) scaleY(.55);opacity:.92;animation:pl-jet .12s ease-in-out infinite alternate}
@keyframes pl-jet {to {transform:rotate(14deg) scaleY(1)}}
.pl-smoke {position:absolute;left:50%;bottom:0;width:0;height:0}
.pl-smoke i {position:absolute;bottom:-7vmin;left:calc(var(--o) * 1vmin);width:26vmin;height:26vmin;margin-left:-13vmin;border-radius:50%;background:radial-gradient(circle,var(--pl-smoke) 18%,transparent 68%);opacity:0;animation:pl-smoke calc(var(--pl-u) * 1.5s) ease-out calc(var(--pl-u) * (.75s + var(--e) * .06s)) forwards}
@keyframes pl-smoke {
  15% {opacity:.85}
  100% {opacity:0;transform:scale(2.6) translateY(-6vmin)}
}

/* 5. The developer mascot boots the site from a terminal that collapses like an old screen. */
.nova-preloader[data-style=terminal] {--pl-total:3s}
.pl-crt {position:absolute;inset:0;display:grid;place-items:center;background:var(--pl-sky-1);padding:20px;animation:pl-crt calc(var(--pl-u) * .55s) cubic-bezier(.6,0,.4,1) calc(var(--pl-u) * 2.4s) forwards}
@keyframes pl-crt {
  55% {transform:scaleY(.006);filter:brightness(2.4);opacity:1}
  100% {transform:scale(0,.006);filter:brightness(3);opacity:0}
}
.pl-crt-inner {display:flex;align-items:center;justify-content:center;gap:clamp(10px,3vw,36px);width:min(1020px,100%)}
.pl-dev {flex:none;width:clamp(210px,31vw,380px);filter:drop-shadow(0 18px 40px var(--pl-glow));animation:pl-dev calc(var(--pl-u) * .8s) cubic-bezier(.16,1,.3,1) both}
@keyframes pl-dev {from {opacity:0;transform:translateX(-40px) scale(.92)}}
.pl-window-frame {flex:1 1 auto;min-width:0;max-width:560px;border:1px solid var(--pl-panel-line);border-radius:14px;background:var(--pl-panel);box-shadow:0 26px 70px -30px var(--pl-glow);overflow:hidden}
.pl-window-frame header {display:flex;align-items:center;gap:7px;padding:12px 16px;border-bottom:1px solid var(--pl-panel-line)}
.pl-window-frame header i {width:10px;height:10px;border-radius:50%;background:var(--pl-panel-line)}
.pl-window-frame header i:first-child {background:var(--pl-accent)}
.pl-window-frame header span {margin-inline-start:8px;font:500 12px/1.4 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;opacity:.65}
.pl-window-frame pre {margin:0;padding:20px;font:500 clamp(12px,1.5vw,15px)/1.9 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;white-space:pre-wrap}
.pl-window-frame b {display:block;font-weight:500;clip-path:inset(0 100% 0 0);animation:pl-type calc(var(--pl-u) * .36s) steps(26) calc(var(--pl-u) * (.15s + var(--n) * .4s)) forwards}
.pl-window-frame b:first-child,.pl-window-frame b:last-child {color:var(--pl-accent)}
@keyframes pl-type {to {clip-path:inset(0)}}
.pl-window-frame u {display:inline-block;width:.6em;height:1.05em;margin-inline-start:4px;vertical-align:-.16em;background:var(--pl-accent);text-decoration:none;animation:pl-cursor .5s steps(2) infinite}
@keyframes pl-cursor {to {opacity:0}}
.pl-progress {height:3px;background:var(--pl-panel-line)}
.pl-progress i {display:block;height:100%;background:var(--pl-accent);box-shadow:0 0 14px var(--pl-glow);transform:scaleX(0);transform-origin:left;animation:pl-progress calc(var(--pl-u) * 1.9s) cubic-bezier(.3,.1,.3,1) calc(var(--pl-u) * .15s) forwards}
@keyframes pl-progress {to {transform:scaleX(1)}}
@media (max-width:720px) {
  .pl-crt-inner {flex-direction:column;gap:6px}
  .pl-dev {width:clamp(170px,46vw,240px)}
  .pl-window-frame {width:100%;flex:none}
}

/* 6. The server mascot powers up, status lights come on, and shutters slide away. */
.nova-preloader[data-style=server] {--pl-total:3.1s}
.pl-slats {position:absolute;inset:0;display:grid;grid-template-rows:repeat(8,1fr)}
.pl-slats i {margin-block:-1px;background:linear-gradient(90deg,var(--pl-sky-1),var(--pl-sky-2),var(--pl-sky-1));animation:pl-slat calc(var(--pl-u) * .6s) cubic-bezier(.76,0,.24,1) calc(var(--pl-u) * (2.1s + var(--i) * .045s)) forwards}
.pl-slats i:nth-child(even) {--pl-dir:-1}
@keyframes pl-slat {to {transform:translateX(calc(var(--pl-dir,1) * 102%))}}
.pl-rack-scene {position:absolute;inset:0;display:grid;place-content:center;justify-items:center;gap:14px;animation:pl-fade calc(var(--pl-u) * .3s) ease calc(var(--pl-u) * 1.95s) forwards}
.pl-server-art {width:clamp(240px,52vmin,450px);filter:drop-shadow(0 18px 42px var(--pl-glow));animation:pl-server calc(var(--pl-u) * .9s) cubic-bezier(.16,1,.3,1) both}
@keyframes pl-server {from {opacity:0;transform:translateY(26px) scale(.93)}}
.pl-status {display:flex;gap:9px}
.pl-status b {width:9px;height:9px;border-radius:50%;background:var(--pl-panel-line);animation:pl-led-on .2s ease calc(var(--pl-u) * (.45s + var(--i) * .2s)) forwards}
@keyframes pl-led-on {to {background:var(--pl-accent);box-shadow:0 0 12px var(--pl-glow)}}
.pl-rack-scene .pl-progress {width:clamp(180px,30vmin,280px);border-radius:3px;overflow:hidden}

/* 7. The planet from the site's own footer rises with the domains mascot, and the horizon opens. */
.nova-preloader[data-style=planet] {--pl-total:3s}
.pl-horizon {background:linear-gradient(var(--pl-sky-1),var(--pl-sky-2) 62%,var(--pl-sky-3));-webkit-mask:radial-gradient(ellipse 120% 90% at 50% 112%,transparent var(--pl-hole),#000 calc(var(--pl-hole) + 3%));mask:radial-gradient(ellipse 120% 90% at 50% 112%,transparent var(--pl-hole),#000 calc(var(--pl-hole) + 3%));animation:pl-hole-wide calc(var(--pl-u) * .9s) cubic-bezier(.7,0,.3,1) calc(var(--pl-u) * 2s) forwards}
@keyframes pl-hole-wide {
  85% {opacity:1}
  to {--pl-hole:150%;opacity:0}
}
.pl-globe {position:absolute;left:50%;top:100%;width:170vmax;height:170vmax;margin-left:-85vmax;border-radius:50%;background:radial-gradient(circle at 50% 0,var(--pl-planet-a),var(--pl-planet-b) 26%);box-shadow:0 0 90px 26px var(--pl-glow);animation:pl-globe calc(var(--pl-u) * 1.7s) cubic-bezier(.16,1,.3,1) calc(var(--pl-u) * .1s) forwards}
@keyframes pl-globe {to {transform:translateY(-20vh)}}
.pl-planet-art {position:absolute;left:50%;bottom:calc(20vh - 3vmin);width:clamp(220px,50vmin,430px);margin-left:calc(clamp(220px,50vmin,430px) / -2);filter:drop-shadow(0 14px 34px var(--pl-glow));animation:pl-planet-art calc(var(--pl-u) * 1.7s) cubic-bezier(.16,1,.3,1) calc(var(--pl-u) * .1s) both}
@keyframes pl-planet-art {from {transform:translateY(62vh)}}
.pl-horizon-logo {position:absolute;left:50%;top:9%;transform:translateX(-50%);animation:pl-rise calc(var(--pl-u) * .9s) ease calc(var(--pl-u) * .55s) both}

/* 8. The service mascots orbit the main badge, then the view opens. */
.nova-preloader[data-style=crew] {--pl-total:3s;--pl-r:clamp(130px,33vmin,300px);--pl-seat:clamp(84px,19vmin,170px)}
.pl-crew-path {position:absolute;left:50%;top:50%;width:calc(var(--pl-r) * 2);height:calc(var(--pl-r) * 2);margin:calc(var(--pl-r) * -1);overflow:visible}
.pl-crew-path circle {stroke:var(--pl-accent);stroke-width:.5;stroke-dasharray:1.5 3;opacity:.55}
.pl-crew-rotor {position:absolute;left:50%;top:50%;width:0;height:0;animation:pl-rotor calc(var(--pl-u) * 3s) cubic-bezier(.3,.1,.5,1) both}
@keyframes pl-rotor {to {transform:rotate(130deg)}}
.pl-seat {position:absolute;width:var(--pl-seat);height:var(--pl-seat);margin:calc(var(--pl-seat) / -2);transform:rotate(calc(var(--n) * 60deg)) translateX(var(--pl-r)) rotate(calc(var(--n) * -60deg))}
.pl-seat img {filter:drop-shadow(0 10px 22px var(--pl-glow));animation:pl-seat-in calc(var(--pl-u) * .6s) cubic-bezier(.34,1.56,.64,1) calc(var(--pl-u) * (.3s + var(--n) * .11s)) both,pl-unspin calc(var(--pl-u) * 3s) cubic-bezier(.3,.1,.5,1) both}
@keyframes pl-seat-in {from {opacity:0;scale:.3}}
@keyframes pl-unspin {to {rotate:-130deg}}
.pl-crew-lead {position:absolute;left:50%;top:50%;width:clamp(150px,30vmin,270px);translate:-50% -50%;filter:drop-shadow(0 16px 40px var(--pl-glow));animation:pl-logo calc(var(--pl-u) * 1.1s) cubic-bezier(.16,1,.3,1) both}

@media (prefers-reduced-motion:reduce) {.nova-preloader {display:none!important}}
