/* ---------- Tokens (Theme "Einsatzbereit" - loest das vorherige "Flow"
   ab, Amber-Akzent). Bewusst EIN FESTES, HELLES Theme, KEIN automatisches
   Umschalten auf das Systemschema mehr (Kundenentscheidung: "im Vorschlag
   ist der hell" - ein spaeteres, manuell waehlbares zweites Theme ist
   geplant, siehe [[admin_ohne_eigene_zeiterfassung]]-Folgearbeit, aber
   das darf nicht automatisch ueber prefers-color-scheme greifen). Es gab
   ohnehin nirgends einen Umschalter, der data-theme="dark" gesetzt haette -
   die frueheren @media/[data-theme]-Bloecke waren totes Gewicht, das
   ausschliesslich ueber das Systemschema griff und genau diese Verwirrung
   verursacht hat. Die --rail-*-Tokens sind bewusst ungenutzter Rest eines
   verworfenen "Volltransfer"-Zwischenstands. ---------- */
:root {
    /* ----- 1. Grundfarben (Marke "Einsatzbereit") -----
       Die einzige Stelle, an der ein Farbwert als Zahl steht. Alles
       andere unten verweist nur noch hierauf. */
    --ink: #17181c;
    --ink-soft: #2a2b30;
    --paper: #f2efe8;
    --paper-raised: #ffffff;
    --line: #e5e2d9;
    --line-strong: #d8d5cc;
    --text: #17181c;
    --text-dim: #6f7078;
    --rail-bg: #17181c;
    --rail-text: #eef0eb;
    --rail-text-dim: #9a9d98;
    --accent: #e0913f;
    --accent-soft: #e8b57e;
    --accent-deep: #a3611c;
    --accent-wash: rgba(224, 145, 63, 0.14);
    --ok: #2f9e8f;
    --ok-wash: rgba(47, 158, 143, 0.14);
    --err: #b3402f;
    --err-wash: rgba(179, 64, 47, 0.12);
    --wait: #6a6fae;
    --wait-wash: rgba(106, 111, 174, 0.12);
    --warn: #a17a1f;
    --warn-wash: rgba(161, 122, 31, 0.12);

    /* Textfarbe auf dunklem Grund (Hero, dunkle Buttons, Preis-Panels).
       Stand vorher 21-mal als hartes #fff im Stylesheet - semantisch ist
       das NICHT dieselbe Farbe wie --paper-raised (weisse Flaeche), auch
       wenn beide zufaellig weiss sind. */
    --on-dark: #ffffff;

    --shadow: 0 1px 2px rgba(20, 20, 20, 0.05), 0 10px 26px -14px rgba(20, 20, 20, 0.16);

    /* ----- 2. Radius-Stufen -----
       Vorher lagen 17 verschiedene Werte im Stylesheet (1,2,3,4,5,6,7,8,
       9,10,11,12,14px sowie 999px/50%) - ohne erkennbare Regel, welcher
       wofuer gilt. Neue Bauteile bitte ausschliesslich aus dieser Leiter
       bedienen. */
    --r-2xs: 2px;   /* Mikro-Marker, Ecken an sehr kleinen Flaechen */
    --r-xs: 3px;    /* Chips, kleine Marker */
    --r-sm: 6px;    /* Formularfelder, Buttons */
    --r-md: 8px;    /* Panels, Karten */
    --r-lg: 12px;   /* grosse Flaechen, Modals */
    --r-pill: 999px;
    --r-circle: 50%;

    /* ----- 3. Schriftgroessen -----
       Vorher 20+ Groessen in 0,5px-Schritten (9.5/10.5/11/11.5/12/12.5/
       13/13.5/14/14.5/15/...) - fuer den Leser nicht unterscheidbar, aber
       jede einzeln zu pflegen. */
    --fs-2xs: 11px;   /* Marker, Tabellen-Fussnoten */
    --fs-xs: 12px;    /* Sekundaertext, Chips */
    --fs-sm: 13px;    /* Tabellen, Formulare, Navigation */
    --fs-md: 15px;    /* Fliesstext */
    --fs-lg: 17px;    /* Abschnittsueberschriften */
    --fs-xl: 22px;    /* Seitenueberschriften */
    --fs-2xl: 30px;     /* Kennzahlen */
    --fs-display: 36px; /* grosse Marketing-Ueberschriften */
    --fs-3xl: 46px;     /* Hero */

    /* Ausnahme, bewusst NICHT auf dieser Leiter: das verkleinerte
       App-Mockup auf der Startseite (.pub-mini-*) arbeitet mit einer
       eigenen Mikro-Leiter von 7,5-9,5px. Es soll wie ein aus der
       Entfernung fotografierter Bildschirm wirken - haette man es auf
       die Fliesstext-Leiter gezwungen, waere genau dieser Eindruck
       zerstoert. Wer dort etwas aendert, bleibt in dieser Mikro-Leiter. */

    /* ----- 4. Abstaende ----- */
    --sp-1: 4px;
    --sp-2: 8px;
    --sp-3: 12px;
    --sp-4: 16px;
    --sp-5: 22px;
    --sp-6: 32px;

    /* ----- 5. Oeffentliche Seiten -----
       Die --pub-*-Tokens stammen aus der Zeit, als die eingeloggte App
       noch das gruene Theme "Flow" trug und die oeffentlichen Seiten als
       einzige "Einsatzbereit" waren - zwei Markenwelten, bewusst getrennt.
       Seit die App selbst auf "Einsatzbereit" umgestellt wurde (siehe
       Kopfkommentar dieser Datei), beschreiben beide Saetze DIESELBE
       Marke. Uebrig blieben Dubletten - teils wertgleich, teils minimal
       auseinandergelaufen (--pub-ink #17181a vs. --ink #17181c,
       --pub-dim #6c6a60 vs. --text-dim #6f7078), ohne dass die Abweichung
       je beabsichtigt war.

       Die Namen bleiben als Verweise bestehen, damit die rund 120
       bestehenden Verwendungen in den oeffentlichen Seiten unveraendert
       weiterlaufen - der WERT kommt jetzt aber aus einer einzigen Quelle.
       Wer neu baut, nimmt direkt die Tokens darueber. */
    --pub-ink: var(--ink);
    --pub-paper: var(--paper);
    --pub-paper2: var(--paper-raised);
    --pub-amber: var(--accent);
    --pub-amber-ink: #1b1300;   /* Schrift auf Amber - eigener Wert, kein Duplikat */
    --pub-line-dark: rgba(255, 255, 255, 0.14);
    --pub-line-paper: var(--line);
    --pub-dim: var(--text-dim);

    color-scheme: light;
}

/* View Transitions (2026-08-11, Kundenwunsch "Seitenwechsel optimieren"):
   sanfter Uebergang beim Wechsel zwischen echten Seiten (Team, Auswertung,
   Start/Stopp, ...) statt hartem Sprung - rein deklarativ per CSS, KEIN
   JS-Router noetig, da die Navigation ohnehin ganz normale <a href>-Links
   sind. Browser ohne Unterstuetzung (aktuell u.a. aeltere Safari-Versionen)
   ignorieren diese Regel schlicht und navigieren exakt wie bisher - reine
   Verbesserung, kein Risiko. htmx-gesteuerte Teil-Updates (Tab-Wechsel
   innerhalb einer Seite, Status-Fragment) nutzen dieselbe Technik separat
   ueber htmx.config.globalViewTransitions (siehe app.js). */
@view-transition {
    navigation: auto;
}

::view-transition-old(root),
::view-transition-new(root) {
    animation-duration: 0.18s;
    animation-timing-function: ease-out;
}

@media (prefers-reduced-motion: reduce) {
    ::view-transition-old(root),
    ::view-transition-new(root) {
        animation: none;
    }
}

* { box-sizing: border-box; }

[x-cloak] { display: none !important; }

html, body { height: 100%; }

/* Sicherheitsnetz gegen seitliches Verschieben der ganzen Seite auf dem
   Handy (Kundenmeldung 2026-08-14: eine einzelne zu breite Zeile hat die
   komplette Seite nach rechts aus dem Bildschirm wachsen lassen, nicht
   nur sich selbst). Absichtlich horizontales Scrollen GENERELL
   ausgeschlossen statt nur die eine Fundstelle zu flicken - echte
   Breiten-Ausnahmen (.tabs, .table-scroll) haben ohnehin ihren eigenen
   overflow-x:auto-Container und bleiben davon unberuehrt. */
html, body { max-width: 100%; overflow-x: hidden; }

/* touch-action:manipulation (Kundenwunsch 2026-08-11): unterbindet den
   Doppel-Tap-Zoom beim schnellen Stempeln auf dem Handy, OHNE Pinch-Zoom
   grundsaetzlich abzuschalten (waere ueber "user-scalable=no" im
   viewport-Meta ein Accessibility-Problem und wird von manchen Browsern
   ohnehin ignoriert) - als Nebeneffekt entfaellt zusaetzlich die
   sonst uebliche ~300ms Tap-Verzoegerung mobiler Browser. */
html, body { touch-action: manipulation; }

/* Querformat-Sperre (Kundenwunsch 2026-08-11): manifest.json setzt zwar
   bereits "orientation":"portrait", das greift aber NUR bei einer
   installierten PWA unter Android - in einem normalen Browser-Tab und
   auf iOS (respektiert diese Vorgabe generell nicht, auch nicht
   installiert) dreht sich die Seite trotzdem mit. Deckt die Luecke
   stattdessen per CSS ab: .orientation-lock (Markup in base.twig/
   offline.html) verdeckt die Bedienoberflaeche, sobald ein
   Telefon-grosses Geraet quer gehalten wird (max-height 500px grenzt
   das gezielt auf Handys ein, Tablets/Desktop im Querformat bleiben
   unberuehrt). */
.orientation-lock { display: none; }
@media (orientation: landscape) and (max-height: 500px) {
    .orientation-lock {
        display: flex;
        position: fixed;
        inset: 0;
        z-index: 9999;
        background: #17181c;
        color: #f2efe8;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        gap: 14px;
        text-align: center;
        padding: 24px;
    }
    .orientation-lock svg { width: 44px; height: 44px; flex-shrink: 0; }
    .orientation-lock p { margin: 0; font-size: var(--fs-md); font-weight: 600; max-width: 280px; }
}

body {
    margin: 0;
    background: var(--paper);
    color: var(--text);
    font-family: -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
    -webkit-font-smoothing: antialiased;
}

a { color: inherit; }

/* Zahlen mit gleicher Ziffernbreite, damit Spalten untereinander
   stehen und eine laufende Uhr nicht zappelt. Bis 2026-09-04 wurde
   dafuer eine Monospace-Schrift eingesetzt - das erledigt zwar die
   Ausrichtung, laesst aber jede Stundenangabe wie Terminal-Ausgabe
   aussehen (am deutlichsten bei grossen Werten wie "30,0 Tage Rest").
   font-variant-numeric: tabular-nums erreicht dasselbe innerhalb der
   normalen Textschrift: die Ziffern bekommen gleiche Laufweite, die
   Schrift bleibt die der uebrigen Oberflaeche.

   Der Klassenname bleibt "num" - er wird in database/
   nachrichten_deckel_hinweis_testen.php im erwarteten Markup
   mitgeprueft. */
.num {
    font-variant-numeric: tabular-nums;
    letter-spacing: 0;
}

/* ---------- Topbar (Theme "Flow") - loest die vorherige linke
   Icon-Leiste ab, siehe [[theme_redesign_bento_kandidat]]: eine
   reine Umfaerbung der Leiste reichte dem Kunden ausdruecklich nicht,
   es sollte die im Flow-Mockup gezeigte obere Tab-Leiste sein. ---------- */
.topbar {
    position: sticky;
    top: 0;
    z-index: 20;
    display: flex;
    align-items: center;
    gap: 28px;
    padding: 14px 32px;
    /* Cremefarben wie .pub-nav auf den oeffentlichen Seiten (bewusst
       derselbe Ton wie --paper, nicht das hellere --paper-raised) - ein
       durchgehender Auftritt von Startseite bis Verwaltung. Der Amber-
       Streifen direkt darueber (siehe layout/base.twig, .pub-stripe)
       traegt die Markenfarbe, nicht der Topbar-Hintergrund selbst. */
    background: var(--paper);
    border-bottom: 1px solid var(--line);
}

.topbar-brand {
    display: flex;
    align-items: center;
    gap: 10px;
    font-size: var(--fs-md);
    font-weight: 900;
    letter-spacing: -0.01em;
    text-transform: uppercase;
    color: var(--text);
    text-decoration: none;
    flex-shrink: 0;
}

.topbar-brand .dot { width: 10px; height: 10px; background: var(--accent); border-radius: var(--r-2xs); transform: rotate(45deg); flex-shrink: 0; }

/* .tabs-group buendelt <nav class="tabs"> + optionalen Planung-Dropdown +
   "Verwaltung"/"Plattform"-Tab in EINEM flex:1-Container - vorher hatte
   .tabs selbst flex:1, wodurch die AUSSERHALB von <nav> liegenden
   Geschwister-Elemente (Dropdown/"Verwaltung") durch den von <nav>
   aufgespannten Leerraum an den rechten Rand gerissen wurden statt bei
   den anderen Reitern zu kleben. .tabs-group bekommt bewusst KEIN
   overflow-x:auto (das bliebe bei .tabs selbst), sonst waere das
   Dropdown-Menue wieder geclippt (siehe Kommentar an der Aufrufstelle
   in layout/base.twig). */
.tabs-group { display: flex; align-items: center; gap: 4px; flex: 1; min-width: 0; }

/* Die Reiterleiste ist ein waagerechter Scroll-Container. Das ist eine
   stille Falle: reicht der Platz nicht, verschwinden Reiter einfach -
   ohne Rand, ohne Pfeil, ohne irgendeinen Hinweis. Genau das ist beim
   Umbau der Kopfzeile am 2026-09-04 passiert: ein etwas breiterer
   Konto-Bereich liess bei 1440px Fensterbreite "Team" und "Auswertung"
   spurlos verschwinden, und es fiel erst im Screenshot-Vergleich auf.

   Die Maske blendet die letzten 24px der Leiste aus. Damit ist ein
   Ueberlauf wenigstens sichtbar, statt lautlos zu schlucken.

   KORREKTUR 12.09.2026: Hier stand, die Maske "greift nur dann - passt
   alles hinein, bleibt die Leiste unveraendert". Das stimmt nicht.
   mask-image kennt keinen Ueberlauf; sie blendet IMMER aus. Nachdem am
   12.09. der Reiter "Fehler" dazukam, endete die Leiste des
   Plattform-Admins genau im Auslaufbereich - und das "r" von "Fehler"
   war dauerhaft halb verschwunden, ohne dass irgendetwas ueberlief.
   Aufgefallen erst im vergroesserten Screenshot.

   Das padding-right unten haelt den Auslaufbereich frei: passt alles
   hinein, endet der letzte Reiter davor. Laeuft etwas ueber, scrollt
   man, und die Maske tut wieder ihren Dienst. */
.tabs {
    display: flex;
    gap: 4px;
    overflow-x: auto;
    scrollbar-width: none;
    padding-right: 26px;
    mask-image: linear-gradient(90deg, #000 calc(100% - 24px), transparent 100%);
}
.tabs::-webkit-scrollbar { display: none; }

.tab {
    padding: 8px 14px;
    border-radius: var(--r-md);
    font-size: var(--fs-sm);
    font-weight: 700;
    color: var(--text-dim);
    text-decoration: none;
    white-space: nowrap;
    transition: color 0.15s ease, background 0.15s ease;
}

.tab:hover { color: var(--text); background: var(--line); }
.tab.on { color: var(--text); background: var(--accent-wash); font-weight: 800; }
.tab:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* Badge fuer offene ArbZG-/MiLoG-Hinweise auf dem "Auswertung"-Tab
   (siehe Controller::render(), AuswertungController::arbzgDaten()). */
.nav-badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 16px;
    height: 16px;
    padding: 0 4px;
    margin-left: 2px;
    border-radius: var(--r-pill);
    background: var(--warn);
    color: var(--on-dark);
    font-size: var(--fs-2xs);
    font-weight: 800;
    line-height: 1;
    vertical-align: middle;
}
.mobile-nav-item .nav-badge { margin-left: 6px; }

