/* IYLT — Handy- und Tablet-Schicht fuer die App.
 *
 * WAS HIER NICHT PASSIERT: die vorhandenen Ansichten werden nicht angefasst.
 * Mit zwei Ausnahmen (der Knopf und die Verdunkelung, die es vorher gar
 * nicht gab) steht JEDE Regel in einer Mediaquery mit Obergrenze. Auf einem
 * Schreibtischbildschirm aendert diese Datei nichts, auch wenn sie geladen
 * ist. Darum ist es eine eigene Datei und kein Eingriff in die 21 Seiten:
 * das App-Gerippe ist in jede Seite hineinkopiert, ein Eingriff waere
 * einundzwanzigmal derselbe Eingriff gewesen.
 *
 * GEMESSEN, nicht vermutet (tools/mobil_pruefen.mjs, 390 x 844 px):
 *     app.improveyourlaptime.com/        725 px breit   335 px Ueberlauf
 *     app.improveyourlaptime.com/shop    496 px breit   106 px Ueberlauf
 * Ursache beidemal dieselbe: `#side` ist fest 224 px breit und `.main` haelt
 * mit `margin-left:224px` Abstand. Von 390 Pixeln bleiben 166 fuer den
 * Inhalt. Dazu kommt `.top` ohne Umbruch - zwoelf Knoepfe in einer Zeile.
 *
 * ZWEI SCHICHTEN, zwei Grenzen:
 *   bis  760 px  Handy:  Seitenleiste ausfahrbar hinter einem Knopf
 *   761-900 px   Tablet hochkant: Seitenleiste auf Sinnbildbreite
 *   ab   901 px  unveraendert
 *
 * Grenze 760 px: dieselbe, die `web/start.html` schon benutzt. Zwei
 * verschiedene Grenzen im selben Haus sind eine Fehlerquelle.
 * Grenze 900 px: deckt die Tablets im Hochformat ab (iPad 768, Air 820,
 * Pro 11" 834) und laesst alle Querformate sowie das grosse iPad hochkant
 * (1024) in Ruhe - dort sind 224 px von der Breite kein Problem mehr.
 */

/* Der Knopf existiert nur fuer das Handy und ist sonst weg. Die Regel steht
   mit Absicht AUSSERHALB der Mediaquery: so ist er auch dann unsichtbar,
   wenn diese Datei einmal ohne Mediaquery-Unterstuetzung geladen wird. */
.mobil-burger { display: none; }
.mobil-schirm { display: none; }
/* Dasselbe fuer den Filterknopf der Cloud: `cloud.html` haengt ihn immer
   ein, sichtbar ist er nur auf dem Telefon. Und `filt-zu` darf oberhalb
   von 760 px nichts bewirken - deshalb stehen die Einklapp-Regeln
   ausschliesslich in der Mediaquery. */
#filtTg { display: none; }

