:root{--ink:#14161a;--grau:#6b7688;--linie:#e2e6eb;--rot:#b81725;--gruen:#0e7d45;}
*{box-sizing:border-box;}
body{margin:0;background:#fff;color:var(--ink);font:15px/1.55 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
     -webkit-font-smoothing:antialiased;min-height:100vh;}

/*==============================================================================
| DER RAHMEN – WORTGLEICH ZU local.php.
|
| Fern- und Selbst-Einrichtung sind dieselbe Software; sie muessen auch gleich
| aussehen. Hier stand vorher eine eigene, karge Karte (grauer Hintergrund,
| gruene Punkte) – Bild und Animation fehlten. Uebernommen aus local.php:
| Bild-Spalte mit langsamem Ken-Burns, Schritt-Punkte mit Sonar-Ring und
| Ziffern-Walze, grosser Zaehler, und der Lade-Schleier mit der Flamme, der so
| lange steht, bis das Hintergrundbild WIRKLICH geladen ist.
| Wer hier etwas aendert, aendert es in local.php mit.
|=============================================================================*/
.nfi-split{display:flex;min-height:100vh;min-height:100dvh;}

/* ---- LINKS: Bild-Spalte mit Logo + Schritten ---- */
.nfi-side{position:relative;flex:0 0 42%;max-width:540px;min-width:0;min-height:100vh;min-height:100dvh;
  display:flex;flex-direction:column;padding:46px 42px;color:#fff;overflow:hidden;background:#cdd6df;}
.nfi-side-img{position:absolute;inset:0;z-index:0;transform-origin:center;
  background:#cdd6df url("https://www.neofire.de/media/background.webp") center/cover no-repeat;
  transform:scale(1.09);transition:transform 9s ease-in-out;will-change:transform;}
@media (prefers-reduced-motion:reduce){.nfi-side-img{transition:none;transform:scale(1.05);}}
.nfi-side::after{content:"";position:absolute;inset:0;z-index:1;
  background:linear-gradient(180deg,rgba(10,12,15,.28) 0%,rgba(10,12,15,.66) 100%);}
.nfi-side-inner{position:relative;z-index:2;display:flex;flex-direction:column;height:100%;}

.nfi-top{display:flex;align-items:center;gap:11px;margin:0 0 46px;color:#fff;}
.nfi-top .logo{width:38px;height:38px;flex:0 0 38px;display:grid;place-items:center;color:#fff;}
.nfi-top .logo svg{width:100%;height:100%;object-fit:contain;}
.nfi-brandwrap{display:flex;flex-direction:row;align-items:baseline;line-height:1;gap:9px;}
.nfi-top .brand{font-size:36px;font-weight:800;letter-spacing:-.02em;line-height:1;color:#fff;}
.nfi-top .sub{color:rgba(255,255,255,.82);font-weight:600;font-size:19px;line-height:1;letter-spacing:.01em;}

.nfi-steps{margin-top:10px;}
.nfi-steps ol{list-style:none;margin:0;padding:0;}
.nfi-steps li{position:relative;display:flex;align-items:center;gap:17px;padding:13px 0;font-weight:600;font-size:18px;line-height:1.25;letter-spacing:-.01em;color:rgba(255,255,255,.6);
  animation:nfiFade .5s ease both;animation-delay:calc(var(--i,0)*.13s);}
.nfi-steps li .n{position:relative;width:44px;height:44px;flex:0 0 44px;border-radius:50%;display:grid;place-items:center;font-size:17px;font-weight:800;letter-spacing:-.01em;
  background:rgba(255,255,255,.12);color:rgba(255,255,255,.72);border:1px solid rgba(255,255,255,.26);
  animation:nfiPop .55s cubic-bezier(.34,1.56,.64,1) both;animation-delay:calc(var(--i,0)*.13s);}
.nfi-steps li.lit .n::after{content:"";position:absolute;inset:-1px;border-radius:50%;opacity:0;
  animation:nfiPulse .62s ease-out both;animation-delay:calc(var(--i,0)*.13s);}
.nfi-steps li:not(:last-child)::after{content:"";position:absolute;left:22px;top:56px;height:22px;width:2px;transform:translateX(-1px);background:rgba(255,255,255,.20);}
.nfi-steps li.done{color:rgba(255,255,255,.90);}
.nfi-steps li.done .n{background:#fff;color:#14161a;border-color:#fff;}
.nfi-steps li.done::after{background:rgba(255,255,255,.40);}
.nfi-steps li.active{color:#fff;font-weight:700;}
.nfi-steps li.active .n{color:#fff;background:#1a1a1a;border:2px solid rgba(255,255,255,.9);
  box-shadow:0 12px 26px rgba(0,0,0,.55), 0 3px 6px rgba(0,0,0,.45), inset 0 -4px 8px rgba(0,0,0,.45);}
.nfi-steps li.active .n::before,
.nfi-steps li.active .n::after{content:"";position:absolute;inset:-2px;border-radius:50%;pointer-events:none;
  border:2px solid rgba(255,255,255,.6);opacity:0;animation:nfiSonar 2.4s ease-out infinite;}
.nfi-steps li.active .n::after{animation-delay:1.2s;}

@keyframes nfiPop{0%{transform:scale(.5);opacity:0;}60%{transform:scale(1.12);}100%{transform:scale(1);opacity:1;}}
@keyframes nfiFade{0%{opacity:0;transform:translateX(-6px);}100%{opacity:1;transform:none;}}
@keyframes nfiPulse{0%{opacity:0;box-shadow:0 0 0 0 rgba(255,255,255,.5);}40%{opacity:1;box-shadow:0 0 0 8px rgba(255,255,255,.14);}100%{opacity:0;box-shadow:0 0 0 15px rgba(255,255,255,0);}}
@keyframes nfiSonar{0%{transform:scale(1);opacity:.75;}70%{opacity:.12;}100%{transform:scale(2.5);opacity:0;}}

/* Der grosse Zaehler steht RECHTS in der Bild-Spalte (local.php hat ihn links).
   `justify-content` – nicht `text-align`: die Zeile ist ein Flex-Kasten aus zwei
   Teilen (Zahl + „/ 6"), text-align greift dort nicht. */
/* Der Zaehler sitzt unten RECHTS und schliesst auf DERSELBEN Linie ab, auf der
   links die Versionszeile endet. Dafuer aus dem Spaltenfluss geloest
   (.nfi-side-inner ist position:relative) - sonst stuende er darueber.
   Die -7px gleichen das enge `line-height:.84` der grossen Ziffer aus: ihr
   Zeilenkasten endet 7px ueber dem der Versionszeile. Nur im Desktop-Aufbau. */
.nfi-count{position:absolute;right:0;bottom:-7px;margin:0;padding:0;display:flex;align-items:baseline;justify-content:flex-end;gap:10px;color:#fff;}
/* Die -6px gleichen das enge `line-height:.84` der grossen Ziffer aus: ihr
   Zeilenkasten ist kuerzer als die Schrift, sonst saesse die Ziffer 6px
   ueber der Grundlinie der Versionszeile. Gilt nur im Desktop-Aufbau -
   auf schmalen Schirmen steht der Zaehler wieder im normalen Fluss. */
.nfi-count .cur{font-size:88px;font-weight:800;line-height:.84;letter-spacing:-.04em;
  animation:nfiRise .55s cubic-bezier(.34,1.56,.64,1) both;animation-delay:calc(var(--last,0)*.13s + .22s);}
.nfi-count .tot{font-size:28px;font-weight:700;color:rgba(255,255,255,.5);letter-spacing:-.02em;}
/* Version unten links, unter dem Zaehler – leise, nicht als Auszeichnung. */
/* Rolle der Seite ("Setup" bzw. "Administration") - weiss ueber der Version.
   Sie traegt jetzt das margin-top:auto und schiebt den Block nach unten. */
.nfi-rolle{margin-top:auto;font-size:16px;font-weight:700;line-height:1.25;color:#fff;}
.nfi-ver{margin-top:2px;font-size:12.5px;font-weight:600;letter-spacing:.02em;
  color:rgba(255,255,255,.45);}
@keyframes nfiRise{0%{opacity:0;transform:translateY(16px) scale(.86);}100%{opacity:1;transform:none;}}

/* Ziffern-Walze in der aktiven Kugel – der Kreis selbst ist die runde Maske. */
.nfi-nreel{position:absolute;inset:0;border-radius:50%;overflow:hidden;}
.nfi-nstrip{position:absolute;left:0;top:0;width:100%;will-change:transform;}
.nfi-ndigit{display:flex;align-items:center;justify-content:center;width:100%;}

@media (prefers-reduced-motion:reduce){
  .nfi-steps li,.nfi-steps li .n,.nfi-steps li.lit .n::after,
  .nfi-steps li.active .n::before,.nfi-steps li.active .n::after,.nfi-count .cur{animation:none;}
}

/* ---- RECHTS: weisse Inhalts-Spalte ---- */
.nfi-main{flex:1 1 auto;min-width:0;background:#fff;display:flex;flex-direction:column;justify-content:center;
  padding:52px 6vw;position:relative;}
/* `transition` fuer den Inhalts-Tausch: waehrend geholt wird, taucht der Kasten
   kurz ab (opacity im Skript) – das ersetzt den Lade-Schleier zwischen den
   Schritten, ohne dass etwas springt. */
.nfi-main-inner{width:100%;max-width:560px;margin:0 auto;transition:opacity .18s ease;}

/* ---- Lade-Schleier ----
   VOM ERSTEN BILD AN DECKEND. Hier lag `animation:nfiLoadIn .5s ease both` – der
   Schleier BLENDETE EIN, von durchsichtig auf weiss. Eine halbe Sekunde lang sah
   man also erst die fertige Seite und dann den Ladevorgang darueber. Genau
   verkehrt herum: erst weiss, dann die Seite.
   Das Ausblenden bleibt (die `transition` und `.hide`) – am Ende soll es weich
   sein, am Anfang sofort. */
.nfi-loader{position:fixed;inset:0;z-index:100000;display:grid;place-items:center;
  background:#fff;opacity:1;transition:opacity .48s ease;}
.nfi-loader.hide{opacity:0;}
.nfi-loadwrap{position:relative;display:flex;flex-direction:column;align-items:center;gap:18px;}
.nfi-load{position:relative;display:grid;place-items:center;line-height:0;}
.nfi-load .nfi-flame{position:relative;color:#111;line-height:0;display:grid;place-items:center;
  animation:nfiFlameIn .64s cubic-bezier(.2,.85,.25,1) both, nfiFlamePulse 2s ease-in-out .64s infinite;}
.nfi-load .nfi-flame svg{width:auto;height:66px;display:block;filter:drop-shadow(0 3px 10px rgba(17,17,17,.18));}
@keyframes nfiFlameIn{
  0%{transform:scale(.28) translateY(16px);opacity:0;}
  70%{transform:scale(1.08) translateY(0);opacity:1;}
  100%{transform:scale(1) translateY(0);opacity:1;}
}
@keyframes nfiFlamePulse{0%,100%{transform:scale(1);opacity:.94;}50%{transform:scale(1.06);opacity:1;}}
.nfi-loadbrand{display:flex;flex-direction:column;align-items:center;gap:3px;margin-top:-8px;
  animation:nfiBrandIn .5s ease .1s both;}
.nfi-lb-name{font-size:27px;font-weight:800;letter-spacing:-.015em;color:#111;line-height:1;}
@keyframes nfiBrandIn{from{opacity:0;transform:translateY(8px);}to{opacity:1;transform:translateY(0);}}
/* KEIN Fortschrittsbalken unter dem Schriftzug (local.php hat einen). Nur Flamme
   und Name – und die stehen kurz, siehe MIN_MS im Skript. */
@media (prefers-reduced-motion:reduce){
  .nfi-loader{animation:none;}
  .nfi-load .nfi-flame{animation:none;}
  .nfi-load .nfi-flame svg{filter:none;}
  .nfi-loadbrand{animation:none;}
}
/* Solange der Schleier liegt, die Einblend-Animationen PAUSIEREN – sonst laufen
   sie unsichtbar dahinter ab und man sieht sie nie. */
body.nfi-boot .nfi-steps li,
body.nfi-boot .nfi-steps li .n,
body.nfi-boot .nfi-steps li.lit .n::after,
body.nfi-boot .nfi-steps li.active .n::before,
body.nfi-boot .nfi-steps li.active .n::after,
body.nfi-boot .nfi-count .cur{animation-play-state:paused !important;}

h1{font-size:30px;margin:0 0 6px;}
.lead{color:var(--grau);margin:0 0 26px;}
/* KEIN `text-transform:uppercase`. „URL DES SHOPS" schrie die Zwischen-
   ueberschrift den Nutzer an und machte aus URL nichts Besseres. Ohne
   Grossbuchstaben braucht es auch die Laufweite nicht mehr; dafuer darf die
   Schrift etwas kraeftiger und dunkler sein, sonst verschwindet die Zeile. */
h2.unter{font-size:15px;margin:26px 0 10px;padding-top:16px;border-top:1px solid var(--linie);
         color:var(--ink);font-weight:700;}
label.f{display:block;font-size:13.5px;color:var(--grau);margin:12px 0 5px;}
input[type=text],input[type=password],input[type=email],input[type=number]{
  width:100%;padding:12px 13px;border:1px solid var(--linie);border-radius:9px;font-size:15px;color:var(--ink);background:#fff;}
input:focus{outline:none;border-color:#9aa4b2;}
.reihe{display:flex;gap:14px;}
.reihe>div{flex:1;}
.schmal{max-width:150px;}
/* DER SCHWARZE KNOPF STEHT IMMER RECHTS – auch auf Schritt 1, wo er allein ist.
   Deshalb `flex-end` an der Zeile und `margin-right:auto` am Zurueck-Zeichen:
   das schiebt sich selbst nach links und laesst den Rest rechts stehen. Mit
   `space-between` waere der Knopf auf Schritt 1 (ohne Zurueck) nach links
   gerutscht. */
.tat{display:flex;gap:12px;align-items:center;margin-top:28px;justify-content:flex-end;}
/* „Zurueck" ist ein ZEICHEN, kein Knopf: kein Rahmen, keine Flaeche. Es bleibt
   trotzdem 34 px gross, damit man es mit dem Finger trifft. */
.zurueck{display:inline-flex;align-items:center;justify-content:center;
  width:34px;height:34px;margin-right:auto;
  border:0;background:none;padding:0;
  color:var(--grau);font-size:21px;line-height:1;text-decoration:none;cursor:pointer;
  transition:color .15s ease;}
.zurueck:hover,.zurueck:focus-visible{color:var(--ink);}
.knopf{display:inline-block;border:none;border-radius:10px;padding:14px 22px;background:#1a1a1a;color:#fff;
       font-size:15px;font-weight:700;cursor:pointer;text-decoration:none;}
.knopf:hover{background:#333;}
.knopf.geist{background:#fff;color:var(--ink);border:1px solid #d7dbe0;font-weight:600;}
.knopf.geist:hover{background:#f4f6f8;}
.meld{border-radius:10px;padding:12px 14px;margin:0 0 18px;font-size:14.5px;}
/* Unten stehende Meldung: Abstand nach OBEN statt nach unten. */
.meld-unten{margin:22px 0 0;}
.meld.schlecht{background:#fdecee;color:#8c1220;border:1px solid #f5c3c9;}
.meld.gut{background:#e9f7ef;color:#0e5c34;border:1px solid #bde5cd;}
.tipp{font-size:13px;color:var(--grau);margin-top:6px;}
.haken{display:flex;gap:10px;align-items:flex-start;margin:18px 0 0;font-size:14px;color:#3f4a59;cursor:pointer;}
.haken input{margin-top:3px;width:16px;height:16px;flex:0 0 auto;}
.haken a{color:#1d4ed8;}
/* ---- Prueflisten-Punkte (Schritt 6) – aus local.php uebernommen ---- */
.nfi-checks{margin:6px 0 22px;}
.nfi-citem{display:flex;align-items:center;gap:14px;padding:13px 2px;font-size:16px;font-weight:600;color:#9aa3b1;
  border-bottom:1px solid var(--linie);opacity:0;transform:translateY(10px);
  transition:opacity .32s cubic-bezier(.2,.7,.3,1),transform .32s cubic-bezier(.2,.7,.3,1),color .3s ease;}
.nfi-checks .nfi-citem:last-child{border-bottom:none;}
.nfi-citem.reveal{opacity:1;transform:none;}
.nfi-citem.is-ok{color:var(--ink);}
.nfi-citem.is-bad{color:#c0261f;}
.nfi-clabel{flex:1 1 auto;}
.nfi-cstatus{flex:0 0 auto;font-size:13px;font-weight:700;color:#b3bac6;opacity:0;transition:opacity .3s ease .12s;}
.nfi-citem.is-ok .nfi-cstatus{color:#1ebe5d;opacity:1;}
.nfi-citem.is-bad .nfi-cstatus{color:#c0261f;opacity:1;}
.nfi-cdot{position:relative;flex:0 0 28px;width:28px;height:28px;border-radius:50%;display:grid;place-items:center;
  background:#eef0f3;transition:background .3s ease,transform .3s cubic-bezier(.34,1.56,.64,1);}
.nfi-citem.is-ok .nfi-cdot{background:#25D366;box-shadow:0 6px 14px rgba(37,211,102,.38);animation:nfiDotPop .45s cubic-bezier(.34,1.56,.64,1) both;}
.nfi-citem.is-bad .nfi-cdot{background:#c0261f;box-shadow:0 6px 14px rgba(192,38,31,.32);animation:nfiDotPop .45s cubic-bezier(.34,1.56,.64,1) both;}
@keyframes nfiDotPop{0%{transform:scale(.2);}55%{transform:scale(1.18);}100%{transform:scale(1);}}
.nfi-cspin{width:15px;height:15px;border:2px solid #cfd4dc;border-top-color:#98a1af;border-radius:50%;animation:nfiSpin .7s linear infinite;}
.nfi-citem.is-ok .nfi-cspin,.nfi-citem.is-bad .nfi-cspin{display:none;}
@keyframes nfiSpin{to{transform:rotate(360deg);}}
.nfi-cok{position:absolute;width:19px;height:19px;opacity:0;}
.nfi-cok path{stroke-dasharray:26;stroke-dashoffset:26;}
.nfi-citem.is-ok .nfi-cok{opacity:1;}
.nfi-citem.is-ok .nfi-cok path{animation:nfiDraw .42s cubic-bezier(.65,0,.35,1) forwards .12s;}
@keyframes nfiDraw{to{stroke-dashoffset:0;}}
/* Das × sass zu tief: als absolut gesetztes INLINE-Element stand es an seiner
   statischen Position, und deren Zeilenkasten bringt den Unterlaengen-Raum mit –
   das Zeichen rutscht dadurch nach unten. Mit `inset:0` fuellt es den Kreis und
   wird als Kasten zentriert, nicht auf einer Grundlinie abgesetzt. */
/* `padding-bottom` und nicht `transform:translateY`: der Punkt animiert beim
   Erscheinen ueber `transform` (nfiCPop) – eine Verschiebung dort wuerde von der
   Animation ueberschrieben. Das Polster verkleinert stattdessen den Kasten unten,
   die mittig gesetzte Glyphe rueckt dadurch nach oben. */
.nfi-cbad{position:absolute;inset:0;display:grid;place-items:center;padding-bottom:4px;
  color:#fff;font-weight:800;font-size:16px;line-height:1;opacity:0;transform:scale(.4);}
.nfi-citem.is-bad .nfi-cbad{opacity:1;transform:scale(1);animation:nfiCPop .4s cubic-bezier(.34,1.56,.64,1) both .1s;}
@keyframes nfiCPop{0%{transform:scale(.4);}60%{transform:scale(1.12);}100%{transform:scale(1);}}
.nfi-citem.has-drop{display:block;}
.nfi-chead{display:flex;align-items:center;gap:14px;cursor:pointer;outline:none;}
.nfi-cchev{flex:0 0 auto;margin-left:auto;color:#b3bac6;display:grid;place-items:center;border-radius:8px;padding:3px;
  transition:transform .3s cubic-bezier(.4,0,.2,1),color .2s ease,background .2s ease;}
.nfi-chead:hover .nfi-cchev{color:#5b6472;background:#f1f3f6;}
.nfi-citem.open .nfi-cchev{transform:rotate(180deg);color:#5b6472;}
.nfi-cdetails{overflow:hidden;max-height:0;opacity:0;padding-left:42px;
  transition:max-height .34s cubic-bezier(.3,.7,.3,1),opacity .25s ease,margin .25s ease;}
.nfi-citem.open .nfi-cdetails{max-height:280px;opacity:1;margin:8px 0 2px;}
.nfi-cdrow{display:flex;justify-content:space-between;gap:16px;padding:7px 0;font-size:13.5px;font-weight:600;
  color:#8a929e;border-top:1px solid #f0f2f5;}
.nfi-cdrow:first-child{border-top:none;}
.nfi-cdrow b{color:#1a2233;font-weight:700;text-align:right;word-break:break-word;}
/* Der Installieren-Knopf wartet auf die Haken-Kette. */
.knopf.nfi-los{opacity:0;pointer-events:none;transition:opacity .3s ease;}
.knopf.nfi-los.nfi-frei{opacity:1;pointer-events:auto;}
@media (prefers-reduced-motion:reduce){
  .nfi-citem{opacity:1;transform:none;transition:none;}
  .nfi-cdot,.nfi-cbad{animation:none;}
  .nfi-cok{opacity:1;} .nfi-cok path{stroke-dashoffset:0;animation:none;}
  .nfi-cstatus{opacity:1;}
  .knopf.nfi-los{opacity:1;pointer-events:auto;}
}
/* ---- Der Lauf: Balken statt Protokollkasten ----
   Vorher stand hier ein schwarzes Feld, in das Zeile fuer Zeile Rohtechnik
   lief. Es blieb nicht nur leer (Puffer), es war auch das Falsche: waehrend
   einer Einrichtung will man wissen, WIE WEIT es ist – nicht mitlesen. */
.nfr-lauf{margin:26px 0 0;}
.nfr-bar{position:relative;height:8px;border-radius:99px;background:#e8ebef;overflow:hidden;}
.nfr-bar-fill{position:absolute;left:0;top:0;bottom:0;width:0;border-radius:99px;background:#1a1a1a;
  transition:width .45s cubic-bezier(.3,.7,.3,1);}
.nfr-zeile{display:flex;align-items:baseline;justify-content:space-between;gap:16px;margin-top:12px;
  font-size:14.5px;font-weight:600;color:var(--ink);}
.nfr-zeile #nfr-proz{font-size:13px;font-weight:700;color:var(--grau);font-variant-numeric:tabular-nums;}
.nfr-zeile .ok{color:#0e7d45;}
.nfr-zeile .bad{color:var(--rot);}
.nfr-verlauf{margin-top:16px;max-height:190px;overflow:auto;font-size:13px;line-height:1.7;color:var(--grau);}
.nfr-vz{padding:1px 0;}
.nfr-vz.ok{color:#0e7d45;font-weight:700;}
.nfr-vz.bad{color:var(--rot);font-weight:700;}
.fertig{display:flex;gap:12px;margin-top:22px;}
.fertig .knopf{flex:1 1 0;text-align:center;}
@media(max-width:900px){
  .nfi-split{flex-direction:column;}
  .nfi-side{flex:none;max-width:none;min-height:auto;padding:30px 24px 26px;}
  .nfi-side-inner{height:auto;}
  .nfi-top{margin-bottom:24px;}
  .nfi-steps li{padding:9px 0;font-size:16px;}
  .nfi-steps li .n{width:38px;height:38px;flex:0 0 38px;font-size:15px;}
  .nfi-steps li:not(:last-child)::after{left:19px;top:47px;height:14px;}
  /* Auf schmalen Schirmen wieder im normalen Fluss (dort height:auto). */
  .nfi-count{position:static;margin-top:20px;padding-top:16px;}
  .nfi-ver{margin-top:10px;}
  .nfi-count .cur{font-size:54px;}
  .nfi-main{padding:34px 24px 40px;justify-content:flex-start;}
}