.tab-dropdown { position: relative; }
.tab-dropdown-trigger { display: inline-flex; align-items: center; gap: 4px; border: none; cursor: pointer; background: none; font: inherit; color: var(--text-dim); }
.tab-dropdown-trigger:hover, .tab-dropdown-trigger.on { color: var(--text); }
.tab-dropdown-caret { width: 14px; height: 14px; transition: transform 0.15s ease; }
.tab-dropdown-caret.is-open { transform: rotate(180deg); }
.tab-dropdown-menu {
    position: absolute;
    top: calc(100% + 6px);
    right: 0;
    min-width: 200px;
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 6px;
    background: var(--paper-raised);
    border: 1px solid var(--line);
    border-radius: var(--r-md);
    box-shadow: var(--shadow);
    z-index: 25;
}
.tab-dropdown-item { padding: 8px 12px; border-radius: var(--r-sm); font-size: var(--fs-sm); font-weight: 600; color: var(--text-dim); text-decoration: none; white-space: nowrap; }
.tab-dropdown-item:hover { color: var(--text); background: var(--line); }
.tab-dropdown-item.on { color: var(--text); background: var(--accent-wash); }

/* ---------- Burger-Menü (nur < 880px, siehe Media-Query unten) - Ersatz
   fuer .tabs-group auf schmalen Breiten, gleiche Links als flache Liste
   statt Reiter+Dropdown. Standardmaessig ausgeblendet, damit es auf dem
   Desktop nie zwischen den Reitern aufblitzt. ---------- */
/* .topbar-right buendelt Burger-Menü/Nutzer-Badge/Sync-Badge (siehe
   layout/base.twig-Kommentar) - auf dem Desktop verhaelt es sich wie die
   fruehere flache Geschwister-Anordnung (gleicher gap-Wert wie .topbar),
   auf Mobile uebernimmt es das margin-left:auto, das vorher direkt auf
   .mobile-nav sass (siehe Mobil-Media-Query unten). */
.topbar-right { display: flex; align-items: center; gap: 28px; }
.mobile-nav { display: none; position: relative; }
.mobile-nav-toggle { display: none; align-items: center; justify-content: center; width: 36px; height: 36px; border: none; border-radius: var(--r-md); background: none; color: var(--text); cursor: pointer; }
.mobile-nav-toggle:hover { background: var(--line); }
.mobile-nav-icon { width: 22px; height: 22px; }
.mobile-nav-icon .line { transition: transform 0.15s ease, opacity 0.15s ease; transform-origin: 12px 12px; }
.mobile-nav-icon.is-open .line-top { transform: translateY(5px) rotate(45deg); }
.mobile-nav-icon.is-open .line-mid { opacity: 0; }
.mobile-nav-icon.is-open .line-bottom { transform: translateY(-5px) rotate(-45deg); }
.mobile-nav-panel {
    position: absolute;
    top: calc(100% + 10px);
    right: 0;
    min-width: 220px;
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 6px;
    background: var(--paper-raised);
    border: 1px solid var(--line);
    border-radius: var(--r-md);
    box-shadow: var(--shadow);
    z-index: 25;
}
.mobile-nav-item { padding: 11px 14px; border-radius: var(--r-md); font-size: var(--fs-md); font-weight: 700; color: var(--text-dim); text-decoration: none; white-space: nowrap; }
.mobile-nav-item:hover { color: var(--text); background: var(--line); }
.mobile-nav-item.on { color: var(--text); background: var(--accent-wash); }

.plattform-banner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding: 10px 32px;
    background: var(--wait-wash);
    color: var(--wait);
    font-size: var(--fs-sm);
    font-weight: 600;
}

.sync-badge {
    flex-shrink: 0;
    padding: 6px 12px;
    border: none;
    border-radius: var(--r-pill);
    font-size: var(--fs-xs);
    font-weight: 600;
    font-family: inherit;
    white-space: nowrap;
    background: var(--accent-wash);
    color: var(--accent);
    cursor: pointer;
}

.sync-badge-warn { background: var(--warn-wash); color: var(--warn); }

/* Konto-Menue rechts in der Kopfzeile.

   Vorher stand die Identitaet des Angemeldeten an ZWEI Stellen
   uebereinander: hier eine Amber-Pille mit dem Namen, und gleich darunter
   im Seitenkopf (_topline.twig) noch einmal Firma, E-Mail, "Mein Konto"
   und "Abmelden" als kleine graue Zeile rechts neben der Seiten-
   ueberschrift. Das war doppelt und stellte eine Verwaltungszeile auf
   dieselbe Hoehe wie die Seitenueberschrift.

   Alles sitzt jetzt hier - aber als aufklappbares Menue, nicht
   nebeneinander: die Kopfzeile teilt sich den Platz mit bis zu zehn
   Reitern, und .tabs ist ein Scroll-Container. Jedes zusaetzliche Pixel
   hier frisst Reiter, die dann kommentarlos verschwinden. */
.account { position: relative; flex-shrink: 0; margin-left: auto; }

.account-trigger {
    display: inline-flex;
    align-items: center;
    gap: var(--sp-1);
    max-width: 200px;
    padding: 6px 10px 6px 14px;
    border: none;
    border-radius: var(--r-pill);
    background: var(--accent-wash);
    color: var(--accent-deep);
    font: inherit;
    font-size: var(--fs-xs);
    font-weight: 700;
    cursor: pointer;
}
.account-trigger:hover { background: var(--accent-soft); color: var(--ink); }
.account-trigger:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

.account-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.account-caret { width: 14px; height: 14px; flex-shrink: 0; transition: transform 0.15s ease; }
.account-caret.is-open { transform: rotate(180deg); }

.account-menu {
    position: absolute;
    top: calc(100% + 6px);
    right: 0;
    min-width: 220px;
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 6px;
    background: var(--paper-raised);
    border: 1px solid var(--line);
    border-radius: var(--r-md);
    box-shadow: var(--shadow);
    z-index: 30;
}

.account-kopf {
    padding: 8px 12px 10px;
    border-bottom: 1px solid var(--line);
    margin-bottom: 4px;
    line-height: 1.35;
}
.account-kopf strong { display: block; font-size: var(--fs-sm); font-weight: 700; color: var(--text); }
.account-kopf span { display: block; font-size: var(--fs-xs); color: var(--text-dim); overflow-wrap: anywhere; }

.account-item {
    padding: 8px 12px;
    border-radius: var(--r-sm);
    font-size: var(--fs-sm);
    font-weight: 600;
    color: var(--text-dim);
    text-decoration: none;
}
.account-item:hover { background: var(--accent-wash); color: var(--accent-deep); }
.account-item.on { background: var(--accent-wash); color: var(--accent-deep); }
/* Trennt die Verwaltungsseiten von "Mein Konto"/"Abmelden" darunter. */
.account-trenner { display: block; height: 1px; background: var(--line); margin: 4px 6px; }

/* Wechsel-Link in die Planung. Traegt bewusst ein Symbol - er fuehrt auf
   einen anderen Hostnamen mit anderer Oberflaeche, das soll sich von
   einem gewoehnlichen Reiter unterscheiden. */
.tab-wechsel { display: inline-flex; align-items: center; gap: var(--sp-2); }
.tab-wechsel svg { width: 15px; height: 15px; flex-shrink: 0; opacity: 0.8; }

/* Bleibt bestehen: das Mobil-Layout weiter unten und die
   Plattform-Ansicht sprechen .user-badge noch an. */
.user-badge {
    flex-shrink: 0;
    padding: 6px 14px;
    border-radius: var(--r-pill);
    font-size: var(--fs-xs);
    font-weight: 700;
    white-space: nowrap;
    background: var(--accent-wash);
    color: var(--accent-deep);
}

/* 2000px waren praktisch keine Grenze: auf einem breiten Monitor lief
   eine schmale Karte wie in "Mein Konto" ganz links und liess rechts
   zwei Drittel leere Flaeche stehen. 1400px ist die Breite, bei der die
   vierspaltige KPI-Reihe und die breiteste Tabelle noch ohne Quetschen
   passen. */
.main { padding: 40px 48px 64px; max-width: 1400px; margin: 0 auto; }

.topline {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    margin-bottom: 36px;
    gap: 24px;
    flex-wrap: wrap;
}

.eyebrow {
    font-size: var(--fs-xs);
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--text-dim);
    margin: 0 0 6px;
}

h1 { font-size: var(--fs-2xl); margin: 0; font-weight: 800; letter-spacing: -0.015em; text-wrap: balance; }
h2 { font-size: var(--fs-md); margin: 0; font-weight: 750; }


/* ---------- Layout helpers ---------- */
.grid-asym {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(280px, 420px);
    gap: 20px;
    align-items: start;
}

.stack { display: flex; flex-direction: column; gap: 20px; }

/* ---------- Seiten-Reiter (Team-Seite: "Übersicht"/"Verwaltung" statt
   einer langen einspaltigen Seitenspalte, Kundenwunsch 2026-08-07) -
   generisch benannt, damit sich kuenftige Seiten mit demselben
   Uebersicht/Verwaltung-Bedarf daran anschliessen koennen. ---------- */
.section-tabs { display: flex; gap: 6px; border-bottom: 1px solid var(--line); margin-bottom: 22px; }
.section-tab {
    font: inherit;
    font-size: var(--fs-sm);
    font-weight: 650;
    color: var(--text-dim);
    background: none;
    border: none;
    padding: 10px 4px 12px;
    margin-right: 22px;
    cursor: pointer;
    position: relative;
}
.section-tab.on { color: var(--text); }
.section-tab.on::after { content: ""; position: absolute; left: 0; right: 0; bottom: -1px; height: 2px; background: var(--accent); border-radius: var(--r-2xs); }

/* align-items: stretch (2026-08-17, Kundenwunsch: "die Boxen müssen
   einheitlich groß sein, die Unterschiede sind doch krass") - vorher
   "start" liess jede Box nur so hoch wie ihren eigenen Inhalt werden,
   in derselben Zeile nebeneinander stehende Boxen mit unterschiedlich
   viel Inhalt wirkten dadurch krass ungleich hoch. "stretch" (CSS-Grid-
   Standard) gleicht alle Boxen EINER Zeile auf die hoechste an - gilt
   ueberall, wo .admin-grid verwendet wird (Auswertung-Details, Team-
   Verwaltung, Modulverwaltung, ...). */
.admin-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 18px; align-items: stretch; }


/* ---------- Karten-Raster fuer Seiten OHNE Reiter ----------

   Anlass: "Mein Konto" hatte vier Reiter (Uebersicht/Sicherheit/
   Datenschutz/Werksreset) mit je einer 480px schmalen Karte. Auf einem
   breiten Bildschirm stand damit eine schmale Spalte links und
   dreiviertel der Seite leer - und wer wissen wollte, was hinter einem
   Reiter steckt, musste ihn anklicken. Bei vier Karten, die zusammen
   auf einen Bildschirm passen, kostet das Klicks ohne Gegenwert.

   Zwei Spalten statt auto-fit: bei auto-fit mit einer Mindestbreite
   entstuenden auf einem 1440er Schirm vier Spalten, und ein
   Passwortformular in einer 340px-Spalte neben drei weiteren sieht
   nicht besser aus als vorher. Zwei Spalten sind die Breite, in der
   ein Formular noch komfortabel ist.

   .breit spannt ueber beide - fuer die Karte, die von der Breite
   wirklich profitiert (Datenraster), und fuer die, die ihre eigene
   Zeile braucht (Gefahrenzone). ---------- */
.karten-raster { display: grid; grid-template-columns: minmax(0, 1fr); gap: 20px; align-items: start; }
.karten-raster > .breit { grid-column: 1 / -1; }