@media (max-width: 760px) {

  /* ── 1. Seitenleiste: ausfahrbar statt immer sichtbar ──────────────── */
  /* Sie bleibt im Dokument und behaelt ihre Rolle; sie steht nur links
     ausserhalb des Bildes, bis jemand den Knopf drueckt. */

  /* ZUERST aus dem Fluss nehmen. Siebzehn Seiten haben `position:fixed`
     schon in ihrem eigenen CSS - der Viewer (`index.html`) als EINZIGER
     nicht: dort ist `#side` ein Flex-Kind von `#app`. Ein `transform`
     verschiebt es dann zwar aus dem Bild, sein PLATZ bleibt aber stehen.
     GEMESSEN, 2026-11-03: bei 390 px Fensterbreite behielt `.vmain`
     genau 100 px. Die ganze Analyse lag in einem 100 Pixel breiten
     Streifen am rechten Rand.
     Warum es die Messung nicht gefunden hat: die Seite war trotzdem
     390 px breit und lief nicht ueber, weil `.stage{overflow-x:auto}`
     den Rest einfaengt. Seitenbreite in Ordnung, Ansicht unbrauchbar -
     dagegen hilft nur hinsehen. */
  #side {
    position: fixed; top: 0; left: 0; bottom: 0; z-index: 50;
    width: min(78vw, 290px);
    transform: translateX(-100%);
    transition: transform .22s ease;
    box-shadow: 0 0 44px rgba(0, 0, 0, .6);
    will-change: transform;
  }
  #app.mobil-auf #side { transform: none; }

  /* Der Schmalmodus (`.col`, 56 px, nur Sinnbilder) ergibt auf dem Handy
     keinen Sinn: wer die Leiste aufmacht, will die Namen lesen. Deshalb
     werden seine Regeln hier zurueckgenommen. */
  #app.col #side { width: min(78vw, 290px); }
  #app.col .s-logo { display: block; }
  #app.col .s-item { justify-content: flex-start; padding: 9px 10px; gap: 12px; }
  #app.col .s-item .l, #app.col .s-item .tag { display: block; }
  /* Siebzehn Eintraege zu je 30 px — gemessen am 2026-11-04 im geoeffneten
     Menue bei 390 px. Ein Menue ist die eine Stelle, an der ein Fehlgriff
     den Nutzer auf eine voellig andere Seite wirft, also gilt hier das
     volle Mass von 44 px. `.s-nav` hat `overflow-y:auto`, die Liste
     scrollt also einfach weiter — nichts wird unerreichbar. */
  #side .s-item { min-height: 44px; }
  #side .s-legal a { min-height: 30px; display: flex; align-items: center; }
  #app.col .s-top { justify-content: flex-start; padding: 0 14px; }
  #app.col .s-sec { text-align: left; font-size: 10px; padding: 12px 10px 4px; }
  .s-col { display: none; }          /* Einklappknopf: siehe oben */

  /* Der Inhalt bekommt die ganze Breite zurueck. `!important` ist hier
     kein Holzhammer, sondern noetig: `#app.col .main` ist spezifischer als
     `.main`, und beide Faelle muessen auf 0. */
  .main, #app.col .main { margin-left: 0 !important; }

  /* ── 2. Verdunkelung hinter der offenen Leiste ─────────────────────── */
  .mobil-schirm {
    display: block;
    position: fixed; inset: 0;
    background: rgba(0, 0, 0, .55);
    z-index: 49;                      /* unter #side (50), ueber allem sonst */
    opacity: 0; pointer-events: none;
    transition: opacity .22s ease;
  }
  #app.mobil-auf .mobil-schirm { opacity: 1; pointer-events: auto; }

  /* ── 3. Der Knopf ──────────────────────────────────────────────────── */
  .mobil-burger {
    display: inline-flex; align-items: center; justify-content: center;
    width: 38px; height: 38px; flex: none;
    background: var(--elev, #1A1F26); color: var(--text, #ECEEF1);
    border: 1px solid var(--border, #262D36); border-radius: 9px;
    padding: 0; margin-right: 2px;
  }
  .mobil-burger:active { border-color: var(--accent, #FF8C00); }
  /* Mindestens 38 px in jede Richtung: alles darunter trifft man mit dem
     Daumen nicht zuverlaessig. */

  /* ── 4. Kopfzeile ──────────────────────────────────────────────────── */
  .topbar { padding: 0 10px; gap: 8px; }
  .topbar > * { min-width: 0; }
  .topbar h1 {
    font-size: 15px; overflow: hidden;
    text-overflow: ellipsis; white-space: nowrap;
  }
  /* Der Anmeldeknopf stand 63 px zu weit rechts, weil nichts schrumpfen
     durfte. */
  .topbar .btn, .topbar .btn2 { flex: none; }
  .fuel { font-size: 11px; white-space: nowrap; }

  /* ── 5. Inhalt ─────────────────────────────────────────────────────── */
  .wrap { padding: 14px 12px 56px; }
  .grid { grid-template-columns: 1fr; }
  .banner { font-size: 12px; padding: 9px 11px; }

  /* Filterzeilen: die vier Felder haben `min-width:150px` und passen zu
     zweit nicht nebeneinander (2 x 150 + Abstand > 366 nutzbare Pixel).
     Untereinander, jedes ueber die volle Breite. */
  .filters { padding: 10px; gap: 8px; }
  .filters .grow { min-width: 0; flex: 1 1 100%; }
  .filters select, .filters input { width: 100%; }
  .vsw { margin-left: 0; }

  /* Karten duerfen schmaler werden als ihre Entwurfsbreite. */
  .bcard, .card, .pcard { min-width: 0; }

  /* ── 6. Werkzeugleiste des Viewers ─────────────────────────────────── */
  /* Zwoelf Knoepfe passen in keine 390 px, und Umbruch in vier Zeilen
     frisst den halben Bildschirm. Also schiebbar: alles bleibt erreichbar,
     nichts ragt heraus. */
  .top {
    overflow-x: auto; flex-wrap: nowrap;
    scrollbar-width: none; -ms-overflow-style: none;
    padding: 8px 10px;
  }
  .top::-webkit-scrollbar { display: none; }
  .top > * { flex: none; }
  .top .sp { flex: 0 0 2px; }         /* der Fuellplatz wuerde sonst schieben */

  /* Die Leiste traegt seit dem 2026-11-05 benannte Gruppen. Auf dem Desktop
     darf sie umbrechen, HIER NICHT: sie ist schiebbar, und ein `wrap` aus
     der Hauptdatei wuerde den Streifen in mehrere Zeilen zerlegen, von denen
     nur die erste zu sehen waere. Die Regel steht deshalb ausdruecklich
     dagegen.
     Die Gruppentitel (RUNDEN, AUSWERTEN …) entfallen: sie kosten auf 390 px
     Breite, die der Nutzer schieben muss, und die Trennlinien zeigen die
     Gruppen auch ohne Wort. */
  .top { flex-wrap: nowrap !important; row-gap: 0; }
  .top .hgroup { display: inline-flex; align-items: center; gap: 8px; flex: none; }
  .top .hlab { display: none; }
  .top .hsep { margin: 0 2px; }

  /* ── 6a. Die Menues DARIN, und der Preis der schiebbaren Leiste ─────── */
  /*
   * Die schiebbare Leiste hat beide Popover-Menues unbrauchbar gemacht:
   * `#viewMenu` (Ansicht) und `#dispMenu` (Darstellung) liegen als
   * `position:absolute` IN `.top`, und ein `overflow` ausser `visible`
   * KAPPT absolut positionierte Kinder. Gemeldet am 2026-11-04: „kann die
   * Ansicht nicht wechseln, die Streckenkarte liegt ueber dem Menue".
   *
   * Zwei Dinge, beide bei 390 px gemessen:
   * 1. `overflow-y` stand auf `auto`, obwohl hier nur `overflow-x` gesetzt
   *    ist. Die Spezifikation erzwingt das, sobald eine Achse nicht
   *    `visible` ist — also wurde auch nach unten gekappt.
   * 2. `#viewMenu` haengt mit `right:0` an seinem Knopf, und der steht im
   *    seitlich GESCHOBENEN Streifen. Das Menue begann bei x=262 und war
   *    359 px breit, ragte also 231 px aus dem 390 px breiten Bild.
   *    `document.elementFromPoint` in seiner Mitte lieferte NICHTS.
   *
   * Nicht der Stapel war das Problem (das Menue hat z-index:50, die Karte
   * ist ein statisches Element und kann es gar nicht ueberdecken) — es war
   * der Zuschnitt. Deshalb hilft kein hoeherer z-index.
   *
   * `position:fixed` loest beides: es entkommt dem Zuschnitt, weil es sich
   * auf das Fenster bezieht statt auf einen Vorfahren mit `overflow`, und
   * es loest sich vom geschobenen Knopf. Als Tafel von unten ist es auf dem
   * Handy ohnehin besser zu treffen als ein Popover an einem 30 px hohen
   * Knopf am Bildrand.
   *
   * `!important` ist hier Pflicht, nicht Bequemlichkeit: `#viewMenu` setzt
   * seine Masse ueber eine ID-Regel, und die schlaegt jede Klassenregel.
   */
  .vmenu, #viewMenu, #dispMenu {
    position: fixed !important;
    left: max(8px, env(safe-area-inset-left, 0px)) !important;
    right: max(8px, env(safe-area-inset-right, 0px)) !important;
    top: auto !important;
    bottom: max(8px, env(safe-area-inset-bottom, 0px)) !important;
    width: auto !important;
    min-width: 0 !important;
    max-width: none !important;
    max-height: 72vh !important;
    overflow-y: auto;
    /* Unter `#side` (50) und seiner Verdunkelung (49): ein offenes
       Hauptmenue gehoert davor. Ueber allem anderen im Viewer — die
       Schubfaecher liegen bei 20/21, die Modale bei 60 und 2000. */
    z-index: 45 !important;
  }

  /* Sektorleiste unter der Werkzeugleiste: 54 px Einzug plus sechzehn
     Felder mit `flex-shrink:0` ergaben 424 px. Der Einzug richtet die
     Felder an der Karte darueber aus, was auf dem Handy ohnehin nicht
     aufgeht - also weg damit, und die Felder duerfen schrumpfen. */
  #sectorBar, #sectorBar.on { padding-left: 8px; padding-right: 8px; }
  #sectorBar .seg { flex-shrink: 1; min-width: 0; }

  /* Der erklaerende Beisatz neben der Ueberschrift ist Schmuck und hat die
     Fuel-Anzeige aus dem Bild gedraengt. */
  .topbar .sub { display: none; }

  /* ── 6e. Der Filterblock der Cloud klappt ein ──────────────────────── */
  /*
   * GEMESSEN am 2026-11-04 bei 390 px: sieben Quellen-Chips, vier
   * Auswahlfelder, Suche, Outlaps und Stints belegten rund 640 der 844 px,
   * BEVOR die erste Runde zu sehen war. Drei Viertel des Bildschirms fuer
   * die Frage, bevor man die Antwort sieht.
   *
   * Zugeklappt bleibt in der Filterleiste nur der Knopf selbst und die
   * Ansichtsumschalter `.modes` — Liste/Baum/Rangliste sind Navigation,
   * kein Filter. Die Zahl der Einschraenkungen steht im Knopf (siehe
   * `filtBadge` in cloud.html), damit ein eingeklappter Filter nicht still
   * weiterwirkt.
   */
  #filtTg { display: inline-flex; align-items: center; }
  #app.filt-zu #srcChips { display: none; }
  #app.filt-zu .filterbar > *:not(#filtTg):not(.modes) { display: none; }

  /* ── 7. Tabellen ───────────────────────────────────────────────────── */
  /* Eine Tabelle mit sieben Spalten schrumpft nicht auf 390 px. Sie bekommt
     ihren eigenen Schiebebereich, statt die ganze Seite breiter zu machen. */
  .ltbl-huelle, .tabelle-huelle { overflow-x: auto; }
  .ltbl { display: block; overflow-x: auto; white-space: nowrap; }

  /* ── 8. Fenster und Dialoge ────────────────────────────────────────── */
  .modal > div, .mdl, .sheet {
    max-width: calc(100vw - 20px);
    max-height: calc(100dvh - 24px);
  }

  /* ── 9. Knoepfe allgemein und der Feedback-Knopf ───────────────────── */
  /* `.btn` ist der Hauptknopf der App. Gemessen waren die
     „Einloggen"-Knoepfe auf den Seiten ohne Sitzung 35 px hoch - also
     genau die Knoepfe, die ein neuer Besucher als erstes trifft. 40 px
     als Untergrenze, mehr aendert hier nichts am Entwurf.
     NICHT angefasst: Textlinks mitten im Satz („bitte log in"), 21 px
     hoch. Die auf 40 px zu ziehen zerreisst den Satz, in dem sie stehen. */
  .btn { min-height: 40px; }

  .mobil-burger { width: 44px; height: 44px; }

  /* Der runde Feedback-Knopf steht jetzt im 900er-Block: das Verdecken
     passiert auf dem Tablet genauso (gemessen im Shop bei 768 px). */
}


/* ════════════════════════════════════════════════════════════════════════
   TABLET HOCHKANT  (761-900 px)

   Hier ist nichts kaputt - gemessen laeuft keine der Seiten ueber. Es ist
   eine Frage der Aufteilung: die Seitenleiste ist ausgeklappt 224 px breit,
   und das sind auf einem iPad hochkant 29 % des Bildschirms, die dauerhaft
   eine Liste mit zwoelf Woertern zeigen. GEMESSEN blieben dem Inhalt 544 px.

   Ein Knopf wie auf dem Handy waere hier falsch: auf einem Tablet ist Platz
   fuer eine stehende Leiste, und eine stehende Leiste ist ein Fingertipp
   weniger. Also die Sinnbildbreite, die die App ohnehin kennt (`#app.col`,
   56 px) - nur eben nicht als Einstellung, sondern weil der Bildschirm es
   verlangt. Der Inhalt waechst damit von 544 auf 712 px, ein Drittel mehr.
   ════════════════════════════════════════════════════════════════════════ */
@media (min-width: 761px) and (max-width: 900px) {

  /* Siebzehn Seiten rechnen ihren Rand aus `--sw`. Die Variable einmal
     umzusetzen erledigt sie alle - Seitenleiste, Hauptbereich, alles was
     sonst noch daran haengt. */
  :root { --sw: var(--swc, 56px); }

  /* Der Viewer rechnet NICHT mit der Variablen, er schreibt 224 px direkt
     ins `#side`. Deshalb hier noch einmal von Hand. */
  #side { width: 56px; }

  /*
   * WARUM HIER `!important` STEHT - und warum das ausnahmsweise die
   * richtige Wahl ist statt der uebliche Holzhammer:
   *
   * Die Regeln, gegen die hier angetreten wird, stehen an DREI Orten in
   * drei verschiedenen Schreibweisen. Der Viewer schreibt
   * `#app.col #side .s-logo`, die Team-Seite `#app.col .s-logo`, und die
   * Rechtslinks kommen aus `injectLegalFooter()` in shell.js, das sein
   * `<style>` zur LAUFZEIT in den Kopf haengt - also nach dieser Datei,
   * womit es jeden Gleichstand gewinnt.
   * Der Versuch ohne `!important` ist gemacht und gemessen: `.s-logo`
   * blieb sichtbar und stand als abgeschnittenes "I..." in der Ecke.
   * Jede Spezifitaet, die hier reicht, muesste bei der naechsten Seite neu
   * geraten werden. Der Block ist eng begrenzt - eine Breite, eine
   * Leiste -, und darin ist "gilt" die ehrlichere Ansage.
   */
  #side .s-logo { display: none !important; }
  #side .s-top { justify-content: center !important; padding: 0 !important; }
  #side .s-item {
    justify-content: center !important; padding: 9px 0 !important;
    gap: 0 !important;
  }
  #side .s-item .l, #side .s-item .tag { display: none !important; }
  #side .s-sub { display: none !important; }
  #side .s-sec {
    text-align: center !important; font-size: 8px !important;
    padding: 10px 0 2px !important;
  }
  #side .s-legal { padding: 8px 2px !important; }
  #side .s-legal a { text-align: center !important; font-size: 10px !important; }
  #side .s-legal .lf { display: none !important; }
  #side .s-legal .ls { display: block !important; }

  /* Der Einklappknopf muss weg. Er schaltet `#app.col` um, und das hat
     jetzt keine sichtbare Wirkung mehr - ein Knopf, bei dem nichts
     passiert, ist schlimmer als kein Knopf. */
  #side .s-col { display: none !important; }

  /* Die Seitenleiste ist jetzt schmal; ihr Rand ist es auch. Seiten, die
     ihren Abstand fest eingetragen haben statt ueber `--sw`, nachziehen. */
  .main, #app.col .main { margin-left: 56px; }
}


