/* =========================================================
   Login-Seite
   Nur von index.php eingebunden (<link rel="stylesheet" href="css/login.css">
   im <head>, nach tokens.css). Stylt ausschließlich das Markup in index.php
   - .field/.btn-primary heißen hier fast genauso wie in configurator.css,
   sind aber zwei komplett getrennte Regelsätze für zwei verschiedene Seiten.
   Verhalten (Formular abschicken, Fehleranzeige) kommt aus js/login.js,
   nicht aus dieser Datei - hier geht es nur ums Aussehen.
   ========================================================= */

/* Äußerster Container in index.php: <div class="login-page">. Teilt den
   Bildschirm per CSS-Grid in zwei Spalten: Marken-Panel (links, 1.1fr) und
   Formular-Panel (rechts, 1fr). Wird unten im @media-Block für schmale
   Bildschirme auf eine gestapelte Spalte umgeschaltet. */
.login-page {
  min-height: 100vh;
  display: grid;
  grid-template-columns: 1.1fr 1fr;
}

/* ---------- Marken-Panel (links) ---------- */
/* <section class="brand-panel"> in index.php - der blaue Verlaufs-Hintergrund
   mit Logo, Ringen und Tagline. position:relative macht diesen Block zum
   Bezugsrahmen für die absolut positionierten Kind-Elemente
   (.signal-rings, .brand-content, .brand-logo, .brand-tagline) weiter unten
   - deren top/left:50% beziehen sich also auf DIESES Element, nicht auf die
   ganze Seite. --logo-radius/--tagline-gap sind lokale CSS-Variablen, die
   nur innerhalb von .brand-panel (und seinen Kindern) gelten und weiter
   unten im @media-Block für kleine Bildschirme überschrieben werden. */
.brand-panel {
  position: relative;
  overflow: hidden;
  background: radial-gradient(120% 120% at 20% 15%, var(--color-primary) 0%, var(--color-primary-dark) 55%, var(--color-primary-darker) 100%);
  padding: 3rem;
  --logo-radius: 84px;
  --tagline-gap: 1.75rem;
}

/* <div class="brand-content"> in index.php - reiner Positionierungs-Rahmen
   (füllt .brand-panel per inset:0 komplett aus), hat selbst kein sichtbares
   Aussehen. Enthält .brand-logo und .brand-tagline, die beide unabhängig
   voneinander absolut positioniert werden (siehe deren Kommentare). */
.brand-content {
  position: absolute;
  inset: 0;
  z-index: 2;
}

/* Logo und Tagline liegen unabhängig voneinander: das Logo sitzt exakt im
   Mittelpunkt der pulsierenden Ringe (.signal-rings), die Tagline hängt sich
   als fixer Abstand darunter - so verschiebt der Textblock nicht den
   Logo-Mittelpunkt, egal wie viele Zeilen die Tagline umbricht. */
/* <img class="brand-logo"> in index.php (assets/logo.png). top/left:50% +
   transform:translate(-50%,-50%) ist der Standard-CSS-Trick, um ein Element
   exakt mittig in seinem positionierten Vorfahren (.brand-panel) zu
   platzieren - dieser Punkt fällt mit dem Mittelpunkt von .signal-rings
   zusammen, weil beide relativ zu .brand-panel zentriert werden. Größe kommt
   aus --logo-radius (oben an .brand-panel definiert), nicht aus einem
   festen px-Wert hier. */
.brand-logo {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: calc(var(--logo-radius) * 2);
  height: calc(var(--logo-radius) * 2);
  object-fit: contain;
  filter: drop-shadow(0 8px 24px rgba(0, 0, 0, 0.25));
  background: #fff;
  border-radius: 50%;
  padding: 14px;
}

/* <p class="brand-tagline"> in index.php. Ebenfalls absolut positioniert,
   aber NICHT vertikal zentriert - "top" ist ein fester Abstand unterhalb des
   Logo-Mittelpunkts (Logo-Radius + Gap), "left:50%" + translateX(-50%)
   zentriert nur horizontal. So bleibt das Logo exakt im Ring-Mittelpunkt,
   unabhängig davon, ob dieser Text ein- oder zweizeilig umbricht. */
.brand-tagline {
  position: absolute;
  top: calc(50% + var(--logo-radius) + var(--tagline-gap));
  left: 50%;
  transform: translateX(-50%);
  width: 100%;
  max-width: 360px;
  margin: 0;
  padding: 0 1rem;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 1.15rem;
  line-height: 1.5;
  color: #eaf0fc;
  letter-spacing: 0.01em;
  text-align: center;
}

/* Signalwellen: konzentrische Ringe, angelehnt an die Bögen im Logo */
/* <div class="signal-rings" aria-hidden="true"> in index.php - reiner
   Positionierungs-Rahmen für die vier .ring-Spans, füllt .brand-panel per
   inset:0 aus und zentriert seine Kinder per Flexbox. aria-hidden im HTML
   sorgt dafür, dass Screenreader dieses rein dekorative Element ignorieren. */
.signal-rings {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 1;
}

/* <span class="ring ring-1..4"> in index.php - vier identische Kreise, die
   sich per @keyframes pulse (siehe unten) laufend aufblähen und ausblenden.
   Die Größe (260px) definiert die Start-/Basisgröße vor der Animation. */
.ring {
  position: absolute;
  border: 1.5px solid rgba(255, 255, 255, 0.22);
  border-radius: 50%;
  animation: pulse 6s ease-out infinite;
}