@media (min-width: 900px) {
    .karten-raster { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* Beschriftetes Datenfeld (Label ueber Wert), wie es in "Meine Daten"
   siebenmal vorkam - vorher jedes Mal mit denselben Inline-Styles. */
.datenfeld-raster { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 16px 24px; }
.datenfeld .label { font-size: var(--fs-xs); color: var(--text-dim); letter-spacing: 0.01em; }
.datenfeld .wert { font-size: var(--fs-md); margin-top: 4px; }

/* Gegenstueck zu .datenfeld-raster fuer EINGABEfelder: dieselbe
   Anmutung, nur mit <label>+<input> statt Label+Wert. Gebraucht auf
   einer .breit-Karte, wo sieben Felder untereinander eine sehr lange,
   sehr schmale Spalte in einer sehr breiten Karte ergaeben (siehe
   "Persoenliche Daten" in mitarbeiter_bearbeiten.twig).
   240px Mindestbreite statt 190px, weil ein Eingabefeld im Gegensatz
   zu einem reinen Anzeigewert nicht umbrechen kann. */
.formular-raster { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 14px 20px; align-items: start; }
.formular-raster label { width: 100%; }
.formular-raster label input, .formular-raster label select, .formular-raster label textarea { width: 100%; }
/* Ein Feld, das ueber die ganze Kartenbreite laufen soll (lange
   Freitext-Eingabe, Erklaertext unter den Feldern). */
.formular-raster > .breit { grid-column: 1 / -1; }

/* Die Karte, auf die eine Weiterleitung gezielt hat (#sicherheit,
   #werksreset). Ersetzt das, was vorher der aktive Reiter leistete:
   zeigen, wo man gelandet ist. :target greift nur, wenn die Adresse
   wirklich diesen Anker nennt - ohne JavaScript. */
.karten-raster > section:target {
    border-color: var(--accent);
    box-shadow: 0 0 0 3px var(--accent-wash), var(--shadow);
}

/* ---------- Heatmap der letzten 14 Tage (Theme "Flow") - zeigt
   Arbeitsmuster ueber die Zeit statt nur die aktuelle Wochensumme,
   siehe ZeiterfassungController::statusDaten() fuer die Datengrundlage
   (5 Stufen je nach Anteil am Tagesziel). ---------- */
.heatmap { display: grid; grid-template-columns: repeat(14, 1fr); gap: 5px; }
.heatmap-tag { aspect-ratio: 1; border-radius: var(--r-sm); background: var(--line); }
.heatmap-stufe-1 { background: color-mix(in srgb, var(--accent) 25%, transparent); }
.heatmap-stufe-2 { background: color-mix(in srgb, var(--accent) 50%, transparent); }
.heatmap-stufe-3 { background: color-mix(in srgb, var(--accent) 75%, transparent); }
.heatmap-stufe-4 { background: var(--accent); }
.heatmap-foot { display: flex; justify-content: space-between; font-size: var(--fs-2xs); color: var(--text-dim); margin-top: 8px; }


/* ---------- KPI-Kachelreihe (Konzept A, vom Nutzer bestaetigt) - fasst
   die wichtigsten Kennzahlen einer Admin-Liste (Team/Abwesenheit/
   Auswertung) in einer Zeile zusammen, damit die Seite auf breiten
   Bildschirmen nicht wie eine schmale, gequetschte Liste wirkt.
   auto-fit statt auto-fill, damit sich 2-5 Kacheln je nach Anzahl
   gleichmaessig auf die verfuegbare Breite verteilen. ---------- */
.kpi-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 16px; margin-bottom: 24px; }
.kpi { background: var(--paper-raised); border: 1px solid var(--line); border-radius: var(--r-md); padding: 18px 20px; box-shadow: var(--shadow); }
.kpi .label { font-size: var(--fs-xs); color: var(--text-dim); text-transform: uppercase; letter-spacing: .04em; }
.kpi .value { font-size: var(--fs-2xl); font-weight: 700; margin-top: 6px; font-variant-numeric: tabular-nums; }
.kpi .value.ok { color: var(--ok); }
.kpi .value.warn { color: var(--warn); }
.kpi .value.err { color: var(--err); }
.kpi .hint { font-size: var(--fs-xs); color: var(--text-dim); margin-top: 2px; }

/* ---------- Kennzahlen-Cockpit-Zusaetze (Auswertung, Konzept A, vom
   Nutzer bestaetigt 2026-08-22) - reine ERGAENZUNGEN zu .kpi/.kpi-row
   oben, damit Team-/Abwesenheit-Seiten, die die einfache .kpi-Kachel
   weiterhin ungeaendert nutzen, unberuehrt bleiben. Nur wenn ein .kpi
   zusaetzlich .kpi-icon/.kpi-top/.kpi-delta enthaelt, sieht sie wie im
   Konzept aus. ---------- */
.kpi-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px; margin-bottom: 10px; }
.kpi-icon { width: 30px; height: 30px; border-radius: var(--r-md); background: var(--accent-wash); color: var(--accent-deep); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.kpi-icon svg { width: 16px; height: 16px; }
.kpi-delta { font-size: var(--fs-xs); font-weight: 700; padding: 3px 9px; border-radius: var(--r-pill); white-space: nowrap; }
.kpi-delta.up { background: var(--ok-wash); color: var(--ok); }
.kpi-delta.down { background: var(--warn-wash); color: var(--warn); }
.kpi-delta.flat { background: var(--line); color: var(--text-dim); }
.kpi.with-icon .label { margin-top: 0; }

/* ---------- Verlaufsdiagramm (Auswertung Konzept A) - loest die
   .rhythm/.rhythm-row-Balkenzeilen NUR im Auswertung-Hauptpanel ab.
   .rhythm/.rhythm-row selbst bleiben fuer Team-/Zeiterfassungs-/
   Plattform-Seiten unveraendert bestehen, die brauchen weiterhin die
   Balkenzeilen-Optik. Pfad/Flaeche werden serverseitig in
   AuswertungController::liniendiagrammDaten() aus den echten Tages-/
   Monatswerten berechnet (kein Client-JS noetig, robust ohne
   JavaScript). */
.trend-chart-wrap { position: relative; }
.trend-chart-wrap svg { width: 100%; height: 190px; display: block; overflow: visible; }
.trend-chart-grid line { stroke: var(--line); stroke-width: 1; }
.trend-chart-area { fill: var(--accent-wash); }
.trend-chart-line { fill: none; stroke: var(--accent); stroke-width: 2.4; stroke-linecap: round; }
.trend-chart-dot { fill: var(--accent-deep); stroke: var(--paper-raised); stroke-width: 2; }
/* Spitzenwert-Beschriftung als HTML-Element UEBER dem SVG statt als
   SVG-<text> (Bugfix 2026-08-22, Kundenmeldung per Foto: "die schrift
   kaum lesbar" - betraf Auswertung UND Plattform-Statistik gleichermassen,
   da beide dasselbe Diagramm nutzen). Root Cause: die SVG hat eine feste
   ViewBox (640x190) bei preserveAspectRatio="none" und wird per CSS auf
   volle Panel-Breite gestreckt - bei breiten Panels (z.B. 30-Tage-
   Ansicht) betraegt der horizontale Skalierungsfaktor >2x, waehrend die
   Hoehe fix bleibt. JEDER Text INNERHALB der SVG wird von diesem
   ungleichmaessigen Stretch mitverzerrt und dadurch praktisch
   unleserlich - ein reines HTML-Element daneben/darueber ist davon
   nicht betroffen und bleibt immer normal lesbar. Position wird in Twig
   als Prozentwert (peakX/breite, peakY/hoehe) gesetzt, die
   align-*-Klasse verhindert ein Ueberlaufen ueber den linken/rechten
   Rand bei einem Spitzentag ganz am Anfang/Ende des Zeitraums. */
.trend-chart-peak-badge { position: absolute; transform: translateY(calc(-100% - 10px)); background: var(--paper-raised); color: var(--accent-deep); font-size: var(--fs-2xs); font-weight: 700; font-family: ui-monospace, "SF Mono", "Cascadia Code", "Consolas", monospace; padding: 3px 8px; border-radius: var(--r-sm); border: 1px solid var(--line); box-shadow: var(--shadow); white-space: nowrap; pointer-events: none; }
.trend-chart-peak-badge.align-center { transform: translate(-50%, calc(-100% - 10px)); }
.trend-chart-peak-badge.align-end { transform: translate(-100%, calc(-100% - 10px)); }
.trend-chart-axis { display: flex; justify-content: space-between; margin-top: 6px; font-size: var(--fs-2xs); color: var(--text-dim); font-weight: 600; }
.trend-chart-empty { color: var(--text-dim); font-size: var(--fs-sm); padding: 40px 0; text-align: center; }

/* ---------- Achtung-Kacheln (Auswertung Konzept A) - fasst offene
   ArbZG-/MiLoG-Hinweise als Einstieg in die jeweiligen Reiter zusammen,
   erscheint nur wenn tatsaechlich etwas offen ist. ---------- */
.attn-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 14px; margin-top: 16px; }
.attn-card { display: flex; align-items: center; gap: 12px; background: var(--paper-raised); border: 1px solid var(--line); border-radius: var(--r-md); padding: 14px 16px; box-shadow: var(--shadow); }
.attn-dot { width: 10px; height: 10px; border-radius: var(--r-pill); flex-shrink: 0; }
.attn-dot.err { background: var(--err); }
.attn-dot.warn { background: var(--warn); }
.attn-text { flex: 1; min-width: 0; }
.attn-text .t1 { font-size: var(--fs-xs); font-weight: 700; }
.attn-text .t2 { font-size: var(--fs-xs); color: var(--text-dim); }
.attn-link { font-size: var(--fs-xs); font-weight: 700; color: var(--accent-deep); white-space: nowrap; text-decoration: none; }
.attn-link:hover { text-decoration: underline; }

.panel {
    background: var(--paper-raised);
    border: 1px solid var(--line);
    border-radius: var(--r-md);
    box-shadow: var(--shadow);
    padding: 26px 26px 22px;
}

.panel-head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    margin-bottom: 16px;
    gap: 12px;
    flex-wrap: wrap;
}

.panel-head .tot { font-size: var(--fs-sm); color: var(--text-dim); }
.panel-head .tot .num { color: var(--text); font-weight: 600; }

/* Reiter-Inhalt innerhalb eines Panels (x-show-Umschaltung, siehe
   _zeiterfassung_status.twig, _team_status.twig, _abwesenheit_status.twig,
   auswertung.twig). Die Klasse wurde an neun Stellen benutzt, ohne dass es
   sie je gab - der eine Grund, warum sie gebraucht wird, ist min-width: 0:
   ein Flex-/Grid-Kind hat sonst min-width: auto und laesst sich von einer
   breiten Tabelle darin ueber die Seitenbreite hinausdruecken. Genau so
   entsteht der waagerechte Bildlauf, den .table-scroll eigentlich
   verhindern soll. */
.section-pane { min-width: 0; }

/* ---------- Hero (Start/Stopp) ---------- */
.hero { padding: 36px 40px 32px; position: relative; overflow: hidden; }

.hero-top { display: flex; justify-content: space-between; align-items: flex-start; gap: 20px; flex-wrap: wrap; }

.status-pill {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 6px 14px 6px 10px;
    border-radius: var(--r-pill);
    font-size: var(--fs-sm);
    font-weight: 600;
}

.status-pill .dot { width: 8px; height: 8px; border-radius: var(--r-circle); background: currentColor; }
.status-pill.idle { background: var(--line); color: var(--text-dim); }
.status-pill.running { background: var(--ok-wash); color: var(--ok); }
.status-pill.running .dot { animation: pulse 1.6s ease-in-out infinite; }
.status-pill.paused { background: var(--wait-wash); color: var(--wait); }

@keyframes pulse {
    0%, 100% { opacity: 1; transform: scale(1); }
    50% { opacity: 0.35; transform: scale(0.72); }
}

@media (prefers-reduced-motion: reduce) {
    .status-pill.running .dot { animation: none; }
}

.goal-note { font-size: var(--fs-sm); color: var(--text-dim); text-align: right; }
.goal-note .num { color: var(--text); font-weight: 600; }

/* Uhr + grosser Rund-Knopf (Design-Vorschlag) statt der frueheren
   linearen Fortschrittsanzeige mit Prozentwert - dieselbe Alpine-
   Reaktivitaet (netto()/format()/ziel aus dem x-data-Scope in
   _zeiterfassung_status.twig), nur ohne die reine Zier-Visualisierung
   (Balken/Prozent). .progress-wrap/-head/-track/-fill/-pct bleiben
   bestehen - die nutzt weiterhin die Urlaubsquote in
   _abwesenheit_status.twig. */
.dial-row { display: flex; flex-direction: column; align-items: center; gap: 14px; margin-top: 18px; text-align: center; }
.dial-clock { font-size: var(--fs-display); font-weight: 700; letter-spacing: -0.02em; }

.progress-wrap { width: 100%; }
.progress-head { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 10px; }
.progress-head .clock { font-size: var(--fs-display); font-weight: 700; letter-spacing: -0.02em; }
.progress-pct { font-size: var(--fs-md); font-weight: 700; color: var(--accent); }
.progress-track { height: 14px; background: var(--line); border-radius: var(--r-pill); overflow: hidden; }
.progress-fill { height: 100%; background: var(--accent); border-radius: var(--r-pill); transition: width 0.6s cubic-bezier(.4, 0, .2, 1); }
.progress-wrap .sub { font-size: var(--fs-xs); color: var(--text-dim); margin-top: 8px; }

.dial-action {
    width: 96px;
    height: 96px;
    border: none;
    border-radius: var(--r-circle);
    cursor: pointer;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 4px;
    font-size: var(--fs-md);
    font-weight: 800;
    font-family: inherit;
    transition: transform 0.12s ease, box-shadow 0.12s ease;
}
.dial-action:active { transform: scale(0.97); }
.dial-action:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
.dial-action svg { width: 22px; height: 22px; }
.dial-action.start { background: var(--accent); color: var(--on-dark); box-shadow: 0 14px 30px -12px var(--accent); }
.dial-action.stop { background: var(--text); color: var(--paper); box-shadow: 0 14px 30px -14px rgba(0, 0, 0, 0.5); }

.dial-links { display: flex; align-items: center; gap: 10px; }
.dial-objekt-details { margin-top: 6px; font-size: var(--fs-xs); color: var(--text-dim); overflow-wrap: anywhere; text-align: left; }

/* ---------- Buttons ---------- */
/* min-height haelt Knoepfe auf exakt der Hoehe der Eingabefelder
   (44px, siehe input-Regeln weiter unten). Ohne sie ergab die Polsterung
   nur 41px - in einer Zeile aus Feld + Knopf, wie bei der Kontaktsuche,
   stand der Knopf dadurch sichtbar niedriger als das Feld daneben.
   box-sizing: border-box gilt global (siehe ganz oben), der Rand von
   .btn-ghost zaehlt also mit hinein statt obendrauf. */
.btn {
    appearance: none;
    border: none;
    border-radius: var(--r-sm);
    padding: 13px 22px;
    min-height: 44px;
    font-size: var(--fs-md);
    font-weight: 600;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    gap: 9px;
    transition: transform 0.12s ease, box-shadow 0.12s ease, background 0.15s ease;
    font-family: inherit;
    text-decoration: none;
    line-height: 1;
}

.btn:active { transform: translateY(1px) scale(0.99); }
.btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.btn svg { width: 16px; height: 16px; }

.btn-primary { background: var(--text); color: var(--paper); }
.btn-primary:hover { box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.35); }

.btn-accent { background: var(--accent); color: var(--on-dark); }
.btn-accent:hover { box-shadow: 0 8px 20px -8px var(--accent); }

.btn-ghost { background: transparent; color: var(--text-dim); border: 1px solid var(--line-strong); }
.btn-ghost:hover { color: var(--text); border-color: var(--text-dim); }

.btn-wait { background: var(--wait); color: var(--on-dark); }

.btn-danger { background: var(--err); color: var(--on-dark); }
.btn-danger:hover { box-shadow: 0 8px 20px -8px var(--err); }

.btn-sm { padding: 7px 13px; min-height: 36px; font-size: var(--fs-sm); border-radius: var(--r-sm); }

/* .btn-text wird sowohl auf <button> als auch auf <a> gesetzt. Ohne die
   ausdrueckliche Angabe unterstrich der Browser nur die <a>-Variante -
   in der Aktionsspalte der Mitarbeitertabelle stand deshalb
   "Bearbeiten" unterstrichen neben "Nachricht", "Sitzung uebernehmen"
   und "Kennwort setzen" ohne Unterstrich, obwohl alle vier dieselbe
   Klasse tragen und dasselbe bedeuten. Die Unterstreichung kommt beim
   Ueberfahren, fuer alle gleich. */
.btn-text {
    background: none;
    border: none;
    padding: 0;
    font: inherit;
    font-weight: 600;
    font-size: var(--fs-xs);
    cursor: pointer;
    color: var(--accent);
    text-decoration: none;
}
.btn-text:hover { text-decoration: underline; }
.btn-text.danger { color: var(--err); }

/* Seiten-Rueck-/Weiterlink direkt unter der Kopfzeile (z.B. "Vorlagen
   verwalten", "Zurück zum Team") - eigene Modifier-Klasse statt die
   Basis-.btn-text ueberall zu vergroessern (die wird auch fuer sehr
   kleine Inline-Aktionen wie "Speichern"/"Stornieren" in Tabellenzeilen
   genutzt). Klebte vorher direkt am naechsten Kasten (kein margin,
   12.5px wirkte neben der grossen H1 unpassend klein). */
.btn-text-nav { display: inline-block; font-size: var(--fs-sm); margin-bottom: 18px; }

/* ---------- Rhythm (Wochenbalken) ---------- */
.rhythm { display: flex; flex-direction: column; gap: 4px; }

.rhythm-row {
    display: grid;
    grid-template-columns: 34px 1fr 68px 22px;
    align-items: center;
    gap: 10px;
    padding: 6px 4px;
    border-radius: var(--r-md);
}

.rhythm-row.hat-eintraege { cursor: pointer; }
.rhythm-row.hat-eintraege:hover { background: var(--line); }

.rhythm-row .d { font-size: var(--fs-xs); color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.04em; }
.rhythm-row.today .d { color: var(--accent); font-weight: 700; }

.bar-track { height: 9px; border-radius: var(--r-sm); background: var(--line); overflow: hidden; }
.bar-fill { height: 100%; border-radius: var(--r-sm); background: var(--text-dim); transition: width 0.4s ease; }
.rhythm-row.today .bar-fill { background: var(--accent); }

.rhythm-row .h { font-size: var(--fs-xs); text-align: right; color: var(--text-dim); }
.rhythm-row.today .h { color: var(--text); font-weight: 600; }

/* Faerbt die bestehende Stunden-Zelle ein statt einen neuen Node
   einzufuegen (das feste 4-Spalten-Grid von .rhythm-row hat dafuer bei
   den kleinsten Breakpoints keinen Platz) - muss nach .rhythm-row.today .h
   stehen (gleiche Spezifitaet, Quellreihenfolge entscheidet), damit ein
   ArbZG-Hinweis am heutigen Tag nicht von der "heute"-Hervorhebung
   ueberschrieben wird. */