/* ════════════════════════════════════════════════════════════════════════
   TEAM-BEREICH  (bis 900 px, also Handy UND Tablet hochkant)

   Eigener Block, weil die Grenze eine andere ist als oben: hier geht es
   nicht um die Seitenleiste der App, sondern um die ZWEITE Spalte, die
   die Team-Seite selbst aufmacht (`.trail`, 248 px: die Ordner des Teams
   und die Mitgliederliste).

   DER FEHLER, um den es geht: `team.html` hat dafuer bereits eine eigene
   Regel - `@media(max-width:780px){.trail{display:none}}`. Die Spalte
   verschwindet auf dem Handy also ERSATZLOS. Darin stehen aber nicht nur
   Namen, sondern die ORDNER, und die sind die Navigation dieser Seite:
   ohne sie sieht man auf dem Handy genau einen Ordner und kommt in keinen
   anderen. Ein ausgeblendetes Menue ist kein mobiles Layout.

   Also nicht ausblenden, sondern umlegen: aus der linken Spalte wird ein
   Streifen oben mit eigener Hoehe und eigenem Scroll. Die Ordner bleiben
   erreichbar, und der Inhalt darunter bekommt die volle Breite statt 464
   (bei 768 px, nach Abzug von Seitenleiste und Spalte).
   ════════════════════════════════════════════════════════════════════════ */