/* Jeder Ring startet die gleiche Animation zeitversetzt (0s/1.5s/3s/4.5s
   bei 6s Gesamtdauer = 4 gleichmäßig verteilte "Wellen"), dadurch entsteht
   der Eindruck kontinuierlich auslaufender Funksignale statt eines
   einzelnen pulsierenden Rings. */
.ring-1 {
  width: 260px;
  height: 260px;
  animation-delay: 0s;
}
.ring-2 {
  width: 260px;
  height: 260px;
  animation-delay: 1.5s;
}
.ring-3 {
  width: 260px;
  height: 260px;
  animation-delay: 3s;
}
.ring-4 {
  width: 260px;
  height: 260px;
  animation-delay: 4.5s;
}

/* Animations-Definition für .ring: wächst von Originalgröße auf das 3.1-fache
   und wird dabei komplett transparent - die eigentliche zeitliche Steuerung
   (Dauer/Verzögerung) steht an .ring bzw. .ring-1..4 oben, nicht hier. Wird
   bei "Bewegung reduzieren"-Einstellung über tokens.css praktisch abgeschaltet. */
@keyframes pulse {
  0% {
    transform: scale(1);
    opacity: 0.55;
  }
  100% {
    transform: scale(3.1);
    opacity: 0;
  }
}

/* ---------- Formular-Panel (rechts) ---------- */
/* <section class="form-panel"> in index.php - die rechte, helle Spalte mit
   dem eigentlichen Login-Formular. Zentriert seinen Inhalt (.form-card)
   sowohl horizontal als auch vertikal per Flexbox. */
.form-panel {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 2rem;
  background: var(--color-bg);
}

/* <div class="form-card"> in index.php - begrenzt die Formularbreite, damit
   Eingabefelder auf großen Bildschirmen nicht unangenehm breit werden. */
.form-card {
  width: 100%;
  max-width: 380px;
}

/* <h1 class="form-title"> in index.php ("Willkommen"). */
.form-title {
  font-size: 1.85rem;
  font-weight: 600;
  color: var(--color-text);
}

/* <p class="form-subtitle"> in index.php. */
.form-subtitle {
  margin: 0.5rem 0 2rem;
  color: var(--color-text-muted);
  font-size: 0.95rem;
}

/* <div class="field"> in index.php - Wrapper um jeweils ein <label> +
   <input> (Benutzername, Passwort). Gleicher Klassenname wie in
   configurator.css, aber komplett unabhängig davon (nur diese Regel gilt
   auf index.php). */
.field {
  margin-bottom: 1.25rem;
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
}

.field label {
  font-size: 0.85rem;
  font-weight: 600;
  color: var(--color-text-muted);
}

/* <input id="username">/<input id="password"> in index.php. Werte werden
   von js/login.js ausgelesen (document.getElementById('username').value)
   und per fetch() an api/login.php geschickt. */
.field input {
  padding: 0.75rem 0.9rem;
  font-size: 1rem;
  border: 1.5px solid var(--color-border);
  border-radius: var(--radius-sm);
  background: var(--color-surface);
  color: var(--color-text);
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
}

.field input:focus {
  border-color: var(--color-accent);
  box-shadow: 0 0 0 3px rgba(74, 127, 209, 0.18);
  outline: none;
}

/* <p class="form-error" id="form-error"> in index.php - standardmäßig per
   HTML-Attribut "hidden" ausgeblendet. js/login.js setzt bei fehlgeschlagenem
   Login den Text und entfernt "hidden" (errorEl.hidden = false). */
.form-error {
  color: var(--color-error);
  font-size: 0.88rem;
  margin: -0.5rem 0 1rem;
}

/* <button type="submit" class="btn-primary"> in index.php. Der eigentliche
   Login-Ablauf (fetch an api/login.php, Redirect zu configurator.php bei
   Erfolg) steckt im "submit"-Event-Listener in js/login.js, nicht hier -
   diese Regel ist nur fürs Aussehen zuständig. */
.btn-primary {
  width: 100%;
  padding: 0.85rem 1rem;
  font-size: 1rem;
  font-weight: 600;
  color: #fff;
  background: var(--color-primary);
  border: none;
  border-radius: var(--radius-sm);
  cursor: pointer;
  box-shadow: var(--shadow-sm);
  transition: background 0.15s ease, transform 0.1s ease;
}

.btn-primary:hover {
  background: var(--color-primary-dark);
}

.btn-primary:active {
  transform: translateY(1px);
}

/* ---------- Responsive ---------- */
/* Unterhalb 860px Fensterbreite: aus der Zwei-Spalten-.login-page wird eine
   gestapelte Ein-Spalten-Ansicht (Marken-Panel oben, Formular darunter).
   --logo-radius/--tagline-gap werden hier kleiner überschrieben, damit Logo
   und Text im niedrigeren, gestapelten Marken-Panel nicht unproportioniert
   wirken - die eigentlichen Positionierungs-Regeln oben (.brand-logo,
   .brand-tagline) bleiben unverändert und lesen einfach die neuen Werte. */
@media (max-width: 860px) {
  .login-page {
    grid-template-columns: 1fr;
    grid-template-rows: auto 1fr;
  }

  .brand-panel {
    padding: 2.5rem 1.5rem;
    min-height: 260px;
    --logo-radius: 55px;
    --tagline-gap: 1.25rem;
  }

  .brand-tagline {
    font-size: 1rem;
  }

  .ring-1,
  .ring-2,
  .ring-3,
  .ring-4 {
    width: 180px;
    height: 180px;
  }
}