.rhythm-row .h.arbzg-warn { color: var(--warn); text-decoration: underline dotted; text-underline-offset: 2px; }
.rhythm-row .h.arbzg-err { color: var(--err); text-decoration: underline dotted; text-underline-offset: 2px; }

.rhythm-row .chevron, .name-cell .chevron { color: var(--text-dim); transition: transform 0.15s ease; width: 16px; height: 16px; }
.rhythm-row .chevron.auf, .name-cell .chevron.auf { transform: rotate(90deg); }

.rhythm-detail { padding: 4px 4px 10px 44px; display: flex; flex-direction: column; gap: 10px; }

/* Saeulendiagramm fuer "Diese Woche" auf der Team-Uebersicht
   (Kundenwunsch 2026-08-14, Konzept-Artifact "Vorschlag B" bestaetigt) -
   ersetzt NUR die dortige .rhythm-row-Zeilenliste, siehe _team_status.twig-
   Kommentar. .rhythm/.rhythm-row selbst bleiben unveraendert (weiterhin
   genutzt von auswertung.twig/plattform_statistik.twig). */
.week-chart { display: flex; align-items: flex-end; gap: 10px; height: 168px; padding: 10px 4px 0; position: relative; }
.week-chart-weekend { position: absolute; right: 4px; bottom: 0; top: 10px; width: calc(2 / 7 * 100% - 6px); background: var(--paper); border-radius: var(--r-md); z-index: 0; }
.week-chart-col { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 8px; height: 100%; justify-content: flex-end; position: relative; z-index: 1; }
.week-chart-val { font-size: var(--fs-xs); font-weight: 800; color: var(--text-dim); font-variant-numeric: tabular-nums; }
.week-chart-col.today .week-chart-val { color: var(--accent-deep); }
.week-chart-val.arbzg-warn { color: var(--warn); text-decoration: underline dotted; text-underline-offset: 2px; }
.week-chart-val.arbzg-err { color: var(--err); text-decoration: underline dotted; text-underline-offset: 2px; }
.week-chart-bar-wrap { width: 100%; max-width: 34px; height: 100px; display: flex; align-items: flex-end; }
.week-chart-bar { width: 100%; border-radius: var(--r-sm) var(--r-sm) var(--r-xs) var(--r-xs); background: linear-gradient(180deg, var(--accent-soft), var(--accent)); min-height: 4px; transition: height 0.4s ease; }
.week-chart-col.today .week-chart-bar { background: linear-gradient(180deg, var(--accent), var(--accent-deep)); box-shadow: 0 0 0 2px var(--accent-wash); }
.week-chart-col.leer .week-chart-bar { background: var(--line); }
.week-chart-day { font-size: var(--fs-xs); font-weight: 800; text-transform: uppercase; letter-spacing: 0.03em; color: var(--text-dim); }
.week-chart-col.today .week-chart-day { color: var(--accent-deep); }
.week-chart-foot { display: flex; justify-content: space-between; margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--line); font-size: var(--fs-xs); color: var(--text-dim); }
.week-chart-foot strong { color: var(--text); font-variant-numeric: tabular-nums; }

/* ---------- Day-List (eigene Woche, nur Mitarbeiter-Ansicht in
   _zeiterfassung_status.twig) - Name+Datum+Status statt Balken, siehe
   .rhythm-row-Kommentar oben: die Team-Uebersicht braucht .rhythm-row
   weiterhin fuer mehrere Mitarbeiter pro Tag. Seit 2026-08-14 (Kunden-
   wunsch, Konzept-Artifact abgenommen): NUR noch Name+Status in der
   Zeile statt vorher 4 Spalten gleichzeitig (Wochentag/Geplant/
   Gearbeitet/Status) + Inline-Akkordeon darunter - auf dem Handy laut
   Kundenmeldung "so unuebersichtlich". Tap oeffnet stattdessen ein
   Modal mit allen Details (geplante Schicht(en), Zeiterfassungs-
   Eintraege inkl. Bearbeiten/Verlauf, ArbZG-Hinweis, Tages-Summe). ---------- */
.day-list { display: flex; flex-direction: column; background: var(--paper-raised); border: 1px solid var(--line); border-radius: var(--r-md); overflow: hidden; }
.day-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 12px 14px; border-bottom: 1px solid var(--line); }
.day-row:last-child { border-bottom: none; }
.day-row.klickbar { cursor: pointer; }
.day-row.klickbar:hover { background: var(--line); }
.day-row-name { font-size: var(--fs-sm); font-weight: 700; color: var(--text); display: flex; align-items: baseline; gap: 7px; min-width: 0; }
.day-row-name > *:first-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.day-row.today .day-row-name { color: var(--accent); }
.day-row-date { font-size: var(--fs-xs); font-weight: 500; color: var(--text-dim); flex-shrink: 0; }
.day-row-right { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }
.day-row-right .chevron-right { width: 15px; height: 15px; color: var(--text-dim); flex-shrink: 0; }

/* Abschnitte + Zusammenfassung im Tages-Modal (dasselbe .modal/.modal-
   head/.modal-body-Grundgeruest wie beim bestehenden "Eintrag
   bearbeiten"-Modal, siehe weiter unten .modal). */
.modal-section { margin-bottom: 16px; }
.modal-section-title { font-size: var(--fs-2xs); font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; color: var(--text-dim); margin-bottom: 8px; }
.modal-schicht-zeile { font-size: var(--fs-xs); padding: 7px 0; border-bottom: 1px solid var(--line); }
.modal-schicht-zeile:last-child { border-bottom: none; }
.modal-tag-summe { display: flex; align-items: center; justify-content: space-between; padding: 11px 13px; border-radius: var(--r-md); background: var(--accent-wash); font-size: var(--fs-xs); font-weight: 700; color: var(--accent-deep); margin-top: 4px; }
.modal-tag-summe strong { font-size: var(--fs-md); font-variant-numeric: tabular-nums; }

.eintrag-zeile { font-size: var(--fs-sm); color: var(--text-dim); }
.eintrag-zeile .info { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.eintrag-zeile .who { font-weight: 600; color: var(--text); overflow-wrap: anywhere; }

.arbzg-hinweis { font-size: var(--fs-xs); margin-top: 4px; }
.arbzg-hinweis.arbzg-warn { color: var(--warn); }
.arbzg-hinweis.arbzg-err { color: var(--err); }
/* Begruendungsnotiz (Migration 054) sitzt farblich innerhalb eines
   .arbzg-warn/.arbzg-err-Blocks - ohne eigene Farbe wuerde sie die
   Warn-/Fehlerfarbe erben statt wie die gleichnamige Notiz in
   .antrag-row .kommentar (Zeile oben) neutral/gedaempft zu wirken. */
.arbzg-hinweis .kommentar { font-size: var(--fs-xs); color: var(--text-dim); margin-top: 4px; font-style: italic; }

.nachtrag-form { margin-top: 14px; display: flex; gap: 10px; flex-wrap: wrap; align-items: flex-end; }

/* ---------- Forms ----------
   "Vorschlag B" (Konzept-Vergleich, vom Nutzer gewaehlt): klarerer,
   etwas kraeftigerer Rahmen + mehr Hoehe/Schriftgroesse als der
   vorherige Stil - wirkt praeziser/hochwertiger, ohne Kanten/Farben der
   bestehenden Theme "Flow" zu verlassen. */
input[type="datetime-local"], input[type="date"], input[type="time"], input[type="number"], input[type="month"], input[type="text"], input[type="search"], input[type="email"], input[type="password"], select, textarea {
    font: inherit;
    font-size: var(--fs-md);
    color: var(--text);
    background: var(--paper-raised);
    border: 1.5px solid var(--line-strong);
    /* Derselbe Radius wie .btn (--r-sm): Feld und Knopf stehen oft
       unmittelbar nebeneinander (Suchzeile, Filterleiste), und zwei
       verschiedene Eckenrundungen in einer Zeile lesen sich als
       Unsauberkeit, nicht als Absicht. */
    border-radius: var(--r-sm);
    padding: 11px 14px;
    height: 44px;
    box-shadow: inset 0 1px 1px rgba(20, 20, 20, 0.02);
    transition: border-color 0.15s ease, box-shadow 0.15s ease;
}

input[type="datetime-local"]:hover, input[type="date"]:hover, input[type="time"]:hover, input[type="number"]:hover, input[type="month"]:hover, input[type="text"]:hover, input[type="search"]:hover, input[type="email"]:hover, input[type="password"]:hover, select:hover, textarea:hover {
    border-color: var(--text-dim);
}

/* Bugfix 2026-08-22 (Kundenbeobachtung vor einem Großkunden-Abschluss:
   "bei schicht, schicht-vorlagen usw. sehen die formularfelder scheiße
   aus"): input[type="time"] war oben nie mit aufgefuehrt, blieb also im
   rohen Browser-Standard-Look haengen - genau die auffaelligsten Felder
   im Schichtplaner (Start/Ende). input[type="color"] (Farbe-Feld)
   braucht eine eigene, schlankere Regel statt der Text-Feld-Polsterung,
   damit die Farbflaeche selbst sichtbar bleibt, reiht sich aber in
   Rahmen/Hoehe/Rundung bei den Nachbarfeldern ein. */
input[type="color"] {
    height: 44px;
    width: 64px;
    padding: 4px;
    border: 1.5px solid var(--line-strong);
    border-radius: var(--r-md);
    background: var(--paper-raised);
    cursor: pointer;
    transition: border-color 0.15s ease, box-shadow 0.15s ease;
}

input[type="color"]:hover {
    border-color: var(--text-dim);
}

input:focus-visible, select:focus-visible, textarea:focus-visible {
    outline: none;
    border-color: var(--accent);
    box-shadow: 0 0 0 3.5px var(--accent-wash);
}

input[type="number"] { width: 84px; }

textarea {
    height: auto;
    min-height: 76px;
    resize: vertical;
    font-family: inherit;
    padding-top: 11px;
}

select {
    appearance: none;
    -webkit-appearance: none;
    /* Ein <select> ist von Haus aus so breit wie sein laengster Eintrag.
       Auf einem Telefon reicht ein Terminalname mit angehaengtem Firmen-
       namen ("Vorfuehrgeraet Buero · Hansa Reinigung KG") dafuer schon
       aus, und die Auswahlliste ragte im Plattform-Hardware-Bereich
       rechts aus der Karte heraus. max-width haelt sie im Container,
       text-overflow kuerzt den zu langen Eintrag lesbar ab. */
    max-width: 100%;
    text-overflow: ellipsis;
    padding-right: 36px;
    cursor: pointer;
    background-repeat: no-repeat;
    background-position: right 14px center;
    background-size: 14px;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236b7078' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}

label {
    font-size: var(--fs-xs);
    color: var(--text-dim);
    display: inline-flex;
    /* Ohne min-width: 0 behaelt ein Label in einer Flex-Zeile die Breite
       seines breitesten Kindes und laesst sich nicht schrumpfen - dann
       hilft auch das max-width am <select> darin nichts mehr. */
    min-width: 0;
    flex-direction: column;
    gap: 5px;
    letter-spacing: 0.01em;
}

.btn-sm { height: 38px; }

/* Reiter-Buttons neben einem Eingabefeld auf dessen Groesse angeglichen
   (2026-08-17, Kundenwunsch: "Monat und Mitarbeiter die müssen an die
   größe der anderen angepasst werden" - erster Versuch war das Feld auf
   .btn-sm zu verkleinern, wurde vom Kunden verworfen: "wenn nicht pass
   die anderen boxen an Monat an" - jetzt umgekehrt: die Reiter-Buttons
   (z.B. "Monat"/"Jahr"/"ArbZG"/"MiLoG"/"Kontakt" auf der Auswertung-Seite)
   werden auf dieselben Masse wie ein normales Eingabefeld (44px hoch,
   15px Schrift, 9px Radius) gebracht statt .btn-sm (38px) zu nutzen. */
.filter-reiter-gross { height: 44px; padding: 11px 18px; font-size: var(--fs-md); border-radius: var(--r-md); }

/* Reiter-Zeile der Auswertung (Monat/Jahr/ArbZG/MiLoG/Kontakt).
   flex-wrap ist hier keine Kosmetik: fuenf Reiter passen auf einem
   Telefon nicht nebeneinander, ohne Umbruch ragte "Kontakt" aus dem
   Bildschirm und war schlicht nicht erreichbar. Umbruch statt
   waagerechtem Bildlauf, weil es nur wenige kurze Eintraege sind - ein
   Reiter, den man erst scrollen muss, wird uebersehen. */
.reiter-leiste { display: flex; flex-wrap: wrap; gap: 8px; min-width: 0; }

/* Aktionsgruppe rechts in einer .panel-head (Zaehler-Chip, Sammel-
   Button, Querverweis). Ohne Umbruch quetscht sich der Button auf
   schmalen Bildschirmen auf drei Zeilen. */
.panel-aktionen { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; }

/* Fehlermeldung direkt unter einem Eingabefeld (Pflicht-Begruendung im
   Bestaetigungs-Modal). Bewusst nicht als Flash-Meldung oben auf der
   Seite: der Hinweis muss an dem Feld stehen, das ihn ausgeloest hat. */
.feld-fehler { color: var(--err); font-size: var(--fs-xs); }

.hairline { border: none; border-top: 1px solid var(--line); margin: 16px 0; }

/* ---------- Modal (Eintrag bearbeiten) ---------- */
.modal-backdrop {
    position: fixed;
    inset: 0;
    background: rgba(13, 15, 19, 0.55);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 20px;
    z-index: 50;
    /* Bugfix 2026-08-11 (Kundenmeldung: "beim hoch und runter wischen
       sehe ich an den Seiten, dass die Seite dahinter hoch und runter
       geht"): ohne overscroll-behavior wanderte ein Scroll-Touch, der
       innerhalb des Modals seine Grenze erreicht (ganz oben/unten),
       auf iOS an die dahinterliegende Seite weiter (Scroll-Chaining). */
    overscroll-behavior: contain;
}

.modal {
    background: var(--paper-raised);
    border: 1px solid var(--line);
    border-radius: var(--r-md);
    box-shadow: var(--shadow);
    width: 100%;
    max-width: 420px;
    /* Bugfix 2026-08-11 (Kundenmeldung: lange Liste - z.B. 9 wartende
       Offline-Aktionen - "es bleibt so und man sieht nicht alles"): ohne
       Begrenzung wuchs das Modal ueber den sichtbaren Bereich hinaus,
       ohne dass sich der Ueberschuss on-screen erreichen liess. */
    max-height: calc(100vh - 40px);
    overflow-y: auto;
    overscroll-behavior: contain;
    padding: 24px;
}

.modal-head {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 18px;
}

.modal-head h3 { font-size: var(--fs-lg); margin: 0; font-weight: 650; }

.modal-close {
    background: none;
    border: none;
    cursor: pointer;
    color: var(--text-dim);
    display: flex;
    padding: 4px;
    border-radius: var(--r-md);
}

.modal-close:hover { color: var(--text); background: var(--line); }
.modal-close svg { width: 18px; height: 18px; }

.modal-body { display: flex; flex-direction: column; gap: 14px; }
.modal-body label { width: 100%; }
.modal-body label input { width: 100%; }
/* Ausnahme fuer Ankreuzfelder: width: 100% zieht eine Checkbox auf die
   volle Zeilenbreite auf und schiebt ihre Beschriftung an den rechten
   Rand - zu sehen bei "Zeitkonto aktiv" auf der Mitarbeiter-Seite, wo
   Kaestchen und Text ueber eine halbe Kartenbreite auseinanderlagen. */
.modal-body label input[type="checkbox"], .modal-body label input[type="radio"] { width: auto; }

.modal-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 22px; }

/* Bild-Vorschau-Modal (Kundenwunsch 2026-08-14: Dokument-Bild bei einem
   Abwesenheitsantrag per Klick "optimal darstellen ... aber nicht
   übergroß") - breiter als das Standard-Formular-Modal (420px), das
   Bild selbst bleibt zusaetzlich per max-height begrenzt (siehe
   _logbuch_status.twig), damit auch ein sehr hohes Foto nicht ueber den
   Bildschirm hinauswaechst. */
.modal-bild { max-width: 640px; }
.modal-bild .modal-body { align-items: center; }

@media (prefers-reduced-motion: reduce) {
    [x-transition] { transition: none !important; }
}

/* ---------- Team / roster ---------- */
.team-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 12px;
}