@media (max-width: 900px) {

  /* `#body` ist der Flex-Kasten mit `.trail` + `.tcenter` nebeneinander. */
  #body { flex-direction: column; }

  .trail {
    display: block;              /* nimmt die 780er-Regel der Seite zurueck */
    width: auto; flex: none;
    border-right: none;
    border-bottom: 1px solid var(--border);
    /* Mehr als ein gutes Drittel des Bildschirms darf die Ordnerliste
       nicht nehmen - darunter steht schliesslich der Inhalt, wegen dem
       man hier ist. Der Rest scrollt. */
    max-height: 34vh;
    overflow-y: auto;
    padding: 10px 12px;


  }

  /* ── Der Viewer: gestapelt ─────────────────────────────────────────── */
  /* Verschoben aus dem Handy-Block am 2026-11-04: bei 768 px ragte das
     Coach-Fenster um bis zu 152 px aus dem Bild (gemessen), und selbst
     ohne es bleiben dem Diagramm von 712 px nur 72. Das Raster quetscht
     auf dem Tablet genauso wie auf dem Telefon - also gilt der Stapel
     jetzt bis 900 px. */
  /*
   * KORREKTUR einer frueheren Entscheidung. Hier stand, Stapeln sei
   * versucht und verworfen worden, weil die Seite dabei von 425 auf 590 px
   * wuchs. Diese Messung war WERTLOS: sie entstand, als `#side` im Viewer
   * noch 290 px Platz wegnahm (siehe Abschnitt 1) und `.vmain` nur 100 px
   * hatte. Unter 100 px macht sich jeder Stapel breit. Mit den echten
   * 390 px sieht die Rechnung anders aus, also wird sie neu gemacht.
   *
   * Das eigentliche Problem war ein anderes: `.stage` ist ein Raster mit
   * `grid-template-columns:300px 1fr 0`. Die 300 px links sind FEST. Von
   * 390 px blieben den Diagrammen 90 - fuenf Kanaele, auf einen
   * fingerbreiten Streifen zusammengedrueckt, und kein Schiebebalken half,
   * weil nichts ueberlief: das Raster hat die Kurven gequetscht, nicht
   * hinausgeschoben. Ein `overflow-x:auto` auf einen gequetschten Inhalt
   * zu setzen, bewegt gar nichts.
   *
   * Also eine Spalte: Karte, dann Infotafel, dann Diagramme - jedes ueber
   * die volle Breite. `!important` schlaegt `.stage.coach` und `.stage.vid`,
   * die eigene Spaltenmasse mitbringen.
   *
   * Eine Telemetrie-Analyse auf 390 px bleibt ein Kompromiss. Aber 390 px
   * breite Kurven kann man lesen, 90 px breite nicht.
   */
  .vmain { margin-left: 0 !important; min-width: 0; }
  .stage, .stage.coach, .stage.vid, .stage.vid.coach {
    grid-template-columns: 1fr !important;
    grid-template-rows: auto auto auto;
    /* `align-content:start` ist hier der entscheidende Teil, nicht Zierrat.
       `.stage` hat ueber `flex:1` eine FESTE Hoehe. Ohne diese Zeile teilen
       sich die drei Zeilen genau diese Hoehe, und weil `.rightcol` unten
       78vh verlangt, blieben der Karte GEMESSEN 72 von 322 px: die Karte
       oben abgeschnitten, die Infotafel gar nicht mehr da. Mit `start`
       nimmt jede Zeile ihre eigene Hoehe, und was nicht passt, scrollt. */
    align-content: start;
    overflow-y: auto; overflow-x: hidden;
  }
  .stage > * { min-width: 0; }
  /* `min-height:0` steht im Seiten-CSS und erlaubt genau das Zusammen-
     quetschen, das wir hier nicht wollen. (`.rightcol` bekommt weiter
     unten seine eigene Mindesthoehe und bleibt deshalb aussen vor.) */
  .leftcol { min-height: auto; }
  /* Die Trennlinie wandert mit: sie trennt jetzt oben/unten, nicht
     links/rechts. */
  .leftcol {
    border-right: none;
    border-bottom: 1px solid var(--border);
  }
  /* Die Karte ist ein Canvas mit fest 300 px. Sie passt in 390, steht aber
     linksbuendig und sieht verloren aus. */
  #map { margin-left: auto; margin-right: auto; }
  /* Die Diagramme brauchen eine Hoehe, sonst fallen sie im Stapel auf das
     zusammen, was `flex:1` von einer Zeile mit `auto`-Hoehe uebrig laesst -
     naemlich nichts. */
  .rightcol { min-height: 78vh; }

  .tcenter { padding: 12px; }

  /* ── Die Kopfzeile: feste 52 px waren zu starr ─────────────────────── */
  /*
   * `.topbar` steht mit `height:52px`, `flex-wrap:nowrap` und
   * `align-items:center` in SECHZEHN Seiten. Passt der Inhalt nicht hinein,
   * wird er wegen `overflow:visible` nicht abgeschnitten, sondern nach oben
   * UND unten herausgedrueckt — also auch ueber den oberen Bildrand hinaus,
   * wo nichts mehr zu sehen ist.
   *
   * Gemessen am 2026-11-04 mit echten Teamdaten: bei 390 px war der Inhalt
   * 73 px hoch, `#thead` reichte von -16 bis 68 und `#tactions` von -21 bis
   * 73. Die erste Zeile des Teamnamens fehlte, und „Manage" schwebte ueber
   * den Ordnern. Zwischen 540 und 900 px waren es noch 2 px.
   *
   * `min-height` statt `height` haelt den Normalfall auf demselben Pixel:
   * die Zeile waechst nur, wenn sie sonst herausragen wuerde. Der
   * Fuellplatz `.sp` hat `flex-basis:0` und erzwingt deshalb KEINEN
   * Umbruch — er schrumpft erst, und erst dann bricht die Zeile um.
   */
  .topbar {
    height: auto;
    min-height: 52px;
    flex-wrap: wrap;
    row-gap: 6px;
    padding-block: 7px;
  }
  /* Ein Chip darf nicht in der MITTE umbrechen. Im Bildschirmfoto stand
     „⛽" am rechten Rand und „12.50" eine Zeile tiefer, der Rahmen war
     mittendurch geschnitten — das sieht nach einem Darstellungsfehler aus,
     obwohl nichts ueberlief. Gefunden nur durch Hinsehen. */
  .topbar .badge, .topbar .stor { white-space: nowrap; }

  /* ── Trefferflaechen: gilt fuer Handy UND Tablet ───────────────────── */
  /*
   * Ein Tablet bedient man mit demselben Daumen. Gemessen am 2026-11-04
   * bei 390 UND 768 px mit ECHTEN Teamdaten (ein Kundenteam mit 8
   * Mitgliedern und 3220 Runden, gelesen statt nachgebaut) - beide Breiten
   * zeigten dieselben dreizehn zu kleinen Flaechen.
   *
   * 44 px ist das Mass, das Apple und Google fuer eine Flaeche nennen, die
   * ein Daumen sicher trifft. Gemessen waren: das „+" fuer einen neuen
   * Ordner 26x21, der Anhang-Knopf 35x35, das Nachrichtenfeld 33 hoch, die
   * Reiter 32, die Auswahlfelder der Filter nur 26.
   */
  .ttab { padding: 11px 14px; font-size: 13px; }
  #addChBtn { min-width: 44px; min-height: 44px; font-size: 18px; line-height: 1; }
  .chatin #attachBtn, .chatin #sendBtn, .chatin #msgIn { min-height: 44px; }
  .chatin #attachBtn { min-width: 44px; }
  /* 40 statt 44 ist ein bewusster Handel: die Kopfzeile bricht auf dem
     Handy ohnehin schon in drei Zeilen um, und jeder Pixel mehr an diesen
     Knoepfen kostet Platz, den der Inhalt braucht. 40 trifft man noch
     sicher, 35 (gemessen) nicht. */
  .topbar .btn, .topbar .btn2, #cloudBtn { min-height: 40px; }
  /* Ein Auswahlfeld ist kein Schmuck, sondern das Werkzeug, mit dem die
     Liste ueberhaupt brauchbar wird. Ankreuzfelder bleiben aussen vor,
     die sollen quadratisch bleiben. */
  .tcenter select,
  .tcenter input:not([type=checkbox]):not([type=radio]),
  .anatab, #aiAllBtn, #rrOpen { min-height: 40px; }
  /*
   * DER FEEDBACK-KNOPF LEGT SICH AUF DIE BEDIENUNG. Er klebt fest unten
   * rechts (`position:fixed`, z-index 9998) und ist mit 105x35 px breit
   * genug, um ganze Bedienelemente zu verdecken. Gemessen am 2026-11-04
   * mit `document.elementFromPoint`: bei 390 px in der Mitte von
   * `#sendBtn` im Team-Chat und von `#anaTrack` im Analyse-Reiter, bei
   * 768 px auf einem Teilen-Knopf im Shop. Nichts lief dabei ueber — kein
   * Mass ausser dem Treffertest findet so etwas.
   *
   * Darum bis 900 px nur noch das Sinnbild in einem runden Knopf: er deckt
   * die Ecke ab statt einer halben Zeile, und die MITTE eines
   * Bedienelements erreicht er nicht mehr. `font-size:0` faltet den Text
   * zusammen, ohne ihn aus dem Dokument zu nehmen — Vorleseprogramme lesen
   * ihn weiter, denn `textContent` bleibt stehen.
   */
  #iylt-fb-btn {
    width: 48px; height: 48px; padding: 0; border-radius: 50%;
    font-size: 0; display: inline-flex;
    align-items: center; justify-content: center;
  }
  #iylt-fb-btn::before { content: "💬"; font-size: 21px; line-height: 1; }

  /* ── Der Viewer ────────────────────────────────────────────────────── */
  /*
   * Die Werkzeugleiste ist seitlich schiebbar, Hoehe kostet hier also
   * nichts ausser Hoehe. Gemessen am 2026-11-04 bei 390 px: ALLE Knoepfe
   * 30x30, die Reiter des Coach-Fensters 34, und das Kreuz, mit dem man
   * eine Runde aus dem Vergleich nimmt, sogar 20x20.
   *
   * Das Kreuz bekommt 36 statt 44: es steht in einer kompakten Zeile je
   * Runde, und 44 wuerde die Liste der Vergleichsrunden auseinanderziehen.
   * 36 trifft man, 20 ist Gluecksache.
   */
  .top .btn, .top .btn2, .aip-tab { min-height: 40px; }
  .top .btn2.ic { min-width: 40px; }
  .mact { min-width: 36px; min-height: 36px; }
  /* Schliess- und Sortierknoepfe im Runden-Fach und im Coach-Fenster. Sie
     liegen bei geschlossenem Fach ausserhalb des Bildes, sind aber beim
     Oeffnen genauso Bedienung wie alles andere - gemessen 24x40, 45x26
     und 27x26. */
  #aipX, #closeDrawer { min-width: 40px; min-height: 40px; }
  #sortToggle { min-height: 40px; }

  /* ── Die Cloud: die dichteste Seite der App ────────────────────────── */
  /*
   * Gemessen am 2026-11-04 bei 390 px: 241 Bedienelemente auf EINEM
   * Telefonbildschirm, davon 221 unter 40 px. Aufgeschluesselt waren das
   * 150 Zeilenknoepfe zu 24x26, 51 Ankreuzfelder zu 16x16, acht
   * Filter-Chips zu 28, vier Auswahlfelder zu 32 und das Suchfeld zu 30.
   */
  button.chip, #outTg, #stintsTg, .tabb, .modes button, #filtTg,
  #delBtn, #pPrev, #pNext,
  #fSim, #fTrack, #fAuto, #fClass, #search, .search { min-height: 40px; }
  .act { min-width: 40px; min-height: 40px; }
  /* Ein Ankreuzfeld von 16 px ist mit dem Daumen Gluecksache. NACHGEMESSEN
     ist die TREFFERFLAECHE aber nicht das Kaestchen, sondern die Zelle:
     51x49 px, und ein Tipp auf ihre Mitte schaltet das Haekchen wirklich
     (gegen die Seite geprueft). Die 24 px sind also Sichtbarkeit, nicht
     Treffsicherheit - das Kaestchen wird groesser, weil man es sehen
     koennen muss, nicht weil man es sonst verfehlt. */
  input.cbx, input.cbAll { width: 24px; height: 24px; }

  /* ── Der Setup-Shop ────────────────────────────────────────────────── */
  /* Gemessen am 2026-11-04: das Auswahlfeld 37 px, die Suche 35, „Reset"
     32, die beiden Ansichtsknoepfe 28 — und je Karte ein Teilen-Knopf zu
     28x28. Der bekommt 36 statt 40: er sitzt als Nebenhandlung in der Ecke
     jeder Karte, und 40 wuerde ihn vor das stellen, worum es geht. */
  #fCar, #fSearch, #fReset, #vCards, #vList { min-height: 40px; }
  .lk { min-width: 36px; min-height: 36px; }

  /* Dass der Feedback-Knopf auf dem Senden-Knopf des Chats lag, ist KEIN
     Handy-Problem - gemessen auch bei 1180 px. Die Regel dagegen steht
     deshalb in `team.html` selbst und gilt in jeder Breite; hier waere sie
     am falschen Ort. */
}