.team-card {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 14px 16px;
    border-radius: var(--r-lg);
    background: var(--paper);
    border: 1px solid var(--line);
}

.team-card .avatar { width: 40px; height: 40px; border-radius: var(--r-lg); font-size: var(--fs-md); }
.team-card .who .name { font-size: var(--fs-md); }
.team-card .who .role { font-size: var(--fs-xs); }
.team-card .who .urlaub-rest { color: var(--text-dim); margin-top: 2px; }

.icon-btn {
    background: none;
    border: none;
    cursor: pointer;
    color: var(--text-dim);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 7px;
    border-radius: var(--r-md);
    flex-shrink: 0;
}
.icon-btn svg { width: 16px; height: 16px; }
.icon-btn:hover { color: var(--text); background: var(--line); }
.icon-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* ---------- Abwesenheit (Freigabe-Warteschlange + eigene Antragsliste) ---------- */
.antrag-liste { display: flex; flex-direction: column; gap: 10px; }

.antrag-row {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 16px;
    padding: 13px 16px;
    border-radius: var(--r-lg);
    background: var(--paper);
    border: 1px solid var(--line);
    flex-wrap: wrap;
}

.antrag-row .who { flex: 1; min-width: 0; }
.antrag-row .who .name { font-size: var(--fs-sm); font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.antrag-row .who .role { font-size: var(--fs-xs); color: var(--text-dim); margin-top: 2px; }
.antrag-row .kommentar { font-size: var(--fs-xs); color: var(--text-dim); margin-top: 4px; font-style: italic; }

/* ---------- Datentabelle (Konzept A, vom Nutzer bestaetigt) - fuer
   Verwaltungslisten mit klaren Spalten (Objekte, Schicht-Vorlagen,
   Team-Mitarbeiter). Dichter/informativer als grosse Karten, skaliert
   besser bei vielen Zeilen, braucht keinen auto-fit/auto-fill-Trick da
   jede Zeile ohnehin die volle Breite nutzt. ---------- */
/* tabular-nums fuer die ganze Tabelle: Ziffern bekommen gleiche
   Laufweite, dadurch stehen Werte wie "29h 0min" und "31h 30min"
   untereinander an derselben Stelle. Vorher tanzten sie um bis zu zwei
   Pixel je Ziffer auseinander, was eine Spalte aus Zeitangaben unruhig
   aussehen laesst. Als Regel auf der Tabelle statt als Klasse an jeder
   Zelle - es gibt keine Spalte, der Proportionalziffern besser
   stuenden. */
table.data { width: 100%; border-collapse: collapse; font-size: var(--fs-sm); font-variant-numeric: tabular-nums; }
table.data th {
    text-align: left;
    font-size: var(--fs-2xs);
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--text-dim);
    font-weight: 600;
    padding: 0 12px 10px;
    border-bottom: 1px solid var(--line-strong);
}
table.data td { padding: 12px; border-bottom: 1px solid var(--line); vertical-align: middle; }
table.data tr:last-child td { border-bottom: none; }
table.data tr:hover td { background: var(--accent-wash); }
table.data .name-cell { font-weight: 600; }
table.data .dim { color: var(--text-dim); font-size: var(--fs-xs); }
table.data .aktionen { display: flex; gap: 14px; justify-content: flex-end; align-items: center; }
table.data .aktionen form { display: inline; }
.table-scroll { overflow-x: auto; }
.table-scroll table.data { min-width: 480px; }
.antrag-aktionen { display: flex; gap: 8px; flex-shrink: 0; }

.team-list { display: flex; flex-direction: column; gap: 12px; margin-top: 2px; }
.team-row { display: flex; align-items: center; gap: 10px; }

.avatar {
    width: 30px;
    height: 30px;
    border-radius: var(--r-md);
    background: var(--accent-wash);
    color: var(--accent);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: var(--fs-xs);
    font-weight: 700;
    flex-shrink: 0;
}

.team-row .who { flex: 1; min-width: 0; }
.team-row .who .name { font-size: var(--fs-sm); font-weight: 600; overflow: hidden; text-overflow: ellipsis; }
.team-row .who .role { font-size: var(--fs-xs); color: var(--text-dim); }

.chip { font-size: var(--fs-2xs); font-weight: 700; padding: 3px 9px; border-radius: var(--r-pill); white-space: nowrap; flex-shrink: 0; }
.chip.on { background: var(--ok-wash); color: var(--ok); }
.chip.pause { background: var(--wait-wash); color: var(--wait); }
.chip.off { background: var(--line); color: var(--text-dim); }
.chip.warten { background: var(--wait-wash); color: var(--wait); }
.chip.genehmigt { background: var(--ok-wash); color: var(--ok); }
.chip.abgelehnt { background: var(--err-wash); color: var(--err); }
.chip.storniert { background: var(--line); color: var(--text-dim); }
.chip.arbzg-warn { background: var(--warn-wash); color: var(--warn); }
.chip.arbzg-err { background: var(--err-wash); color: var(--err); }

/* Generisches Zustands-Trio. Die Chips darueber sind nach ihrer Fachlage
   benannt (genehmigt/abgelehnt gehoeren zu Abwesenheitsantraegen, on/pause
   zu einer laufenden Erfassung) - sie hier wiederzuverwenden waere im
   Markup irrefuehrend, weil eine RFID-Karte weder genehmigt noch
   pausiert ist. Deshalb drei Varianten, die nur den Zustand benennen. */
.chip.ok { background: var(--ok-wash); color: var(--ok); }
.chip.warn { background: var(--warn-wash); color: var(--warn); }
.chip.err { background: var(--err-wash); color: var(--err); }

/* Angehaengte Dokumente je Abwesenheitsantrag (Migration 055) - kleine
   Link-Liste unter Kommentar/Ablehnungsgrund, gleiches .kommentar-Muster
   fuer die Schriftgroesse. */
.dokument-liste { display: flex; flex-direction: column; gap: 4px; margin-top: 4px; }
.dokument-zeile { display: flex; align-items: center; gap: 8px; font-size: var(--fs-xs); }
.dokument-zeile a, a.dokument-zeile, button.dokument-zeile { color: var(--accent-deep); text-decoration: none; }
.dokument-zeile a:hover, a.dokument-zeile:hover, button.dokument-zeile:hover { text-decoration: underline; }

/* ---------- Oeffentliche Seiten (Startseite, Preise, FAQ, Login,
   Registrieren, je eine Seite pro Zusatzmodul) - der Auftritt, den ein
   Besucher VOR dem Login sieht. Baustellen-/Werkstatt-Aesthetik mit
   Amber-Akzent, bewusst kraeftiger als die eingeloggte Arbeitsflaeche.

   Diese Seiten sind eigenstaendige Dokumente ohne layout/base.twig und
   ohne JS-Framework. Ihre Farben kommen seit der Token-Vereinheitlichung
   aus demselben Satz wie die App (siehe :root am Dateianfang, Abschnitt
   5) - der zweite, konkurrierende :root-Block, der hier stand, ist
   entfallen. ---------- */

/* Feste helle Grundflaeche fuer die Startseite, bewusst unabhaengig vom
   System-Farbschema des Besuchers - anders als die eingeloggte App (die
   sich an --paper/--ink haelt) ist die Markenoptik dieser oeffentlichen
   Seiten fest vorgegeben (siehe .pub-hero/.pub-price fuer die bewusst
   dunklen Gegenstuecke). Ohne dieses Class faellt z.B. .pub-nav sonst auf
   das globale, THEME-ABHAENGIGE --paper zurueck - bei einem Besucher mit
   dunklem Systemtheme wurde die Navigationsleiste dadurch faelschlich
   schwarz statt hell. */
.pub-page { background: var(--pub-paper); color: var(--pub-ink); }

/* Markenband oberhalb der Kopfzeile.

   Vorher: 8px hoch, Amber gegen fast-Schwarz, schraeg gestreift - das
   ergibt Absperrband. Auf einer Verwaltungsoberflaeche, die man acht
   Stunden am Tag offen hat, ruft das "Achtung" statt "Marke", und es war
   das erste, was man auf jeder Seite sah.

   Ein Zwischenschritt mit denselben Streifen in zwei Amber-Toenen war
   nicht besser: bei 4px Hoehe verschmieren die Kanten zu einem
   unsauberen Braun. Jetzt eine durchgehende Linie mit warmem Verlauf -
   ruhig, eindeutig Marke, und in 3px so zurueckhaltend, dass sie den
   Inhalt darunter nicht mehr ueberstimmt. */
.pub-stripe { height: 3px; background: linear-gradient(90deg, var(--accent-deep) 0%, var(--accent) 45%, var(--accent-soft) 100%); }

.pub-nav { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 22px 32px; max-width: 1160px; margin: 0 auto; }
.pub-brand { display: flex; align-items: center; gap: 10px; font-weight: 900; font-size: var(--fs-lg); letter-spacing: -0.01em; color: inherit; text-decoration: none; }
.pub-brand .dot { width: 10px; height: 10px; background: var(--pub-amber); border-radius: var(--r-2xs); transform: rotate(45deg); flex-shrink: 0; }
.pub-nav-links { display: flex; align-items: center; gap: 26px; font-size: var(--fs-sm); font-weight: 700; }
.pub-nav-links a { color: inherit; text-decoration: none; opacity: 0.75; }
.pub-nav-links a:hover { opacity: 1; }
.pub-nav-cta { background: var(--pub-ink); color: var(--on-dark); font-weight: 800; font-size: var(--fs-sm); padding: 11px 20px; border-radius: var(--r-xs); text-decoration: none; }

/* "Zusatzmodule"-Ausklapp-Menu im Hauptmenue der oeffentlichen Seiten -
   natives <details>, siehe _pub_nav.twig-Kommentar. */
.pub-nav-drop { position: relative; }
.pub-nav-drop summary { cursor: pointer; opacity: 0.75; list-style: none; display: inline-flex; align-items: center; gap: var(--sp-1); }
.pub-nav-drop-caret { width: 14px; height: 14px; flex-shrink: 0; transition: transform 0.15s ease; }
.pub-nav-drop[open] .pub-nav-drop-caret { transform: rotate(180deg); }
.pub-nav-drop summary:hover { opacity: 1; }
.pub-nav-drop summary::-webkit-details-marker { display: none; }
.pub-nav-drop[open] summary { opacity: 1; }
.pub-nav-drop-menu { position: absolute; top: calc(100% + 16px); left: 50%; transform: translateX(-50%); background: var(--pub-paper2); border: 1px solid var(--pub-line-paper); border-radius: var(--r-md); box-shadow: 0 16px 32px -14px rgba(0, 0, 0, 0.3); padding: 8px; min-width: 190px; z-index: 20; }
.pub-nav-drop .pub-nav-drop-menu a { display: block; color: var(--pub-ink); opacity: 1; padding: 9px 10px; border-radius: var(--r-sm); font-size: var(--fs-sm); }
.pub-nav-drop .pub-nav-drop-menu a:hover { background: var(--pub-line-paper); }

/* Mobil-Menu (Kundenwunsch 2026-08-14, Konzept-Artifact bestaetigt) - wie
   .pub-nav-drop oben ein natives <details>, KEIN JS. Nur unterhalb 640px
   sichtbar (siehe Media-Query weiter unten), ersetzt dort das komplett
   ausgeblendete .pub-nav-links. .pub-nav-right buendelt Menu-Knopf +
   "Anmelden" zu EINEM Flex-Kind von .pub-nav, damit justify-content:
   space-between auf Mobil (.pub-nav-links faellt weg) weiterhin nur
   zwischen Marke und dieser Gruppe aufteilt statt den Menu-Knopf in die
   Mitte zu ruecken. */
.pub-nav-right { display: flex; align-items: center; gap: 10px; }
.pub-mobile-nav { display: none; position: relative; }
.pub-mobile-nav-toggle {
    display: flex; align-items: center; justify-content: center;
    width: 36px; height: 36px; border-radius: var(--r-md); border: 1px solid var(--pub-line-paper);
    background: var(--pub-paper2); color: var(--pub-ink); cursor: pointer; list-style: none;
    transition: background 0.15s ease, border-color 0.15s ease;
}
.pub-mobile-nav-toggle::-webkit-details-marker { display: none; }
.pub-mobile-nav-icon { width: 18px; height: 18px; }
/* Reiner CSS-Morph (Hamburger -> X) ueber den nativen details[open]-
   Zustand - kein JS noetig, gleiche Linien-Idee wie .mobile-nav-icon im
   eingeloggten Bereich (dort per Alpine-Klasse gebunden). */
.pub-mobile-nav-icon .line { transition: transform 0.15s ease, opacity 0.15s ease; transform-origin: 12px 12px; }
.pub-mobile-nav[open] .pub-mobile-nav-toggle { background: var(--pub-ink); border-color: var(--pub-ink); color: var(--on-dark); }
.pub-mobile-nav[open] .pub-mobile-nav-icon .line-top { transform: translateY(5px) rotate(45deg); }
.pub-mobile-nav[open] .pub-mobile-nav-icon .line-mid { opacity: 0; }
.pub-mobile-nav[open] .pub-mobile-nav-icon .line-bottom { transform: translateY(-5px) rotate(-45deg); }
.pub-mobile-nav-panel {
    position: absolute; top: calc(100% + 12px); right: 0; min-width: 220px;
    display: flex; flex-direction: column; gap: 1px;
    background: var(--pub-paper2); border: 1px solid var(--pub-line-paper); border-radius: var(--r-md);
    box-shadow: 0 20px 40px -16px rgba(0, 0, 0, 0.35); padding: 8px; z-index: 30;
}
.pub-mobile-nav-panel a { display: block; color: var(--pub-ink); text-decoration: none; padding: 11px 12px; border-radius: var(--r-md); font-size: var(--fs-sm); font-weight: 700; }
.pub-mobile-nav-panel a:hover { background: var(--pub-line-paper); }
.pub-mobile-nav-panel a.sub { font-weight: 600; font-size: var(--fs-xs); padding-left: 24px; }
.pub-mobile-nav-panel a.current { background: rgba(224, 145, 63, 0.16); color: #a3611c; }
.pub-mobile-nav-panel .pub-mobile-nav-label { display: block; padding: 8px 12px 2px; font-size: var(--fs-2xs); font-weight: 800; text-transform: uppercase; letter-spacing: 0.04em; color: var(--pub-dim); }
.pub-mobile-nav-panel hr { border: none; border-top: 1px solid var(--pub-line-paper); margin: 4px 6px; }

.pub-hero { background: var(--pub-ink); color: var(--on-dark); padding: 76px 32px 90px; position: relative; overflow: hidden; }
.pub-hero-grid { max-width: 1160px; margin: 0 auto; display: grid; grid-template-columns: 1.05fr 0.95fr; gap: 50px; align-items: center; }
.pub-eyebrow-tag { display: inline-flex; align-items: center; gap: 8px; background: var(--pub-amber); color: var(--pub-amber-ink); font-weight: 900; font-size: var(--fs-xs); letter-spacing: 0.04em; text-transform: uppercase; padding: 6px 12px; border-radius: var(--r-2xs); margin-bottom: 24px; }
.pub-hero-h { font-size: var(--fs-3xl); line-height: 1.04; font-weight: 900; letter-spacing: -0.015em; margin: 0 0 22px; text-wrap: balance; }
.pub-hero-h .accent { color: var(--pub-amber); }
.pub-hero-sub { font-size: var(--fs-lg); line-height: 1.6; color: rgba(255, 255, 255, 0.72); max-width: 46ch; margin: 0 0 32px; }
.pub-hero-ctas { display: flex; gap: 14px; flex-wrap: wrap; margin-bottom: 26px; }
.pub-btn-amber { background: var(--pub-amber); color: var(--pub-amber-ink); font-weight: 900; font-size: var(--fs-md); padding: 15px 26px; border-radius: var(--r-xs); text-decoration: none; border: none; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; font-family: inherit; }
.pub-btn-amber:hover { box-shadow: 0 8px 20px -8px var(--pub-amber); }
.pub-btn-outline { border: 2px solid rgba(255, 255, 255, 0.35); color: var(--on-dark); font-weight: 800; font-size: var(--fs-md); padding: 13px 24px; border-radius: var(--r-xs); text-decoration: none; }
.pub-hero-price { font-size: var(--fs-sm); color: rgba(255, 255, 255, 0.55); font-weight: 600; }
.pub-hero-price b { color: var(--on-dark); }

.pub-hero-visual { background: var(--pub-paper2); border-radius: var(--r-sm); padding: 22px; color: var(--pub-ink); box-shadow: 0 30px 60px -20px rgba(0, 0, 0, 0.5); }
.pub-hv-row { display: flex; justify-content: space-between; align-items: center; padding: 12px 4px; border-bottom: 1px solid var(--pub-line-paper); font-size: var(--fs-sm); }
.pub-hv-row:last-child { border: none; }
.pub-hv-name { font-weight: 800; }
.pub-hv-sub { color: var(--pub-dim); font-size: var(--fs-xs); }
.pub-hv-pill { font-size: var(--fs-2xs); font-weight: 900; padding: 4px 9px; border-radius: var(--r-2xs); }
.pub-hv-pill.run { background: rgba(58, 125, 92, 0.16); color: var(--accent); }
.pub-hv-pill.pause { background: rgba(224, 145, 63, 0.18); color: var(--pub-amber); }

.pub-trust { background: var(--pub-ink); border-top: 1px solid var(--pub-line-dark); padding: 20px 32px 54px; }
.pub-trust-row { max-width: 1160px; margin: 0 auto; display: flex; gap: 34px; flex-wrap: wrap; color: rgba(255, 255, 255, 0.55); font-size: var(--fs-xs); font-weight: 700; }
/* Symbol und Text auf einer Grundlinie - Emoji brachten ihre eigene
   Groesse mit, die Strichzeichnungen bekommen sie hier zugewiesen. */
.pub-trust-row span { display: inline-flex; align-items: center; gap: var(--sp-2); }
.pub-trust-row svg { width: 16px; height: 16px; flex-shrink: 0; color: var(--accent); }

.pub-feat { padding: 84px 32px; background: var(--pub-paper); color: var(--pub-ink); }
.pub-feat-head { max-width: 1160px; margin: 0 auto 46px; }
.pub-feat-head .eyebrow { font-weight: 900; font-size: var(--fs-xs); letter-spacing: 0.06em; text-transform: uppercase; color: var(--accent); margin-bottom: 10px; }
.pub-feat-head h2 { font-size: var(--fs-display); font-weight: 900; margin: 0; letter-spacing: -0.01em; text-wrap: balance; max-width: 20ch; }
.pub-feat-grid { max-width: 1160px; margin: 0 auto; display: grid; grid-template-columns: repeat(3, 1fr); gap: 2px; background: var(--pub-line-paper); }
.pub-feat-card { background: var(--pub-paper2); padding: 30px 26px; }
.pub-feat-card .fnum { font-weight: 900; font-size: var(--fs-xs); color: var(--pub-amber); margin-bottom: 14px; }
.pub-feat-card h3 { font-size: var(--fs-lg); font-weight: 900; margin: 0 0 8px; }
.pub-feat-card p { font-size: var(--fs-sm); line-height: 1.6; color: var(--pub-dim); margin: 0; }
.pub-feat-card p a { color: var(--pub-ink); font-weight: 700; text-decoration: underline; }
.pub-feat-head-row { max-width: 1160px; margin: 0 auto 46px; display: flex; align-items: flex-end; justify-content: space-between; gap: 20px; flex-wrap: wrap; }
.pub-feat-head-row .pub-feat-head { margin: 0; }
.pub-feat-more { font-size: var(--fs-sm); font-weight: 800; text-decoration: none; border-bottom: 2px solid var(--pub-amber); padding-bottom: 2px; white-space: nowrap; color: var(--pub-ink); }

/* ---------- "Für wen" (Zielgruppen-Leiste, direkt unter dem Hero) ---------- */
.pub-audience { background: var(--pub-ink); border-top: 1px solid var(--pub-line-dark); padding: 26px 32px 50px; }
.pub-audience-row { max-width: 1160px; margin: 0 auto; display: grid; grid-template-columns: repeat(4, 1fr); gap: 1px; background: var(--pub-line-dark); }
.pub-audience-card { background: var(--pub-ink); padding: 18px 16px; }
.pub-audience-card .mark { width: 8px; height: 8px; background: var(--pub-amber); border-radius: var(--r-2xs); transform: rotate(45deg); margin-bottom: 12px; }
.pub-audience-card h4 { color: var(--on-dark); font-size: var(--fs-md); font-weight: 800; margin: 0 0 4px; }
.pub-audience-card p { color: rgba(255, 255, 255, 0.5); font-size: var(--fs-xs); line-height: 1.5; margin: 0; }

/* ---------- "So funktioniert's" (3 Schritte - genuiner Ablauf, daher
   Nummerierung gerechtfertigt statt reiner Dekoration) ---------- */
.pub-steps { padding: 80px 32px; background: var(--pub-paper); }
.pub-steps-head { max-width: 1160px; margin: 0 auto 44px; text-align: center; }
/* --ok ist die Zustandsfarbe "in Ordnung" (Tuerkis) und stammt aus dem
   abgeloesten Theme "Flow". Als Schmuckfarbe fuer eine Ueberschrift hat
   sie hier nichts zu suchen: sie sagt dem Leser "positiver Zustand", wo
   gar kein Zustand gemeint ist, und stoesst sich mit dem Amber der
   Marke. Die semantischen Verwendungen von --ok (Haken in der
   Vergleichstabelle, positive Kennzahlen) bleiben unveraendert. */
.pub-steps-head .eyebrow { font-weight: 900; font-size: var(--fs-xs); letter-spacing: 0.06em; text-transform: uppercase; color: var(--accent-deep); margin-bottom: 10px; display: block; }
.pub-steps-head h2 { font-size: var(--fs-2xl); font-weight: 900; margin: 0 auto; max-width: 22ch; letter-spacing: -0.01em; text-wrap: balance; }
.pub-steps-row { max-width: 1160px; margin: 0 auto; display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }
.pub-step-card { position: relative; padding-top: 8px; }
.pub-step-num { font-size: var(--fs-3xl); font-weight: 900; color: var(--pub-line-paper); line-height: 1; margin-bottom: 4px; }
.pub-step-card h3 { font-size: var(--fs-lg); font-weight: 900; margin: 0 0 8px; }
.pub-step-card p { font-size: var(--fs-sm); line-height: 1.6; color: var(--pub-dim); margin: 0; }
.pub-step-arrow { position: absolute; top: 20px; right: -28px; font-size: var(--fs-xl); color: var(--pub-line-paper); font-weight: 900; }

/* ---------- Bildschirm-Vorschau (echte, wenn auch vereinfachte
   Nachbildung der Live-App - kein Blindkauf) ---------- */
.pub-screens { padding: 80px 32px; background: var(--pub-ink); }
.pub-screens-head { max-width: 1160px; margin: 0 auto 44px; text-align: center; }
.pub-screens-head .eyebrow { font-weight: 900; font-size: var(--fs-xs); letter-spacing: 0.06em; text-transform: uppercase; color: var(--pub-amber); margin-bottom: 10px; display: block; }
.pub-screens-head h2 { color: var(--on-dark); font-size: var(--fs-2xl); font-weight: 900; margin: 0 auto; max-width: 24ch; letter-spacing: -0.01em; text-wrap: balance; }
.pub-screens-head p { color: rgba(255, 255, 255, 0.6); font-size: var(--fs-md); margin: 12px auto 0; max-width: 50ch; }
.pub-screens-row { max-width: 1160px; margin: 0 auto; display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
.pub-screen-frame { background: var(--pub-paper); border-radius: var(--r-md); overflow: hidden; box-shadow: 0 30px 60px -20px rgba(0, 0, 0, 0.6); }
.pub-screen-chrome { background: var(--pub-paper2); padding: 8px 12px; display: flex; gap: 5px; border-bottom: 1px solid var(--pub-line-paper); }
.pub-screen-chrome span { width: 8px; height: 8px; border-radius: var(--r-circle); background: var(--pub-line-paper); display: block; }
.pub-screen-body { padding: 20px; }
.pub-screen-caption { text-align: center; color: rgba(255, 255, 255, 0.55); font-size: var(--fs-xs); margin-top: 14px; font-weight: 700; }
.pub-mini-topbar { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; }
.pub-mini-brand { display: flex; align-items: center; gap: 6px; font-weight: 900; font-size: var(--fs-2xs); color: var(--pub-ink); }
.pub-mini-brand .dot { width: 6px; height: 6px; background: var(--pub-amber); border-radius: 1px; transform: rotate(45deg); }
.pub-mini-badge { background: rgba(224, 145, 63, 0.18); color: var(--pub-amber); font-size: 9.5px; font-weight: 800; padding: 3px 8px; border-radius: var(--r-pill); }
.pub-mini-panels { display: grid; grid-template-columns: 1.1fr 0.9fr; gap: 12px; }
.pub-mini-panel { background: var(--pub-paper2); border-radius: var(--r-sm); padding: 12px; }
.pub-mini-panel .ptitle { font-size: 10.5px; font-weight: 800; margin-bottom: 8px; display: flex; justify-content: space-between; color: var(--pub-ink); }
.pub-mini-row { display: flex; justify-content: space-between; font-size: 9.5px; padding: 5px 0; border-bottom: 1px solid var(--pub-line-paper); }
.pub-mini-row:last-child { border: none; }
.pub-mini-row .n { font-weight: 700; color: var(--pub-ink); }
.pub-mini-chip { background: var(--pub-line-paper); color: var(--pub-dim); font-size: 8.5px; font-weight: 800; padding: 2px 6px; border-radius: var(--r-pill); }
.pub-mini-chip.ok { background: var(--ok-wash); color: var(--ok); }
.pub-mini-dial { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; height: 100%; }
.pub-mini-clock { font-family: ui-monospace, "SF Mono", Consolas, monospace; font-size: var(--fs-md); font-weight: 800; color: var(--pub-ink); }
.pub-mini-go { width: 44px; height: 44px; border-radius: var(--r-circle); background: var(--pub-ink); color: var(--on-dark); display: flex; align-items: center; justify-content: center; font-size: 8px; font-weight: 900; }
.pub-mini-kpis { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; margin-bottom: 12px; }
.pub-mini-kpi { background: var(--pub-paper2); border-radius: var(--r-sm); padding: 8px; }
.pub-mini-kpi .l { font-size: 7.5px; color: var(--pub-dim); font-weight: 700; text-transform: uppercase; }
.pub-mini-kpi .v { font-size: var(--fs-md); font-weight: 900; margin-top: 2px; color: var(--pub-ink); }
.pub-mini-kpi .v.ok { color: var(--ok); }

/* ---------- FAQ ---------- */
.pub-faq { padding: 80px 32px; background: var(--pub-paper); }
.pub-faq-inner { max-width: 760px; margin: 0 auto; }
.pub-faq-head { text-align: center; margin-bottom: 40px; }
.pub-faq-head .eyebrow { font-weight: 900; font-size: var(--fs-xs); letter-spacing: 0.06em; text-transform: uppercase; color: var(--accent-deep); margin-bottom: 10px; display: block; }
.pub-faq-head h1, .pub-faq-head h2 { font-size: var(--fs-2xl); font-weight: 900; margin: 0; letter-spacing: -0.01em; text-wrap: balance; }
.pub-faq-item { border-bottom: 1px solid var(--pub-line-paper); padding: 22px 0; }
.pub-faq-item h3 { font-size: var(--fs-md); font-weight: 800; margin: 0 0 8px; }
.pub-faq-item p { font-size: var(--fs-sm); line-height: 1.65; color: var(--pub-dim); margin: 0; }

/* ---------- Preisvergleich ---------- */
.pub-compare { padding: 80px 32px; background: var(--pub-paper); }
.pub-compare-head { max-width: 1160px; margin: 0 auto 44px; text-align: center; }
.pub-compare-head .eyebrow { font-weight: 900; font-size: var(--fs-xs); letter-spacing: 0.06em; text-transform: uppercase; color: var(--pub-amber); margin-bottom: 10px; display: block; }
.pub-compare-head h2 { font-size: var(--fs-2xl); font-weight: 900; margin: 0 auto; max-width: 26ch; letter-spacing: -0.01em; text-wrap: balance; }
.pub-compare-grid { max-width: 1000px; margin: 0 auto; display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; align-items: stretch; }
.pub-compare-card { background: var(--pub-paper2); border: 1px solid var(--pub-line-paper); border-radius: var(--r-md); padding: 26px 22px; display: flex; flex-direction: column; }
.pub-compare-card.win { background: var(--pub-ink); border-color: var(--pub-ink); }
.pub-compare-card .ctitle { font-size: var(--fs-sm); font-weight: 800; color: var(--pub-dim); margin-bottom: 4px; }
.pub-compare-card.win .ctitle { color: rgba(255, 255, 255, 0.55); }
.pub-compare-card .cprice { font-size: var(--fs-xl); font-weight: 900; margin-bottom: 18px; color: var(--pub-ink); }
.pub-compare-card.win .cprice { color: var(--pub-amber); }
.pub-compare-card .cprice span { font-size: var(--fs-2xs); font-weight: 700; color: var(--pub-dim); }
.pub-compare-card.win .cprice span { color: rgba(255, 255, 255, 0.55); }
.pub-compare-card ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 10px; flex: 1; }
.pub-compare-card li { font-size: var(--fs-xs); line-height: 1.5; color: var(--pub-dim); padding-left: 18px; position: relative; }
.pub-compare-card.win li { color: rgba(255, 255, 255, 0.8); }
.pub-compare-card li.no::before { content: "✕"; position: absolute; left: 0; color: var(--err); font-weight: 900; }
.pub-compare-card li.yes::before { content: "✓"; position: absolute; left: 0; color: var(--ok); font-weight: 900; }
.pub-compare-card.win li.yes::before { color: var(--pub-amber); }

/* ---------- "Warum uns" ---------- */
.pub-why { padding: 80px 32px; background: var(--pub-paper2); }
.pub-why-inner { max-width: 1160px; margin: 0 auto; }
.pub-why-head { text-align: center; margin-bottom: 44px; }
.pub-why-head .eyebrow { font-weight: 900; font-size: var(--fs-xs); letter-spacing: 0.06em; text-transform: uppercase; color: var(--pub-amber); margin-bottom: 10px; display: block; }
.pub-why-head h2 { font-size: var(--fs-2xl); font-weight: 900; max-width: 26ch; margin: 0 auto; letter-spacing: -0.01em; text-wrap: balance; }
.pub-why-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px; }
.pub-why-card h4 { font-size: var(--fs-md); font-weight: 900; margin: 0 0 8px; }
.pub-why-card p { font-size: var(--fs-xs); line-height: 1.6; color: var(--pub-dim); margin: 0; }

/* ---------- Schluss-CTA (vor dem Footer) ---------- */
.pub-final-cta { background: var(--pub-amber); padding: 60px 32px; text-align: center; }
.pub-final-cta h2 { color: var(--pub-amber-ink); font-size: var(--fs-2xl); font-weight: 900; max-width: 20ch; margin: 0 auto 22px; letter-spacing: -0.01em; text-wrap: balance; }
.pub-final-cta .pub-btn-outline.dark { border-color: var(--pub-ink); color: var(--pub-ink); }
.pub-final-cta .pub-btn-outline.dark:hover { background: var(--pub-ink); color: var(--on-dark); }

/* ---------- Cookie-Consent-Banner (nur sichtbar, wenn im SEO-Reiter
   tatsaechlich Tracking-Code hinterlegt ist - siehe _tracking_body.twig) ---------- */
.pub-cookie-banner { position: fixed; left: 16px; right: 16px; bottom: 16px; z-index: 999; max-width: 640px; margin: 0 auto; background: var(--pub-ink); color: var(--on-dark); border-radius: var(--r-md); padding: 18px 20px; box-shadow: 0 20px 50px -10px rgba(0, 0, 0, 0.55); display: flex; flex-direction: column; gap: 14px; }
.pub-cookie-banner[hidden] { display: none; }
.pub-cookie-banner p { margin: 0; font-size: var(--fs-xs); line-height: 1.55; color: rgba(255, 255, 255, 0.82); }
.pub-cookie-banner p a { color: var(--on-dark); }
.pub-cookie-banner-actions { display: flex; gap: 10px; justify-content: flex-end; flex-wrap: wrap; }
.pub-cookie-btn { font-family: inherit; font-size: var(--fs-xs); font-weight: 800; padding: 9px 16px; border-radius: var(--r-sm); border: 1px solid rgba(255, 255, 255, 0.3); background: transparent; color: var(--on-dark); cursor: pointer; }
.pub-cookie-btn.accent { border: none; background: var(--pub-amber); color: var(--pub-amber-ink); }

/* ---------- /funktionen ---------- */
.pub-fn-hero { background: var(--pub-ink); color: var(--on-dark); padding: 56px 32px 46px; text-align: center; }
.pub-fn-hero .eyebrow { font-weight: 900; font-size: var(--fs-xs); letter-spacing: 0.06em; text-transform: uppercase; color: var(--pub-amber); margin-bottom: 12px; display: block; }
.pub-fn-hero h1 { font-size: var(--fs-display); font-weight: 900; max-width: 24ch; margin: 0 auto 14px; letter-spacing: -0.015em; text-wrap: balance; }
.pub-fn-hero p { color: rgba(255, 255, 255, 0.65); font-size: var(--fs-md); max-width: 56ch; margin: 0 auto; }
.pub-fn-list { max-width: 900px; margin: 0 auto; padding: 60px 32px 80px; }
.pub-fn-item { display: grid; grid-template-columns: 60px 1fr; gap: 24px; padding: 34px 0; border-bottom: 1px solid var(--pub-line-paper); }
.pub-fn-item:last-child { border-bottom: none; }
.pub-fn-num { font-size: var(--fs-sm); font-weight: 900; color: var(--pub-amber); padding-top: 4px; }
.pub-fn-item h2 { font-size: var(--fs-xl); font-weight: 900; margin: 0 0 10px; letter-spacing: -0.01em; }
.pub-fn-item .lede { font-size: var(--fs-md); line-height: 1.65; color: var(--pub-ink); margin: 0 0 14px; max-width: 62ch; }
.pub-fn-bullets { list-style: none; padding: 0; margin: 0; display: flex; flex-wrap: wrap; gap: 8px 18px; }
/* Die Raute sitzt absolut, der Text bleibt EIN Textfluss.
   15.09.2026: hier stand "display: flex; align-items: center; gap: 6px"
   auf dem li selbst. Dann ist aber jedes Kind ein Flex-Element - auch
   ein <strong> mitten im Satz. Aus "Passwoerter mit <strong>Argon2id</strong>
   gehasht" wurden drei Spalten mit Luecken dazwischen, auf dem Telefon
   unlesbar. Aufgefallen auf /sicherheit, weil das die erste Seite ist,
   die in diesen Aufzaehlungen hervorhebt; die aelteren Seiten kamen ohne
   Auszeichnung aus und sahen deshalb richtig aus. */
.pub-fn-bullets li { font-size: var(--fs-xs); color: var(--pub-dim); font-weight: 600; position: relative; padding-left: 12px; }
.pub-fn-bullets li::before { content: ""; position: absolute; left: 0; top: 0.42em; width: 6px; height: 6px; background: var(--pub-amber); border-radius: 1px; transform: rotate(45deg); }

.pub-price { background: var(--pub-ink); color: var(--on-dark); padding: 80px 32px; text-align: center; }
.pub-price-box { max-width: 480px; margin: 0 auto; background: rgba(255, 255, 255, 0.06); border: 1px solid var(--pub-line-dark); border-radius: var(--r-md); padding: 40px; }
.pub-price-box .amount { font-size: var(--fs-3xl); font-weight: 900; }
.pub-price-box .amount span { font-size: var(--fs-md); font-weight: 700; color: rgba(255, 255, 255, 0.6); }
.pub-price-box ul { list-style: none; padding: 0; margin: 22px 0 28px; text-align: left; display: flex; flex-direction: column; gap: 10px; font-size: var(--fs-sm); color: rgba(255, 255, 255, 0.85); }
.pub-price-box li::before { content: "✓ "; color: var(--pub-amber); font-weight: 900; }

.pub-addon-row { max-width: 480px; margin: 28px auto 0; display: flex; gap: 14px; flex-wrap: wrap; }
.pub-addon-card { flex: 1; min-width: 190px; background: rgba(255, 255, 255, 0.04); border: 1px solid var(--pub-line-dark); border-radius: var(--r-md); padding: 20px; text-align: left; }
.pub-addon-card .label { font-size: var(--fs-2xs); font-weight: 800; letter-spacing: 0.06em; text-transform: uppercase; color: var(--pub-amber); margin-bottom: 8px; }
.pub-addon-card h3 { font-size: var(--fs-md); font-weight: 800; margin: 0 0 6px; }
.pub-addon-card p { font-size: var(--fs-xs); line-height: 1.5; color: rgba(255, 255, 255, 0.65); margin: 0 0 14px; }
.pub-addon-card .price { font-size: var(--fs-lg); font-weight: 800; }
.pub-addon-card .price span { font-size: var(--fs-xs); font-weight: 600; color: rgba(255, 255, 255, 0.55); }

.pub-footer { padding: 34px 32px; text-align: center; font-size: var(--fs-xs); color: var(--pub-dim); background: var(--pub-paper); }
.pub-footer a { color: var(--pub-dim); }

/* Login/Registrieren: kompaktere Auth-Karte statt der vollen Hero-Seite */
.pub-auth-wrap { min-height: 100vh; display: flex; align-items: center; justify-content: center; background: var(--pub-ink); padding: 40px 20px; }
.pub-auth-card { max-width: 400px; width: 100%; background: var(--pub-paper2); border-radius: var(--r-md); padding: 34px 32px; box-shadow: 0 30px 70px -24px rgba(0, 0, 0, 0.6); color: var(--pub-ink); }
.pub-auth-card .pub-brand { margin-bottom: 22px; color: var(--pub-ink); }
.pub-auth-card h1 { font-size: var(--fs-xl); font-weight: 900; margin: 0 0 8px; letter-spacing: -0.01em; }
.pub-auth-card p.sub { color: var(--pub-dim); font-size: var(--fs-sm); margin: 0 0 22px; line-height: 1.5; }
.pub-auth-card label { color: var(--pub-dim); }
.pub-auth-card .pub-btn-amber { width: 100%; margin-top: 6px; }
.pub-auth-foot { text-align: center; margin-top: 18px; font-size: var(--fs-xs); color: var(--pub-dim); }
.pub-auth-foot a { color: var(--pub-ink); font-weight: 700; }

/* Registrieren: zweispaltig (dunkle Pitch-Seite + helle Formular-Karte) */
.pub-split-wrap { min-height: 100vh; display: grid; grid-template-columns: 1.1fr 0.9fr; }
.pub-split-pitch { background: var(--pub-ink); color: var(--on-dark); padding: 56px 44px; display: flex; flex-direction: column; justify-content: center; gap: 20px; }
.pub-split-pitch h1 { font-size: var(--fs-display); line-height: 1.1; font-weight: 900; letter-spacing: -0.015em; margin: 0; text-wrap: balance; }
.pub-split-pitch h1 .accent { color: var(--pub-amber); }
.pub-split-pitch p.lede { font-size: var(--fs-md); line-height: 1.6; color: rgba(255, 255, 255, 0.72); margin: 0; max-width: 44ch; }
.pub-split-form { display: flex; align-items: center; justify-content: center; padding: 40px 24px; background: var(--pub-paper); }
.pub-split-form .pub-auth-card { box-shadow: 0 20px 50px -18px rgba(0, 0, 0, 0.25); }

.pub-checkline { display: flex; align-items: flex-start; gap: 8px; font-size: var(--fs-xs); color: var(--pub-dim); font-weight: 400; line-height: 1.5; }
.pub-checkline input { margin-top: 2px; }
.pub-checkline a { color: var(--pub-dim); }
.pub-honeypot { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

.result-icon { width: 52px; height: 52px; border-radius: var(--r-circle); display: flex; align-items: center; justify-content: center; margin: 0 auto 16px; font-size: var(--fs-xl); font-weight: 900; }
.result-icon.ok { background: var(--ok-wash); color: var(--ok); }
.result-icon.cancel { background: var(--err-wash); color: var(--err); }
.result-icon.pause { background: var(--warn-wash); color: var(--warn); }

@media (max-width: 900px) {
    .pub-hero-h { font-size: var(--fs-display); }
    /* Vorher als Inline-Style direkt im Template gesetzt (kein Class-Hook,
       also fuer JEDE Media-Query unerreichbar) - die Zwei-Spalten-
       Anordnung (Text + "Gerade unterwegs"-Karte) presste sich dadurch auf
       schmalen Bildschirmen in zwei viel zu schmale Spalten statt
       untereinander zu stehen. Jetzt eine echte Klasse, hier gezielt auf
       eine Spalte reduzierbar. */
    .pub-hero-grid { grid-template-columns: 1fr; gap: 32px; }
    .pub-feat-grid { grid-template-columns: 1fr; }
    .pub-feat-head-row { flex-direction: column; align-items: flex-start; gap: 10px; }
    .pub-split-wrap { grid-template-columns: 1fr; }
    .pub-split-pitch { padding: 40px 28px; }
    .pub-audience-row { grid-template-columns: repeat(2, 1fr); }
    .pub-steps-row { grid-template-columns: 1fr; gap: 30px; }
    .pub-step-arrow { display: none; }
    .pub-screens-row { grid-template-columns: 1fr; }
    .pub-compare-grid { grid-template-columns: 1fr; max-width: 420px; }
    .pub-why-grid { grid-template-columns: repeat(2, 1fr); }
    .pub-fn-hero h1 { font-size: var(--fs-2xl); }
    .pub-fn-item { grid-template-columns: 1fr; gap: 8px; }
}

@media (max-width: 480px) {
    .pub-audience-row { grid-template-columns: 1fr; }
    .pub-why-grid { grid-template-columns: 1fr; }
    .pub-final-cta h2 { font-size: var(--fs-xl); }
}

@media (max-width: 880px) {
    /* Das volle Hauptmenue (.pub-nav-links) waere zusammen mit Marke +
       "Anmelden"-Knopf in einer Zeile eng/ueberlappend - wird deshalb
       ausgeblendet, Marke + Anmelden bleiben (auf der oeffentlichen
       Startseite die wichtigste Aktion). Seit 2026-08-14 (Kundenwunsch,
       Konzept-Artifact bestaetigt) bleiben alle Seiten trotzdem ueber den
       neuen .pub-mobile-nav-Menu-Knopf erreichbar - vorher gab es dafuer
       KEINEN Ersatz. 880px statt 640px (Kundenwunsch direkt nach dem
       ersten Upload: "ab tablet größe") - derselbe Breakpoint wie das
       bestehende Burger-Menu im eingeloggten Bereich (siehe .mobile-nav
       weiter unten), greift also schon ab Tablet-Breite, nicht erst ab
       Handy-Breite. */
    .pub-nav-links { display: none; }
    .pub-mobile-nav { display: block; }
}

/* Kleine Zwischenueberschrift im Burger-Menue ("Konto") - trennt die
   Navigationsziele von den Konto-Links darunter. */
.mobile-nav-trenner {
    display: block;
    padding: 12px 14px 4px;
    font-size: var(--fs-2xs);
    font-weight: 700;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--text-dim);
    border-top: 1px solid var(--line);
    margin-top: var(--sp-2);
}

/* ---------- Rechtstexte: /agb, /widerruf, /auftragsverarbeitung ----------
   Lange Fliesstexte, die jemand wirklich liest (oder im Streitfall
   lesen MUSS). Deshalb eine schmalere Spalte als bei den Verkaufsseiten
   (~72 Zeichen statt der vollen Breite) und mehr Zeilenabstand -
   Rechtstexte ueber die volle Fensterbreite sind der Grund, warum
   niemand sie liest. Palette und Tokens wie bei den uebrigen
   oeffentlichen Seiten, damit es nicht nach einer fremden Seite
   aussieht. */
.pub-rechtstext { max-width: 760px; margin: 0 auto; padding: 64px 32px 88px; background: var(--pub-paper); }
.pub-rechtstext h1 { font-size: var(--fs-2xl); font-weight: 900; margin: 10px 0 16px; letter-spacing: -0.01em; text-wrap: balance; }
.pub-rechtstext h2 { font-size: var(--fs-lg); font-weight: 800; margin: 38px 0 10px; padding-top: 18px; border-top: 1px solid var(--pub-line-paper); }
.pub-rechtstext h3 { font-size: var(--fs-md); font-weight: 800; margin: 24px 0 8px; }
.pub-rechtstext p { font-size: var(--fs-sm); line-height: 1.75; color: var(--pub-dim); margin: 0 0 12px; }
.pub-rechtstext a { color: var(--accent-deep); }
.pub-rechtstext .pub-lead { font-size: var(--fs-md); line-height: 1.7; color: var(--pub-ink); margin-bottom: 26px; }

.pub-liste { list-style: none; padding: 0; margin: 0 0 14px; display: flex; flex-direction: column; gap: 9px; }
.pub-liste li { font-size: var(--fs-sm); line-height: 1.65; color: var(--pub-dim); padding-left: 18px; position: relative; }
.pub-liste li::before { content: "·"; position: absolute; left: 4px; font-weight: 900; color: var(--pub-amber); }

/* Herausgehobener Block - die Widerrufsbelehrung und das
   Muster-Formular muessen sich vom umgebenden Text abheben, das
   verlangt schon die Form. */
.pub-kasten { background: var(--pub-paper2); border: 1px solid var(--pub-line-paper); border-left: 3px solid var(--pub-amber); border-radius: var(--r-md); padding: 20px 22px; margin: 18px 0 22px; }
.pub-kasten h3 { margin-top: 0; }
.pub-kasten p:last-child { margin-bottom: 0; }

.pub-muster { font-family: ui-monospace, "SF Mono", Consolas, monospace; font-size: 12.5px; line-height: 1.6; white-space: pre-wrap; background: var(--pub-paper); border: 1px solid var(--pub-line-paper); border-radius: var(--r-md); padding: 16px; margin: 0; overflow-x: auto; color: var(--pub-ink); }

.pub-hinweis { font-size: var(--fs-xs) !important; color: var(--pub-dim); font-style: italic; }

/* overflow-x am Container und nicht an der Tabelle: eine Tabelle mit
   eigenem overflow verliert ihre Zeilenumbrueche. Auf schmalen Geraeten
   scrollt der Kasten, die Seite nicht. */
.pub-preistabelle { width: 100%; border-collapse: collapse; margin: 6px 0 18px; display: block; overflow-x: auto; }
.pub-preistabelle th, .pub-preistabelle td { text-align: left; font-size: var(--fs-sm); padding: 9px 12px; border-bottom: 1px solid var(--pub-line-paper); color: var(--pub-dim); }
.pub-preistabelle th { font-weight: 800; color: var(--pub-ink); white-space: nowrap; }
.pub-preistabelle td.num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }

.pub-rechtstext-fuss { margin-top: 34px !important; padding-top: 18px; border-top: 1px solid var(--pub-line-paper); font-size: var(--fs-xs) !important; }

@media (max-width: 640px) {
    .pub-rechtstext { padding: 40px 20px 64px; }
}

/* ---------- Erste Schritte (gefuehrter Einstieg) ----------
   Eine Liste zum Abhaken, keine Tabelle: jeder Eintrag traegt
   Ueberschrift, Erklaerung, Knopf und Zustand. Aufgebaut aus den
   vorhandenen Tokens, damit sie nicht wie eine fremde Seite wirkt. */
.fortschritt-schiene { height: 8px; border-radius: var(--r-pill); background: var(--line); overflow: hidden; margin-top: 4px; }
.fortschritt-balken { height: 100%; background: var(--accent); border-radius: var(--r-pill); transition: width .25s ease; }
.fortschritt-balken.fertig { background: var(--ok); }

.schritt-liste { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }
.schritt { display: flex; gap: 14px; padding: 16px 0; border-bottom: 1px solid var(--line); align-items: flex-start; }
.schritt:last-child { border-bottom: none; padding-bottom: 0; }
.schritt:first-child { padding-top: 4px; }

/* Erledigtes bleibt LESBAR. Es nur auszugrauen waere bequem, aber wer
   nachsieht, was er schon getan hat, will es auch lesen koennen -
   deshalb nur die Ueberschrift zurueckgenommen, nicht der ganze Block. */
.schritt.erledigt h3 { color: var(--text-dim); text-decoration: line-through; text-decoration-thickness: 1px; }

.schritt-haken { flex-shrink: 0; padding-top: 2px; }
.schritt-haken form { margin: 0; }

.schritt-knopf {
    width: 24px; height: 24px; border-radius: 6px; cursor: pointer;
    border: 2px solid var(--line-strong); background: var(--paper);
    display: flex; align-items: center; justify-content: center;
    color: #fff; padding: 0;
}
.schritt-knopf:hover { border-color: var(--accent); }
.schritt-knopf.an { background: var(--accent); border-color: var(--accent); }
.schritt-knopf svg { width: 14px; height: 14px; }

/* Automatisch erkannt: sieht aus wie ein gesetzter Haken, ist aber
   kein Knopf - er laesst sich nicht abwaehlen, weil beim naechsten
   Laden ohnehin wieder dastuende, was die Anwendung sieht. */
.schritt-erkannt {
    width: 24px; height: 24px; border-radius: 6px;
    background: var(--ok); color: #fff;
    display: flex; align-items: center; justify-content: center;
}
.schritt-erkannt svg { width: 14px; height: 14px; }

.schritt-text { flex: 1; min-width: 0; }
.schritt-text h3 { font-size: var(--fs-md); font-weight: 800; margin: 0 0 4px; }
.schritt-text p { font-size: var(--fs-sm); line-height: 1.6; color: var(--text-dim); margin: 0 0 8px; }
.schritt-fuss { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; font-size: var(--fs-xs); }

@media (max-width: 640px) {
    .schritt { gap: 10px; }
}

/* ---------- Leaderboard (Monatsauswertung Team) ---------- */
.leaderboard { display: flex; flex-direction: column; gap: 10px; }
.leaderboard-row { display: grid; grid-template-columns: 1fr 90px; align-items: center; gap: 12px; }
.leaderboard-row .name { font-size: var(--fs-sm); font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.leaderboard-row .bar-track { height: 10px; }
.leaderboard-row .h { font-size: var(--fs-sm); text-align: right; }

/* ---------- Avatar-Variante (Auswertung Konzept A) - eigener
   Modifier statt Aenderung der Basis-.leaderboard-row oben, damit
   plattform_umsatz.twig/plattform_statistik.twig (nutzen dieselbe
   Basis-Klasse ohne Avatar-Spalte) unveraendert bleiben. ---------- */
.leaderboard-row.with-avatar { grid-template-columns: 28px 1fr 90px; }
.leaderboard-avatar { width: 28px; height: 28px; border-radius: var(--r-pill); background: var(--text); color: var(--paper); font-size: var(--fs-2xs); font-weight: 800; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.leaderboard-avatar.rank1 { background: var(--accent-deep); }

/* ---------- Rang-Nummer-Variante (Plattform-Statistik Konzept A) -
   fuer Ranglisten ohne Personenbezug (z.B. meistbesuchte Seiten), wo
   ein Initialen-Avatar keinen Sinn ergibt. ---------- */
.leaderboard-row.with-rank { grid-template-columns: 22px 1fr 60px; }
.leaderboard-rank { font-size: var(--fs-xs); font-weight: 800; color: var(--accent-deep); text-align: center; }
.leaderboard-rank.rank1 { color: var(--on-dark); background: var(--accent-deep); border-radius: var(--r-pill); width: 20px; height: 20px; display: flex; align-items: center; justify-content: center; margin: 0 auto; }

.leergrid { color: var(--text-dim); font-size: var(--fs-sm); padding: 6px 0; }

/* ---------- Note / Hinweis (Flash) ---------- */
.hinweis {
    padding: 12px 16px;
    border-radius: var(--r-lg);
    margin-bottom: 16px;
    font-size: var(--fs-sm);
    overflow-wrap: break-word;
    word-break: break-word;
}
.hinweis-success { background: var(--ok-wash); color: var(--ok); }
.hinweis-danger { background: var(--err-wash); color: var(--err); }
.hinweis-warning { background: var(--warn-wash); color: var(--warn); }

.note {
    margin-top: 24px;
    padding: 14px 18px;
    border-radius: var(--r-lg);
    background: var(--accent-wash);
    color: var(--text);
    font-size: var(--fs-xs);
    line-height: 1.5;
    border: 1px dashed var(--accent-soft);
}
.note b { color: var(--accent); }

/* ---------- Leerzustaende und Hinweise ----------

   .leer traegt in dieser Anwendung ZWEI Rollen: echte Leermeldungen
   ("Noch keine Kontakte angelegt.", 61 Stellen) und ruhige Hinweistexte
   ("Nur Mitarbeiter mit Haken werden abgerechnet", 115 Stellen). Beide
   sollen zurueckhaltend aussehen - die Klasse bleibt deshalb, wie sie
   ist, nur mit etwas mehr Luft und einer eigenen Zeilenhoehe, damit
   laengere Hinweise lesbar umbrechen.

   Fuer die Faelle, in denen eine leere Liste den GANZEN Inhaltsbereich
   einer Seite ausmacht, reicht ein grauer Satz am linken Rand nicht: die
   Seite sieht dann aus, als sei etwas schiefgegangen. Dafuer gibt es
   .leerzustand - mittig, mit Symbol und Platz fuer die naechste Aktion.
   Bewusst NICHT ueberall angewandt: in engen Teilpanels waere ein
   grosser mittiger Block schlechter als der eine Satz. */
.leer { color: var(--text-dim); font-size: var(--fs-sm); line-height: 1.5; padding: 10px 0; }

.leerzustand {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    gap: var(--sp-2);
    padding: var(--sp-6) var(--sp-4);
    color: var(--text-dim);
}
.leerzustand-symbol {
    width: 44px;
    height: 44px;
    border-radius: var(--r-circle);
    background: var(--accent-wash);
    color: var(--accent-deep);
    display: flex;
    align-items: center;
    justify-content: center;
    margin-bottom: var(--sp-1);
}
.leerzustand-symbol svg { width: 22px; height: 22px; }
.leerzustand-titel { font-size: var(--fs-md); font-weight: 700; color: var(--text); }
.leerzustand-text { font-size: var(--fs-sm); max-width: 46ch; margin: 0; }
.leerzustand .btn { margin-top: var(--sp-2); }

@media (max-width: 880px) {
    .topbar { padding: 12px 18px; gap: 16px; }
    .topbar-brand .label { display: none; }
    /* .tabs-group (Reiter+Dropdown) weicht dem Burger-Menü - siehe
       .mobile-nav-Regeln oben und layout/base.twig. margin-left:auto auf
       .topbar-right (nicht mehr auf .mobile-nav selbst, siehe Bugfix
       2026-08-11 unten) schiebt die gesamte Gruppe an den rechten Rand,
       statt direkt nach der Marke stehenzubleiben (Kunden-Rückmeldung:
       "auf die rechte Seite sieht besser aus"). */
    .tabs-group { display: none; }
    .topbar-right { margin-left: auto; gap: 10px; }
    .mobile-nav { display: block; }
    .mobile-nav-toggle { display: inline-flex; }
    /* Bugfix 2026-08-11, zweiter Anlauf (erste Version - nur eine
       Breitenbegrenzung auf .sync-badge - reichte laut Kundenmeldung
       nicht: "man sieht mehr als vorher aber nicht alles besser wäre das
       menü würde in der app immer rechts bleiben"). order:3 erzwingt
       jetzt, dass das Burger-Menü IMMER das rechte Ende von .topbar-right
       ist, unabhaengig davon, wie breit user-badge/sync-badge gerade
       sind - die Badges duerfen davor beliebig schrumpfen/abschneiden,
       ohne die Position des Menüs zu beeinflussen. */
    .mobile-nav { order: 3; flex-shrink: 0; }
    .user-badge { order: 1; flex-shrink: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    /* Auf schmalen Geraeten bleibt vom Konto-Bereich nur der Name - die
       Firmenzeile und die beiden Links haetten neben Burger-Menue und
       Sync-Anzeige keinen Platz mehr. Beide Links stehen dafuer im
       Burger-Menue (siehe layout/base.twig, Abschnitt "Konto"). */
    /* Das Konto-Menue bleibt auch auf schmalen Geraeten bedienbar - es
       braucht ohnehin nur die Breite des Namens, der hier zusaetzlich
       frueher abgeschnitten wird. Die beiden Links stehen zusaetzlich im
       Burger-Menue (siehe layout/base.twig, Abschnitt "Konto"). */
    .account { order: 1; flex-shrink: 1; min-width: 0; }
    .account-trigger { max-width: 130px; }
    .sync-badge { order: 2; flex-shrink: 1; min-width: 0; max-width: 110px; overflow: hidden; text-overflow: ellipsis; }
    .main { padding: 28px 20px 48px; }
    /* minmax(0, 1fr) statt nacktem 1fr - ein Grid-Item hat sonst ein
       implizites min-width:auto (= inhaltsbasiert), das schmalen Inhalt
       (z.B. eine lange E-Mail-Adresse in .antrag-row) zwingen kann, die
       GESAMTE Spalte (und damit die ganze Seite) breiter als den
       Viewport zu machen - genau das liess z.B. die Plattform-Seite auf
       dem iPhone trotz korrekter Ellipsis-/Flex-Regeln in den einzelnen
       Komponenten ueberlaufen, weil deren Spalte selbst schon zu breit
       war, bevor diese Regeln je greifen konnten. */
    .grid-asym { grid-template-columns: minmax(0, 1fr); }
    /* Kundenwunsch 2026-08-16: auf der Mitarbeiter-Startseite soll die
       Start/Stopp-Uhr (.hero) IMMER oben stehen, das Wochen-Panel (.stack)
       darunter - im einspaltigen Mobil-Layout folgt die Grid-Reihenfolge
       sonst der HTML-Reihenfolge (Wochen-Panel zuerst). Nur diese eine
       Grid-Instanz betroffen (Team-/Auswertung-Seiten nutzen .grid-asym
       ebenfalls, aber ohne .hero-Kind - der Selektor greift dort nicht). */
    .grid-asym > .hero { order: -1; }
    .rhythm-row { grid-template-columns: 30px 1fr 60px 20px; }
    .leaderboard-row { grid-template-columns: 1fr 80px; }
    .hero { padding: 26px 22px 24px; }
}

@media (max-width: 560px) {
    /* iOS Safari zoomt beim Fokussieren automatisch in ein Eingabefeld
       hinein, wenn dessen Schrift kleiner als 16px ist (fest verdrahtetes
       Browser-Verhalten, keine Einstellung) - bei der Basis-Schriftgroesse
       von 13.5px passierte das bei JEDEM Tippen in ein Formularfeld auf
       dem iPhone. 16px ist der niedrigste Wert, der das verhindert. */
    input[type="datetime-local"], input[type="date"], input[type="time"], input[type="number"], input[type="month"], input[type="text"], input[type="search"], input[type="email"], input[type="password"], select, textarea {
        font-size: var(--fs-lg);
    }
    /* iOS Safari erzwingt bei type="date"/"datetime-local"/"month" sonst
       eine eigene, an der systemweiten Kalenderbedienung orientierte
       Mindestbreite, die die gesetzte CSS-Breite/den Formularrahmen
       ignoriert (bekannter WebKit-Effekt, meldete sich als "Von/Bis
       schaut über den Rahmen hinaus" beim Abwesenheits-Antrag).
       -webkit-appearance:none deaktiviert dieses native Sizing, das Feld
       verhaelt sich danach wie jedes andere Textfeld (width:100%, siehe
       .nachtrag-form-Regel unten). Bewusst nur hier in der Mobil-Media-
       Query, nicht global - am Desktop rendern date-Felder in allen
       Browsern bereits korrekt (per Screenshot-Test geprueft), ein
       globales appearance:none wuerde dort nur das native Kalender-Icon
       unnoetig entfernen. */
    input[type="date"], input[type="datetime-local"], input[type="month"] {
        -webkit-appearance: none;
    }
    .main { padding: 20px 14px 40px; }
    h1 { font-size: var(--fs-xl); }
    .progress-head .clock { font-size: var(--fs-2xl); }
    .panel { padding: 20px 18px 18px; }
    .nachtrag-form { flex-direction: column; align-items: stretch !important; }
    .nachtrag-form input, .nachtrag-form select { width: 100%; }
    .nachtrag-form .btn { width: 100%; justify-content: center; }
    .start-row { flex-direction: column; align-items: stretch; }
    .start-row select { width: 100%; }
    .start-row .btn { width: 100%; justify-content: center; }
    .modal { max-width: none; }
    .rhythm-row { grid-template-columns: 26px 1fr 54px 18px; gap: 6px; }
    .team-grid { grid-template-columns: 1fr; }
    .leaderboard-row { grid-template-columns: 1fr 70px; gap: 8px; }
    /* align-items:flex-start (statt stretch) heisst hier: .who wird NICHT
       mehr automatisch auf die volle Zeilenbreite gestreckt, sondern
       schrumpft/waechst auf seine eigene Inhaltsbreite - die
       flex:1/min-width:0/Ellipsis-Regeln von .who oben greifen nur bei
       flex-direction:row (Hauptachse=horizontal), hier ist die
       Hauptachse aber vertikal. Ohne explizites width:100% konnte eine
       lange E-Mail-Adresse dadurch ungebremst ueber den Bildschirmrand
       hinausragen, obwohl die Ellipsis-Regeln technisch korrekt waren. */
    .antrag-row { flex-direction: column; align-items: flex-start; }
    .antrag-row .who { width: 100%; }
    .antrag-aktionen { width: 100%; }
}
