/* Routenplaner — Gerüst (Etappe 2).
   Farben, Maße und Formen sind aus dem Mockup übernommen (verbindlich nach
   ZIELBILD §0), der Aufbau ist neu geschrieben. */

:root{
  --bg:#faf9f5; --ink:#1d1d1a; --dim:#6b6b62; --line:#dedcd2; --soft:#ecebe3; --sf:#ffffff;
  /* C65 — DER KOPFBALKEN TRÄGT DIE MARKE (Freigabe Matthias 20.09.2026, Palette 1 „Werkstatt"
     behalten, nur der Balken auf das Marken-Obsidian: `#020b07` aus `coreflow-landing`).
     Es sind DREI Tokens und nicht einer: `--head` färbt außer dem Balken zwei weitere dunkle
     Flächen (:791 Toast, :862 Hinweis), und `--head2`/`--head3` (Suchfeld, Pille, Avatar-Rand)
     müssen kühl nachziehen — sonst wirken sie bräunlich auf dem kalten Schwarz.
     Gemessen: Kopftext `#f4f3ee` auf `#020b07` = 17,9:1 (vorher 15,2:1 auf `#1d1d1a`). */
  --head:#020b07; --headfg:#f4f3ee; --head2:#0d1611; --head3:#2a352f;
  --green:#0f7a4d; --greend:#0a5c3a; --greens:#eaf3ee;
  --amber:#a8701f; --ambers:#fbf1e0; --red:#a8324a; --reds:#fbecef;
  --grey:#75746a; --greys:#eeede6;
  /* K2 — eine Farbe je Wochentag Mo–Fr, fest. Nicht je Route. */
  --t1:#2f6f9f; --t2:#2e8b6b; --t3:#bd7a2a; --t4:#7a5aa8; --t5:#b0455f;
  --mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  --sans:system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
  /* Flächenmaße — von den Schiebern zur Laufzeit überschrieben */
  --lw:302px; --rw:322px; --bh:296px; --bl:14px; --br:14px;
  /* Oberkante der seitlichen Flächen: Unterkante der Leiste (56) + 6px Luft. EIN Ort für #pLeft, #pRight,
     die Griffe und die Spalte oben links über der Karte (Zoomleiste, Umkreis-Regler). */
  --fo:62px;
}
*{box-sizing:border-box}
/* `hidden` ist ein Attribut, aber `display:none` ist nur eine Regel — und jede
   spaetere Regel mit `display:flex` gewinnt. Genau daran blieb das Demo-Banner
   nach dem Anmelden sichtbar (gemessen, Assert B4). Ein einziges !important
   hier ist billiger als in jeder Regel daran zu denken. */
[hidden]{display:none !important}
html,body{height:100%}
body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--sans);
  -webkit-font-smoothing:antialiased;overflow:hidden}
button{font-family:inherit}

#buehne{position:fixed;inset:0;overflow:hidden}
#karte{position:absolute;inset:0;z-index:1;background:var(--soft)}
.leaflet-container{background:var(--soft)}

/* ── L1 Leiste: immer sichtbar, schwebend, mittig, dunkel ─────────────── */
.cmd{position:absolute;top:12px;left:50%;transform:translateX(-50%);display:flex;
  align-items:center;gap:7px;background:var(--head);color:var(--headfg);
  border-radius:999px;padding:7px 9px;box-shadow:0 10px 26px rgba(0,0,0,.26);z-index:30}
.logo{appearance:none;border:0;background:transparent;color:inherit;font:inherit;
  font-weight:700;font-size:var(--fs-i,13px);letter-spacing:.03em;padding:6px 9px;border-radius:999px;
  cursor:pointer;display:flex;align-items:center;gap:6px}
.logo:hover{background:var(--head2)}
.logo[aria-pressed="true"]{background:var(--green)}
.searchbox{width:216px;background:var(--head2);border:1px solid var(--head3);
  border-radius:999px;padding:6px 12px;font-size:var(--fs-i,12.5px);color:#e6e4dc;font-family:inherit}
.searchbox::placeholder{color:#a3a199}
.pill{appearance:none;border:1px solid var(--head3);background:transparent;color:#d9d7cf;
  font:inherit;font-size:var(--fs-n,12px);font-weight:600;border-radius:999px;padding:6px 12px;
  cursor:pointer;display:inline-flex;align-items:center;gap:6px}
.pill:hover{background:var(--head2)}
.pill[aria-pressed="true"]{background:var(--green);border-color:var(--green);color:#fff}
.avatar{appearance:none;width:30px;height:30px;border-radius:50%;border:1px solid var(--head3);
  background:transparent;color:inherit;display:grid;place-items:center;font-size:10.5px;
  font-weight:700;cursor:pointer}
.avatar[aria-expanded="true"]{background:var(--green);border-color:var(--green);color:#fff}

/* ── L6 Menü: über allem ──────────────────────────────────────────────── */
.menu{position:absolute;top:54px;right:14px;z-index:31;background:var(--sf);
  border:1px solid var(--line);border-radius:12px;box-shadow:0 16px 40px rgba(29,29,26,.18);
  width:250px;padding:6px}
.menu button{display:flex;width:100%;align-items:center;gap:9px;appearance:none;border:0;
  background:transparent;font:inherit;font-size:var(--fs-i,13px);color:var(--ink);padding:9px 10px;
  border-radius:8px;cursor:pointer;text-align:left}
.menu button:hover,.menu a[data-menu]:hover{background:var(--soft)}
.menu a[data-menu]{display:flex;width:100%;box-sizing:border-box;align-items:center;gap:9px;font-size:var(--fs-i,13px);
  color:var(--ink);padding:9px 10px;border-radius:8px;text-decoration:none}
.menu .mtrenn{height:1px;background:var(--soft);margin:5px 2px}
.menu .mkopf{padding:8px 10px 4px;font-size:var(--fs-n,11.5px);color:var(--dim);line-height:1.45}

/* ── C65 D: Menü A mit Kopf B ──────────────────────────────────────────────
   Breiter als die 250 px von vorher, weil „Mitgliedschaft & Rechnungen" mit
   Symbol und Plakette sonst umbricht — gemessen, nicht geschätzt. */
.menu{width:278px}
.menu [data-menu] svg{width:17px;height:17px;flex:0 0 17px;fill:none;stroke:currentColor;
  stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.menu [data-menu]>span:first-of-type{flex:1 1 auto;min-width:0}
.menu [data-menu]{min-height:38px}
.menu .mgruppe{padding:11px 10px 4px;font-size:var(--fs-n,10.5px);font-weight:700;letter-spacing:.07em;color:var(--dim)}
.menu .mplakette{margin-left:auto;padding:2px 7px;border-radius:999px;font-size:var(--fs-n,10.5px);font-weight:700;
  background:var(--ambers);color:#7c4a12}
.menu .mplakette-bau{background:var(--greys);color:#5c5b52}
.menu .mkopf-konto{display:flex;align-items:center;gap:10px;padding:10px 10px 12px;
  border-bottom:1px solid var(--line);margin-bottom:2px}
.menu .mavatar{width:34px;height:34px;flex:0 0 34px;border-radius:999px;background:var(--greens);
  color:var(--green);display:flex;align-items:center;justify-content:center;font-weight:700;font-size:var(--fs-i,12.5px)}
.menu .mkopftext{display:flex;flex-direction:column;gap:2px;min-width:0}
.menu .mfirma{font-size:var(--fs-i,13px);font-weight:600;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.menu .mpaket{font-size:var(--fs-n,11.5px);color:var(--dim)}
.menu [data-menu="abmelden"]{color:var(--dim)}
/* Hilfe & Kontakt: Titel, darunter Adresse und Antwortzeit in der Nebenfarbe (zwei kleine Zeilen, umbrechend). */
.menu .mhilfe{display:flex;flex-direction:column;gap:1px;padding:4px 0}
.menu .mhilfe small{font-size:var(--fs-n,11.5px);color:var(--dim);line-height:1.35;white-space:normal}

/* ── C65: Reiter „Konto" ───────────────────────────────────────────────── */
.kkopf{margin:0 0 18px}
.ekopf2{margin:0 0 2px;font-size:16px;font-weight:700}
.ksek{margin:0 0 24px;padding:0 0 20px;border-bottom:1px solid var(--soft)}
.ksek:last-child{border-bottom:0;padding-bottom:0}
/* Zwei Karten nebeneinander, das Team über die volle Breite — wie im abgenommenen Entwurf.
   Erst ab 900 px: darunter stünden zwei Spalten mit je 40 Zeichen Zeilenlänge. */
@media (min-width:900px){
  .kraster{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 28px;align-items:start}
  .kraster>.ksek:nth-child(3),.kraster>#konto-daten{grid-column:span 2}
}
.ksek .etitel{margin:0 0 2px}
.kzeile{display:flex;gap:12px;align-items:baseline;padding:7px 0;border-bottom:1px solid var(--soft)}
.klabel{flex:0 0 150px;font-size:var(--fs-n,12px);color:var(--dim)}
.kwert{flex:1 1 auto;min-width:0;font-size:var(--fs-i,13px);color:var(--ink);overflow-wrap:anywhere}
.knote{display:block;font-size:var(--fs-n,11.5px);color:var(--dim);margin-top:2px}
.kknoepfe{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}
.kpaket{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:8px;
  padding:11px 13px;border:1px solid var(--line);border-radius:10px;background:var(--bg)}
.kpaketwort{font-size:var(--fs-i,13.5px);font-weight:700}
.kplakette{flex-shrink:0;padding:3px 9px;border-radius:999px;background:var(--greens);
  color:var(--greend);font-size:var(--fs-n,11.5px);font-weight:700}
.kteamkopf{display:flex;align-items:baseline;justify-content:space-between;gap:12px;flex-wrap:wrap}
.kteamkopf .fnote{margin:0}
/* Der Balken zeigt dieselbe Zahl wie die Zeile darüber — er rechnet sie nicht,
   er bekommt sie (konto.js liest `belegt`/`sitze` aus EINER Antwort). */
.kbalken{display:flex;height:7px;border-radius:999px;background:var(--soft);overflow:hidden;margin:9px 0 4px}
.kbalken-an{background:var(--green)}
.kbalken-ein{background:var(--amber)}
.kliste{width:100%;border-collapse:collapse;margin-top:8px;font-size:var(--fs-i,12.5px)}
.kliste th{text-align:left;font-size:var(--fs-n,11px);color:var(--dim);font-weight:600;padding:0 8px 6px 0;
  border-bottom:1px solid var(--line)}
.kliste td{padding:7px 8px 7px 0;border-bottom:1px solid var(--soft);overflow-wrap:anywhere}
.kliste td.kan{color:var(--greend);font-weight:600}
.kliste td.kein{color:#7c4a12;font-weight:600}
.kliste td.kaus{color:var(--dim)}
.kliste tr.kaus td{color:var(--dim)}

/* ── Suchergebnis-Fläche ──────────────────────────────────────────────── */
.sres{position:absolute;top:52px;left:50%;transform:translateX(-50%);z-index:32;
  width:min(560px,92%);background:var(--sf);border:1px solid var(--line);border-radius:12px;
  box-shadow:0 18px 44px rgba(29,29,26,.22);padding:12px 14px;font-size:var(--fs-i,12.5px);color:var(--dim);
  max-height:420px;overflow:auto}   /* bis M3 inline in suche.js (FLAECHE), dort schlug es die Telefon-Regel */

/* ── Drei Flächen ─────────────────────────────────────────────────────── */
.panel{position:absolute;background:var(--sf);border:1px solid var(--line);border-radius:12px;
  box-shadow:0 10px 30px rgba(29,29,26,.12);z-index:6;display:flex;flex-direction:column;
  overflow:hidden}
/* 62px = Unterkante der Leiste (56) + 6px Luft. Dazu die Höhe des Demo-Bandes,
   das genau in diesem Streifen liegt: mit Band beginnen die seitlichen Flächen
   darunter, ohne Band an der alten Stelle. Warum nicht einfach übereinander —
   siehe „Demo-Banner" weiter unten. */
#pLeft{left:14px;top:var(--fo);bottom:14px;width:var(--lw)}
#pRight{right:14px;top:var(--fo);bottom:14px;width:var(--rw)}
#pBottom{left:var(--bl);right:var(--br);bottom:14px;height:var(--bh)}
.panel[hidden]{display:none}
.phead{display:flex;align-items:center;gap:8px;padding:9px 11px;border-bottom:1px solid var(--soft);
  flex-shrink:0}
.phead h3{margin:0;font-size:var(--fs-i,13px);font-weight:700;flex:1}
.pbody{flex:1;overflow:auto;padding:11px}
.iconbtn{appearance:none;border:1px solid var(--line);background:var(--sf);color:var(--dim);
  border-radius:7px;width:26px;height:26px;display:grid;place-items:center;cursor:pointer;
  flex-shrink:0;font-size:15px;line-height:1}
.iconbtn:hover{background:var(--soft);color:var(--ink)}
/* 1.34 — × der Anmeldung in der Home-App ohne Sitzung (app.js `anmeldeFensterZeichnen`): nur am Telefon da, also 44 px. */
#azu{float:right;width:44px;height:44px;font-size:20px}   /* Anker CFRP_KAPUTT=azu-klein */

/* Rand-Schieber. Die Trefferfläche ist bewusst breiter als der sichtbare
   Strich — 6 px sind mit der Maus kaum zu fassen. */
/* Die Griffe liegen NEBEN den Flächen auf der Bühne, nicht IN ihnen.
   Grund, gemessen: `.panel` hat `overflow:hidden`. Ein Griff mit `right:-5px`
   im Inneren wird zur Hälfte weggeschnitten — und ein weggeschnittener Bereich
   nimmt keine Klicks an. Der linke Schieber war dadurch tot (302px → 302px),
   während der untere zufällig noch traf. Über CSS-Variablen wandern sie
   automatisch mit der Flächengröße mit. */
.grip{position:absolute;z-index:8;background:transparent}
.grip::after{content:"";position:absolute;inset:0;margin:auto;background:var(--line);
  border-radius:2px;opacity:0}
.grip:hover::after,.grip.aktiv::after{opacity:1}
.grip[hidden]{display:none}
/* Der Griff beginnt, wo seine Fläche beginnt — sonst ragte sein oberes Stück
   unter das Demo-Band und wäre dort nicht zu fassen. */
.grip-w{width:12px;cursor:col-resize;top:var(--fo);bottom:14px}
.grip-w::after{width:3px;height:44px}
.grip-h{height:12px;cursor:row-resize;left:var(--bl);right:var(--br)}
.grip-h::after{height:3px;width:44px}
/* A-154 B2 (Generalprobe 30.09.) — der untere Griff ist SICHTBAR: bis hier stand sein Balken auf opacity 0 bis zum Hover, niemand fand
   ihn, und die Tagesliste blieb bei 1440×900 wenige Zeilen hoch. Die Seitengriffe bleiben leise (Planung/Detail haben ihre Breite). */
#gBottom::after{opacity:1;height:4px;width:48px;background:var(--dim)}   /* Anker CFRP_KAPUTT=griff-unsichtbar */
#gLeft{left:calc(14px + var(--lw) + 1px)}
#gRight{right:calc(14px + var(--rw) + 1px)}
#gBottom{bottom:calc(14px + var(--bh) + 1px)}

/* ── K7 Karte pur: Routen-Chip ────────────────────────────────────────── */
.routechip{position:absolute;left:14px;top:106px;z-index:4;background:var(--sf);
  border:1px solid var(--line);border-radius:10px;padding:8px 11px;font-size:var(--fs-n,12px);
  box-shadow:0 8px 22px rgba(29,29,26,.10)}
.routechip b{font-size:var(--fs-i,12.5px);display:block}
.routechip span{color:var(--dim)}
.legdots{display:flex;gap:4px;margin-top:6px}
.legdots i{width:22px;height:5px;border-radius:3px;display:block}

/* ── C47 C · Umkreis-Regler über der Karte ────────────────────────────── */
/* Dieselbe Bauart wie der Routen-Chip darüber (Karte, Rahmen, Schatten), nur an der linken
   Kante der freien Kartenfläche: `--bl` ist der Wert, den auch die Hinweiszeile benutzt — eine
   offene Planungsfläche schiebt beide gleich weit nach rechts. Der Kreis, den er steuert, liegt
   in der Ebene „umkreis" (z-index 398) und damit unter jeder Linie. */
.poolregler{position:absolute;left:var(--bl);top:106px;z-index:5;width:250px;
  background:var(--sf);border:1px solid var(--line);border-radius:10px;padding:9px 11px;
  font-size:var(--fs-n,12px);color:var(--ink);box-shadow:0 8px 22px rgba(29,29,26,.10)}
.poolregler .prkopf{font-weight:600;font-size:var(--fs-i,12.5px);margin-bottom:6px}
.poolregler .przu{display:none;appearance:none;border:0;background:transparent;color:var(--dim);font:inherit;font-size:20px;font-weight:400;
  min-width:44px;min-height:44px;justify-content:center;align-items:center;cursor:pointer}   /* nur Telefonstufe (dort display:inline-flex) */
.poolregler .przeile{display:flex;align-items:center;gap:7px}
.poolregler .prschieber{flex:1;min-width:0;accent-color:var(--green)}
.poolregler .prtippen{width:58px;font:inherit;font-size:var(--fs-n,12px);padding:3px 5px;
  border:1px solid var(--line);border-radius:6px;background:var(--sf);color:var(--ink)}
.poolregler .preinheit{color:var(--dim)}
.poolregler .prmehr{display:none;appearance:none;border:0;background:transparent;color:var(--greend);font:inherit;font-size:var(--fs-n,12px);font-weight:600;
  min-height:44px;padding:0 8px;margin-left:auto;cursor:pointer}   /* nur hochkant mit Tagesliste (A-113 K2, Regel unten) */
.poolregler .prtreffer{margin-top:6px;color:var(--dim);min-height:15px}
.prhinweis{font-size:var(--fs-n,11px);color:var(--dim);margin:2px 0 4px;line-height:1.35}
/* C47 E3/E4 — der Dichte-Satz: dieselbe kleine Schrift wie die Hinweiszeile, damit er die
   Trefferzahl darüber nicht überstimmt. Die Stufe färbt NUR das Wort am Satzende mit, nicht die
   Zeile in ein Warnschild: „dünn" ist kein Fehler, sondern eine Lage. `duenn` nimmt denselben
   gedämpften Rotton wie `.dguete-zweifelhaft` (EIN Ton für „hier stimmt etwas nicht ganz"),
   `dicht` das Grün der Neukunden, `ueblich` bleibt grau wie jeder Nebentext. */
.prdichte{font-size:var(--fs-n,11px);color:var(--dim);margin:2px 0 4px;line-height:1.35;font-variant-numeric:tabular-nums}
.prdichte[data-stufe="duenn"]{color:#a33}
.prdichte[data-stufe="dicht"]{color:var(--greend)}
.prdichte[data-stufe="ueblich"]{color:var(--dim)}
/* C47 G4 — der Demo-Hinweis im Umkreis-Regler: dieselbe Schriftgroesse wie Dichte und
   Deckel-Hinweis, aber eigene Farbe, damit er nicht wie eine Messung aussieht. */
.prdemo{font-size:var(--fs-n,11px);color:var(--dim);margin:2px 0 4px;line-height:1.35;font-style:italic}
.poolregler .prknoepfe{display:flex;gap:10px;flex-wrap:wrap;margin-top:6px}
.poolregler .prknoepfe .linkbtn{font-size:var(--fs-n,11.5px);display:inline-flex;align-items:center;min-height:24px}   /* A-157 B8: eigene Knöpfe, keine Links im Satz — Schreibtisch ≥ 24 (WCAG 2.5.8), Telefon 44 unten */ /* Anker CFRP_KAPUTT=umkreis-knoepfe-schreibtisch */
/* Spalte oben links über der Karte: Zoomleiste, darunter der Umkreis-Regler. Bei offener Planung lag das „−“ zu einem
   Drittel hinter #pLeft (Hans, 28.09., 1440 und 1280); nur nach rechts geschoben lag es unter dem Griff #gLeft und bei 820
   unter der Leiste #cmd (gemessen, zoom-leiste Z1). Darum beginnt die Spalte bei offener Planung dort, wo die freie
   Kartenfläche beginnt: links `--bl` (wie Hinweiszeile und Regler), oben `--fo` (wie die Flächen) — der Regler rückt um
   dasselbe `--fo` mit, sein Abstand zur Leiste bleibt der von zugeklappt. `:where()` hält die Spezifität bei der der
   Grundregeln, damit die Telefon-quer-Regeln weiter unten gewinnen; unter 769px ist #pLeft ganzseitig (M1, Telefonblock).
   Bündig (A-023, Hans 28.09.): Leaflets eigener Abstand oben (leaflet.css `.leaflet-top .leaflet-control`) fällt in diesem
   Zustand weg, sonst stünde die Leiste um genau diesen Abstand tiefer als die Planung (gemessen 72 gegen 62). */
@media (min-width:769px){
  :where(#buehne:has(> #pLeft:not([hidden]))) .leaflet-top.leaflet-left{left:var(--bl);top:var(--fo)}   /* Anker CFRP_KAPUTT=zoom-unter-planung */
  :where(#buehne:has(> #pLeft:not([hidden]))) .leaflet-top.leaflet-left .leaflet-control{margin-top:0}   /* Anker CFRP_KAPUTT=zoom-nicht-buendig */
  :where(#buehne:has(> #pLeft:not([hidden]))) .poolregler{top:calc(106px + var(--fo))}   /* Anker CFRP_KAPUTT=regler-unter-zoom */
  /* A-157 B8 (gemessen mobil-rundgang G5f, 1440): seit die Tagesfläche die halbe Höhe hat (A-154 B2), reichte der Regler mit
     „Mehr“-Knöpfen unter sie — `#gBottom`, das KW-Schild und die Tageszeile nahmen „Zum Umkreis“ … „Umkreis schließen“ den Tipp.
     Dieselbe Grenze wie beim Neukunden-Blatt (`nk-unter-tagpanel`), der Rest scrollt im Regler. */
  :where(#buehne:has(> #pBottom:not([hidden]))) .poolregler{max-height:calc(100% - 106px - var(--fo) - var(--bh) - 36px);overflow-y:auto;overscroll-behavior:contain;box-sizing:border-box}   /* Anker CFRP_KAPUTT=regler-unter-tagpanel */
}
/* Der Kreis selbst: Farbe und Breite stehen an den Leaflet-Optionen (SVG-Attribute), damit sie
   auch dann stimmen, wenn dieses Stylesheet einmal nicht greift. Hier nur das, was die Optionen
   nicht können — der Kreis nimmt keine Zeigerereignisse an, die Karte darunter schon. */
.poolkreis{pointer-events:none}

/* ── K8 Hinweiszeile über der Tagesfläche ─────────────────────────────── */
.maphint{position:absolute;left:var(--bl);bottom:var(--hb,22px);font-size:var(--fs-n,11px);color:#7a7970;
  background:rgba(255,255,255,.85);border:1px solid var(--line);border-radius:7px;
  padding:4px 9px;z-index:2}

/* ── Demo-Banner ──────────────────────────────────────────────────────── */
/* Das Demo-Band ist mit der Demo gegangen (A-021, 01.10.2026): ohne Sitzung steht die Anmeldung, kein Band.
   An seinem Platz, mittig unter der Leiste, steht nur noch die ruhige netz-Zeile (`html.js::netzZeileHtml`): kein Netz beim Start,
   Kasten weggeklickt — der Zustand und die Handlung „Neu laden“, in den Farben der Fläche (kein Alarm, die Sitzung liegt). */
.netzzeile{position:absolute;top:60px;left:50%;transform:translateX(-50%);z-index:29;display:flex;align-items:center;gap:10px;flex-wrap:wrap;justify-content:center;max-width:calc(100% - 20px);background:var(--sf);border:1px solid var(--line);color:var(--ink);border-radius:12px;padding:6px 8px 6px 14px;font-size:var(--fs-n,12px);font-weight:600;box-shadow:0 8px 22px rgba(29,29,26,.10)}
.netzzeile .knopf{min-height:44px}

/* ── K3 Marker ────────────────────────────────────────────────────────── */
.mk{display:grid;place-items:center;font-weight:700;font-family:var(--mono)}
/* Die Mitte des Symbols auf dem Geo-Punkt (karte.js::punktIcon). `translate` statt `transform`: Leaflet setzt die
   Lage als transform auf denselben Knoten, beide Eigenschaften addieren sich. */
.mk-anker{translate:-50% -50%}   /* Anker CFRP_KAPUTT=marker-anker-alt */
.mk-besuch{width:26px;height:26px;border-radius:50%;color:#fff;font-size:11.5px;
  border:2px solid #fff;box-shadow:0 2px 6px rgba(0,0,0,.3)}
/* Etappe 8 (B1): das Hotel hat ein EIGENES Symbol — ein „H" im hellen Feld, die Heimat bleibt das dunkle ⌂. */
.mk-hotel{width:24px;height:24px;border-radius:7px;background:var(--sf);font-size:12px;color:var(--ink);
  border:2px solid var(--ink);box-shadow:0 2px 6px rgba(0,0,0,.25)}
.mk-hotel.offen{border-color:var(--red)}
.mk-tank{width:15px;height:15px;border-radius:3px;background:var(--sf);
  border:2px solid var(--dim);box-shadow:0 1px 4px rgba(0,0,0,.25)}
.mk-pause{width:14px;height:14px;border-radius:50%;background:transparent;
  border:2px solid var(--dim);box-shadow:0 1px 4px rgba(0,0,0,.2)}
.mk-heim{width:22px;height:22px;border-radius:6px;background:var(--ink);color:#fff;
  font-size:11px;border:2px solid #fff;box-shadow:0 2px 6px rgba(0,0,0,.3)}
/* K12 — Versorgungsvorschlag: kleiner HOHLER Kreis, ohne Nummer, ohne Tagesfarbe.
   Ein Punkt, den noch niemand eingeplant hat, sieht anders aus als ein Stopp mit
   Linie — das ist der ganze Unterschied, den K12 sichtbar machen will. */
.mk-vorschlag{width:13px;height:13px;border-radius:50%;background:#fff;
  border:2px solid var(--dim);box-shadow:0 1px 3px rgba(0,0,0,.22);cursor:pointer}
.mk-vorschlag:hover{border-color:var(--ink)}
.mk-vorschlag.veraltet{opacity:.45;cursor:default}   /* AV3 K1: alte Punkte während des Nachladens (karte.js) */
/* K4/K10 — die Abschwächung nicht gewählter Tage.
   ZWEI FEHLER IN EINER ZEILE, beide am 04.09.2026 gemessen:
   1. Der Selektor traf nichts. Leaflet setzt die Klasse `leaflet-marker-icon` an
      den WRAPPER, `blass` sitzt am inneren `.mk`-div (`className:''` in
      karte.js) — `.leaflet-marker-icon.blass` verlangte beides am selben
      Element. Gemessen: getComputedStyle(.mk.blass).opacity === "1", also gar
      keine Abschwächung, seit es die Regel gibt.
   2. Der Wert. K10 setzt für nicht gewählte Tage 0,55 als Untergrenze („nie
      darunter"); 0,32 lag darunter und hätte die Marker schwächer gezeigt als
      die Linien, zu denen sie gehören. */
.leaflet-marker-icon .mk.blass{opacity:.55}

/* ── Baustellen-Hinweis in noch leeren Flächen (G6: ehrlich statt tot) ── */
.baustelle{color:var(--dim);font-size:var(--fs-i,12.5px);line-height:1.6}
.baustelle b{color:var(--ink);display:block;margin-bottom:4px;font-size:var(--fs-i,13px)}

/* ── Anmelde-Fenster ──────────────────────────────────────────────────── */
.ovl{position:absolute;inset:0;background:rgba(29,29,26,.42);z-index:40;display:grid;
  place-items:center;padding:20px}
.modal{width:min(400px,100%);background:var(--sf);border:1px solid var(--line);
  border-radius:14px;box-shadow:0 30px 70px rgba(0,0,0,.3);padding:18px}
.modal h2{margin:0 0 4px;font-size:16px}
.modal p{margin:0 0 14px;font-size:var(--fs-i,12.5px);color:var(--dim);line-height:1.5}
/* LAUNCH 1.29: der Ladefehler bleibt im Bild — ein langes Wort (Quelle, Code) darf den Kasten nicht über
   den Rand drücken (gemessen vorher: bis x1004 bei 390 px). `min-width:0` gegen das Grid-Minimum. */
#ladefehler .modal{min-width:0;overflow-wrap:anywhere}
#ladefehler .reihe{flex-wrap:wrap}
#ladefehler a.knopf{text-decoration:none}
#ladefehler .knopf{min-height:44px;display:inline-flex;align-items:center}   /* A-151: „Neu laden“ ist die Handlung — volle Tippfläche (gemessen vorher 37 px bei 390) */
.ladedetails{margin-top:14px;font-size:var(--fs-n,11.5px);color:var(--dim)}
.ladedetails summary{cursor:pointer;padding:12px 0;line-height:20px}   /* 44 px Tippfläche, Marker bleibt (kein display:flex) */
.ladedetails p{margin:4px 0 0;font-family:var(--mono,monospace);font-size:var(--fs-n,11px)}
.modal label{display:block;font-size:var(--fs-n,12px);font-weight:600;margin:10px 0 4px}
/* Command 45 A3: `textarea` sieht aus wie `input` — die Notiz im Formular „Kunde anlegen" ist
   dasselbe Feld, nur mehrzeilig. `resize:vertical`, damit ein langer Text sichtbar wird, ohne
   dass jemand das Fenster in die Breite zieht. */
.modal input,.modal textarea{width:100%;font:inherit;font-size:var(--fs-i,13.5px);border:1px solid var(--line);
  border-radius:8px;padding:9px 11px;background:var(--sf);color:var(--ink)}
.modal textarea{resize:vertical;line-height:1.45;min-height:60px}
.modal .reihe{display:flex;gap:8px;margin-top:16px}
.knopf{appearance:none;border:1px solid var(--line);background:var(--sf);color:var(--ink);
  font:inherit;font-size:var(--fs-i,13px);border-radius:9px;padding:9px 14px;cursor:pointer}
.knopf.primaer{background:var(--green);border-color:var(--green);color:#fff;font-weight:600}
.fehler{color:var(--red);font-size:var(--fs-i,12.5px);margin-top:10px;min-height:1em}
.fehler[data-art="ok"]{color:var(--green)}   /* M3b: die „Passwort vergessen"-Antwort ist keine Fehlermeldung */

/* ══ W (Etappe 5) · Wochenübersicht — Maße und Farben aus dem Mockup (G12) ══
   Die Fläche scrollt NICHT als Ganzes: Kopf und Kennzahlen stehen fest, gescrollt wird in
   der einzelnen Tagesspalte. Ein Tag mit vierzig Besuchen darf den Wochenkopf nicht
   wegschieben — sonst weiß man beim Scrollen nicht mehr, welche Woche man liest. */
.week{position:absolute;top:56px;left:0;right:0;bottom:0;background:var(--bg);z-index:12;
  display:flex;flex-direction:column;overflow:hidden}

/* W7 — eine Farbe je Wochenstatus, an EINER Stelle. Punkt im Kopf und Punkt in der Liste
   lesen dieselbe Variable; zwei Farbtöpfe wären zwei Wahrheiten über denselben Zustand. */
:root{--ws-erledigt:#75746a; --ws-laeuft:#2f7a54; --ws-geplant:#bd7a2a;
  --ws-frei:#cfcec5; --ws-ohne-reise:#e2e1d8}
.wdot{width:9px;height:9px;border-radius:50%;display:block;background:var(--ws-frei);flex-shrink:0}
.wdot[data-status="erledigt"]{background:var(--ws-erledigt)}
.wdot[data-status="laeuft"]{background:var(--ws-laeuft)}
.wdot[data-status="geplant"]{background:var(--ws-geplant)}
.wdot[data-status="frei"]{background:var(--ws-frei)}
.wdot[data-status="ohne-reise"]{background:var(--ws-ohne-reise)}

.weekhead{display:flex;align-items:center;gap:12px;padding:12px 18px 6px;flex-wrap:wrap}
.weeknav{display:flex;align-items:center;gap:5px;background:var(--sf);border:1px solid var(--line);
  border-radius:10px;padding:4px 5px}
.navbtn{appearance:none;border:0;background:transparent;color:var(--ink);width:28px;height:28px;
  border-radius:7px;display:grid;place-items:center;cursor:pointer;font-size:16px;line-height:1}
.navbtn:hover{background:#f0efe8}
.wpick{position:relative;display:inline-flex}
.wtitel{margin:0;font-size:inherit;font-weight:inherit}
.wpickbtn{appearance:none;border:1px solid var(--line);background:var(--sf);font:inherit;
  font-size:var(--fs-i,13.5px);font-weight:700;color:var(--ink);border-radius:10px;padding:7px 12px;cursor:pointer;
  display:inline-flex;align-items:center;gap:9px;white-space:nowrap;font-variant-numeric:tabular-nums}
.wpickbtn:hover{border-color:var(--head)}
.wstat{font-size:var(--fs-n,11px);font-weight:700;border-radius:999px;padding:3px 9px;background:var(--greys);
  color:var(--grey);text-transform:none}
.wstat[data-status="laeuft"]{background:var(--greens);color:var(--greend)}
.wstat[data-status="geplant"]{background:var(--ambers);color:var(--amber)}
#wroute{font-size:var(--fs-i,12.5px);color:var(--dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
/* Der Warnchip darf den Kopf nicht sprengen: ohne Deckel schob er „Zurück zur Karte" in eine
   zweite Zeile (gemessen am Bild e5-W1-app, 1440 px). Er kürzt lieber sich selbst. */
.weekhead .warnchip{max-width:38%}
.weekacts{margin-left:auto;display:flex;gap:7px;align-items:center;flex-wrap:wrap}
/* Etappe 8 — Fortschritt, Hotelzeile, Verlauf, Tauschen */
.rowbtn.primaer{background:var(--green);color:#fff;border-color:var(--green)}
.rowbtn.primaer:hover{background:var(--greend)}
.rowbtn:disabled{opacity:.5;cursor:default}
.planerlauf{font-size:var(--fs-n,11.5px);color:var(--amber);font-weight:600}
.itm.hotel .adresse{color:var(--dim)}
.itm.hotel .preis{color:var(--ink);font-weight:600}
.itm.hotel .buchen{display:inline-block;margin-top:3px}
.itm.hotel.offen .nm{color:var(--red)}
.modal.verlauf{width:min(560px,94%)}
.vabschnitt{margin:10px 0}
.vabschnitt h4{margin:0 0 4px;font-size:var(--fs-n,12px);color:var(--dim);text-transform:uppercase;letter-spacing:.03em}
.vzeile{display:flex;gap:10px;align-items:baseline;padding:5px 0;border-top:1px solid var(--soft);font-size:var(--fs-i,12.5px)}
.vzeile.aus{color:var(--dim);text-decoration:line-through}
.vwann{font-family:var(--mono);font-size:var(--fs-n,11px);color:var(--dim);min-width:118px}
.vtext{flex:1}
.vkandidat{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:7px 0;border-top:1px solid var(--soft)}
.vkandidat .sub{display:block;font-size:var(--fs-n,11px);color:var(--dim)}
.rowbtn{appearance:none;border:1px solid var(--line);background:var(--sf);color:var(--ink);font:inherit;
  font-size:var(--fs-n,12px);font-weight:600;border-radius:9px;padding:6px 11px;cursor:pointer}
.rowbtn:hover{background:var(--soft)}
.rowbtn.sm{font-size:var(--fs-n,11.5px);padding:4px 9px}
.linkbtn{appearance:none;border:0;background:transparent;color:var(--green);font:inherit;
  font-size:var(--fs-n,11.5px);font-weight:600;cursor:pointer;padding:0}
.linkbtn:hover{text-decoration:underline}
.aangebot{margin:12px 0 0}
#aangebot{font-size:var(--fs-i,13px);text-decoration:none}

/* W2 · Wochenauswahl. Die Höhe ist gedeckelt: eine Liste über 53 Wochen, die den halben
   Bildschirm füllt, ist keine Auswahl mehr, sondern eine zweite Fläche. */
.wpop{position:absolute;top:calc(100% + 6px);left:0;z-index:22;width:330px;max-height:360px;
  overflow:auto;background:var(--sf);border:1px solid var(--line);border-radius:12px;
  box-shadow:0 18px 44px rgba(29,29,26,.2);padding:6px}
.wpophead{display:flex;align-items:center;gap:6px;padding:4px 4px 8px;position:sticky;top:-6px;
  background:var(--sf);z-index:2;border-bottom:1px solid var(--soft)}
.wpophead [data-wheute]{margin-left:auto}
.wpop .mo h4{margin:0;font-size:var(--fs-n,11px);font-weight:700;color:var(--dim);letter-spacing:.05em;
  text-transform:uppercase;padding:8px 9px 4px}
.wrow{display:grid;grid-template-columns:15px 62px 1fr auto auto;gap:9px;align-items:center;width:100%;
  appearance:none;border:0;background:transparent;font:inherit;text-align:left;padding:7px 9px;
  border-radius:8px;cursor:pointer;color:var(--ink)}
.wrow:hover{background:#f4f3ec}
.wrow[aria-pressed="true"]{background:var(--greens);box-shadow:inset 0 0 0 1px #bcdcc9}
.wrow .wkw{font-weight:700;font-size:var(--fs-i,12.5px);font-variant-numeric:tabular-nums}
.wrow .wname,.wrow .wbes{font-size:var(--fs-n,12px);color:var(--dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wrow .wname.aus{opacity:.55}
.wrow .wbes{text-align:right;font-variant-numeric:tabular-nums}
.wrow .walert{font-size:var(--fs-n,11px);color:var(--red)}

/* W3 · Kennzahlen */
.kpis{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:10px;padding:8px 18px 2px}
.kpi{background:var(--sf);border:1px solid var(--line);border-radius:10px;padding:9px 11px}
.kpi .kl{font-size:var(--fs-n,10px);letter-spacing:.06em;text-transform:uppercase;color:var(--dim)}
.kpi .kv{font-size:19px;font-weight:700;font-variant-numeric:tabular-nums;line-height:1.15;margin-top:2px}
.kpi .ksub{font-size:var(--fs-n,11px);color:var(--dim);font-variant-numeric:tabular-nums;min-height:1em}
.kbar{height:5px;border-radius:3px;background:var(--soft);overflow:hidden;margin-top:6px}
.kbar i{display:block;height:100%;background:var(--green)}

/* W4 · Tagesspalten */
.days{flex:1;display:grid;grid-template-columns:repeat(var(--plaetze,5),minmax(0,1fr));gap:10px;
  padding:10px 18px 16px;min-height:0}
.daycol{background:var(--sf);border:1px solid var(--line);border-radius:12px;display:flex;
  flex-direction:column;overflow:hidden;min-height:0}
.daycol.gewaehlt{box-shadow:0 0 0 2px var(--ink) inset}
.dayhead{padding:9px 12px;color:#fff;display:flex;align-items:center;justify-content:space-between;gap:6px}
.dayhead .d{font-size:var(--fs-i,12.5px);font-weight:700}
.daywarn{padding:6px 12px;font-size:var(--fs-n,11px);font-weight:600;color:var(--red);background:var(--reds);border-bottom:1px solid var(--soft)}
.dayhead .st{font-size:var(--fs-n,10.5px);font-weight:700;background:rgba(255,255,255,.22);border-radius:999px;padding:2px 8px}
.daybody{flex:1;overflow-y:auto;padding:6px;min-height:0}
.itm{display:grid;grid-template-columns:50px 1fr;gap:8px;padding:7px;border-radius:8px;cursor:pointer;
  border:1px solid transparent;text-align:left;background:transparent;font:inherit;width:100%;color:var(--ink)}
.itm:hover{background:#f6f5ef;border-color:var(--soft)}
.itm .tm{font-family:var(--mono);font-size:var(--fs-n,11px);color:var(--dim);padding-top:2px;font-variant-numeric:tabular-nums}
.itm .nm{display:block;font-size:var(--fs-i,12.5px);font-weight:600;line-height:1.3}
.itm .sub{display:block;font-size:var(--fs-n,11px);color:var(--dim);line-height:1.35;margin-top:1px}
.itm .bad{display:block;margin-top:4px}
.itm.aux,.itm.hotel{cursor:default}
.itm.aux:hover,.itm.hotel:hover{background:transparent;border-color:transparent}
.itm.aux .nm{font-weight:500;color:var(--dim)}
.dayfoot{border-top:1px solid var(--soft);padding:8px 11px;display:flex;align-items:center;
  justify-content:space-between;gap:8px}
.dayfoot .meta{font-size:var(--fs-n,11px);color:var(--dim);font-variant-numeric:tabular-nums}
.daycol.leer .daybody{display:flex;flex-direction:column;align-items:flex-start;gap:8px;padding:11px}
/* A5 (Command 38): liegen MEHRERE Routen in derselben Kalenderwoche, sagt jede Spalte,
   zu welcher Fahrt ihr Tag gehoert. Bei einer Route steht die Zeile nicht da. */
.dayroute{font-size:var(--fs-n,11px);font-weight:700;color:var(--dim);padding:5px 12px 0;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* §20 · Leerzustände der Woche */
.wleer{margin:14px 18px;font-size:var(--fs-i,12.5px);color:var(--dim);line-height:1.6;max-width:640px}

/* D1 · Detailfenster über der Wochenübersicht */
.modal.dfenster{width:min(560px,92%);max-height:82%;padding:0;display:flex;flex-direction:column;overflow:hidden}
.dfenster .mh{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;
  padding:15px 17px 12px;border-bottom:1px solid var(--soft)}
.dfenster .mh h3{margin:0;font-size:15.5px;font-weight:700;line-height:1.25}
.dfenster .dsub{font-size:var(--fs-n,11.5px);color:var(--dim);margin-top:2px}
.dfenster .mb{padding:14px 17px;overflow:auto}
/* K11 — das Detail eines Versorgungspunktes. Schmaler als das Kundenfenster: es
   zeigt fünf Angaben und einen Knopf, keine Historie. */
.modal.vfenster{width:min(420px,92%)}
.vfenster .dfeld{margin-bottom:10px}
.vfenster .dfeld label{color:var(--dim);font-weight:600}

.fuss{position:absolute;right:14px;bottom:14px;z-index:3;font-size:var(--fs-n,11px);color:var(--dim);
  background:rgba(255,255,255,.85);border:1px solid var(--line);border-radius:7px;padding:4px 9px}
.fuss a{color:var(--dim)}

/* ══ ETAPPE 3 · Tag, Detail, Zeiten ═══════════════════════════════════════ */

/* ── T1 Kopfzeile ─────────────────────────────────────────────────────── */
.tagkopf{align-items:center;flex-wrap:wrap;row-gap:6px}
.kwlabel{font:inherit;font-size:var(--fs-i,13px);font-weight:700;color:inherit;background:none;border:0;padding:0;margin:0;cursor:pointer;white-space:nowrap}
/* Rundgang 25.09.: mit flex-shrink 0 lief die Chipreihe im Tag-Panel über (820 Tablet: „Fr“ angeschnitten). Sie darf
   schrumpfen und bricht um, wenn der Platz nicht reicht; am Schreibtisch ist genug da, dort ändert sich nichts. */
.tagkopf .daychips{display:inline-flex;flex-wrap:wrap;gap:6px;padding:0;flex-shrink:1;min-width:0}   /* Anker CFRP_KAPUTT=tagchips-820 */
/* T1/Z7 — zweite und dritte Zeile des Kopfes: die vier Kennzahlen, darunter der
   Z7-Satz. Das Kreuz bleibt oben rechts neben den Chips. */
.tagkopf [data-zu]{margin-left:auto}
.tagkopf .tagzahlen{flex-basis:100%;max-width:none;justify-content:flex-start}
.tagkopf .z7{flex-basis:100%;max-width:none}
.tagkopf .warnchip{flex-basis:100%;max-width:none}
.z7{font-size:var(--fs-n,11px);color:var(--dim);line-height:1.4}
.supkopf{width:100%;display:block;font-size:var(--fs-n,11.5px);color:var(--dim);margin-bottom:2px}
.hinweiszeile{margin:8px 11px 0;padding:7px 10px;border-radius:8px;background:var(--ambers);border:1px solid #e6d3ae;color:var(--amber);font-size:var(--fs-n,12px)}
/* N2 — Hinweis MIT Knopf: Satz links, Knopf rechts; am Telefon bricht der Knopf unter den Satz. 44 px Tippfläche wie jeder Knopf. */
.hinweiszeile:has(.hinweisknopf){display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:6px 10px}
.hinweiszeile .hinweisknopf{min-height:44px}
.leerzustand{margin:8px 11px}
.tagtitel{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.tagtitel b{font-size:var(--fs-i,13px)}
/* T1 — die vier Kennzahlen. Jede ist ein eigenes Element (`[data-tz]`), damit sie
   als Ganzes umbricht statt mitten in „Arbeitszeit 9:56 h"; der Trenner steht als
   `::before` davor und nie vor der ersten. */
.tagzahlen{font-size:var(--fs-n,11.5px);color:var(--dim);font-variant-numeric:tabular-nums;
  display:inline-flex;flex-wrap:wrap;gap:0 4px;justify-content:flex-end}
.tagzahlen .tz{white-space:nowrap}
.tagzahlen .tzsep{color:var(--line)}
.tagzahlen .tz[data-tz="arbeit"]{color:var(--ink);font-weight:600}
/* ── C65 B · Die Tagesleiste — ein Ort unter dem Tag ──────────────────────
   Sie liegt AUSSERHALB von `.pbody` (tag.js) und scrollt deshalb nicht mit.
   `.tagfuss` gibt es nicht mehr: die vier Kennzahlen stehen hier oben in der
   Leiste, aus demselben Baustein wie im Kopf. */
.tagleiste{flex-shrink:0;background:var(--sf);border-top:1px solid var(--line)}
.tlspeicher{font-size:var(--fs-n,12px);color:var(--dim);margin-right:2px}
.tlspeicher.offen{color:#7c4a12;font-weight:600}
.tlreihe{display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:9px 12px;flex-wrap:wrap}
.tlgruppe{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.knopf.tl{display:inline-flex;align-items:center;gap:8px;min-height:40px;font-weight:600}
.knopf.tl svg{width:16px;height:16px;flex:0 0 16px;fill:none;stroke:currentColor;
  stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.knopf.tl svg.voll{fill:currentColor;stroke:none}
.knopf.tl svg.pfeil{width:12px;height:12px;flex:0 0 12px;stroke-width:2.4;opacity:.65}
.knopf.tl:disabled{background:var(--bg);color:#8b8a80;cursor:default}
.knopf.tl.auf{border-color:var(--ink);background:var(--soft)}
/* A1-P4a: Grund, wenn der Knopf „Reihenfolge optimieren" fehlt — leise, wie .sup-leer. */
.tl-hinweis{font-size:var(--fs-n,11.5px);color:var(--dim);align-self:center}
/* Der Aufklapp geht NACH OBEN: die Leiste sitzt am unteren Rand der Fläche,
   ein Menü darunter läge außerhalb des Bildes. */
.tlauf{position:relative;display:inline-flex}
/* A-35 — das Menü hängt am Schreibtisch fest über dem Knopf (tag.js) und reicht dann über die Kante der Fläche. Es bleibt
   im Stapel von #pBottom (z-index 6); ohne Anhebung läge der Zieh-Griff (z-index 8) über dem obersten Eintrag. */
#pBottom:has(#exportmenu){z-index:9}   /* Anker CFRP_KAPUTT=export-unter-griff */
.tlmenue{position:absolute;bottom:48px;left:0;z-index:33;width:270px;background:var(--sf);
  border:1px solid var(--line);border-radius:11px;box-shadow:0 14px 34px rgba(29,29,26,.16);
  padding:6px;display:flex;flex-direction:column;gap:2px}
.tlmenue [role="menuitem"]{display:flex;align-items:center;gap:10px;padding:8px 10px;min-height:44px;
  border-radius:8px;text-decoration:none;color:var(--ink);font-size:var(--fs-i,13px)}
.tlmenue [role="menuitem"]:hover,.tlmenue [role="menuitem"]:focus{background:var(--soft);outline:none}
.tlmenue [role="menuitem"]:focus-visible{outline:2px solid var(--green);outline-offset:-2px}
.tlmenue [role="menuitem"] svg{width:17px;height:17px;flex:0 0 17px;fill:none;stroke:currentColor;
  stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.tlmenue [role="menuitem"]>span{display:flex;flex-direction:column;gap:1px;min-width:0}
.tlmenue [role="menuitem"] b{font-weight:600}
.tlmenue [role="menuitem"] em{font-style:normal;font-size:var(--fs-n,11.5px);color:var(--dim)}
.tlmenue [role="menuitem"].aus{color:#8b8a80;cursor:default}
/* Kopf mit × und Schleier gibt es nur am Telefon (Regeln in der Telefon-Stufe); am Schreibtisch schließt der Klick daneben. */
.tlmenue .tlkopf,.tlschleier{display:none}
/* Telefon (390): die zwei Gruppen stehen untereinander, jede füllt die Breite. */
@media (max-width:560px){
  .tlreihe{flex-direction:column;align-items:stretch}
  .tlgruppe{justify-content:stretch}
  .tlgruppe>*{flex:1 1 auto;justify-content:center}
  .tlmenue{width:min(270px,calc(100vw - 32px))}
}
/* Z3 — Warnchip. Ein Hinweis, nie eine Sperre (G2) — er steht neben den Zahlen statt vor ihnen. Die Farbe ist ROT
   (--red/--reds), nicht Amber, wie der Kommentar bis 01.10. behauptete; Amber trägt seit A-214 nur „knapp“ (unten). */
.warnchip{display:inline-flex;align-items:center;gap:6px;background:var(--reds);
  border:1px solid #e7c2ca;color:var(--red);border-radius:999px;padding:4px 11px;
  font-size:var(--fs-n,11.5px);font-weight:600;max-width:52%;line-height:1.35}
.warnchip[data-warn="knapp"]{background:var(--ambers);border-color:#e6d3ae;color:#7c4a12}   /* Anker CFRP_KAPUTT=knapp-rot */   /* Ambra dunkel 6,6:1 auf --ambers (--amber wären 3,75:1) */
.stopp .hinweisknopf{min-height:44px;margin-top:2px}   /* A-214: Tippmaß wie in .hinweiszeile */
.daychips{display:flex;gap:7px;flex-wrap:wrap;padding:9px 11px 0;flex-shrink:0}
.cf-day{appearance:none;border:1px solid var(--line);background:var(--sf);font:inherit;
  font-size:var(--fs-n,12px);font-weight:600;border-radius:9px;padding:6px 11px;cursor:pointer;
  display:inline-flex;align-items:center;gap:7px;color:var(--ink)}
.cf-day[aria-pressed="true"]{border-color:transparent;background:var(--tf,var(--ink));color:#fff}
.cf-day i{width:9px;height:9px;border-radius:50%;display:block}
/* G12 — Datum im Chip in Monospace, wie `.daychip .num` im Mockup. */
.cf-day .num{font-family:var(--mono);font-size:var(--fs-n,11px);opacity:.85}
.tagbody{padding-top:9px}

/* ── T3 Stoppliste ────────────────────────────────────────────────────── */
.stoppliste{display:flex;flex-direction:column}
/* Command 43 B4 — die Zeile UMBRICHT: das Zeit-Schild steht in der Zeile, die Warnung darunter
   (`flex-basis:100%`). Ohne Umbruch schöbe ein langer Warntext Pfeile und Kreuz aus der Fläche. */
.stopp{display:flex;align-items:center;gap:9px;padding:7px 8px;border-radius:9px;
  cursor:pointer;border:1px solid transparent;flex-wrap:wrap;row-gap:4px}
.stopp:hover{background:var(--soft)}
.stopp.gewaehlt{background:var(--greens);border-color:#c6ded1}
.stopp:focus-visible{outline:2px solid var(--green);outline-offset:1px}
.szeit{font-family:var(--mono);font-size:var(--fs-n,11.5px);color:var(--dim);white-space:nowrap;
  min-width:88px;font-variant-numeric:tabular-nums}
.sico{width:16px;text-align:center;font-size:12px;color:var(--dim);flex-shrink:0}
.sname{flex:1;min-width:0;font-size:var(--fs-i,12.5px);display:flex;flex-direction:column;gap:1px}
.smeta{font-size:var(--fs-n,11px);color:var(--dim)}
.smeta em{font-style:normal;color:var(--amber);font-weight:600}
.iconbtn.klein{width:24px;height:24px;font-size:13px}   /* WCAG 2.5.8: Schreibtisch-Ziel ≥ 24 (Entscheid Constantin 30.09.2026, a154-kernweg T4) */
/* Command 43 B3 — Gespraechsdauer in der Stoppzeile: Schnellwahl + freie Zahl */
.dauerwahl{display:flex;align-items:center;gap:2px;flex-shrink:0}
.dauerwahl .dwahl{appearance:none;border:1px solid var(--line);background:var(--sf);color:var(--dim);font:inherit;font-size:var(--fs-n,10.5px);padding:2px 5px;border-radius:6px;cursor:pointer;line-height:1.2;min-height:24px}
.dauerwahl .dwahl[aria-pressed="true"]{background:var(--green);border-color:var(--green);color:#fff;font-weight:600}
.dauerwahl .dfrei{width:46px;min-height:24px;box-sizing:border-box;font:inherit;font-size:var(--fs-n,11px);padding:2px 4px;border:1px solid var(--line);border-radius:6px;background:var(--sf);color:var(--ink)}
/* Command 43 B5 — „Pause danach" je Stoppzeile: leise wie das Kreuz daneben, gestrichelt wie
   der Kopf-Knopf „Pause einplanen", damit beide als dieselbe Sache erkennbar sind. */
.iconbtn.klein.pausenach{border:1px dashed var(--line);color:var(--dim)}
.iconbtn.klein.pausenach:hover{border-style:solid;color:var(--ink)}
/* Command 43 B4 — Zeit-Schild je Stopp: fest (Termin) · fenster (Zeitfenster) · frei.
   „frei" ist bewusst leise: es ist der Normalfall und darf die beiden anderen nicht übertönen. */
.zschild{font-size:var(--fs-n,10.5px);border-radius:999px;padding:2px 8px;flex-shrink:0;white-space:nowrap;
  border:1px solid var(--line);background:var(--sf);color:var(--dim);font-variant-numeric:tabular-nums}
.zschild.fest{background:var(--greens);border-color:#c6ded1;color:var(--greend);font-weight:600}
.zschild.fenster{background:var(--ambers);border-color:#e6d3ae;color:var(--amber);font-weight:600}
.zschild.frei{background:transparent;border-style:dashed}
/* Die Warnung des Stopps: eigene Zeile unter der Stoppzeile, gleicher Chip wie im Kopf. */
.stopp .warnchip.amstopp{flex-basis:100%;max-width:none;font-size:var(--fs-n,11px);cursor:default}
/* Command 44 Block 0.1 — Wartezeit vor einem festen Termin: klein neben der Zeit, in der Farbe des
   festen Termins, kein Satz. In der Optimieren-Vorschau (`.oliste`) derselbe Text, gleiche Farbe. */
.swarte{font-size:var(--fs-n,10.5px);color:var(--amber);white-space:nowrap;font-variant-numeric:tabular-nums;flex-shrink:0}
.optvorschau .oliste .warnchip.amstopp{display:inline-flex;font-size:var(--fs-n,10.5px);margin-top:2px}
.badge{font-size:var(--fs-n,10.5px);font-weight:700;border-radius:999px;padding:2px 8px;flex-shrink:0}
.badge.gruen{background:var(--greens);color:var(--greend)}
.badge.rot{background:var(--reds);color:var(--red)}
.badge.grau{background:var(--greys);color:var(--grey)}

/* ── T4 Versorgung ────────────────────────────────────────────────────── */
.supzeile{display:flex;gap:7px;flex-wrap:wrap;margin-top:11px;padding-top:10px;
  border-top:1px solid var(--soft)}
.sup{appearance:none;border:1px solid var(--line);background:var(--sf);font:inherit;
  border-radius:9px;padding:6px 10px;cursor:pointer;text-align:left;color:var(--ink);
  display:flex;flex-direction:column;gap:1px;max-width:230px}
.sup:hover{background:var(--soft)}
.sup b{font-size:var(--fs-n,12px);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sup span{font-size:var(--fs-n,10.5px);color:var(--dim)}
.sup.pause{border-style:dashed}
.sup-lade,.sup-leer,.sup-fehler{font-size:var(--fs-n,11.5px);color:var(--dim);align-self:center}
.sup-fehler{color:var(--red)}

/* ── T5 Vollständigkeitszeile ─────────────────────────────────────────── */
.rint{margin-top:11px;font-size:var(--fs-n,11.5px);border-radius:9px;padding:7px 11px;
  background:var(--greens);color:var(--greend);border:1px solid #c6ded1}
.rint.bad{background:var(--reds);color:var(--red);border-color:#eccdd4}

/* ── T6 Aktionen ──────────────────────────────────────────────────────── */
.tagaktionen{margin-top:10px;display:flex;gap:8px;flex-wrap:wrap;align-items:center}
/* Etappe 7 — LT5 Pfeile je Stopp, Zustand „Tag wird berechnet …", Block „Nicht untergebracht" */
/* ▲ ▼ nebeneinander: übereinander wären zwei Ziele ≥ 24 höher als die Zeile (vorher 18 × 13 übereinander). */
.stopp .pfeile{display:flex;flex-direction:row;gap:2px;margin-left:auto}
.iconbtn.pfeil{width:24px;height:24px;font-size:10px;line-height:1;padding:0}   /* Anker CFRP_KAPUTT=stoppziel-klein */
.iconbtn.pfeil[disabled]{opacity:.3;cursor:default}
.planerlauf{margin:8px 11px 0;padding:7px 10px;border-radius:8px;background:var(--greens);border:1px solid #c6ded1;color:var(--ink);font-size:var(--fs-n,12px)}
/* A-085 — der Ladekreis (html.js `LADEKREIS`): ein Kreisbogen, drei Viertel sichtbar, dreht sich; still bei reduzierter Bewegung. */
.ladekreis{display:inline-block;flex:none;width:.95em;height:.95em;margin-right:.45em;vertical-align:-.14em;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;
  animation:ladekreis-dreh .8s linear infinite}   /* Anker CFRP_KAPUTT=ladekreis-steht */
@keyframes ladekreis-dreh{to{transform:rotate(360deg)}}
.ladekreis:last-child{margin-right:0}   /* allein im Knopf (planung.js `+` → Kreis): kein Abstand ins Leere */
.planerlange{display:block;margin-top:4px;color:var(--dim)}
@media (prefers-reduced-motion:reduce){.ladekreis{animation:none;border-right-color:currentColor;opacity:.5}}
/* ── Command 43 B7 · Vorschau „Reihenfolge optimieren" ──────────────────────
   Zwei Spalten nebeneinander, solange Platz ist; darunter untereinander. Die
   Fläche liegt in `.pbody` und darf deshalb mitscrollen — sie ist kein Fenster
   über der Karte, sondern die Antwort auf einen Knopf IN der Tagesleiste. */
.optvorschau{margin:8px 11px;padding:9px 11px;border-radius:9px;background:var(--sf);
  border:1px solid var(--green);font-size:var(--fs-i,12.5px)}
.optvorschau .okopf{display:flex;gap:9px;align-items:baseline;flex-wrap:wrap;margin-bottom:7px}
.optvorschau .okopf b{font-size:var(--fs-i,13px)}
.optvorschau .meta{color:var(--dim);font-size:var(--fs-n,11.5px)}
.optvorschau .ospalten{display:flex;gap:10px;flex-wrap:wrap}
.optvorschau .ospalte{flex:1 1 190px;min-width:0;border:1px solid var(--line);border-radius:8px;padding:7px 9px;background:var(--bg)}
.optvorschau .ospalte>b{display:block;font-size:var(--fs-n,12px);margin-bottom:3px}
.optvorschau .ozahlen{display:flex;gap:9px;flex-wrap:wrap;color:var(--dim);font-size:var(--fs-n,11.5px);margin-bottom:5px}
.optvorschau .ozahlen b{color:var(--ink);font-variant-numeric:tabular-nums}
.optvorschau .oliste{list-style:decimal;margin:0;padding-left:19px}
.optvorschau .oliste li{display:list-item;padding:1px 0}
.optvorschau .oliste li>*{vertical-align:middle}
.optvorschau .ozeit{font-variant-numeric:tabular-nums;color:var(--dim);margin-right:6px}
.optvorschau .oname{word-break:break-word}
.optvorschau .oliste li.ofest .oname{font-weight:600}
.optvorschau .ounter{display:block;margin-top:6px}
.optvorschau .oaktionen{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
.nichtblock{margin:8px 11px;padding:8px 10px;border-radius:8px;background:var(--ambers);border:1px solid #e6d3ae;font-size:var(--fs-i,12.5px)}
.nichtblock b{display:block;margin-bottom:4px}
.nichtblock .nz{display:flex;gap:8px;align-items:center;justify-content:space-between;padding:3px 0}
.nichtblock .nz span{flex:1}
.nichtblock .nz .knopf.mini{white-space:nowrap}
.knopf.mini{font-size:var(--fs-n,11.5px);padding:5px 10px;border-radius:8px;text-decoration:none;
  display:inline-block}

/* ── D2/D3 Detail ─────────────────────────────────────────────────────── */
.dtitel{margin-bottom:14px}
.dtitel b{display:block;font-size:14px}
.dtitel span{font-size:var(--fs-n,11.5px);color:var(--dim)}
.dfeld{margin-bottom:14px}
.dfeld label{display:block;font-size:var(--fs-n,11.5px);font-weight:600;margin-bottom:4px}
.dfeld input{font:inherit;font-size:var(--fs-i,13px);border:1px solid var(--line);border-radius:8px;
  padding:7px 9px;background:var(--sf);color:var(--ink);width:110px}
.dreihe{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.dwert{font-size:var(--fs-i,13px)}
.dhint{display:block;font-size:var(--fs-n,11px);color:var(--dim);margin-top:5px;line-height:1.5}
/* A-074: der Satz des geplanten Besuchs über dem Erreichbar-Hinweis — eigene Zeile, volle Breite; der Satz bricht um, deshalb
   Ecken statt Pille (999 machte aus vier Zeilen ein Oval, gemessen im Bild 390 der ersten Fassung). Farbe, Schrift: `.warnchip`. */
.dhint .warnchip{display:flex;width:fit-content;max-width:none;border-radius:8px;margin-bottom:5px}
.dtag{font-size:var(--fs-n,10.5px);font-weight:700;border-radius:999px;padding:3px 9px;
  background:var(--greys);color:var(--grey)}
.dtag.eigen{background:var(--ambers);color:var(--amber)}
.dnote{font-size:var(--fs-n,11.5px);color:var(--dim);line-height:1.55;background:var(--soft);
  border-radius:9px;padding:9px 11px;margin-bottom:14px}
.dnote b{color:var(--ink)}
.daktionen{margin-top:4px}

/* ── Etappe 4 · Planung: Reiter, Routen, Kunden (Optik nach Mockup, G12) ── */
.tabs{display:flex;gap:4px;flex:1}
.tab{appearance:none;border:1px solid transparent;background:transparent;font:inherit;font-size:var(--fs-i,12.5px);font-weight:600;
  color:var(--dim);border-radius:8px;padding:5px 10px;cursor:pointer}
.tab[aria-pressed="true"]{background:var(--soft);color:var(--ink);border-color:var(--line)}
.rcard,.kcard .card{display:block;width:100%;text-align:left;border:1px solid var(--line);background:var(--sf);border-radius:11px;
  padding:10px 11px;margin-bottom:8px;font:inherit;color:var(--ink)}
.rcard.arbeit{border-color:#bcdcc9;background:var(--greens)}
/* Aufgabe 2 (Command 36) — DIE ROUTENKARTE VERHÄLT SICH WIE DIE KUNDENKARTE.
   Dieselbe Hover-Farbe wie `.kcard .card:hover` (var(--soft)), keine zweite Optik
   erfunden. `.gewaehlt` ist der Zustand DANACH (V3/V8): ein Blick genügt, um zu wissen,
   welche Route unten in der Tagesliste steht — ein linker Balken, weil Rand und
   Hintergrund bei `.arbeit` schon belegt sind und sich sonst überlagerten. */
.rcard[role=button]{cursor:pointer}
.rcard[role=button]:hover{background:var(--soft)}
.rcard[role=button]:focus-visible{outline:2px solid var(--green);outline-offset:2px}
.rcard.gewaehlt{border-color:var(--green);background:var(--greens);box-shadow:inset 4px 0 0 var(--green)}
.rcard.gewaehlt:hover{background:var(--greens)}
.rkopf,.kkopf{display:flex;justify-content:space-between;gap:8px;align-items:flex-start}
.rkopf b,.kkopf b{flex:1;font-size:var(--fs-i,13px)}
.rschild{font-size:var(--fs-n,11px);font-weight:700;border-radius:999px;padding:2px 8px;white-space:nowrap}
.rschild.kw{appearance:none;border:0;cursor:pointer;background:var(--greens);color:var(--greend);font:inherit;font-size:var(--fs-n,11px);font-weight:700}
.rschild.gespeichert{background:var(--soft);color:var(--dim)}
.stern{appearance:none;border:0;background:none;font-size:15px;line-height:1;cursor:pointer;color:var(--amber);padding:0 2px}
.rzahlen{display:block;font-size:var(--fs-n,11.5px);color:var(--dim);font-variant-numeric:tabular-nums;margin-top:4px}
.rmeta,.kcard .meta{display:block;font-size:var(--fs-n,11px);color:var(--dim);margin-top:3px;line-height:1.45}
.raktion{display:flex;gap:6px;margin-top:8px;flex-wrap:wrap}
.knopf.voll{width:100%;margin-top:6px;text-align:center}
.knopf.naehe{display:none}   /* A-156 B6: „Neukunden in der Nähe“ gibt es nur am Telefon — am Schreibtisch steht die Karte daneben */
.bauzeile{display:flex;align-items:center;gap:8px;border:1px solid var(--green);background:var(--greens);border-radius:9px;padding:7px 10px;margin-bottom:6px;font-size:var(--fs-i,12.5px)}
.bauzeile b{flex:1;color:var(--greend)}
.kfilter{display:flex;flex-direction:column;gap:7px;margin-bottom:8px}
.kzeile{display:flex;gap:8px;align-items:center}
.kzeile .fvoll{flex:1;width:auto}
.kzahl{font-size:var(--fs-n,11.5px);font-weight:600;white-space:nowrap;color:var(--dim)}
.ueberzeile{appearance:none;width:100%;text-align:left;font:inherit;font-size:var(--fs-n,12px);font-weight:600;cursor:pointer;
  border:1px solid #e7b9c4;background:var(--reds);color:var(--red);border-radius:9px;padding:8px 10px;margin-bottom:6px}
.kcard{position:relative;margin-bottom:8px}
.kcard .card{margin:0;cursor:pointer}
.kcard .card:hover{background:var(--soft)}
.kcard .card.offen{background:var(--soft);border-color:var(--dim)}   /* A-289 A8: rechts offen */
.kcard .card>span{display:block;font-size:var(--fs-n,11.5px);color:var(--dim);margin-top:2px}
.kstand{margin-top:6px;display:flex;justify-content:space-between;align-items:center;gap:8px}
.tag{font-size:var(--fs-n,10.5px);font-weight:700;border-radius:999px;padding:2px 8px;white-space:nowrap}
.addbtn{position:absolute;right:9px;bottom:9px;appearance:none;border:1px solid var(--green);background:var(--sf);color:var(--greend);
  width:28px;height:28px;border-radius:50%;font:inherit;font-size:17px;line-height:1;cursor:pointer}
.addbtn:hover{background:var(--greens)}
/* Command 46A Block F — das Plus rechnet: gedämpft, nicht anklickbar (wie `.mk-bau.laeuft`). */
.addbtn.laeuft{border-color:var(--dim);color:var(--dim);background:#f3f4f6;cursor:progress}
.addbtn.laeuft:hover{background:#f3f4f6}
/* Ergebnistöne der Einstellungen (b-green …) auf die Badge-Farben */
.badge.b-green{background:var(--greens);color:var(--greend)}
.badge.b-amber{background:var(--ambers);color:var(--amber)}
.badge.b-red{background:var(--reds);color:var(--red)}
.badge.b-grey{background:var(--greys);color:var(--grey)}

/* ── P6/P11 Karte: Bau-Kandidaten, gewählter Kunde ─────────────────────── */
/* B1 (Command 43) — der Kundenbestand: kleiner SCHWARZER Punkt, immer da, unter den Stoppmarkern.
   `#000` wörtlich, nicht `var(--ink)`: Schwarz ist Vertrag (Neukunden werden in M2 grün), und ein
   Vertrag steht nicht hinter einer Variablen, die jemand für die Schrift umstimmt. */
.mk-kunde{width:10px;height:10px;border-radius:50%;background:#000;border:1.5px solid #fff;
  box-shadow:0 1px 3px rgba(0,0,0,.35);cursor:pointer}
.mk-kunde:hover{width:13px;height:13px}
/* C47 C (Command 47, Block C) — der NEUKUNDE aus dem Pool: derselbe Punkt wie der Bestand,
   GRÜN statt schwarz. Gleiche Größe, gleiche Form, gleicher Rand — der einzige Unterschied ist
   die Farbe, und deshalb braucht die Karte keine Legende (Bauplan M2: „Bestandskunden schwarz
   und Neukunden grün"). `var(--green)` ist hier richtig und `#000` bei `.mk-kunde` daneben auch:
   Schwarz ist Vertrag gegen die Marke, Grün IST die Marke. */
.mk-neu{width:10px;height:10px;border-radius:50%;background:var(--green);border:1.5px solid #fff;
  box-shadow:0 1px 3px rgba(0,0,0,.35);cursor:pointer}
.mk-neu:hover{width:13px;height:13px}
/* A-081 — Vorschlag außerhalb des Grenzwerts (Neukunden entlang der Route): grau und blass wie in der Attrappe. */
.mk-neu.aus{background:var(--grey);opacity:.6}
.mk-bau{background:#fff;border:2px solid var(--green);color:var(--greend);border-radius:50%;width:16px;height:16px;font-size:10px}
.mk-bau.gewaehlt{background:var(--green);color:#fff;width:20px;height:20px;font-size:12px}
/* Command 46A — der Marker rechnet gerade (`routen.bauLaeuft`): blass, „…" statt Haken, und er
   nimmt keinen Tipp mehr an. `pointer-events:none` ist die ANZEIGE der Sperre, nicht die Sperre
   selbst — die steht in `routen.bauSchalten` (ein Ort, beide Klickwege, P4). */
.mk-bau.laeuft{border-color:var(--dim);color:var(--dim);background:#f3f4f6;pointer-events:none;cursor:progress}
.mk-bau.gewaehlt.laeuft{background:var(--dim);color:#fff}
.mk-sel{background:var(--ink);color:#fff;border-radius:50%;width:18px;height:18px;font-size:10px;border:2px solid #fff;box-shadow:0 2px 8px rgba(0,0,0,.3)}
/* ── D2 Historie ───────────────────────────────────────────────────────── */
.historie{display:flex;flex-direction:column;gap:4px}
.hzeile{display:flex;gap:8px;align-items:center;font-size:var(--fs-n,11.5px);flex-wrap:wrap}
.hdatum{font-family:var(--mono);color:var(--dim);font-variant-numeric:tabular-nums}
.hnotiz{color:var(--dim)}

/* ── T2 Bearbeitungsleiste (Mockup `.editbar`) ─────────────────────────── */
.editbar{display:flex;align-items:center;gap:9px;padding:7px 11px;background:var(--greens);border-bottom:1px solid #c6ded1;font-size:var(--fs-i,12.5px);flex-wrap:wrap}
.editbar b{font-size:var(--fs-i,13px)}
.editbar .meta{color:var(--dim);font-size:var(--fs-n,11.5px)}
.editbar .rechts{margin-left:auto;display:flex;gap:6px;flex-wrap:wrap}
/* Command 43 B2/B6 — Bau-Leiste eines ungespeicherten Tages (dieselbe Optik wie die Bearbeitungsleiste) */
.bauleiste input[type=date]{font:inherit;font-size:var(--fs-n,12px);padding:3px 6px;border:1px solid var(--line);border-radius:6px;background:var(--sf);color:var(--ink)}

/* ── X4 Rückfrage · R3 Zurücksetzen-Fenster ────────────────────────────── */
.frage .modal{width:min(470px,92%)}
.frage .modal.breit{width:min(640px,94%)}
.frage h2{font-size:15px;line-height:1.3}
.frage .mkopf{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;margin:-8px -10px 0 0}
.frage .mkopf h2{padding-top:8px}
.frage .mzu{flex:0 0 auto;min-width:44px;min-height:44px;appearance:none;border:0;background:transparent;color:var(--dim);
  font:inherit;font-size:20px;line-height:1;cursor:pointer;border-radius:8px}
.frage .mzu:hover{background:var(--soft)}
.aendliste{display:flex;flex-direction:column;gap:4px;max-height:50vh;overflow:auto;margin:8px 0}
.aendzeile{display:flex;gap:10px;align-items:center;cursor:pointer;padding:6px 8px;border:1px solid var(--line);border-radius:8px;font-size:var(--fs-i,12.5px)}
.aendzeile input{width:16px;height:16px;cursor:pointer;flex-shrink:0}
.aendzeile.aus span{color:var(--dim);text-decoration:line-through}
/* V3: `.fuss` ist der absolut positionierte Impressum-Chip der Karte (oben, bottom/right 14px). Im
   Fenster hängt die Leiste am Fenster, nicht am Viewport — Position und Chip-Optik zurückgenommen. */
.frage .fuss{position:static;z-index:auto;font-size:inherit;background:none;border:0;padding:0;
  display:flex;gap:8px;justify-content:space-between;margin-top:12px;flex-wrap:wrap}

/* ── G13 Sicherheitsrückfrage ──────────────────────────────────────────────
   Die FRAGE ist der Satz, den der Nutzer lesen soll — sie steht in Textfarbe und
   Lesegröße, nicht in der gedämpften Nebentextfarbe von `.modal p`. Die FOLGE
   („3 Änderungen gehen verloren") steht darunter, kleiner und abgesetzt: sie ist
   die Begründung, nicht die Frage.
   Der Vorrang liegt bei „Nein": es steht links, ist der Fokus (app.js) und trägt
   das ruhige Aussehen; „Ja" bleibt der primäre Knopf, damit die Zustimmung
   sichtbar ist — aber niemand landet ohne Absicht darauf. */
.frage .modal.sicher{width:min(440px,92%)}
.frage .modal.sicher p.sicherfrage{color:var(--ink);font-size:var(--fs-i,13.5px);line-height:1.5;margin:0 0 10px}
.frage .modal.sicher p.sicherfolge{color:var(--dim);font-size:var(--fs-i,12.5px);line-height:1.5;margin:0;
  border-left:2px solid var(--line);padding-left:10px}
.frage .modal.sicher .reihe{justify-content:flex-end}
.frage .modal.sicher [data-nein]{font-weight:600}

/* ── P14 Zeiten ───────────────────────────────────────────────────────── */
.flabel{display:block;font-size:var(--fs-n,11.5px);font-weight:600;margin:14px 0 4px}
.flabel:first-child{margin-top:0}
/* „Wochenmodell in voller Breite, nicht abgeschnitten" (P14) — im Mockup war
   genau das der Befund, den t8 gemessen hat. */
.fvoll{width:100%;font:inherit;font-size:var(--fs-i,13px);padding:8px 9px;border:1px solid var(--line);
  border-radius:8px;background:var(--sf);color:var(--ink)}
.fvoll:disabled{color:var(--dim);background:var(--soft)}
/* Command 45 A3 — die Notiz im Kundendetail ist ein `.fvoll`-Feld wie Firma und Kundennummer,
   nur mehrzeilig; ohne diese Zeile erbte sie die Browser-Schrift statt der der Fläche. */
textarea.fvoll{resize:vertical;line-height:1.45;min-height:56px;font:inherit;font-size:var(--fs-i,13px)}
/* P14 — Zahlenfeld wie `.setrow input` im Mockup: Monospace, rechtsbündig, schmal. */
/* A5 — Stand-Zeile im Menü: Hash in Monospace, leise. */
.mstand{font-size:var(--fs-n,10.5px);color:var(--dim);padding:7px 12px 4px;font-family:var(--mono);border-top:1px solid var(--soft);margin-top:4px}
.fzeile{display:flex;align-items:center;gap:9px}
.fzeile .fnote{margin-top:0;flex:1}
.fzahl{font:inherit;font-size:var(--fs-i,12.5px);font-weight:700;font-family:var(--mono);border:1px solid var(--line);
  border-radius:6px;padding:6px 7px;width:74px;text-align:right;background:var(--sf);color:var(--ink)}
.fwert{font-size:var(--fs-i,13px)}
.fwert span{display:block;font-size:var(--fs-n,11px);color:var(--dim);margin-top:2px;line-height:1.5}
/* Command 52 C4 — dieselbe Zielbranche, nur gelesen, im Umkreis-Regler */
.przb{font-size:var(--fs-n,11.5px);color:var(--dim);line-height:1.7;margin-top:4px}
.przb b{color:var(--ink);font-weight:700}
.przbtags{display:inline-flex;flex-wrap:wrap;gap:4px;vertical-align:middle}
.przbtag{border:1px solid var(--line);border-radius:999px;padding:0 7px;font-size:var(--fs-n,10.5px);font-weight:600;color:var(--ink);background:var(--sf)}
.przbtag.aus{color:var(--dim);text-decoration:line-through;background:transparent}
/* Command 52 C — Zielbranche: ein Schlagwort, darunter Tags zum Abwählen */
.zbkopf{display:flex;align-items:baseline;gap:10px;margin:0 0 18px}
.zbwort{display:inline-block;background:var(--ink);color:#fff;border-radius:999px;padding:6px 14px;font-size:var(--fs-i,13px);font-weight:700}
.zbtags{display:flex;flex-wrap:wrap;gap:8px}
.zbtag{appearance:none;border:1px solid var(--line);background:var(--sf);color:var(--dim);font:inherit;font-size:var(--fs-i,12.5px);
  font-weight:600;border-radius:999px;padding:7px 14px;cursor:pointer;text-decoration:line-through}
.zbtag[aria-pressed="true"]{background:var(--green);border-color:var(--green);color:#fff;text-decoration:none}
.zbtag:disabled{cursor:default;opacity:.75}
.fnote{font-size:var(--fs-n,11px);color:var(--dim);margin-top:5px;line-height:1.5}
.ferklaert summary{cursor:pointer;color:var(--ink);font-weight:600}   /* K2 — zugeklappter Erklärsatz (planung.js faelligErklaert) */
.warnnote,.gutnote{margin-top:16px;font-size:var(--fs-n,11.5px);border-radius:9px;padding:9px 11px;
  line-height:1.5}
.warnnote{background:var(--ambers);border:1px solid #e6d3ae;color:var(--amber)}
.gutnote{background:var(--greens);border:1px solid #c6ded1;color:var(--greend)}

/* ── E5 Einstellungen (Command 26 D3) ─────────────────────────────────────
   Die Fläche teilt sich Rahmen und Kopf mit der Wochenübersicht (`.week`) —
   dieselbe Bauart, dieselbe Oberkante, derselbe Abstand unter dem Demo-Band.
   Eigen ist nur der Körper: eine Spalte, gedeckelt, damit ein Eingabefeld auf
   1440 px nicht über die halbe Wand läuft (Mockup: max-width 860). */
.einst .ebody{flex:1;overflow:auto;padding:10px 18px 24px;max-width:760px;width:100%}
.ekopf{font-size:14px;font-weight:700}
.etitel{margin:6px 0 12px;font-size:var(--fs-i,12.5px);font-weight:700;color:var(--dim);
  text-transform:uppercase;letter-spacing:.06em}
.einst .fzeile{flex-wrap:wrap}

/* ── D2 Erreichbar + Termin (Command 26 D1/D2) ────────────────────────────*/
.dbis{font-size:var(--fs-n,11.5px);color:var(--dim)}
.dnotizfeld{margin-top:8px}
/* Ein gesperrtes Feld muss GESPERRT AUSSEHEN, sonst hält der Nutzer die
   ausbleibende Wirkung für einen Fehler. */
.dfeld.gesperrt input:disabled,.dfeld input:disabled{background:var(--soft);color:var(--dim);cursor:not-allowed}

/* T8 — das Pin in der Stoppzeile. Gedrückt ist es kein zweites Symbol, sondern
   dasselbe in der Warnfarbe: der Zustand steckt in der Farbe, nicht in einem
   neuen Zeichen, das man erst lernen müsste. */
.iconbtn.pin{font-size:12px;line-height:1;transform:rotate(45deg)}
.iconbtn.pin.an{background:var(--ambers);border-color:#e6d3ae;color:var(--amber)}
.stopp.fixiert .szeit{font-weight:700;color:var(--amber)}
.szeit.offen{color:var(--dim)}   /* 1.44: Uhrzeit offen („–“) — eine Strecke davor hat keine Straßenroute */

/* ── G5 Toast ─────────────────────────────────────────────────────────── */
/* Unten mittig und ÜBER den Flächen: die Meldung gehört zur Änderung, die der
   Nutzer gerade ausgelöst hat, und muss sichtbar sein, egal welche Fläche
   offen ist. */
.toast{position:absolute;bottom:22px;left:50%;transform:translateX(-50%);
  background:var(--head);color:var(--headfg);border-radius:11px;padding:10px 13px;
  font-size:var(--fs-i,12.5px);display:flex;align-items:center;gap:11px;max-width:min(660px,92%);
  box-shadow:0 14px 34px rgba(0,0,0,.3);line-height:1.45}
/* Vorab-Lauf 40742315 (c43 D4): ein stehender Toast lag bei offenem Detail rechts über „Tag speichern“ und „Fahrmodus“
   und schluckte den Klick. Der Toast steht über der Tagesfläche — `--hb` (app.js) ist ihre Oberkante + 22, ohne Fläche 22. */
.toast{bottom:var(--hb,22px)}   /* Anker CFRP_KAPUTT=toast-auf-tagknopf */
.toast.fehler{background:var(--red)}
.toast.warn{background:#7c4a12}   /* M7: Einfügen mit neuer Warnung — Ambra dunkel, Weiß darauf 7:1 */
.toast .tkurz{display:none}
.toast button{appearance:none;border:1px solid rgba(255,255,255,.4);background:transparent;
  color:inherit;font:inherit;font-size:var(--fs-n,11.5px);font-weight:700;border-radius:999px;
  padding:4px 11px;cursor:pointer;flex-shrink:0}
.toast button:hover{background:rgba(255,255,255,.14)}
/* LAUNCH 1.31: 44×44 Tippfläche (vorher gut 20 px hoch) — ein Toast, der stehen bleibt, muss sich am Telefon sicher
   schließen lassen. Der negative Rand hält den Toast so flach wie vorher. */
.toast .tzu{border:0;padding:0;min-width:44px;min-height:44px;margin:-8px -8px -8px -4px;font-size:18px;font-weight:400;opacity:.8}   /* Anker CFRP_KAPUTT=tzu-klein */

/* ══ Etappe 11 (Command 29) · Import, Nacharbeit, Klassenauswahl, Guide ══════
   Vier Familien, ein Rahmen: `.import` und `.guide` teilen sich Aufbau, Kopf
   und Oberkante mit `.week` und `.einst` — dieselbe Bauart, damit eine
   Vollbildfläche überall gleich aussieht und der Nutzer den „Zurück"-Knopf
   nicht suchen muss. Eigen ist jeweils nur der Körper.
   Die Klassennamen stehen HIER und nicht je Fläche, weil sie Vertrag sind
   (docs/umbau/karte/e5-vertrag.md): die Suiten greifen danach. */

/* ── Import (X2) ─────────────────────────────────────────────────────────── */
.import .ebody{flex:1;overflow:auto;padding:10px 18px 24px;max-width:980px;width:100%}
/* Die Ablagefläche ist bewusst groß und gestrichelt: sie ist der einzige
   Startpunkt der ganzen Fläche, und eine Datei zieht man nicht auf einen Knopf. */
.imzone{border:2px dashed var(--line);border-radius:12px;background:var(--sf);
  padding:26px 18px;text-align:center;font-size:var(--fs-i,13px);color:var(--dim);cursor:pointer}
.imzone.drueber{border-color:var(--green);background:var(--greens);color:var(--greend)}
.imkopf{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:var(--fs-i,12.5px);
  color:var(--dim);margin:12px 0 6px}
.imkopf b{color:var(--ink);font-size:var(--fs-i,13px)}
/* Zuordnungstabelle: Dateispalte · Ziel · Beispielwert. Der Beispielwert ist
   der Grund, warum überhaupt jemand die Zuordnung prüfen kann — er steht
   deshalb in derselben Zeile und nicht in einer Fußnote. */
.imtabelle{width:100%;border-collapse:collapse;font-size:var(--fs-i,12.5px)}
.imtabelle th{text-align:left;font-size:var(--fs-n,11px);text-transform:uppercase;letter-spacing:.06em;
  color:var(--dim);font-weight:700;padding:6px 8px;border-bottom:1px solid var(--line)}
.imtabelle td{padding:6px 8px;border-bottom:1px solid var(--soft);vertical-align:middle}
.imtabelle td.imname{font-weight:600}
.imtabelle td.imbeispiel{color:var(--dim);font-variant-numeric:tabular-nums;
  max-width:230px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.imtabelle select{font:inherit;font-size:var(--fs-i,12.5px);padding:4px 6px;border:1px solid var(--line);
  border-radius:8px;background:var(--sf);color:var(--ink);max-width:230px}
.imvorschau{overflow-x:auto;border:1px solid var(--line);border-radius:10px;margin:10px 0}
.imvorschau table{border-collapse:collapse;font-size:var(--fs-n,12px);white-space:nowrap}
.imvorschau th,.imvorschau td{padding:5px 9px;border-bottom:1px solid var(--soft);text-align:left}
.imfehler{border:1px solid #e6c3cc;background:var(--reds);color:var(--red);
  border-radius:10px;padding:9px 11px;font-size:var(--fs-i,12.5px);margin:10px 0}
.imfehler li{margin:2px 0}
.imhinweise{font-size:var(--fs-n,12px);color:var(--dim);line-height:1.6;margin:8px 0}
/* Fortschritt: eine Zeile mit Zahlen, kein Kreisel. „Paket 2 von 2 · Adressen
   45 von 144" sagt, wie lange es noch dauert; ein Kreisel sagt nur, dass etwas
   passiert. */
.imfort{display:flex;align-items:center;gap:10px;font-size:var(--fs-i,12.5px);color:var(--dim);
  font-variant-numeric:tabular-nums;margin:10px 0}
.imbalken{flex:1;height:6px;border-radius:999px;background:var(--soft);overflow:hidden}
.imbalken>i{display:block;height:100%;background:var(--green);transition:width .2s}
.imergebnis{display:flex;gap:16px;flex-wrap:wrap;border:1px solid #c6ded1;background:var(--greens);
  border-radius:11px;padding:11px 13px;margin:12px 0}
.imergebnis b{display:block;font-size:17px;color:var(--greend);font-variant-numeric:tabular-nums}
.imergebnis span{font-size:var(--fs-n,11.5px);color:var(--dim)}
.imwarum,.imerklaer{font-size:var(--fs-n,12.5px);line-height:1.45;color:var(--ink,inherit);margin:10px 0}   /* A-289 A5/A6 */
.imaktion{display:flex;gap:7px;flex-wrap:wrap;margin-top:10px}

/* ── Nacharbeit (Z2) ─────────────────────────────────────────────────────── */
.dnacharbeit{border:1px solid #e6d3ae;background:var(--ambers);border-radius:10px;
  padding:9px 11px;margin-top:8px;font-size:var(--fs-i,12.5px)}
.dgrund{display:block;color:var(--amber);margin-bottom:6px;line-height:1.5}
.dtreffer{display:flex;flex-direction:column;gap:4px;margin-top:7px}
.dtreffer button{text-align:left;font:inherit;font-size:var(--fs-n,12px);border:1px solid var(--line);
  background:var(--sf);border-radius:8px;padding:6px 9px;cursor:pointer;color:var(--ink)}
.dtreffer button:hover{background:var(--soft)}
/* Der Klickmodus muss SICHTBAR sein, sonst klickt der Nutzer auf die Karte und
   wundert sich, dass ein Kunde verschoben wird. */
/* A-382: über den Kartenebenen (Leaflet-Panes) — mit der alten Stufe lag der Hinweis unter der Karte und war nie zu sehen (gemessen 04.10.) */
.punkthinweis{position:absolute;left:calc(var(--freil, 0px) + 12px);right:calc(var(--freir, 0px) + 12px);width:fit-content;margin-inline:auto;top:calc(var(--freio, 56px) + 14px);z-index:1000;   /* Anker CFRP_KAPUTT=pin-hinweis-unter-karte */
  background:var(--head);color:var(--headfg);border-radius:10px;padding:8px 12px;
  font-size:var(--fs-i,12.5px);box-shadow:0 12px 30px rgba(0,0,0,.28);display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px}   /* A-422: in einer schmalen freien Fläche bricht „Abbrechen“ unter den Text, statt aus dem Kasten zu ragen · Anker CFRP_KAPUTT=pin-hinweis-ohne-umbruch */
.punkthinweis .rowbtn{position:relative;flex:0 0 auto;color:var(--ink)}
@media (pointer:coarse){.punkthinweis .rowbtn::before{content:"";position:absolute;left:0;right:0;top:50%;height:44px;transform:translateY(-50%)}}
@media (max-width:768px){.frage .modal:has(.felder) textarea{height:56px;min-height:44px}}   /* A-383 (Entscheid Constantin 04.10.): „Koordinate ermitteln“ und „Anlegen“ bleiben am Telefon ohne Rollen im Bild · Anker CFRP_KAPUTT=formular-notiz-hoch */
@media (max-width:768px){.punkthinweis{left:70px;right:12px;top:max(56px, calc(var(--toastunten, 0px) + 8px));width:auto;flex-wrap:nowrap;justify-content:space-between}}   /* rechts neben dem Zoom, unter der Guide-Leiste; A-404: mit Toast an derselben Stelle rückt der Hinweis unter ihn (`--toastunten`, app.js `toastZeichnen`) · Anker CFRP_KAPUTT=pin-hinweis-auf-toast */

/* ── Klassen zuweisen (Z3) ───────────────────────────────────────────────── */
.kauswahl{position:sticky;top:0;z-index:2;display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  border:1px solid var(--green);background:var(--greens);border-radius:9px;
  padding:7px 10px;margin-bottom:7px;font-size:var(--fs-i,12.5px)}
.kauswahl b{flex:1;color:var(--greend)}
.kauswahl select{font:inherit;font-size:var(--fs-n,12px);padding:3px 6px;border:1px solid var(--line);
  border-radius:7px;background:var(--sf);color:var(--ink)}
.kwahl{margin-right:7px;accent-color:var(--green)}
/* Die Mehrfachauswahl je Karte (P3, Command 29): ein Kästchen oben links auf
   der Karte, wie das Plus unten rechts (`.addbtn`) schon vormacht — dieselbe
   Bauart, die andere Ecke. `.kcard .card` bekommt links Platz, ohne die
   geteilte Regel mit `.rcard` anzufassen (dort steht kein Kästchen). */
.kwahlhuelle{position:absolute;left:9px;top:9px;z-index:1;cursor:pointer;line-height:0}
.kwahlhuelle input{accent-color:var(--green)}
.kcard .card{padding-left:32px}
.kmassen{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:8px 0;font-size:var(--fs-n,12px);color:var(--dim)}
.kalleknopf{display:flex;align-items:center;gap:6px;cursor:pointer}
.kalleknopf input{accent-color:var(--green)}

/* ── Einstellungen: Reiterband (E1–E7) ───────────────────────────────────── */
.etabs{display:flex;gap:4px;flex-wrap:wrap;padding:0 18px;border-bottom:1px solid var(--line)}
.etabs .tab{border-radius:8px 8px 0 0;border-bottom-color:transparent;margin-bottom:-1px}
.etabs .tab[aria-pressed="true"]{background:var(--sf);border-color:var(--line);border-bottom-color:var(--sf)}

/* ── Einrichtungs-Guide (GU1/GU2) ────────────────────────────────────────── */
.guide .ebody{flex:1;overflow:auto;padding:10px 18px 24px;max-width:760px;width:100%}
/* Rundgang 25.09.: die Berichte-Fläche hatte als einzige keinen Innenrand — „Diese Seite ist in Arbeit.“ klebte bei x 0. */
#berichte .ebody{flex:1;overflow:auto;padding:10px 18px 24px;max-width:760px;width:100%}   /* Anker CFRP_KAPUTT=berichte-ohne-rand */
.gtext{font-size:var(--fs-i,12.5px);color:var(--dim);line-height:1.65;margin:4px 0 14px}
.gfuss{margin-top:16px}
/* Der Fortschritt steht im KOPF und nicht über der Liste: er beantwortet die
   Frage „wie weit bin ich", und die stellt man, bevor man liest. */
.gfort{font-variant-numeric:tabular-nums}
.gbalken{width:120px;height:6px;border-radius:999px;background:var(--soft);overflow:hidden}
.gbalken>i{display:block;height:100%;background:var(--green);transition:width .25s}
.gliste{list-style:none;margin:0;padding:0;counter-reset:gschritt}
.gschritt{counter-increment:gschritt;position:relative;border:1px solid var(--line);background:var(--sf);
  border-radius:11px;padding:11px 13px 11px 44px;margin-bottom:8px}
.gschritt::before{content:counter(gschritt);position:absolute;left:13px;top:11px;
  width:20px;height:20px;border-radius:999px;background:var(--soft);color:var(--dim);
  font-size:var(--fs-n,11.5px);font-weight:700;display:flex;align-items:center;justify-content:center}
.gschritt.fertig::before{background:var(--greens);color:var(--greend)}
/* A-289 A3 (Klicktest 02.10.: „erledigte Schritte nicht auf einen Blick erkennbar — nur kleiner Marker“): erledigt = ✓ auf vollem Grün und grüner Rand. */
.gschritt.erledigt{border-color:var(--green)} .gschritt.erledigt::before{content:'✓';background:var(--green);color:#fff}   /* Anker CFRP_KAPUTT=guide-erledigt-blass */
.gschritt.dran{border-color:var(--green);background:var(--greens)}
.gschritt b{display:block;font-size:var(--fs-i,13px);margin-bottom:3px}
.gschritt span{font-size:var(--fs-n,12px);color:var(--dim);line-height:1.55}
.gaktion{display:flex;gap:7px;flex-wrap:wrap;margin-top:9px}
.gerledigt{font-size:var(--fs-n,11px);font-weight:700;border-radius:999px;padding:2px 8px;
  background:var(--greens);color:var(--greend)}
.gerledigt.uebersprungen{background:var(--greys);color:var(--grey)}
/* A-255: übersprungen, aber das Fahrzeug fehlt noch — kein Grau wie „erledigt genug“, sondern die Farbe des Offenen. */
.gerledigt.offen{background:var(--ambers);color:var(--amber)}
.gzusatz{font-size:var(--fs-n,12px);color:var(--ink,inherit);line-height:1.55;margin:7px 0 0}
.gzusatz .gliste{margin:3px 0 5px;padding-left:18px} .gzusatz .gliste li{margin:0}   /* A-274 B4 — die Vorbelegung als Liste, je Wert eine Zeile */
/* Unterpunkt einer Schrittkarte (Command 44 D): eingerückt und ohne eigene
   Nummer — er zählt nicht im Fortschritt, also darf er auch nicht so aussehen.
   Kein „überspringen": wer den Schritt darüber überspringt, überspringt ihn mit. */
.gunter{list-style:none;margin:10px 0 0;padding:0;border-top:1px solid var(--soft)}
.gunter li{padding:9px 0 0 14px;border-left:2px solid var(--soft);margin-top:9px}
.gunter b{display:block;font-size:var(--fs-i,12.5px);margin-bottom:3px}
.gunter span{font-size:var(--fs-n,12px);color:var(--dim);line-height:1.55}
/* LAUNCH 1.36 — „Als App auf den Home-Bildschirm" nach der Liste: wie eine Schrittkarte, aber ohne Nummer, denn sie
   zählt nicht im Fortschritt (app/guide.js `heimKarte`). */
.gheim{border:1px dashed var(--line);background:var(--sf);border-radius:11px;padding:11px 13px;margin:4px 0 8px}
.gheim.fertig{border-style:solid;border-color:var(--green)}
.gheim b.gtitel{display:block;font-size:var(--fs-i,13px);margin-bottom:3px}
.gheim span,.gheim p{font-size:var(--fs-n,12px);color:var(--dim);line-height:1.55}
.gheim p{margin:6px 0 0}
.gheim p b{color:var(--ink)}

/* ── Der minimierte Guide (Command 44 D) ─────────────────────────────────────
   Unten links ÜBER der Tagesleiste, an denselben zwei Variablen wie die
   Hinweiszeile (`--bl`/`--hb`) und um deren Höhe darüber — so wandert sie mit,
   wenn die linke oder die untere Fläche auf- oder zugeht, statt sie zu
   verdecken. z-index 28 liegt ÜBER den Vollbildflächen (`.week`, 12) und unter
   Menü (31), Suchergebnis (32) und Rückfrage (40): genau dorthin führen die
   „öffnen"-Knöpfe des Guides, und dort muss der Weg zurück sichtbar bleiben. */
/* `min(…)` statt `left:var(--bl)` pur — und das ist KEIN Breakpoint, sondern eine
   Schranke: `--bl` folgt der linken Fläche, die 302 px breit ist, egal wie schmal
   das Gerät ist (die App ist bis heute auf Desktop-Maß gebaut; die wenigen Media-Regeln dieser
   Datei richten einzelne Stellen, kein Telefon-Layout, Kapitel M offen; OFFENE 1.13, Stand
   23.09.2026). Bei 390 px stand die Leiste dadurch bei x=287 und ragte
   43 px über den Rand hinaus (gemessen 13.09.2026, iPhone-13-Emulation). 200 px ist
   die gemessene Breite der Leiste mit Reserve (191 px bei 1440×900, 146 px bei 390). */
.gminleiste.keinplatz{display:none}   /* A-325: kein Platz zwischen Planung/Zoom und Detail — die Leiste deckt nichts zu */
.gminleiste{position:absolute;left:min(var(--bl), calc(100% - 14px - 200px));
  bottom:calc(var(--hb,22px) + 27px);z-index:28;
  appearance:none;display:flex;align-items:center;gap:8px;cursor:pointer;
  background:var(--sf);border:1px solid var(--green);border-radius:999px;
  padding:6px 13px;font:inherit;font-size:var(--fs-n,12px);color:var(--ink);
  box-shadow:0 8px 22px rgba(29,29,26,.12)}
.gminleiste.imkopf{position:relative;left:auto;right:auto;top:auto;bottom:auto;box-shadow:none;flex:0 0 auto}   /* A-351/A-360: Telefon, Vollbildfläche — im Kopf der Fläche, im Fluss. `relative`, nicht `static`: die 44-px-Tippfläche (`::before`, Telefon-Stufe) hängt am nächsten positionierten Vorfahren — mit `static` war das die ganze Fläche (gemessen 390 × 607, jeder Tipp traf die Leiste). Anker CFRP_KAPUTT=leiste-tippflaeche-ganz */
.gminleiste:hover{background:var(--greens)}
.gminleiste b{font-size:var(--fs-i,12.5px);color:var(--greend)}
.gminleiste span{color:var(--dim)}
/* A-289 A4: seit die Leiste „Einrichtung fortsetzen“ auch nach dem Schließen steht, ist sie am Telefon kein kurzer Gast mehr — über
   der Tagesleiste deckte sie die Tageschips („Mo 28.09.“, gemessen 390×663). Am Telefon steht sie auf der Karte (`.imstreifen`,
   guide.js) oben rechts im Kartenstreifen, neben dem Zoom; in den Vollbildflächen bleibt sie, wo sie war (dort nur nach
   Minimieren — oben rechts lag in der Woche die KW-Auswahl). Am Schreibtisch legt `guideLeisteLegen` sie unter das Suchfeld. */
@media (max-width:768px), (orientation:landscape) and (max-height:500px){
  .gminleiste.imstreifen{left:auto;right:14px;top:calc(env(safe-area-inset-top, 0px) + 12px);bottom:auto}   /* Anker CFRP_KAPUTT=leiste-auf-tagchips */ .gminleiste.imkopf{min-height:44px}   /* A-450: im Kopf der Vollbildfläche steht sie neben 44 px hohen Knöpfen und war 31 hoch (m-telefon W4) · Anker CFRP_KAPUTT=leiste-kopf-flach */
}

/* Nachtrag 28d Z4 — Kapazitätshinweis neben „Nicht untergebracht": eine Aussage über den
   Bestand, keine Fehlermeldung. Deshalb ruhig gesetzt, nicht rot, nicht fett. */
.kaphinweis {
  margin: .35rem 0 .5rem; padding: .45rem .6rem; border-radius: 6px;
  background: color-mix(in srgb, currentColor 6%, transparent);
  border-left: 3px solid color-mix(in srgb, currentColor 35%, transparent);
  font-size: var(--fs-i, .86rem); line-height: 1.35; opacity: .92;
}

/* Die Standardrouten-Fläche (Command 32, Schritt 5) ist mit Command 40 Schritt 6 gefallen — Stile im Archiv. */

/* Command 44 C — Formular „Kunde anlegen" im Rückfrage-Fenster: Felder im Zweierraster,
   `breit` über die volle Breite, der Hinweis (Treffer/Fehlschlag) unter den Feldern. */
.modal .felder{display:grid;grid-template-columns:1fr 1fr;gap:0 10px}
.modal .felder .feld.breit{grid-column:1/-1}
.modal .felder label{margin-top:8px}
.modal .fhinweis{margin:10px 0 0;font-size:var(--fs-n,12px);line-height:1.5;color:var(--dim)}
.modal .fhinweis.gut{color:var(--green)}
.modal .fhinweis.fehler{color:var(--red,#a8324a)}
.modal .fwahl{display:flex;flex-direction:column;gap:6px;margin-top:10px}   /* 28.09.: Treffer „Adresse prüfen“ */
.modal .fwahlk{min-height:44px;text-align:left;padding:8px 12px;border:1px solid var(--line);border-radius:10px;background:var(--sf);font:inherit;font-size:13px;color:var(--ink);cursor:pointer}
.modal .fwahlk:hover,.modal .fwahlk:focus-visible{border-color:var(--green)}
/* 28.09.: Monatskalender im Fenster „Neuer Tag“ (monatskalender.js, Entscheid Matthias Variante B). Tage ≥ 44 px hoch
   (Tippziel), sieben Spalten füllen die Fensterbreite; Punkte = schon geplante Kunden (höchstens drei). */
/* Ein Monat mit sechs Wochenzeilen macht das Fenster am Telefon höher als die Seite; `.ovl` zentriert, also läge „Tag bauen“
   unter dem Rand, unerreichbar. Das Fenster scrollt in sich (gemessen: datum-kalender K8). */
.frage .modal:has(.kal){max-height:100%;overflow-y:auto;overscroll-behavior:contain}   /* Anker CFRP_KAPUTT=kal-ueberlauf */
.frage .modal:has(.felder){max-height:100%;overflow-y:auto;overscroll-behavior:contain} .frage .modal:has(.felder) .mkopf{position:sticky;top:-18px;z-index:1;background:var(--sf);padding-top:18px;margin-top:-26px} /* A-465: rollt das Formular ans Ende, bleibt das × oben stehen; die Kopfzeile deckt auch den Innenrand des Fensters, sonst schaut ein Feld darüber hervor · Anker CFRP_KAPUTT=frage-kopf-rollt-weg */ .frage .modal:has(.felder) .reihe:has(> :nth-child(4)){flex-wrap:wrap}   /* A-383: ein Formular mit vier Knöpfen — die Reihe bricht um, das Fenster rollt, das × bleibt oben erreichbar · Anker CFRP_KAPUTT=formular-ueberlauf */
.modal .kal{margin:10px 0 2px;user-select:none;-webkit-user-select:none}
.modal .kal-kopf{display:flex;align-items:center;justify-content:space-between;margin-bottom:2px}
.modal .kal-kopf strong{font-size:14px}
.modal .kal-kopf button{width:44px;height:44px;border:1px solid var(--line);border-radius:10px;background:var(--sf);font-size:18px;color:var(--ink);cursor:pointer}
.modal .kal-kopf button:disabled{opacity:.35;cursor:default}
.modal .kal-wt,.modal .kal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:0}
.modal .kal-wt span{text-align:center;font-size:11px;color:var(--dim);padding:2px 0}
.modal .kal-grid button{height:44px;min-width:0;border:0;border-radius:10px;background:transparent;font:inherit;font-size:14px;color:var(--ink);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;cursor:pointer;padding:0}
.modal .kal-grid button:hover:not(:disabled){background:var(--sf)}
.modal .kal-grid button:focus-visible{outline:2px solid var(--green);outline-offset:-2px}
.modal .kal-grid button:disabled{color:var(--grey);opacity:.45;cursor:default}   /* gesperrt = vergangen; WCAG nimmt gesperrte Knöpfe vom Kontrast aus, der Satz im aria-label sagt es */
.modal .kal-grid button.we:not(:disabled){color:var(--dim)}
.modal .kal-grid button.heute{box-shadow:inset 0 0 0 1.5px var(--ink)}
.modal .kal-grid button.gewaehlt,.modal .kal-grid button.gewaehlt:hover{background:var(--green);color:#fff;font-weight:600}
.modal .kal-grid .pkte{display:flex;gap:2px;height:5px}
.modal .kal-grid .pkte i{width:5px;height:5px;border-radius:50%;background:var(--amber)}
.modal .kal-grid button.gewaehlt .pkte i{background:#fff}
.modal .kal-legende{display:flex;align-items:flex-start;gap:6px;font-size:12px;color:var(--dim);margin:4px 0 0}
/* Telefon: ein Monat mit sechs Wochenzeilen, dazu Belegt-Satz und Knöpfe, muss in 663 px passen (gemessen 28.09.: 663 px Inhalt
   auf 623 px Platz, „Tag bauen“ lag unter dem Rand). Die Tippziele bleiben 44 px, nur Ränder werden knapper. */
@media (max-width:560px){
  .ovl.frage:has(.kal){padding:10px}
  .frage .modal:has(.kal){padding:14px}
  .frage .modal:has(.kal) > p{margin-bottom:8px}
}
.modal .kal-legende i{width:6px;height:6px;border-radius:50%;background:var(--amber);display:inline-block;flex:none;margin-top:6px}
.modal .knopf:disabled{opacity:.55;cursor:default}
#dstamm input{width:100%}
#dstamm .dreihe input{flex:1 1 90px;min-width:0}
#dstamm .dreihe input[data-nstrasse]{flex:3 1 160px}
/* ── Command 44 Block A · Hotel am Tagesende ────────────────────────────────
   Die Liste ist ein Block in der Tagesfläche wie die Optimierer-Vorschau (`.optvorschau`),
   kein Fenster; ihre Zeilen folgen `.vkandidat` (Name + zwei Unterzeilen, Knopf rechts). */
.hotelwahl .okopf .iconbtn{margin-left:auto}
.hotelwahl .hliste{display:flex;flex-direction:column}
.hotelwahl .hkandidat{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:7px 0;border-top:1px solid var(--soft)}
.hotelwahl .hkandidat .hinfo{min-width:0;flex:1}
.hotelwahl .hkandidat .hname{font-size:var(--fs-i,12.5px)}
.hotelwahl .hkandidat .sub{display:block;font-size:var(--fs-n,11px);color:var(--dim)}
.hotelwahl .hkandidat .hpreis{color:var(--ink);font-weight:600;font-variant-numeric:tabular-nums}
/* Command 45 C: die nicht stornierbare Alternative desselben Hauses — zurückgenommen, denn
   die stornierbare Rate ist die Vorgabe; die Zahl bleibt tabellarisch lesbar. */
.hotelwahl .hkandidat .halt{font-variant-numeric:tabular-nums;opacity:.85}
/* C65 Auflage 4 — „über Budget": ein HINWEIS neben dem Preis, keine Warnung und keine Sperre.
   Deshalb Bernstein (`--amber`) und nicht Rot: das Haus ist wählbar, es ist nur teurer als das,
   was im Konto steht. Der Satz unter der Liste (`.hgrenze`) nennt, was die harte Grenze
   weggelassen hat — er steht ausserhalb von `.hliste`, damit ihn keine Trennlinie einfasst. */
.hotelwahl .hkandidat .hueber{color:var(--amber);font-weight:600;white-space:nowrap}
.hotelwahl .hgrenze{font-size:var(--fs-n,11px);color:var(--dim);padding:6px 0 0;border-top:1px solid var(--soft)}
.hotelwahl .hlade,.hotelwahl .hleer{font-size:var(--fs-n,12px);color:var(--dim);padding:6px 0}
.hotelwahl .hleer .meta{display:block;font-size:var(--fs-n,11px)}
.hotelwahl .hfilter{display:flex;align-items:center;gap:7px;flex-wrap:wrap;font-size:var(--fs-n,12px);padding:0 0 6px;cursor:pointer}   /* A-336 */
.stopp .hknoepfe{display:flex;gap:6px;flex-wrap:wrap;flex-basis:100%;margin-top:4px}
.stopp .hknoepfe .knopf.mini{font-size:var(--fs-n,11px);padding:4px 9px}
.stopp .linkbtn.preisneu{font-size:inherit;color:var(--amber)}
.sup.hotel{border-style:dashed}

/* Command 47 Block D — der gewählte Neukunde und das Detail */
.mk-neu.gewaehlt{width:16px;height:16px;border-width:2.5px;box-shadow:0 0 0 3px rgba(15,122,77,.28),0 1px 3px rgba(0,0,0,.35)}
/* D2.1 (16.09.2026) — die Stufe ist ein KNOPF, sieht aber nicht aus wie einer: keine Fläche,
   kein Rahmen, nur die gepunktete Unterstreichung, die überall „hier steht mehr dahinter"
   heißt. Ein Knopf mit Rahmen neben „+ in den Tag" wären zwei Handlungen von gleichem Gewicht,
   und die Übernahme ist die wichtigere. `font:inherit`, weil ein `<button>` sonst die
   Schriftart des Betriebssystems erbt und die Zeile aus dem Satz fiele. */
.dguete{font-size:var(--fs-i,13px);font-weight:700;font-family:inherit;background:none;border:0;padding:0;
  cursor:pointer;text-decoration:underline dotted;text-underline-offset:3px}
.dguete-geprueft{color:var(--greend)}.dguete-teilgeprueft{color:#8a6d1f}.dguete-zweifelhaft{color:#a33}
.dguete-geschlossen{color:#a33}.dguete-ungeprueft{color:var(--dim)}
/* Das Hinweisfenster: klein, über der Fläche, an der Stufe angewachsen. `position:absolute`
   gegen das umschließende `.dguetefeld` — ohne den Bezugsrahmen hinge es am Fenster und wanderte
   beim Scrollen der rechten Fläche davon. */
.dguetefeld{position:relative}
.dpop{position:absolute;z-index:40;left:0;top:100%;margin-top:4px;max-width:320px;
  background:#fff;border:1px solid var(--line);border-radius:10px;padding:10px 12px;
  box-shadow:0 6px 20px rgba(0,0,0,.18)}
.dpop > b{font-size:var(--fs-n,12px)}
.dpop .dhint{margin-top:3px}
.dpruef{list-style:none;margin:8px 0 0;padding:0;font-size:var(--fs-n,11.5px);line-height:1.5}
.dpruef li{display:flex;justify-content:space-between;gap:10px;padding:2px 0;border-top:1px solid var(--greys)}
.dpruef li span:first-child{color:var(--dim)}
.dpruef li.nein span:last-child{color:#a33;font-weight:600}.dpruef li.offen span:last-child{color:var(--dim)}
/* ── C47 D2.2 · DIE DRITTE PUNKTART: „Neukunde, geplant" ────────────────────────────────────
   Bestand schwarz · Neukunde im Pool grün · übernommener Neukunde grün MIT dunklem Ring.
   Gleiche Größe wie die beiden anderen (ein Neukunde ist nicht wichtiger), gleiche Form; der
   Ring sagt „gehört schon uns", die Farbe sagt „ist noch keiner von den Alten". Der Ring ist
   der Rand selbst, kein zusätzlicher Schatten: ein Punkt, der bei drei Arten dreimal anders
   groß wirkt, ist auf einer vollen Karte nicht mehr zu sortieren. */
.mk-kunde.neu{background:var(--green);border:2px solid var(--ink)}
.mk-bau.neu{border-color:var(--ink)}
/* Nachtrag 16.09. (Prüfpunkt 2, zweiter Anlauf): dieselbe Kennung auf den zwei Markern, die ÜBER dem
   Kundenpunkt liegen können — der Auswahl-Marker (gewählter Kunde, `.mk-sel`) und der nummerierte
   Stopp des Tages (`.mk-besuch`, Tagesfarbe bleibt, grüner Ring außen). Ohne sie verdeckte Schwarz den
   grünen Ring-Punkt, und die Karte sagte „Bestand" über einem Neukunden. */
.mk-sel.neu{background:var(--green);border-color:var(--ink)}
.mk-besuch.neu{box-shadow:0 0 0 2.5px var(--green),0 2px 6px rgba(0,0,0,.3)}
/* Dieselbe Marke in der Kundenzeile und im Kundendetail — ein Wort, zwei Orte, ein Aussehen. */
.kkopf .tag.neu,.dtag.neu{background:var(--greens);color:var(--greend)}

/* ── C76/C78 · Fahrmodus — ein Telefon-Pfad ───────────────────────────────────────────────────
 * 390 px zuerst, und zwar nicht als Anpassung, sondern als Ausgangsmaß: dieser Schirm wird im
 * Auto bedient, mit einer Hand, oft in der Sonne. Deshalb große Treffflächen (min. 44 px), viel
 * Weiß, wenig Text und genau EIN grüner Knopf je Schirm — der, den man als nächstes drückt.
 * Auf dem Schreibtisch bleibt derselbe Aufbau, nur mittig begrenzt: eine zweite Darstellung
 * wäre ein zweiter Ort für dieselbe Fläche. */
.fahren{position:absolute;inset:0;z-index:40;background:var(--bg);overflow-y:auto;
  padding:14px 16px 28px;display:flex;flex-direction:column;gap:12px}
.fahren>*{width:100%;max-width:520px;margin-inline:auto}
.fkopf{display:flex;flex-direction:column;gap:8px}
.fkopf .freihe{display:flex;align-items:center;justify-content:space-between;gap:12px}
.fkopf .ftag{font-weight:700;font-size:15px}
.fzaehler{font-size:var(--fs-n,12px);color:var(--dim)}
.fbalken{height:4px;background:var(--soft);border-radius:2px;overflow:hidden}
.fbalken span{display:block;height:100%;background:var(--green);transition:width .2s}
.fdemo{background:var(--ambers);border:1px solid var(--amber);border-radius:10px;
  padding:10px 12px;font-size:var(--fs-n,12px);line-height:1.45;color:var(--ink)}
.fkarte{background:var(--sf);border:1px solid var(--line);border-radius:14px;
  padding:16px;display:flex;flex-direction:column;gap:14px}
.fname{font-size:20px;font-weight:700;line-height:1.25}
.fadresse{font-size:var(--fs-i,13px);color:var(--dim);margin-top:-8px}
.fwerte{display:flex;flex-wrap:wrap;gap:6px 14px;font-size:var(--fs-n,12px);color:var(--dim)}
.ffenster{display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px;font-size:var(--fs-n,12px);color:var(--dim);margin-top:-6px}
.ffenster .warnchip{max-width:none}
.fknoepfe{display:flex;gap:10px}
.fknoepfe>*{flex:1;min-height:48px;display:inline-flex;align-items:center;justify-content:center;
  text-decoration:none;font-size:15px}
.fknoepfe [aria-disabled="true"]{opacity:.45}
.ftext{appearance:none;background:none;border:0;color:var(--dim);font:inherit;font-size:var(--fs-i,13px);
  text-decoration:underline;padding:6px 0;cursor:pointer;align-self:center}
.ffeld{display:flex;flex-direction:column;gap:6px}
.ffeld label{font-size:var(--fs-n,12px);font-weight:600;color:var(--dim)}
.ffeld textarea,.ffeld input{font:inherit;font-size:15px;color:var(--ink);background:var(--sf);
  border:1px solid var(--line);border-radius:10px;padding:10px 12px;min-height:44px;width:100%;
  box-sizing:border-box}
.ffeld textarea{min-height:76px;resize:vertical}
/* F1 (Karls Simulator-Vorlauf 29.09.2026, iOS 27): iOS-Safari zeichnet `input type=time` mit eigener Mindestbreite — „Uhrzeit“
   ragte 9 px über die Karte, „Start“/„Ende“ überlappten um 14 px. Ohne Eigenzeichnung und mit Mindestbreite 0 nimmt das Feld
   die Breite seiner Spalte; die Spalte darf schrumpfen (`.fzwei .ffeld` min-width:0). */
.ffeld input[type=time]{-webkit-appearance:none;appearance:none;min-width:0;display:block}   /* Anker CFRP_KAPUTT=zeitfeld-eigenbreite */
.fchips{display:flex;flex-wrap:wrap;gap:8px}
/* Die Ergebnis-Chips tragen den `ton` des Mandanten (b-green/b-amber/b-red/b-grey) als Rahmen,
   nicht als Fläche: gefüllt ist nur der gewählte — sonst konkurrieren fünf bunte Flächen um
   dieselbe Aufmerksamkeit, und der Nutzer sieht nicht, was er gewählt hat. */
.fchip{appearance:none;font:inherit;font-size:14px;background:var(--sf);color:var(--ink);
  border:1.5px solid var(--line);border-radius:999px;padding:10px 14px;min-height:44px;cursor:pointer}
.fchip.b-green{border-color:var(--green)} .fchip.b-amber{border-color:var(--amber)}
.fchip.b-red{border-color:var(--red)}     .fchip.b-grey{border-color:var(--dim)}
.fchip.gewaehlt{background:var(--ink);border-color:var(--ink);color:#fff;font-weight:600}
.fstand{font-size:var(--fs-n,12px);color:var(--amber);min-height:16px}
.fzeile{display:flex;align-items:baseline;justify-content:space-between;gap:12px;font-size:15px}
.fzeile.klein{font-size:var(--fs-i,13px);color:var(--dim)}
.fzwei{display:flex;gap:12px}
.fzwei .ffeld{flex:1;min-width:0}
.fkm{display:flex;align-items:center;gap:8px}
.fkm input{max-width:140px}
.fhilfe{font-size:var(--fs-n,12px);color:var(--dim)}

/* ── KAPITEL M, M1 · DIE TELEFON-STUFE (E1, E5 — docs/wissen/mobil.md; KONZEPT-MOBIL §2, §7) ──────────────
   EIN Umbruch, zwei Bedingungen für EINE Telefon-Fläche: schmal, ODER quer mit geringer Höhe (das iPhone quer ist
   breiter als die Stufe, aber niedrig — E5). iPad hochkant und Laptop bleiben beim Schreibtischbild.
   `--telefon: 1` ist der EINE Ort, an dem das JS die Stufe erfährt (`zustand.js::telefon`, P4).
   Unter der Stufe: `#cmd` aus, die Reiterleiste unten in der Daumenzone, jede Fläche eine ganze Seite (genau eine
   offen, `zustand.js::eineFlaeche`), oben nur Anzeige. Der Tag lässt oben einen Kartenstreifen frei (E4), quer die
   linke Seite. Das Innere der Flächen (Tag untereinander, Woche als Liste, Suchblatt) ist M2–M4. */
.reiter{display:none}
.zurueck,.kartegross,.baukopf,.pluskunde,.heimhinweis{display:none}
/* A-289 A7 — Hinweis nach dem Import, unten mittig über der Karte, frei vom Fußbalken (gemessen am Bild 1440) */
.importhinweis{position:absolute;z-index:40;left:50%;transform:translateX(-50%);bottom:84px;width:min(440px,calc(100% - 32px));box-sizing:border-box;background:var(--sf);border:1px solid var(--line);border-radius:12px;box-shadow:0 6px 24px rgba(0,0,0,.18);padding:14px 48px 14px 16px;font-size:var(--fs-n,13px);line-height:1.45}
.importhinweis p{margin:6px 0 0}
.importhinweis .heimtitel{display:block;font-size:15px}
.importhinweis .heimzu{position:absolute;top:4px;right:4px;width:44px;height:44px;border:0;background:transparent;font-size:24px;color:inherit;cursor:pointer}
.importhinweis .knopf[data-importzu]{margin-top:10px;min-height:44px}   /* M5: Baukopf und „+ Kunde“ gibt es nur am Telefon */
/* „Zur Route“ im Bau-Modus (leiste.js): am Schreibtisch oben rechts an der Karte, links neben der rechten Fläche (--br). */
.zurroute{display:inline-flex;align-items:center;position:absolute;z-index:6;right:var(--br);top:106px;min-height:36px;padding:0 14px;
  border:1px solid var(--line);border-radius:10px;background:var(--sf);color:var(--ink);font:inherit;font-weight:600;cursor:pointer;
  box-shadow:0 2px 8px rgba(0,0,0,.15)}
.zurroute[hidden]{display:none}
.zurroute{gap:8px}
.zurroute svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round}
.zurroute svg circle{fill:currentColor;stroke:none}
.suchefertig,.suchblatt{display:none}   /* M3 — Suchblatt und „Fertig“ gibt es nur am Telefon */
.dzaehler,.dfuss{display:none}   /* M2b — Zähler und Fuß des Stopp-Details gibt es nur am Telefon */ .dpause,.tzauf{display:none}   /* R6 — „Pause nach diesem Stopp“ im Detail und ⓘ an den Kennzahlen: nur am Telefon */
/* A-35 — die Wahl der Navi-App (navi.js). Im Stopp-Detail nur am Telefon, wo „Navigieren“ im Fuß steht; im Fahrmodus immer. */
.naviwahl{display:flex;align-items:center;gap:8px;margin-top:10px;font-size:var(--fs-i,13px);color:var(--dim)}
.naviwahl select{flex:1;min-height:44px;font:inherit;color:var(--ink)}
.dnaviwahl{display:none}
@media (max-width:768px), (orientation:landscape) and (max-height:500px){
  :root{--telefon:1;--reiterh:56px;--obenfrei:48px;--tagfrei:120px;--streifen:30%}   /* --tagfrei: links frei für „‹ Tag“ (8 + 103 px breit, gemessen) */
  /* A6 Grundschrift am Telefon (Matthias 25.09.2026, Variante B): ZWEI Schriftmaße für alle Flächen. Jede Schrift der
     App unter der Inhaltsstufe liest eine der beiden Variablen, mit ihrem Schreibtischwert als Rückfall — außerhalb
     dieser Stufe ist nichts gesetzt, der Schreibtisch bleibt wie er war. Ausgenommen: Zeichen in festen Kästen
     (Kartenmarker, Avatar, Symbolknöpfe), sie sind Glyphen, kein Lesetext. */
  :root{--fs-n:12.5px;--fs-i:14px}   /* Anker CFRP_KAPUTT=schrift-klein */
  :where(button){font-size:var(--fs-n)}   /* Knöpfe ohne eigene Größe fielen auf WebKits Knopf-Standard (11 px, gemessen im Guide) */
  /* TIPPZIELE ≥ 44 × 44 px (Entscheid Constantin 29.09.2026, Apple-HIG; Wächter `tests/telefon-tippziele.test.mjs` T1) — EINE
     Regel für alle Ziele: die Trefferfläche wächst unsichtbar um jedes Ziel auf mindestens 44 × 44 (wie M5b an den
     Kartenmarken), das Bild bleibt. `:where` hält die Spezifität bei 0 — wer seine Lage selbst setzt (absolute, fixed),
     behält sie; `z-index:1` lässt das kleine Ziel über dem nächsten, nicht positionierten Nachbarn liegen. Nicht die
     Kartenmarken (M5b regelt sie einzeln, der Kundenstamm liegt zu dicht) und nicht `[role=button]` — das tragen nur große
     Flächen (Stoppzeile, Ablagefläche); als positionierte Geschwister lägen sie über dem ⊕ der Zeile davor. Nicht
     `.linkbtn`: der Link-Knopf steht im Satz („… – erneut versuchen“) und ist wie ein Link im Fließtext ausgenommen
     (WCAG 2.5.8 „inline“) — vergrößert nahm er der Nadel darunter den Tipp. Nicht `.card` (Entscheid Constantin 30.09.2026):
     die Kundenkarte ist selbst groß genug; positioniert lag ihre Fläche (z-index 1, später im Baum) über dem Auswahlkästchen
     `.kwahlhuelle` daneben und nahm ihm den Tipp (a38 F-Kundenauswahl). Eine Fläche überdeckt nie ein anderes
     Bedienelement — Wächter `tests/telefon-tippziele.test.mjs` D1. */
  :where(button:not(.linkbtn, .card), a.knopf, summary, .leaflet-control-zoom a, label:has(> input[type=checkbox]), label:has(> input[type=radio])){position:relative}
  :where(button:not(.linkbtn, .card), a.knopf, summary, .leaflet-control-zoom a, label:has(> input[type=checkbox]), label:has(> input[type=radio]))::before{content:"";position:absolute;left:50%;top:50%;width:max(100%,44px);height:max(100%,44px);transform:translate(-50%,-50%);z-index:1}   /* Anker CFRP_KAPUTT=tippziel-klein */ /* Anker CFRP_KAPUTT=flaeche-deckt */
  /* Wo zwei kleine Ziele übereinander stehen, nimmt das untere dem oberen den Tipp — dort hilft nur echte Höhe (gemessen T1:
     Einstellungs-Reiter in zwei Reihen, Zoom +/−, das KW-Schild über den Tagesknöpfen). Auswahlfelder: WebKit übergeht
     min-height (gemessen 23 px), eine feste Höhe nimmt es (vorher nur `#pLeft select.fvoll`, M4). */
  .tab,.kwlabel{min-height:44px}   /* Anker CFRP_KAPUTT=reiter-abgeschnitten */
  /* Stoppzeile (Entscheid Constantin 29.09. abends, nach Karls Simulator-Bild 07e): die Dauer-Pillen bleiben SICHTBAR klein,
     nur ihre Fläche ist 44 — so weit auseinander, dass keine Fläche die nächste anschneidet (Mittenabstand ≥ 44), in einem
     Band von 44 Höhe (die Fläche bleibt in ihrer Reihe). Die Nadel ⚲ steht wieder in der Reihe, direkt vor ▲; ihre Fläche
     dreht NICHT mit (gedreht wäre sie eine Raute von 62 px). Alle Zeichen der Reihe sind sichtbar klein (seit dem Nachzug auch ▲ ▼ ×) und halten
     Mittenabstand ≥ 44 (◍ griff 7 px in ▼ — ein Tipp 20 px rechts der ▼-Mitte ging an ◍, Karl 29.09.). */
  .dauerwahl{min-height:44px;gap:0}   /* Anker CFRP_KAPUTT=pillen-gross */
  .dauerwahl .dwahl+.dwahl{margin-left:18px}
  .dauerwahl .dfrei{margin-left:10px;width:40px;-moz-appearance:textfield;appearance:textfield}   /* ohne Drehschalter: am Telefon tippt man Ziffern */
  .dauerwahl .dfrei::-webkit-inner-spin-button,.dauerwahl .dfrei::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}
  .stopp .iconbtn.pin{margin:0 14px 0 auto}   /* rechts in der Reihe; Mitte ⚲ bis Mitte ▲ = 11 + 14 + Spalt 4 + 15 = 44 */
  .stopp .iconbtn.pin::before{transform:translate(-50%,-50%) rotate(-45deg)}
  .stopp .iconbtn.pin+.pfeile{margin-left:0}   /* Anker CFRP_KAPUTT=nadel-lose  ⚲ ▲ ▼ ◍ als EINE Gruppe rechts — sonst teilen sich zwei auto-Ränder den Platz und ⚲ steht lose (Karl 07f) */
  .stopp .iconbtn.pausenach{display:none}   /* R6 (Entscheid Constantin 01.10.2026): ◍ steht am Telefon im Stopp-Detail („Pause nach diesem Stopp“), nicht in der Zeile — eine Reihe weniger je Stopp · Anker CFRP_KAPUTT=pause-in-zeile */
  .stopp{row-gap:14px}
  .leaflet-touch .leaflet-bar.leaflet-control-zoom a{width:var(--zoomb);height:var(--zoomb);line-height:var(--zoomb)}
  /* N3 (Vorab 7800c073, m-telefon „liegt auf“) — EIN Ort für die rechte Kante der Zoom-Leiste: Leaflets Rand 10 + Rahmen 2 +
     Knopf + Rahmen 2 (leaflet.css `.leaflet-left .leaflet-control`, `.leaflet-touch .leaflet-bar`). Was links oben über der
     Karte liegt (der Toast hochkant und quer), beginnt dort. Bis 30.09. rechnete der Toast mit dem Zoom von vor der 44er-Regel
     (x 10–44, `left:52px`) und lag 4 px über „+“/„−“ (Zoom sichtbar x 12–56). */
  :root{--zoomb:44px;--zoomkante:calc(10px + 2px + var(--zoomb) + 2px)}   /* Anker CFRP_KAPUTT=toast-ueber-zoom */
  /* Das Kästchen selbst bleibt obenauf — die Fläche des Labels liegt daneben, nicht darüber (neukunden-panel N1: `check()`). */
  :where(label:has(> input[type=checkbox]), label:has(> input[type=radio])) > input{position:relative;z-index:2}
  /* Die Regel oben macht jedes Tippziel `position:relative`, seine Fläche liegt auf Ebene 1. Klebende Köpfe und Füße über Listen
     stehen deshalb auf z-index 2 (`.nkkopf`, `.nkfuss`, `.tlkopf`, `.prkopf`, `#week .wfuss`), sonst liegen die Zeilen beim Scrollen darüber. */
  select{height:44px}
  .cmd{display:none}
  /* M3 Suchblatt (24.09.2026): dasselbe `#suche` als Zeile unten über den Reitern, daneben „Fertig“; das Blatt deckt
     die Ansicht darunter, die Treffer stehen über der Eingabe, der beste am nächsten (column-reverse über Gruppenblöcke,
     der Kopf eines Blocks oben: order 1). Kein Element oberhalb von y 39 (M-39): das Blatt ist Grund, keine Bedienung. */
  .cmd.suchzeile{display:flex;top:auto;left:10px;right:10px;transform:none;
    bottom:calc(var(--reiterh) + env(safe-area-inset-bottom) + 8px)}
  .cmd.suchzeile>:not(#suche):not(#suchefertig){display:none}
  .cmd.suchzeile .searchbox{flex:1 1 auto;width:auto;min-height:44px;box-sizing:border-box;font-size:16px}
  .cmd.suchzeile .suchefertig{display:inline-flex;align-items:center;flex:0 0 auto;min-height:44px;padding:0 14px;
    appearance:none;border:0;border-radius:999px;background:transparent;color:#fff;font:inherit;font-weight:700;cursor:pointer}
  .suchblatt{display:block;position:absolute;left:0;right:0;top:0;z-index:29;background:var(--bg);
    bottom:calc(var(--reiterh) + env(safe-area-inset-bottom))}
  .suchblatt[hidden]{display:none}
  .suchhinweis{position:absolute;left:16px;right:16px;bottom:72px;margin:0;font-size:var(--fs-i,13px);color:var(--dim)}
  .sres{display:flex;flex-direction:column-reverse}
  .sres [data-sblock]{display:flex;flex-direction:column-reverse}   /* Anker CFRP_KAPUTT=treffer-oben */
  .sres [data-sgruppe]{order:1}
  .sres [data-sziel]{min-height:44px;align-items:center!important;box-sizing:border-box}   /* Anker CFRP_KAPUTT=treffer-klein */
  .sres{top:auto;left:10px;right:10px;transform:none;max-height:calc(100% - var(--reiterh) - 140px);overflow:auto;
    bottom:calc(var(--reiterh) + env(safe-area-inset-bottom) + 66px)}
  .reiter{display:flex;position:absolute;left:0;right:0;bottom:0;z-index:30;background:var(--head);
    padding:0 env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left)}
  .reiter[hidden]{display:none}
  .reiter button{flex:1 1 0;min-width:0;min-height:var(--reiterh);appearance:none;border:0;background:transparent;
    color:#d9d7cf;font:inherit;font-size:var(--fs-i,12.5px);font-weight:600;cursor:pointer}
  .reiter button[aria-pressed="true"]{color:#fff;box-shadow:inset 0 3px 0 var(--green)}
  /* Jede Fläche eine ganze Seite, zwischen Kopf und Reiterleiste. */
  #pLeft,#pRight,#pBottom{left:0;right:0;width:auto;height:auto;top:var(--obenfrei);border-radius:0;
    border-left:0;border-right:0;bottom:calc(var(--reiterh) + env(safe-area-inset-bottom))}
  #pBottom{top:var(--streifen)}   /* Anker CFRP_KAPUTT=streifen-38 · E4 — der Kartenstreifen oben bleibt frei. R6 (Constantin 01.10.2026): 38 → 30 %, EIN Ort `--streifen` (Telefon-:root) für alles, was an seiner Kante hängt */
  .grip{display:none}
  .week{top:0;bottom:calc(var(--reiterh) + env(safe-area-inset-bottom))}
  /* M4 Woche: Scrollen, Kacheln und Tagesaufbau stehen seit Woche B (25.09.2026) in deren Stufe weiter unten —
     sie umfasst diese Stufe ganz, zwei Orte für dieselbe Regel wären einer zu viel. */
  .daybody{overflow:visible}
  /* M4b: die Bedienung der Woche auf das Tippmaß — Pfeile 28, Wochenwahl 32, „Zurück zur Karte“ 29, „Jetzt planen“ 25,
     „Tag auf Karte“ 13 px hoch gemessen. Der Stopp (`.itm`) war mit 70 schon groß genug. */
  #week .navbtn{min-width:44px;min-height:44px}   /* Anker CFRP_KAPUTT=woche-klein */
  #week .wpickbtn,#week .rowbtn,#week .knopf.mini{min-height:44px;box-sizing:border-box}
  #week .linkbtn{display:inline-flex;align-items:center;min-height:44px}
  /* M4 Planung: sie ist schon eine Spalte (#pLeft ganzseitig, M1) — es fehlten die Tippflächen: Reiter 27, × 26,
     „+“ 28, Auswahlfelder 21 px hoch. Eingaben mit 16 px Schrift, darunter zoomt Safari beim Antippen heran. */
  #pLeft .tab,#pLeft .knopf,#pLeft .fvoll,#pLeft .fzahl,#pLeft .rschild.kw{min-height:44px;box-sizing:border-box}   /* Anker CFRP_KAPUTT=planung-klein */
  #pLeft .iconbtn,#pLeft .addbtn{min-width:44px;min-height:44px}
  /* m-telefon P1 (QA-Fassung, 01.10.2026): der Stern der Routenkarte blieb 19 × 15 — die Demo hatte keine Routen, also nie einen Stern.
     Echte Fläche wie die Nachbarn der Planung (M4); das Zeichen bleibt, wo es war: die Polster schieben es in die rechte obere Ecke,
     die negativen Ränder geben ihr keinen Platz im Kopf — er belegt wie vorher 19 × 15, Name und KW-Schild stehen, wo sie standen. Oben
     liegt die Fläche im Kartenpolster (10 von 11), rechts reicht sie 5 über den Kartenrand ins Polster von `.pbody` (11, kein Rollbalken),
     links genau über die Lücke (−8 = `gap`), nicht ins KW-Schild. Erste Fassung (758a248e) hielt rechts im Kartenrand und schob das Schild
     6 nach links — gemessen von Pablo im Bildvergleich. `position:relative` hebt die Fläche über die Kennzahlzeile darunter. */
  #pLeft .stern{position:relative;display:inline-flex;align-items:flex-start;justify-content:flex-end;width:44px;height:44px;padding:10px 19px 0 2px;margin:-10px -17px -19px -8px}   /* Anker CFRP_KAPUTT=stern-klein */
  /* m-telefon P1, zweiter Grund (Pablo, 01.10.2026): die Zeile „⚠ … Kunden sind überfällig“ im Reiter Kunden war 33 hoch. */
  #pLeft .ueberzeile{min-height:44px}   /* Anker CFRP_KAPUTT=ueberzeile-klein */
  /* A-38 (Audit 25.09.2026): Safari am iPhone vergrößert die Seite beim Antippen jedes Feldes unter 16 px — und bleibt
     vergrößert. Vorher hob nur #pLeft auf 16; gemessen lagen Kundendetail 13, Anmeldung/Dialoge 13.5, Fahrmodus 15,
     Tag .dfrei 11, Bauleiste 12, Import 12.5 und Einstellungen 12.5 darunter. EINE Untergrenze für jedes Textfeld statt
     einer Zeile je Fläche (P4); `!important`, weil sie über jeder Flächenregel stehen muss, auch über einer künftigen.
     Kein Feld der App ist größer als 16, die Grenze verkleinert also nichts. Beweis tests/a38-felder-16.test.mjs. */
  input:not([type=checkbox],[type=radio],[type=range],[type=button],[type=submit],[type=reset],[type=file],[type=color]),textarea,select{font-size:16px!important}   /* Anker CFRP_KAPUTT=eingabe-zoom */
  /* Das Menü hinter „Mehr“: unten, über der Reiterleiste, ganz im Bild. */
  .menu{position:absolute;top:auto;left:8px;right:8px;width:auto;max-height:calc(100% - var(--reiterh) - 24px);
    overflow:auto;bottom:calc(var(--reiterh) + env(safe-area-inset-bottom) + 8px)}   /* Anker CFRP_KAPUTT=menue-ohne-scroll */
  .menu [data-menu]{min-height:44px}
  /* A-35 — der Export der Tagesleiste hat mit der Navigation bis zu sieben Einträge: als Blatt über der Reiterleiste,
     ganz im Bild und scrollbar, statt am Knopf verankert (dort ragte er rechts und unten aus dem Bild). */
  .tlmenue{position:fixed;left:8px;right:8px;width:auto;top:auto;bottom:calc(var(--reiterh) + env(safe-area-inset-bottom) + 8px);max-height:calc(100% - var(--reiterh) - var(--obenfrei) - 24px);overflow:auto}   /* Anker CFRP_KAPUTT=export-blatt */
  /* M7-Nachlauf (Constantin 26.09.): das Blatt ließ sich am Telefon nicht schließen (Escape gibt es dort nicht, Zoom-Tipp schluckt
     Leaflet), und ein Tipp auf die Karte startete den Umkreis. Kopf mit × „Export schließen“ (44×44, bleibt oben beim Scrollen). */
  .tlmenue .tlkopf{display:flex;align-items:center;justify-content:space-between;position:sticky;top:-6px;z-index:2;margin:-6px -6px 0;padding:0 0 0 16px;background:var(--sf);font-size:var(--fs-i,13px)}   /* Anker CFRP_KAPUTT=export-ohne-zu */
  .tlmenue .tlzu{min-width:44px;min-height:44px;border:0;background:none;font-size:22px;line-height:1;color:var(--ink);cursor:pointer}
  /* Der Schleier unter dem Blatt fängt jeden Tipp daneben: die Karte darunter bekommt ihn nicht (kein Umkreis-Start, kein
     Zoom), und er schließt über seinen eigenen Listener (tag.js). Der Dokument-Listener in app.js reicht hier NICHT: WebKit mit
     Touch schickt für ein Element ohne eigenen Klick-Listener kein `click` (gemessen 390 WebKit: pointerdown…touchend am
     Schleier, kein click — auch mit cursor:pointer); dasselbe Bild wie am iPhone, wo der Tipp daneben nichts schloss. */
  .tlschleier{display:block;position:fixed;inset:0;z-index:32;background:transparent}   /* Anker CFRP_KAPUTT=export-ohne-schleier */
  /* Mit „Reisekostenabrechnung“ (Tabelle formulare an, 30.09.) wurde das Blatt so hoch, dass „Karte groß“ (z-index 31, außerhalb von #pBottom)
     über seinem Kopf mit × lag. Offenes Blatt = der Stapel von #pBottom über Reiterleiste und Kartenknöpfen, unter dem Toast (35). */
  #pBottom:has(#exportmenu){z-index:32}   /* Anker CFRP_KAPUTT=export-unter-kartegross */
  /* A-21 — unten rechts lag die Kartennennung unter Reiterleiste und Tagesfläche (gemessen 390: y 646, verdeckt). Oben rechts
     ging nicht: dort erscheint der Toast (m-telefon N3-T, Vorab-Lauf über b3696c6e). Frei ist: ohne Tagesfläche („Karte groß“)
     rechts über den Reitern; mit Tagesfläche links unten im Kartenstreifen, direkt über ihrer Oberkante (100 % − `--streifen`
     von #pBottom), links von „Karte groß“. Dieselbe Regel trägt quer: dort liegt sie links im Kartenteil unter dem Zoom, frei
     vom Toast und von der Tagesliste rechts (gemessen, mobil-rundgang G10c/G10d „Q tag“). */
  .leaflet-bottom.leaflet-right{bottom:calc(var(--reiterh) + env(safe-area-inset-bottom));right:var(--sr,0px)}
  #buehne:has(> #pBottom:not([hidden])) .leaflet-bottom.leaflet-right{bottom:calc(100% - var(--streifen));right:auto;left:var(--sl,0px)}   /* Anker CFRP_KAPUTT=osm-verdeckt */
  .zahlband{top:8px}   /* A-194: oben, die Leiste ist hier aus (.cmd unten) */
  /* M2 — der Tag als EINE scrollende Spalte (E3/E4, Konzept „Tag“): Kopf, die Stopps über die volle Breite, dann die
     Nebenaktionen, „Fahrmodus starten“ klebt unten über der Reiterleiste. `tag.js` bleibt unberührt: Tagesleiste und
     ihre Gruppen treten mit `display:contents` zurück, ihre Knöpfe werden Geschwister der Liste. */
  #pBottom{overflow-y:auto;overscroll-behavior:contain;flex-flow:row wrap;align-content:flex-start;scroll-padding-bottom:72px}   /* Anker CFRP_KAPUTT=tag-klemmt */
  #pBottom>*{flex:1 1 100%;min-width:0}
  #pBottom .tagbody{overflow:visible;padding-top:3px} #pBottom>.editbar{order:1;border-top:1px solid #c6ded1} #pBottom .tagkopf{padding-block:5px;row-gap:4px}   /* R6 (01.10.2026): die erste Stoppzeile steht beim Start ganz im Bild, auch bei 581 hoch — die Bearbeitungsleiste steht am Telefon HINTER der Liste bei den Werkzeugen, Kopf und Listenanfang rücken enger (Tippflächen unberührt). Vorher lag die Zeile unter „Fahrmodus starten“. Anker CFRP_KAPUTT=stopps-hinter-leiste */
  #pBottom .tagleiste,#pBottom .tlreihe,#pBottom .tlgruppe{display:contents}
  #pBottom .knopf.tl{flex:1 1 auto;min-height:44px;margin:4px 6px}
  #pBottom .tlauf{flex:1 1 auto;margin:4px 6px}
  #pBottom .tlauf .knopf.tl{margin:0;width:100%}
  #pBottom .tlspeicher{flex:1 1 100%;margin:6px 12px 0}
  /* Die Stoppzeile (umbrechend schon am Schreibtisch): der Name nimmt die erste Zeile neben Zeit und Symbol ein, die
     Bedienung rutscht darunter — ohne diese Basis bekam der Name hier 15 px. Die ↑/↓ auf 44 zu bringen ist M5. */
  /* A-168 N3 (Karls Simulator-Nachlauf): hier stand zusätzlich `row-gap:6px` und schlug die Telefonregel `.stopp{row-gap:14px}`
     weiter oben (Spezifität) — bei 6 reichte die Fläche von „Besuchsbericht“ und ⚲ aus der zweiten Reihe ins Band der
     Dauer-Pillen, ein Tipp 21 px unter „30“/„60“ ging an den Nachbarn. Der Reihenabstand steht nur noch dort. */
  #pBottom .stopp{min-height:44px;box-sizing:border-box}   /* Anker CFRP_KAPUTT=reihen-eng */
  #pBottom .stopp .sname{flex:1 1 calc(100% - 150px);min-width:0}   /* Anker CFRP_KAPUTT=stopp-gequetscht */
  /* M7 (26.09.): am Kundenstopp brach „ד allein in eine dritte Zeile (Zeitart, frei/30/45/60/Feld, ⚲, ▲▼, ◍ füllen die zweite),
     22 px klein. Es steht jetzt oben rechts neben dem Namen, auf Tippmaß; die Bedienung darunter bleibt in einer Zeile.
     `order` statt Umbau im Markup: am Schreibtisch bleibt die Reihenfolge, wie sie ist. */
  /* M7 (26.09.): die Team-Tabelle brach bei 390 mitten im Wort („Außendie|nst“, „angemel|det“, E-Mail) — vier Spalten auf
     350 px mit overflow-wrap:anywhere. Am Telefon wird jede Zeile eine Karte: Name | Status, darunter E-Mail | Rolle; nur
     die E-Mail darf noch brechen, und das erst, wenn sie allein keine Zeile hat. */
  .kliste thead{display:none} .kliste,.kliste tbody{display:block} .kliste tr{display:grid;grid-template-columns:minmax(0,1fr) auto;column-gap:10px;padding:7px 0;border-bottom:1px solid var(--soft)} .kliste td{padding:0;border:0;overflow-wrap:normal} .kliste td:nth-child(1){font-weight:600} .kliste td:nth-child(2){grid-column:1;overflow-wrap:anywhere;color:var(--dim)} .kliste td:nth-child(3),.kliste td:nth-child(4){white-space:nowrap;text-align:right} .kliste td:nth-child(3){grid-column:2;grid-row:2} .kliste td:nth-child(4){grid-column:2;grid-row:1}   /* Anker CFRP_KAPUTT=team-tabelle-eng (eine Zeile: der Schalter nimmt die ganze Kartenform) */
  #pBottom .stopp>*{order:1}
  #pBottom .stopp>.szeit,#pBottom .stopp>.swarte,#pBottom .stopp>.sico,#pBottom .stopp>.sname,#pBottom .stopp>[data-raus]{order:0}   /* Anker CFRP_KAPUTT=raus-eigene-zeile */
  #pBottom .stopp>[data-raus]{width:30px;height:30px;font-size:15px;align-self:flex-start}   /* sichtbar klein, die Fläche 44 kommt aus der Tippziel-Regel (Entscheid Constantin 29.09. abends) */
  /* m-telefon T2 (Vorab-Lauf 40742315): der Name behält mindestens die halbe Zeile (+ 8 = halber Innenrand, gemessen wird die
     Zeile mit Rand) und 4 px Reserve darüber, weil T2 vor dem Vergleich rundet (Constantin 26.09.); dafür rücken Zeit, Symbol,
     Name und × enger (4 statt 9). 88 + 16 + 188 + 44 + 3·4 = 348 ≤ 352 bei 390.
     Wird die Zeit breiter, rutscht eher das × um, als dass der Name schrumpft. */
  #pBottom .stopp:has(>[data-raus]){column-gap:4px} #pBottom .stopp:has(>[data-raus]) .sname{flex:1 1 0;min-width:calc(50% + 12px)}   /* Anker CFRP_KAPUTT=name-gequetscht  Anker CFRP_KAPUTT=name-ohne-reserve */
  #pBottom .knopf.tl[data-fahrmodus]{order:99;flex:1 1 100%;justify-content:center;position:sticky;bottom:8px;z-index:3;min-height:48px;   /* Anker CFRP_KAPUTT=fahrmodus-nicht-fest */
    /* K1 (Rundgang) — ein Rahmen in Panelfarbe füllt die 8 px bis zur Reiterleiste und den Rand links/rechts: vorher schien
       die Liste unter dem schwebenden Knopf durch („frei 30 45 60“ halb darunter). Der Schatten darüber trennt ihn von der Liste. */
    margin:8px 10px;box-shadow:0 0 0 10px var(--sf,#fff),0 -12px 16px rgba(0,0,0,.10)}   /* Anker CFRP_KAPUTT=fuss-durchsichtig */
  /* „‹ Tag“ unten links über der Reiterleiste (Daumenzone); „Karte groß“ unten rechts am Kartenstreifen. */
  .zurueck,.kartegross{display:inline-flex;align-items:center;position:absolute;z-index:31;min-height:44px;padding:0 14px;border:1px solid var(--line,#d8d6cf);
    border-radius:10px;background:var(--bg,#fff);color:inherit;font:inherit;font-weight:600;box-shadow:0 2px 8px rgba(0,0,0,.15)}
  .zurueck{left:8px;bottom:calc(var(--reiterh) + env(safe-area-inset-bottom) + 8px)}
  .kartegross{right:8px;top:calc(var(--streifen) - 52px)}
  /* Bau-Modus hochkant: links unter den Zoomknöpfen (Leaflet: Rand 10 + zwei Knöpfe mit Rahmen), NICHT rechts im Streifen —
     dort liegt der Toast (`left:52px`, bis zu fünf Zeilen, gemessen karte-einpassen B3a 28.09.). Nur das Zeichen, 44 × 44.
     Seit den 44-px-Zoomknöpfen (Tippziele, 29.09.) eine Knopfhöhe tiefer — sonst schneidet der Zoom den Knopf (B3a). */
  .zurroute{z-index:31;left:8px;right:auto;top:110px;width:44px;height:44px;min-height:44px;padding:0;justify-content:center}
  .zurroute .zr-text{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
  .zurueck[hidden],.kartegross[hidden]{display:none}
  /* M5 Tag bauen am Telefon (LAUNCH 1.13): oben links am Kartenstreifen der Baukopf mit dem Zähler (liegt auch über dem
     Suchblatt im Modus „hinzufügen“), unten links „+ Kunde“ in der Daumenzone. Im Bau-Modus (`data-baumodus`, leiste.js)
     ist „Tag speichern“ der Hauptknopf unten rechts; der Fahrmodus-Knopf tritt zurück — einen Tag, der gerade entsteht,
     fährt man nicht ab. */
  .baukopf{display:block;position:absolute;z-index:31;left:60px;top:calc(var(--streifen) - 52px);max-width:calc(100% - 202px);padding:8px 12px;
    border-radius:10px;background:var(--ink);color:#fff;font-size:var(--fs-i,13px);font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}   /* R6: rechts neben „Zur Route“ (links unter dem Zoom) — der schmalere Streifen hebt den Kopf auf dessen Höhe (karte-einpassen B3a) */
  .pluskunde{display:inline-flex;align-items:center;position:absolute;z-index:31;left:8px;min-height:48px;padding:0 16px;   /* Anker CFRP_KAPUTT=pluskunde-oben */
    bottom:calc(var(--reiterh) + env(safe-area-inset-bottom) + 8px);border:1px solid var(--green);border-radius:10px;background:var(--sf);
    color:var(--greend);font:inherit;font-weight:700;box-shadow:0 2px 8px rgba(0,0,0,.15)}
  .baukopf[hidden],.pluskunde[hidden]{display:none}
  .baukopf.imblatt{top:8px}
  /* M5 — der Toast steht nicht auf der Daumen-Reihe („+ Kunde“, Speichern, Fertig, Fahrmodus): gemessen lag er bei
     bottom 22 px über „Route speichern“ und „Reihenfolge optimieren“ und fing deren Tipp ab. Und er nimmt die Breite
     zwischen den Rändern: mit left 50 % + translateX bekam er als absolutes Element nur die halbe Breite (gemessen ≈ 220 px,
     neun Zeilen — der „8-Zeilen-Toast“ aus 1.30).
     M5b — und er steht OBEN, direkt unter dem Kopf: über der Daumen-Reihe (bottom Reiter + 64 px) lag er am Telefon hochkant
     noch auf den Tagesknöpfen (Dauer-Chips, ⚲, ▲▼), quer auf ◍. Oben liegt der Kartenstreifen, dort wird nicht getippt;
     links frei bis zur Kante der Zoom-Leiste (`--zoomkante`, N3), quer nur über der Karte (Regel in der Quer-Stufe). Rechts 6
     statt 12: N3 schob ihn links 6 px weiter, und die Warn-Kurzsätze sind auf diese Breite gesetzt (mobil-rundgang G8 kappte
     bei 320 den Termin-Konflikt in der zweiten Zeile) — die Breite bleibt, die Lage rückt. */
  .toast{top:calc(var(--obenfrei) + 8px);bottom:auto;left:var(--zoomkante);right:6px;transform:none;max-width:none}   /* Anker CFRP_KAPUTT=toast-auf-daumen */
  /* M5b — oben liegt beim ersten Besuch auch der Hinweis Home-Bildschirm (z 40, dieselbe Höhe): gemessen fing er das × des
     Toasts ab (l131 T-zu-T). Der Toast geht darüber — er ist kurz da und trägt Fehlersätze, der Hinweis kommt einmal. */
  /* A-1055: die Höhe des Toasts im Stapel steht seit dem 06.10.2026 für ALLE Breiten am Dateiende (ein Ort). */
  /* M7-Nacharbeit (Constantin 26.09.): der Warn-Toast beim Einfügen stand am Telefon mit sechs Zeilen über den Filtern.
     Hier nur der Kurzsatz, höchstens 2 Zeilen (Kappung als Netz); Name, km und Einzelheiten stehen im Tag. */
  .toast.mitkurz .tlang{display:none}   /* Anker CFRP_KAPUTT=toast-lang-telefon */
  .toast.mitkurz{gap:8px}
  /* M7 Umkreis (26.09.): mit geladenen Treffern wurde der Regler höher als der Kartenstreifen, „Umkreis schließen“ lag unter
     der Tagesliste und das Feld scrollte nicht. Jetzt endet er am Rand der sichtbaren Karte (ohne Tagesliste: über den
     Reitern, mit Tagesliste hochkant: an deren Oberkante 38 %) und scrollt in sich; der Kopf klebt oben und trägt das ×
     „Umkreis schließen“ (Tippmaß), also ohne Scrollen erreichbar. */
  .poolregler{--prmax:calc(100% - 106px - var(--reiterh) - env(safe-area-inset-bottom) - 8px)}
  :has(> #pBottom:not([hidden])) > .poolregler{--prmax:calc(var(--streifen) - 106px - 8px)}
  .poolregler{max-height:var(--prmax);overflow-y:auto;overscroll-behavior:contain;box-sizing:border-box}   /* Anker CFRP_KAPUTT=umkreis-ohne-grenze */
  .poolregler .prkopf{position:sticky;top:-9px;z-index:2;display:flex;align-items:center;justify-content:space-between;gap:8px;
    margin:-9px -11px 4px;padding:0 0 0 11px;background:var(--sf)}
  .poolregler .przu{display:inline-flex}   /* Anker CFRP_KAPUTT=umkreis-ohne-kopf-zu */
  .poolregler .prknoepfe .linkbtn{min-height:44px}   /* Anker CFRP_KAPUTT=umkreis-knoepfe-klein */
  .toast.mitkurz .tkurz{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden}
  /* M5b — „+ in den Tag“ im Kunden-Detail fest unten, in EINER Zeile mit „‹ Tag“ (links frei für ihn, wie der Fuß des
     Stopp-Details M2b): vorher stand er nach Historie und Bericht unter dem Bild (gemessen y 1222 bei 663 hoch, 36 hoch).
     Klebt in `.pbody` (sticky), der Fuß bleibt also Teil des Details; `.pbody` braucht dann keinen Freiraum mehr unten. */
  #pRight .pbody .daktionen{position:sticky;bottom:0;z-index:2;display:flex;margin:12px -11px 0;padding:8px 8px 8px var(--tagfrei);border-top:1px solid var(--soft);background:var(--sf)}   /* Anker CFRP_KAPUTT=detail-knopf-scrollt */
  #pRight .pbody .daktionen .knopf{flex:1 1 auto;min-height:44px;justify-content:center;font-weight:600}
  /* A-157 B9: im Neukunden-Detail steht neben „+ in den Tag“ ein langer Hinweis — nebeneinander quetschte er den Knopf auf
     55 px und drei Zeilen (mobil-rundgang G5g). Der Knopf behält seine Zeile, der Hinweis bricht darunter um. */
  #pRight .pbody .daktionen{flex-wrap:wrap} #pRight .pbody .daktionen .knopf{white-space:nowrap} #pRight .pbody .daktionen .dhint{flex:1 1 100%;margin-top:6px}   /* Anker CFRP_KAPUTT=inden-tag-gequetscht */
  #pRight .pbody:has(> .daktionen){padding-bottom:0}
  /* M5b — Tippfläche der Karten-Marker ≥ 44 × 44 (Apple HIG), ohne das Bild zu ändern: ein unsichtbarer Kreis um den Punkt.
     NICHT für `.mk-kunde`: der Kundenstamm liegt dicht (Demo 594 Punkte) — 44 px um jeden Punkt überdeckten die Karte;
     Kunden erreicht man am Telefon über die Suche (M3). Ebenso nicht für die Korridor-Vorschläge (`.mk-neu[data-korridor]`),
     die stehen in der Liste „Neukunden entlang der Route“. Die Neukunden aus dem Umkreis (`.mk-neu[data-neu]`) stehen NUR
     auf der Karte — sie bekommen die Fläche (A-156 B7, Hans' Generalprobe). Wo Flächen überlappen, entscheidet
     `karte.js::naechsterPunkt`: der Tipp geht an das nächste sichtbare Symbol, nicht an die oberste Fläche. */
  .mk-besuch,.mk-heim,.mk-pause,.mk-vorschlag,.mk-bau,.mk-neu[data-neu]{position:relative}
  .mk-besuch::after,.mk-heim::after,.mk-pause::after,.mk-vorschlag::after,.mk-bau::after,.mk-neu[data-neu]::after{content:"";position:absolute;left:50%;top:50%;width:44px;height:44px;margin:-22px 0 0 -22px;border-radius:50%}   /* Anker CFRP_KAPUTT=marker-flaeche-klein */
  .knopf.naehe{display:flex;justify-content:center;align-items:center;min-height:44px;margin:0 0 10px;font-weight:600}   /* Anker CFRP_KAPUTT=naehe-versteckt */
  /* A-168 N4 (Karls Simulator-Nachlauf): im Leerzustand standen Import, „Kunde anlegen“ und „Neukunden in der Nähe“ Kante an
     Kante (y 206/250/294) — drei Tippflächen ohne Luft. Untereinander mit Abstand; der Nähe-Knopf bleibt der letzte. */
  #kundenleer .daktionen{display:flex;flex-direction:column;gap:8px} #kundenleer .knopf.naehe{margin:8px 0 0}   /* Anker CFRP_KAPUTT=leer-knoepfe-kleben */
  /* M6 Hinweis Home-Bildschirm: oben im Inhalt, nicht in der Daumenzone (dort liegen Fahrmodus, „+ Kunde“, Speichern).
     Über dem Demo-Band (z 29) und den Flächen; er ist einmalig und geht mit einem Tipp weg. */
  .heimhinweis{display:block;position:absolute;z-index:40;left:8px;right:8px;top:calc(var(--obenfrei) + 8px);max-width:520px;margin:0 auto;   /* Anker CFRP_KAPUTT=heimhinweis-weg */
    padding:14px 52px 12px 16px;border:1px solid var(--line,#d8d6cf);border-radius:14px;background:var(--sf,#fff);color:var(--ink,#1d1d1a);
    box-shadow:0 10px 28px rgba(0,0,0,.18);font-size:15px;line-height:1.4}
  .heimhinweis p{margin:6px 0 0}
  .importhinweis{bottom:calc(var(--reiterh) + 64px)}   /* A-289 A7: über „‹ Tag“ und den Reitern; oben liegen Toast und Zoom */
  .heimhinweis .heimtitel{display:block;font-size:16px}
  .heimhinweis .heimzu{position:absolute;top:4px;right:4px;width:44px;height:44px;border:0;background:transparent;font-size:24px;color:inherit;cursor:pointer}   /* Anker CFRP_KAPUTT=heimhinweis-klein */
  .heimhinweis .knopf[data-heimzu]{display:flex;justify-content:center;align-items:center;width:100%;min-height:44px;margin-top:10px;box-sizing:border-box}
  [data-baumodus] #pBottom .knopf.tl[data-fahrmodus]{display:none}
  [data-baumodus] #pBottom .knopf.tl[data-tagspeichern]{order:99;flex:0 1 auto;position:sticky;bottom:8px;z-index:3;min-height:48px;
    margin:8px 10px 8px auto;box-shadow:0 -6px 14px rgba(0,0,0,.12)}
  .sres .bauplus{flex:0 0 auto;min-width:44px;min-height:44px;border:1px solid var(--green);border-radius:999px;background:var(--sf);   /* Anker CFRP_KAPUTT=bauplus-klein */
    color:var(--greend);font:inherit;font-size:20px;font-weight:700;line-height:1;cursor:pointer}
  .sres .bauplus[aria-pressed="true"]{background:var(--green);color:#fff}
  .sres [data-szeile]>[data-sziel]{flex:1 1 auto;min-width:0}
  /* M5 B4 — ↑/↓ je Stopp nebeneinander statt übereinander. Seit 29.09. abends (Entscheid Constantin) sichtbar klein wie ⚲/◍,
     die Fläche 44 kommt aus der Tippziel-Regel; der Spalt hält die Mitten eine Fläche auseinander (15 + 14 + 15 = 44). */
  #pBottom .stopp .pfeile{flex-direction:row;gap:14px}
  #pBottom .iconbtn.pfeil{width:30px;height:30px;font-size:13px}   /* Anker CFRP_KAPUTT=pfeile-klein  Anker CFRP_KAPUTT=pfeil-ohne-flaeche */
  /* M5 B5 — die Vorschau „Reihenfolge optimieren“ einspaltig, Übernehmen/Verwerfen auf das Tippmaß. */
  #pBottom .optvorschau .ospalte{flex-basis:100%}
  #pBottom .optvorschau .oaktionen .knopf{flex:1 1 0;min-height:44px}   /* Anker CFRP_KAPUTT=vorschau-klein */
  /* Gate 26.09. (m-telefon B3): der Tipp holt die Vorschau an ihren Anfang ins Bild (tag.js `vorschau-ausser-sicht`); seit A6
     ist sie höher als die Fläche, und „Übernehmen“/„Verwerfen“ am Ende lagen unter dem festen Fuß und der Reiterleiste.
     Am Telefon stehen die zwei Knöpfe deshalb direkt unter dem Kopf der Vorschau, die Spalten zum Vergleichen darunter. */
  #pBottom .optvorschau{display:flex;flex-direction:column}
  #pBottom .optvorschau .oaktionen{order:-1;margin:0 0 8px}   /* Anker CFRP_KAPUTT=vorschau-knoepfe-unten */
  #pBottom .optvorschau .okopf{order:-2}
  /* A-168 N5: am Telefon steht „Preise neu laden“ direkt unter dem Kopf der Hotelliste; das × (26 × 26, Kopf auf Grundlinie)
     reichte mit seiner Fläche hinein, ein Tipp 21 px unter dem × traf den Knopf. × sichtbar 30, oben im Kopf, Kopf mit Luft
     darunter: Mitte × + 22 endet über dem Knopf. */
  #pBottom .hotelwahl .okopf{align-items:flex-start;margin-bottom:8px} #pBottom .hotelwahl .okopf .iconbtn{width:30px;height:30px}   /* Anker CFRP_KAPUTT=hotel-zu-eng */
  /* A-266 (Prüfstand 390, 01.10.2026): „Preise neu laden“ steht hier oben (order −1), der A-265-Satz „… sucht mit Ihrer neuen Grenze“
     stand unten nach der Liste — gemessen 874 px unter dem Knopf, den er nennt. Er rückt mit an den Kopf, direkt über den Knopf. */
  #pBottom .hotelwahl [data-grenze-lockerer]{order:-1;border-top:0;padding:0 0 6px}   /* Anker CFRP_KAPUTT=lockerer-satz-unten */
  #pBottom .hotelwahl .hfilter,#pBottom .hotelwahl [data-laden-ohne-echo]{order:-1;border-top:0}   /* A-336: am Telefon beim Kopf, wie der Knopf */
  #pBottom .hotelwahl .hfilter{min-height:44px;padding:0}   /* A-336: Tippfläche am Telefon — gemessen 24 px ohne diese Zeile.  Anker CFRP_KAPUTT=laden-filter-klein */
  #guide button{min-height:44px}   /* A-270 B3 (Entscheid Constantin): jeder Guide-Knopf am Telefon mit 44 px Tippfläche; gemessen vorher 20 px.  Anker CFRP_KAPUTT=guide-knopf-klein */
  #pRight .pbody{padding-bottom:72px}   /* das letzte Feld des Details scrollt über „‹ Tag“ hinaus */
  /* M2b — das Stopp-Detail als eigene Seite: oben „Stopp k von n“, unten fest „Navigieren“ und „Anrufen“ in EINER Zeile
     mit „‹ Tag“ (links frei für ihn). Der Fuß steht neben `.pbody` (detail.js), scrollt also nicht mit; `.pbody` braucht
     dann keinen eigenen Freiraum für „‹ Tag“ mehr. */
  .dzaehler{display:inline;font-size:var(--fs-i,12.5px);font-weight:600;color:var(--dim);font-variant-numeric:tabular-nums;white-space:nowrap} #pRight .pbody .daktionen .knopf.dpause{display:inline-flex}   /* R6 */
  #pRight .dfuss{display:flex;gap:8px;flex-shrink:0;padding:8px 8px 8px var(--tagfrei);border-top:1px solid var(--soft);background:var(--sf)}
  #pRight .dfuss .knopf{flex:1 1 0;min-width:0;min-height:44px;display:inline-flex;align-items:center;justify-content:center;font-weight:600;text-decoration:none}
  #pRight .dfuss [aria-disabled="true"]{opacity:.45}
  #pRight .pbody:has(+ .dfuss){padding-bottom:11px}
  #pRight .dnaviwahl{display:flex}
  /* Rundgang 25.09. (390 WebKit gemessen): drei Stellen ragten aus dem Bild oder lagen unter dem Tippmaß.
     Besuchsklassen — Farbe, Name, Zahl, „/Jahr · n Kunden“, „Löschen“ in EINER Zeile: rechts bis 497 px, „Löschen“ und
     der Zähler abgeschnitten. Jetzt bricht die Zeile: Farbe · Name oben, Zahl mit „/Jahr · n Kunden“ und „Löschen“ darunter
     (Zahl und „/Jahr“ bleiben zusammen). */
  #einst .kzeile{flex-wrap:wrap;row-gap:6px}   /* Anker CFRP_KAPUTT=klassen-eine-zeile */
  #einst .kzeile .fvoll{flex:1 1 calc(100% - 44px);min-width:0}
  #einst .kzeile .kzahl{flex:1 1 auto}
  #einst .rowbtn{min-height:44px}   /* K4 — jeder Zeilenknopf der Einstellungen (Klassen, Ergebnisse, Heimat: vorher 25 px), ein Ort · Anker CFRP_KAPUTT=einst-knopf-klein */
  .ferklaert summary{min-height:44px;box-sizing:border-box;padding:12px 0}
  /* A-157 (Altfund B8) — „Alle … angezeigten auswählen“ war 18 hoch; seine 44er-Fläche (::before) reichte in „Was heißt fällig?“
     darunter. Mit echter Höhe 44 ist die Fläche das Label selbst, der Nachbar bleibt frei. */
  .kmassen .kalleknopf{min-height:44px;box-sizing:border-box}   /* Anker CFRP_KAPUTT=kalle-flach */
  #dstamm > label ~ label{display:block;margin-top:12px}   /* K3 — vorher klebte jede Beschriftung (0 px) am Feld darüber · Anker CFRP_KAPUTT=beschriftung-klebt */
  .fahren [data-fraus],.fahren .ftext{min-height:44px;box-sizing:border-box;padding-inline:12px}   /* K6 — „Fahrmodus verlassen“ 27 px, „Stopp überspringen“ 29 px → 44 · Anker CFRP_KAPUTT=fahr-knopf-klein */
  /* Tageschips im Tag — fünf Chips mit flex-shrink 0 reichten bis 531 px, der Freitag lag außerhalb. Eigene Zeile unter
     KW-Schild und ×, die Chips teilen die Breite; im Chip Punkt, Kürzel, Datum untereinander. */
  .tagkopf .daychips{order:1;flex:1 1 100%;min-width:0;display:flex;gap:4px}
  .tagkopf .tagzahlen,.tagkopf .z7,.tagkopf .warnchip{order:2} .tagkopf .tagzahlen{flex:1 1 0;min-width:0;line-height:28px;max-height:28px;overflow:hidden} .tagkopf .tagzahlen .tz[data-tz="arbeit"]{order:-2} .tagkopf .tagzahlen .tzsep{display:none} .tagkopf .tagzahlen .tz:not([data-tz="arbeit"])::before{content:"·\00a0";color:var(--line)} .tagkopf .tzauf{display:inline-flex;order:2;align-self:flex-start;margin-top:2px;width:24px;height:24px;padding:0;align-items:center;justify-content:center;border:1px solid var(--line);border-radius:50%;background:var(--sf);color:var(--dim);font:600 13px/1 inherit} .tagkopf .tzauf[aria-expanded="true"]{color:var(--ink);border-color:var(--ink)} .tagkopf .z7{display:none} .tagkopf.z7auf .z7{display:block} .tagkopf.z7auf .tagzahlen{max-height:none;line-height:inherit;padding-top:6px}   /* R6 — Kennzahlen in EINER Zeile (Arbeitszeit zuerst; was nicht passt, bricht in die verdeckte zweite; der Trenner hängt am FOLGENDEN Wert, damit keine Zeile mit „·“ endet), der Verkehrssatz hinter ⓘ: ein Tipp klappt beides auf · Anker CFRP_KAPUTT=kennzahlen-zweizeilig */
  .tagkopf .cf-day{flex:1 1 0;min-width:0;min-height:44px;flex-direction:column;justify-content:center;gap:2px;padding:4px 2px;line-height:1.15}   /* Anker CFRP_KAPUTT=tagchips-breit */
  /* Anmeldung — „Passwort vergessen?“ war 13 px hoch, „Zum Angebot“ ein blauer Browser-Link. */
  #anmeldung .linkbtn{display:inline-flex;align-items:center;min-height:44px;font-size:var(--fs-i,13px);text-decoration:none}   /* Anker CFRP_KAPUTT=anmeldung-links-klein */
}
@media (orientation:landscape) and (max-height:500px){
  /* M-39: Safari quer ohne Symbolleiste verdeckt die oberen 39 px — dort steht nichts, das man tippen muss. */
  :root{--reiterh:46px;--obenfrei:40px;--streifen:38%}   /* quer gibt es keinen Streifen: Regler-Höhe und Kartennennung bleiben, wie sie vor R6 waren */
  #pBottom{top:var(--obenfrei);left:44%}   /* E4 quer — die Karte links, die Liste rechts */
  .kartegross{top:auto;right:auto;left:calc(44% - 132px);bottom:calc(var(--reiterh) + env(safe-area-inset-bottom) + 8px)}
  .zurroute{top:auto;right:auto;left:calc(44% - 132px);bottom:calc(var(--reiterh) + env(safe-area-inset-bottom) + 60px);width:auto;height:auto;padding:0 14px}   /* quer: über „Karte groß“, mit Wort */
  .zurroute .zr-text{position:static;width:auto;height:auto;clip-path:none}
  .baukopf{top:calc(var(--obenfrei) + 4px);max-width:calc(44% - 16px)}   /* M5 quer: oben links über der Karte, nicht über der Liste */
  .toast{right:calc(56% + 12px)}   /* M5b quer: rechts beginnt die Tagesliste oben mit Datum, Verwerfen, × — der Toast bleibt über der Karte */
  /* M7 G1-Q (26.09.): quer liegt die Dynamic Island an der linken (oder rechten) Kante und deckte den „−“-Zoom. Alles, was
     links über der Karte bedient wird, rückt um die Safe-Area ein; die Tagesliste rechts um die rechte. `--sl`/`--sr`
     sind die EINE Quelle (Suite kann sie setzen, das Gerät setzt sie über env()). */
  :root{--sl:env(safe-area-inset-left,0px);--sr:env(safe-area-inset-right,0px)}
  .leaflet-top.leaflet-left,.leaflet-bottom.leaflet-left{left:var(--sl)}   /* Anker CFRP_KAPUTT=insel-zoom */
  .leaflet-top{top:calc(var(--obenfrei) - 10px)}   /* M-39: der Zoom stand bei y 12, in der Zone, die Safari quer verdeckt (10 px Leaflet-Rand) */ .gminleiste.imstreifen{left:calc(var(--zoomkante) + 6px + var(--sl));right:auto;top:calc(max(var(--obenfrei), var(--toastunten, 0px)) + 6px)}   /* A-450: quer stand die Leiste bei y 12 in derselben Zone — jetzt neben dem Zoom über der Karte, unter dem Toast · Anker CFRP_KAPUTT=leiste-in-safarizone */ :is(#buehne:has(> #pLeft:not([hidden])), #buehne:has(> #pRight:not([hidden])), #buehne:has(> .poolregler:not([hidden]):not(.nkpanel))) > .gminleiste.imstreifen{left:auto;right:14px;top:4px}   /* A-450: Planung und Detail decken quer die ganze Karte, der Umkreis-Regler steht am selben Platz — dort bleibt die Leiste, wo sie war (FREIGABEN: sie bleibt sichtbar), statt etwas zu verdecken; die Neukunden-Fläche (`.nkpanel`) liegt quer unten, neben dem Zoom bleibt Platz · Anker CFRP_KAPUTT=leiste-auf-planung-quer · Anker CFRP_KAPUTT=leiste-auf-regler-quer */
  /* A-352 (Simulator quer, 03.10.2026): die Nennung hing an der Höhe (`--streifen` von oben), der Zoom am oberen Rand — auf einem
     flachen Bild (Safari quer mit Symbolleiste) schob sie sich über „−“. Jetzt hängt sie am Zoom: Zoom-Oberkante `--obenfrei`,
     darunter zwei Knöpfe samt Rahmen und Trennlinie (5 px, leaflet.css), dann 3 px Luft. Wortlaut und Sichtbarkeit unverändert. */
  #buehne:has(> #pBottom:not([hidden])) .leaflet-bottom.leaflet-right{bottom:auto;top:calc(var(--obenfrei) + 2 * var(--zoomb) + 8px)}   /* Anker CFRP_KAPUTT=osm-ueber-zoom */
  .toast{left:calc(var(--zoomkante) + var(--sl))} :root{--nennungh:1.5rem} #buehne:has(> #pBottom:not([hidden])):has(> #toast) > .gminleiste.imstreifen{top:calc(max(var(--toastunten, 0px), var(--obenfrei) + 2 * var(--zoomb) + 8px + var(--nennungh)) + 6px)}   /* A-450 Nachbesserung (mobil-rundgang G10d): quer mit Tag steht die Kartennennung unter dem Zoom (A-352, Zeile darüber); ein zweizeiliger Toast schob die Leiste genau auf sie. Steht ein Toast, rückt die Leiste unter Toast UND Nennung (`--nennungh`: Platz für eine Zeile Nennung, kein Messwert) · Anker CFRP_KAPUTT=leiste-auf-nennung */ #buehne:has(> #pBottom:not([hidden])) > .gminleiste.imstreifen{max-width:calc(44% - var(--zoomkante) - var(--sl) - 14px);flex-wrap:wrap;row-gap:0}   /* mit Dynamic Island links (`--sl`) reichte die Leiste 28 px unter die Tagesliste (ab 44 %, `#pBottom` oben): sie bricht um, statt hineinzuragen · Anker CFRP_KAPUTT=leiste-ueber-tagesliste */
  .zurueck{left:calc(8px + var(--sl))}
  .baukopf{left:calc(8px + var(--sl));max-width:calc(44% - 16px - var(--sl))}
  .routechip{left:calc(14px + var(--sl))}
  /* Die Hinweiszeile stand quer über `--hb` (Schreibtischhöhe der Tagesfläche + 22) oben links auf dem „−“ des Zooms —
     quer gehört sie unten an die Karte, links von „Karte groß“. */
  .maphint{left:calc(var(--bl) + var(--sl));bottom:calc(var(--reiterh) + env(safe-area-inset-bottom) + 20px);max-width:calc(44% - 150px - var(--sl))}
  #pBottom{padding-right:var(--sr);box-sizing:border-box}
  /* Umkreis quer: neben dem Zoom (10 + 34 px + Luft), oben ab dem freien Rand; endet über den Reitern (Karte links hat
     die volle Höhe, die Tagesliste liegt daneben, nicht darunter). */
  .poolregler,:has(> #pBottom:not([hidden])) > .poolregler{left:calc(56px + var(--sl));top:calc(var(--obenfrei) + 6px);
    width:min(250px, calc(44% - 64px - var(--sl)));--prmax:calc(100% - var(--obenfrei) - 6px - var(--reiterh) - env(safe-area-inset-bottom) - 60px)}   /* 60 = „Karte groß“ 44 + 2 × 8 */
}

/* ══ Woche B am Telefon und Tablet (Matthias 25.09.2026) ═══════════════════════════════════════════════
   „oben die tage dann der tag auf der seite im detail unten tag abschliessen und öffnen und für tageswechsel eiinfach
   wischen“ — unter 900 px: Wochenzeile, Tagesleiste, EIN Tag im Detail, Fuß mit „Öffnen“ und dem Fahrmodus-Knopf.
   Die Grenze steht NUR hier (woche.js fragt, ob `.wleiste` sichtbar ist). Darüber bleibt das Gitter unverändert. */
.wzeile,.wleiste,.wfuss,.daysum{display:none}
@media (max-width:899px), (orientation:landscape) and (max-height:500px){   /* Anker CFRP_KAPUTT=woche-b-breit  Anker CFRP_KAPUTT=quer-vergessen */
  #week{overflow-y:auto;overscroll-behavior:contain}   /* Anker CFRP_KAPUTT=woche-klemmt */
  #week>*{flex-shrink:0}
  #week .kpis{display:none}   /* Anker CFRP_KAPUTT=kacheln-zurueck */
  #week .wzeile{display:block;margin:2px 0 0;padding:0 16px;font-size:var(--fs-n,13px);color:var(--dim);white-space:nowrap;font-variant-numeric:tabular-nums}
  #week .wzeile b{color:var(--ink);margin-right:4px}
  #week .wleiste{display:flex;gap:4px;padding:10px 12px 0}   /* Anker CFRP_KAPUTT=wleiste-aus */
  #week .wwahl{flex:1 1 0;min-width:0;min-height:52px;appearance:none;border:1px solid var(--line);background:var(--sf);
    border-radius:10px;font:inherit;color:var(--ink);cursor:pointer;display:flex;flex-direction:column;align-items:center;
    justify-content:center;gap:1px;padding:5px 2px;line-height:1.15}
  #week .wwahl i{width:8px;height:8px;border-radius:50%;background:var(--tf);display:block}
  #week .wwahl b{font-size:var(--fs-i,13px)}
  #week .wwahl .num{font-family:var(--mono);font-size:var(--fs-n,11.5px);color:var(--dim)}
  #week .wwahl .wz{font-size:var(--fs-n,11px);color:var(--dim);white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis}
  /* S2 (30.09.2026): „heute · Hotel“ passte in einer Zeile nicht in den Chip (Text 75 in 68, abgeschnitten). Jedes Zeichen
     steht in seiner eigenen Zeile, der Trenner nur für Vorleser und den schmalen Fall ohne diese Regel. Beweis woche-chip W1. */
  #week .wwahl .wz{display:flex;flex-direction:column;align-items:center;line-height:1.15} #week .wwahl .wz .wzsep{display:none}   /* Anker CFRP_KAPUTT=chip-zeichen-einzeilig */
  #week .wwahl.leer b{color:var(--dim)}
  #week .wwahl[aria-pressed="true"]{background:var(--tf);border-color:transparent;color:#fff}
  #week .wwahl[aria-pressed="true"] i{background:#fff}
  #week .wwahl[aria-pressed="true"] .num,#week .wwahl[aria-pressed="true"] .wz,#week .wwahl[aria-pressed="true"] b{color:#fff}
  #week .days{flex:none;display:block;padding:10px 12px 12px}   /* Anker CFRP_KAPUTT=woche-eine-spalte */
  #week .days>.daycol:not(.wakt){display:none}   /* Anker CFRP_KAPUTT=alle-tage */
  #week .days>.daycol+.daycol.wakt{margin-top:10px}
  #week .daycol.gewaehlt{box-shadow:none}
  #week .daybody{overflow:visible}
  #week .daysum{display:block;padding:8px 12px;font-size:var(--fs-i,13px);font-weight:600;border-bottom:1px solid var(--soft);font-variant-numeric:tabular-nums}
  #week .dayfoot{display:none}
  #week .daycol.leer [data-wplanen]{display:none}   /* „Jetzt planen“ steht einmal: im Fuß */
  /* Ein Kundenstopp je Zeile: Uhrzeit · Name · Ergebnis. Adresse und Notiz stehen im Tag (README B: „fällt weg: die
     Adresszeile je Stopp“). Der Name in Inhaltsgröße; die ganze Zeile ist die Tippfläche. */
  #week button.itm{min-height:44px;align-items:center;padding:6px 7px}
  #week button.itm .ik{display:flex;align-items:center;gap:8px;min-width:0}
  #week button.itm .nm{flex:1 1 auto;min-width:0;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  #week button.itm .sub{display:none}   /* Anker CFRP_KAPUTT=stopp-dreizeilig */
  #week button.itm .bad{margin:0;flex:0 0 auto}
  #week .itm .tm{font-size:var(--fs-n,12px);padding-top:0}
  #week .wfuss{display:flex;gap:8px;padding:8px 12px 10px;background:var(--bg);border-top:1px solid var(--line);z-index:2}
  #week .wfuss{position:sticky;bottom:0;z-index:2;margin-top:auto}   /* Anker CFRP_KAPUTT=fuss-scrollt */
  #week .wfuss .knopf{flex:1 1 0;min-width:0;min-height:44px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:0 8px}
  #week .wfuss .knopf:disabled{background:var(--bg);border-color:var(--line);color:#8b8a80;cursor:default}   /* wie .knopf.tl:disabled in der Tagesleiste */
}

/* A-113 K2 — Telefon hochkant MIT Tagesliste: der Kartenstreifen ist nur ~250 px hoch, der Regler (250 × 138 ab y 106) deckte
   gemessen 35 % davon und die ganze untere Hälfte (mobil-rundgang G5c). Er rückt nach oben neben den Zoom (x 10–54) und steht
   kompakt: Kopf mit „Mehr“ und ×, Schieber, Trefferzahl. Der Rest kommt über „Mehr“ und scrollt im Regler. Quer bleibt er,
   wie er war. A-166 N1: hochkant gilt das auch ohne Tagesliste (Karte groß), etwa nach „Neukunden in der Nähe“ —
   vorher stand er dort groß ab y 106 über den Punkten. `#buehne > #poolregler` statt `:has(> #pBottom…) > .poolregler`: trifft das Neukunden-Blatt
   (`.poolregler.nkpanel`, eigene Regeln weiter unten) nicht und schlägt die ID-Regel `--prmax` der Telefon-Grundregeln. */
@media (max-width:768px) and (orientation:portrait){
  #buehne > #poolregler{top:8px;left:56px;width:min(250px, calc(100% - 64px));--prmax:calc(var(--streifen) - 16px)}   /* Anker CFRP_KAPUTT=umkreis-blatt-halb */ #buehne > #poolregler:not(.mehr){padding-bottom:3px} #buehne > #poolregler:not(.mehr) .prkopf{margin-bottom:2px}   /* R6: kompakt niedriger statt schmaler — im schmaleren Streifen unter einem Viertel (mobil-rundgang G5c-T), die Trefferzahl behält ihre Breite */
  #buehne > #poolregler{--deckt-karte:1}   /* A-137: so steht er IM Kartenstreifen — karte.js `einpassen` hält die Fläche frei */
  #buehne > #poolregler:not(.mehr) :is(.przb,.prdichte,.prdemo,.prhinweis,.prknoepfe){display:none}
  #buehne > #poolregler .prmehr{display:inline-flex;align-items:center}   /* Anker CFRP_KAPUTT=umkreis-gross-ohne-mehr */
  /* Kompakt steht die Trefferzahl an der Stelle der Überschrift (sie sagt mehr als „Neukunden im Umkreis“ und bleibt
     sichtbar); mit „Mehr“ kommt die Überschrift zurück und die Zahl steht wieder unter dem Schieber. */
  #buehne > #poolregler:not(.mehr) .prkopf > span{visibility:hidden}
  #buehne > #poolregler:not(.mehr) .prtreffer{position:absolute;left:11px;top:9px;right:90px;height:44px;margin:0;
    display:flex;align-items:center;gap:6px;white-space:nowrap;overflow:hidden;color:var(--ink);font-weight:600;z-index:3}
  #buehne > #poolregler .prmehr{padding:0 6px}
}

/* ── A-010 · Neukunden entlang der Route (neukunden.js, Attrappe bau/mockups/neukunden-route) ──────────────────────
   Bauart des Umkreis-Reglers (Klasse `poolregler` für Schieber und Zahlenfeld), aber rechts über der Karte und breiter:
   am Schreibtisch neben der Karte wie in der Attrappe, am Telefon als Blatt über den Reitern. Die Liste scrollt, Kopf und
   Fuß bleiben stehen. */
.poolregler.nkpanel{left:auto;right:var(--br);width:340px;max-height:calc(100% - 106px - var(--fo) - 14px);
  overflow-y:auto;overscroll-behavior:contain;box-sizing:border-box;padding:11px 13px 0}
/* Das Tag-Panel liegt unten ÜBER der Karte (z-index) — ohne diese Grenze verschwand der Fuß mit „In den Tag übernehmen“
   dahinter (gemessen 29.09., neukunden-panel N6-1440). Die Höhe folgt `--bh`, auch wenn der Nutzer das Panel zieht. */
:has(> #pBottom:not([hidden])) > .poolregler.nkpanel{max-height:calc(100% - 106px - var(--fo) - var(--bh) - 36px)}   /* Anker CFRP_KAPUTT=nk-unter-tagpanel */
.nkpanel .nkkopf{display:flex;align-items:center;justify-content:space-between;gap:8px;font-weight:600;font-size:var(--fs-i,14px)}
.nkpanel .nkzu{display:inline-flex;min-width:36px;min-height:36px;margin:-8px -8px -8px 0}
.nkpanel .nkunter{color:var(--dim);font-size:var(--fs-n,11.5px);margin:2px 0 9px;line-height:1.35}
.nkpanel .nkmodus{display:flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;margin-bottom:9px}
.nkpanel .nkmodus button{flex:1 1 0;appearance:none;border:0;background:var(--sf);color:var(--dim);font:inherit;font-size:var(--fs-n,12px);
  min-height:34px;cursor:pointer}
.nkpanel .nkmodus button.an{background:var(--head);color:var(--headfg);font-weight:600}
.nkpanel .prhinweis{margin:6px 0 9px}
.nkpanel .nkzahl{display:flex;justify-content:space-between;gap:8px;flex-wrap:wrap;color:var(--dim);font-size:var(--fs-n,11.5px);
  border-top:1px solid var(--line);margin:0 -13px;padding:8px 13px}
.nkpanel .nkliste{margin:0 -13px}
.nkpanel .nkzeile{display:grid;grid-template-columns:auto 1fr auto;gap:10px;align-items:start;padding:10px 13px;border-top:1px solid var(--soft);cursor:pointer}
.nkpanel .nkzeile.an{background:var(--greens)}
.nkpanel .nkzeile.blitz{outline:2px solid var(--green);outline-offset:-2px}
.nkpanel .nkzeile input{margin:2px 0 0;accent-color:var(--green);width:16px;height:16px}
.nkpanel .nkmitte{display:flex;flex-direction:column;gap:2px;min-width:0}
.nkpanel .nkname{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px}
.nkpanel .nkname b{font-size:var(--fs-n,13px)}
.nkpanel .nkguete{font-size:var(--fs-n,10.5px);padding:1px 6px;border-radius:6px;background:var(--greys);color:var(--dim)}
.nkpanel .nkguete.g-geprueft{background:var(--greens);color:var(--greend)}
.nkpanel .nkort,.nkpanel .nkteil{color:var(--dim);font-size:var(--fs-n,11.5px)}
.nkpanel .nkumweg{display:flex;flex-direction:column;align-items:flex-end;text-align:right;font-variant-numeric:tabular-nums;font-size:var(--fs-n,12px);max-width:140px}
.nkpanel .nkumweg span{color:var(--dim)}
.nkpanel .nkumweg.laedt{color:var(--dim)}
.nkpanel .nkumweg.fehlt{color:var(--amber)}
.nkpanel .nkumweg.fehlt .linkbtn{color:var(--amber);text-decoration:underline}
.nkpanel .nkleer{color:var(--dim);font-size:var(--fs-n,12px);line-height:1.4;padding:10px 0 12px}
.nkpanel .nkleer.fehler{color:var(--red)}
.nkpanel .nkfuss{position:sticky;bottom:0;z-index:2;display:flex;align-items:center;gap:10px;margin:0 -13px;padding:10px 13px;
  background:var(--sf);border-top:1px solid var(--line);font-size:var(--fs-n,11.5px);color:var(--dim);line-height:1.35}
.nkpanel .nkfuss b{color:var(--ink)}
.nkpanel .nkfuss .knopf{flex:0 0 auto;min-height:38px;white-space:nowrap}
.nkpanel .nkfuss .knopf:disabled{background:var(--bg);border-color:var(--line);color:#8b8a80;cursor:default}
@media (max-width:768px), (orientation:landscape) and (max-height:500px){
  /* Telefon: ein Blatt über den Reitern, volle Breite, höchstens 70 % der Höhe — die Karte mit dem Streifen bleibt oben
     sichtbar. Tippmaße 44 px (Apple HIG) für Umschalter, Häkchen und Knopf. */
  .poolregler.nkpanel,:has(> #pBottom:not([hidden])) > .poolregler.nkpanel{left:0;right:0;top:auto;width:auto;
    bottom:calc(var(--reiterh) + env(safe-area-inset-bottom));max-height:70%;border-radius:16px 16px 0 0;border-bottom:0;z-index:30}
  .nkpanel .nkkopf{position:sticky;top:-11px;z-index:2;   /* 2: über der Trefferfläche der Zeilen (Tippziele, 29.09.) */
    background:var(--sf);margin:-11px -13px 0;padding:6px 5px 0 13px}
  .nkpanel .nkzu{min-width:44px;min-height:44px}
  .nkpanel .nkmodus button{min-height:44px}
  .nkpanel .nkzeile input{width:20px;height:20px}
  .nkpanel .nkfuss .knopf{min-height:44px}
}

/* ── Formular-Vorlagen (formular-ansicht.js): Editor links, Vorschau rechts (A4 im iframe OHNE Skripte) ───────────
   Das Fenster hängt am <body> (nicht in einer Fläche, die neu gezeichnet wird) und liegt über allem wie `.ovl`. Am Telefon
   stehen Editor und Vorschau untereinander; gedruckt wird nur das Dokument im iframe (`contentWindow.print`). */
.fformhuelle{position:fixed;inset:0;z-index:60;background:rgba(29,29,26,.42);display:grid;place-items:center;padding:16px}
.fform{width:min(1320px,100%);height:min(94vh,100%);background:var(--sf);border:1px solid var(--line);border-radius:14px;
  box-shadow:0 30px 70px rgba(0,0,0,.3);display:flex;flex-direction:column;overflow:hidden;position:relative}
/* A-135: das Beleg-Blatt liegt ÜBER dem Bericht im selben Fenster (kein zweites Fenster, kein Tab — nie eine Adresse nach außen) */
.fbelegblatt{position:absolute;inset:0;z-index:2;background:var(--sf);display:flex;flex-direction:column}
.fbelegkopf{display:flex;align-items:center;gap:10px;padding:10px 14px;border-bottom:1px solid var(--line)}
.fbelegkopf .knopf{margin-left:auto;min-width:44px;min-height:44px}
.fbeleginhalt{flex:1;min-height:0;overflow:auto;padding:14px;display:flex;flex-direction:column;align-items:center;gap:12px}
.fbeleginhalt img{max-width:100%;height:auto;object-fit:contain}
.fformkopf{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px 14px;border-bottom:1px solid var(--line)}
.fformkopf strong{font-size:var(--fs-i,15px)}
.fformkopf .rechts{margin-left:auto;display:flex;gap:8px;align-items:center}
.fbuehne{font-size:var(--fs-n,11.5px);color:var(--amber);background:var(--ambers);border-radius:6px;padding:2px 8px}
.fformkonflikt{margin:0 12px 6px;padding:8px 10px;border-radius:8px;background:var(--ambers);color:var(--amber);font-size:var(--fs-n,12.5px)}   /* zwei Geräte, ein Bericht (formular-ansicht.js KONFLIKT) */
.fformkonflikt .linkbtn{color:inherit;font-weight:600}
.fformstand{font-size:var(--fs-n,12px);color:var(--amber);padding:0 14px;min-height:0}
.fformstand:not(:empty){padding:6px 14px;border-bottom:1px solid var(--soft)}
.fformleib{flex:1;min-height:0;display:grid;grid-template-columns:minmax(320px,440px) 1fr}
.feditor{overflow-y:auto;overscroll-behavior:contain;padding:10px 14px 24px;border-right:1px solid var(--line)}
.fvorschau{width:100%;height:100%;border:0;background:#e9e9e9}
/* Nur im Editor: `.ffeld`, `.flabel`, `.fzeile` tragen auch Fahrmodus und Einstellungen (fahren.js, einstellungen.js). Bis
   29.09. abends standen diese Regeln ohne `.feditor` — die Einstellungen bekamen umrandete Rasterkästen (gemessen T1/E1). */
.feditor .fbereich{border:0;margin:0 0 12px;padding:0}
.feditor .fbereich legend{font-weight:600;font-size:var(--fs-i,13px);padding:8px 0 4px}
.feditor .ffeld{display:flex;flex-direction:column;gap:3px;margin-bottom:9px}
.feditor .flabel{font-size:var(--fs-n,12px);font-weight:600}
.feditor .fpflicht{color:var(--red)}
.feditor .fherkunft{font-size:var(--fs-n,11px);color:var(--dim)}
.feditor input,.feditor select,.feditor textarea{font:inherit;font-size:var(--fs-i,13.5px);border:1px solid var(--line);border-radius:8px;
  padding:6px 8px;background:var(--sf);color:var(--ink);width:100%;box-sizing:border-box}
.feditor textarea{resize:vertical;line-height:1.45}
.feditor select{min-height:36px}   /* WebKit zeichnet ein <select> ohne Höhe flacher als die Textfelder daneben */
.feditor .fzeile{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:6px;align-items:end;padding:8px;border:1px solid var(--soft);   /* Anker CFRP_KAPUTT=formular-regeln-global */
  border-radius:8px;margin-bottom:6px}
.feditor .fspalte{display:flex;flex-direction:column;gap:2px;font-size:var(--fs-n,11px);color:var(--dim)}
/* A-167 F2 (Simulator-Nachlauf 30.09.) — wie F1 beim Zeitfeld: iOS-Safari zeichnet `input type=date` selbst, mit eigener
   Mindestbreite (gemessen 193 in einer Spalte von 175, über die Belegkarte hinaus). Ohne Eigenzeichnung und mit Mindestbreite 0
   nimmt das Feld die Breite seiner Spalte; die Spalte (Rasterzelle) darf schrumpfen. Nur im Editor — das Datumsfeld der
   Bauleiste (neuer Tag) bleibt unberührt. min-height 36 nur gegen das Zusammenfallen des leeren Felds ohne Eigenzeichnung —
   kein Tippmaß: Eingabefelder stehen weder in der 44er-Flächenregel (Telefonblock, `::before`) noch in der T1-Zielliste von
   telefon-tippziele (dort nur Kästchen/Radio); 44 hat am Telefon nur das <select> (`select{height:44px}`). */
.feditor .fspalte{min-width:0} .feditor input[type=date]{-webkit-appearance:none;appearance:none;min-width:0;min-height:36px;display:block}   /* Anker CFRP_KAPUTT=datumsfeld-eigenbreite */
.fimbau{font-size:var(--fs-n,11.5px);color:var(--dim);background:var(--soft);border-radius:6px;padding:2px 8px;align-self:flex-start}   /* „im Bau“: sichtbar, nicht versteckt */
.feditor .fberechnet{font-variant-numeric:tabular-nums;font-weight:600;color:var(--ink);min-height:1.4em;padding:4px 0}   /* berechnet — keine Eingabe (formular.js::rechnen) */
.feditor .fhinweis{font-size:var(--fs-n,11px);color:var(--amber)}
.feditor .fhinweis:empty{display:none}
@media (max-width:768px), (orientation:landscape) and (max-height:500px){
  .fformhuelle{padding:0}
  .fform{width:100%;height:100%;border-radius:0;border:0}
  .fformleib{display:flex;flex-direction:column;overflow-y:auto}
  .feditor{overflow:visible;border-right:0;border-bottom:1px solid var(--line)}
  .fvorschau{height:80vh;flex:0 0 auto}
  .fformkopf .knopf{min-height:44px}
  .feditor input,.feditor select,.feditor textarea{font-size:16px}   /* iOS zoomt unter 16 px beim Fokus */
}

/* A-087 Firmenlogo im Reiter Konto (firmenlogo.js): Vorschau in fester Fläche, das Bild behält sein Seitenverhältnis. */
.klogo{display:flex;align-items:center;justify-content:center;width:240px;max-width:100%;height:96px;margin-top:10px;
  padding:8px;border:1px dashed var(--line);border-radius:8px;background:var(--bg);box-sizing:border-box}
.klogo-bild{max-width:100%;max-height:100%;object-fit:contain;display:block}
.klogo-wahl{position:relative;cursor:pointer}
.klogo-wahl:disabled{opacity:.55;cursor:default;pointer-events:none}
.klogo-datei{position:fixed;left:0;top:0;width:1px;height:1px;opacity:0;overflow:hidden;pointer-events:none}   /* A-657: hängt an body, nicht im Abschnitt */
.klogo-wahl:focus-visible{outline:2px solid var(--green);outline-offset:2px}

/* A-156 B6 — hochkant mit offener Planung ist die Karte ein Streifen; vom Zoom lugte nur das „+“ heraus und las sich wie
   „hinzufügen“. Dort steht er nicht: das Aufziehen mit zwei Fingern bleibt, und der Weg in die Karte ist
   „Neukunden in der Nähe“ bzw. der Reiter Tag. */
@media (max-width:768px) and (orientation:portrait){
  :has(> #pLeft:not([hidden])) .leaflet-control-zoom{display:none}   /* Anker CFRP_KAPUTT=zoom-im-streifen */
}

/* ── A-194 Abo-Ende (M3d): Sperrschirm und Zahlungsband — übernommen aus dem Muster HANS-03 (22.09.2026,
   ~/Desktop/routenplaner/bau/konto/sperre.css). Neu ist genau EIN Token, --amberd (Text auf --ambers): --amber auf
   --ambers misst 3,77:1 und fällt unter 4,5:1 (Messung im Bericht HANS-03). Der Portal-Weg im Band ist ein Knopf
   (`.zahlband-link`), kein Link: er geht über konto.js::portalOeffnen, nicht über eine Adresse. ── */
:root{--amberd:#7a4f12}
.sperre{position:fixed;inset:0;z-index:1000;display:grid;place-items:center;overflow:auto;padding:24px 16px;background:var(--head);color:var(--headfg)}
.sperre-karte{width:min(440px,100%);display:flex;flex-direction:column;gap:14px}
.sperre-logo{display:block;width:56px;height:56px;border-radius:12px;box-shadow:0 0 0 1px var(--head3)}
.sperre h1{margin:6px 0 0;font-size:26px;line-height:1.2;font-weight:700;letter-spacing:-.01em}
.sperre p{margin:0;font-size:15px;line-height:1.55;color:#c3c9c4}
.sperre-knoepfe{display:flex;flex-direction:column;gap:10px;margin-top:8px} .sperre-support{user-select:text;-webkit-user-select:text} .sperre-support a{color:var(--headfg);text-decoration:underline;overflow-wrap:anywhere}   /* A-953: die Support-Adresse am Sperrschirm — antippbar und als Text auswählbar */
.sperre-knopf{display:flex;align-items:center;justify-content:center;min-height:48px;padding:0 20px;border-radius:11px;border:1px solid transparent;font:700 15px/1.2 var(--sans);text-decoration:none;cursor:pointer}
.sperre-knopf.voll{background:var(--green);color:#fff}
.sperre-knopf.voll:hover{background:var(--greend)}
.sperre-knopf.rand{background:transparent;border-color:var(--head3);color:var(--headfg)}
.sperre-knopf.rand:hover{background:var(--head2)}
.sperre :focus-visible{outline:2px solid #34d399;outline-offset:3px}
.zahlband{position:absolute;top:60px;left:50%;transform:translateX(-50%);z-index:29;display:flex;align-items:center;gap:10px;max-width:calc(100% - 20px);width:max-content;padding:6px 6px 6px 14px;border-radius:999px;background:var(--ambers);border:1px solid #e6d3ae;color:var(--amberd);font-size:12.5px;font-weight:600;line-height:1.35;box-shadow:0 8px 22px rgba(29,29,26,.10)}
.zahlband-link{flex:none;appearance:none;display:inline-flex;align-items:center;min-height:30px;padding:0 12px;border-radius:999px;border:1px solid #e6d3ae;background:var(--sf);color:var(--amberd);font:700 12.5px/1.2 var(--sans);white-space:nowrap;cursor:pointer}
.zahlband-link:hover{border-color:var(--amberd)}
.zahlband-zu{flex:none;appearance:none;width:30px;height:30px;border:0;border-radius:999px;background:transparent;color:var(--amberd);font:700 18px/1 var(--sans);cursor:pointer}
.zahlband-zu:hover{background:rgba(122,79,18,.1)}
.zahlband :focus-visible{outline:2px solid var(--amberd);outline-offset:2px}
/* Gekündigt, läuft noch (Constantin 30.09.): dasselbe Band, ruhig — ein Hinweis mit Datum, keine Störung. */
.zahlband.ruhig{background:var(--sf);border-color:var(--line);color:var(--ink)}
.zahlband.ruhig .zahlband-zu{color:var(--ink)}
.zahlband.ruhig :focus-visible{outline-color:var(--ink)}
@media (max-width:480px){
  .zahlband{flex-wrap:wrap;border-radius:14px;padding:10px 8px 10px 14px}
  .zahlband span{flex:1 1 100%}
  .zahlband-zu{margin-left:auto;width:44px;height:44px}
  .zahlband-link{min-height:44px}   /* Tippmaß am Telefon (design-system.md, Tippziele) — im Muster standen 30 */
}
/* R6b (Entscheid Constantin 01.10.2026) — B1: am Telefon faltet der Tagkopf seine Warnchips zu „⚠ n Hinweise“ (Knopf in der
   KW-Zeile, die ohnehin 44 hoch ist: kostet keine Höhe); ein Tipp klappt sie auf (tag.js warnBinden). Ein einzelner Hinweis,
   der in eine Zeile passt, bleibt ausgeschrieben (`falten` fehlt dann). Die Hinweise am Stopp (.amstopp) bleiben, wo sie sind.
   B3: „Fahrmodus fortsetzen (n von m)“ wird im Woche-Fuß nicht mehr abgeschnitten — „Öffnen“ nimmt nur seine Breite, der
   Hauptknopf den Rest und bricht notfalls um statt zu kürzen. Schreibtisch und Tablet: unverändert.
   A-289 A10 (Klicktest 02.10.: „sechs rote Elemente gleichzeitig wirken wie ein großer Bug“): das Falten gilt jetzt auf jeder
   Breite — die vier Sammel-Regeln stehen außerhalb des Telefon-Blocks; Kopf-Luft und Woche-Fuß bleiben Telefon. */
.warnsammel{display:none}
.tagkopf.falten .warnsammel{display:inline-flex;align-items:center;margin-left:auto;min-height:32px;padding:0 11px;background:var(--reds);border:1px solid #e7c2ca;color:var(--red);border-radius:999px;font:600 var(--fs-n,11.5px)/1.2 inherit;white-space:nowrap;cursor:pointer}
.tagkopf.falten .warnsammel[aria-expanded="true"]{border-color:var(--red)}
.tagkopf.falten [data-zu]{margin-left:4px}
.tagkopf.falten:not(.warnauf) > .warnchip{display:none}   /* Anker CFRP_KAPUTT=warnchips-offen */
@media (max-width:768px), (orientation:landscape) and (max-height:500px){
  #pBottom .tagkopf{padding-top:0} #pBottom .knopf.tl[data-fahrmodus]{min-height:44px;bottom:4px}   /* Mit gerechneten Zeiten trägt die erste Kunden-Zeile die Fensterpille („Standard 07:30–16:30“) und wird dreizeilig (151 statt 122 hoch); damit sie trotzdem ganz mit 16 px Reserve steht, gehen 13 px Luft, die keine Tippfläche ist: über dem KW-Schild (es ist selbst 44 hoch), am Fahrmodus-Knopf (44 = Tippmaß wie jeder Knopf, 4 statt 8 px über der Reiterleiste). Anker CFRP_KAPUTT=kopf-luft */
  #week .wfuss .knopf[data-woeffnen]{flex:0 0 auto;padding:0 14px} #week .wfuss .knopf[data-wfahren]{white-space:normal;text-overflow:clip;line-height:1.2;padding:4px 8px}   /* Anker CFRP_KAPUTT=fortsetzen-gekuerzt */
}
/* B4-Beiwerk (Constantin 01.10.2026) — Fahrkarte im Querformat: mit dem roten Termin-Satz (R6b B2) rutschte „Stopp überspringen“
   unter den Rand (390 hoch). Die Karte nutzt im Querformat mehr Breite (der Satz bricht in zwei statt drei Zeilen) und
   rückt enger; Tippflächen bleiben (Knöpfe 48, „Stopp überspringen“ 44). Hochformat, Tablet und Schreibtisch unverändert. */
@media (orientation:landscape) and (max-height:500px){
  .fahren{padding-top:8px;gap:8px} .fahren>*{max-width:760px} .fkarte{padding:12px 16px;gap:10px}   /* Anker CFRP_KAPUTT=fahrkarte-quer-hoch */
}

/* A-428 — „Adressen prüfen“: die Nacharbeit als Liste (nacharbeit.js). Je Zeile Nummer, Firma, Adresse, Grund und die Handlungen;
   die Farbe der Nummer sagt die Gruppe (noch nicht gesucht · ungefähr · kein Treffer). Die Knöpfe brechen um, statt zu schrumpfen. */
.nakopf{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;margin-bottom:6px}
.nakopf b{font-size:var(--fs-t,14px)} .nakopf span{color:var(--dim);font-size:var(--fs-i,12.5px)} .nakopf .linkbtn{margin-left:auto}
.naerklaer{color:var(--dim);font-size:var(--fs-i,12.5px);line-height:1.5;margin:0 0 8px}
.nazeile{display:flex;gap:10px;padding:10px 0;border-top:1px solid var(--line)}
.nanr{flex:0 0 24px;width:24px;height:24px;border-radius:50%;display:grid;place-items:center;font-size:var(--fs-n,11.5px);font-weight:700;color:#fff;background:#6f6f68}
.nanr.ungefaehr{background:#b7791f} .nanr.offen{background:#2f6f9f}
.nakern{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:2px}
.nakern b{overflow-wrap:anywhere} .naadresse{color:var(--dim);font-size:var(--fs-i,12.5px);overflow-wrap:anywhere}
.nagrund{font-size:var(--fs-i,12.5px);line-height:1.5}
.tag.na{color:#fff;background:#6f6f68;margin-right:4px} .tag.na.ungefaehr{background:#b7791f} .tag.na.offen{background:#2f6f9f}
.naaktionen{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}   /* Anker CFRP_KAPUTT=pruefliste-knoepfe-eng */
/* A-587/A-598 — DREI KNÖPFE STEHEN AM TELEFON UNTEREINANDER. Die Wahl „Abbrechen · Route aktualisieren · Nur diese Fahrt“ passte bei 390 px
   nicht in eine Reihe: „Nur diese Fahrt“ wurde 65 px breit und dreizeilig (gemessen 04.10.2026). Zwei Knöpfe bleiben nebeneinander. A-652: NUR Fenster ohne Formularfelder — „Kunde anlegen“ (drei Knöpfe unter dem Formular) verlor sonst „Anlegen“ aus dem Bild (a383 A0). */
@media (max-width:560px){.modal:not(:has(.felder)) .reihe:has(> .knopf:nth-child(3)){flex-direction:column} .modal:not(:has(.felder)) .reihe:has(> .knopf:nth-child(3)) > .knopf{width:100%}}   /* Anker CFRP_KAPUTT=wahl-reihe-eng  Anker CFRP_KAPUTT=reihe-auch-im-formular */
/* A-590 — die Vorlage in der Routenkarte: Tage untereinander, die Fahrten als Schilder. */
.rvorlage{margin-top:8px;padding-top:8px;border-top:1px solid var(--line,#e5e5df);cursor:default} .rvorlage ul{list-style:none;margin:0;padding:0;font-size:var(--fs-n,11.5px);line-height:1.5}
.rvorlage li b{display:inline-block;min-width:4.6em} .rfahrten{display:flex;flex-wrap:wrap;gap:6px;margin-top:5px}
/* A-1055 (Hans 06.10.2026, Messung A-1046; Grundlage M7: ein Toast ist nie still und trägt sein „Rückgängig“) — DER TOAST LIEGT ÜBER
   JEDEM FENSTER DER BÜHNE, auf allen Breiten. Gemessen am Stand davor (Chromium 1440×900 und 820×1180, Kundendetail offen): Toast z 35
   unter `.ovl` z 40, am Mittelpunkt von „Rückgängig“ lag das Fenster, der Klick kam nie an; am Telefon stand seit M5b schon 41.
   EIN Ort für die Zahl — die Grundregel oben trägt keinen z-index mehr, die Telefon-Zeile ist entfallen.
   Zweitens: solange ein Fenster offen ist, steht der Toast am unteren Rand der Bühne statt über der Tagesfläche (`--hb`) — in der
   Kartenansicht lag er sonst mitten im Fenster über dem Notizfeld. Am Telefon steht er oben (`top`), dort liest niemand `--hb`.
   NICHT gedeckt: das Formular-Fenster (`.fformhuelle`) hängt am body über der ganzen Bühne — ein Toast der Bühne kommt mit CSS nicht darüber. */
.toast{z-index:41}   /* Anker CFRP_KAPUTT=toast-unter-hinweis */
#buehne:has(> .ovl) > .toast{--hb:22px}   /* Anker CFRP_KAPUTT=toast-mitten-im-fenster */
/* A-1066 (Lesung Anton A-1058 N2, gemessen 06.10.): ein mehrzeiliger Toast war bei offenem Fenster am Tablet nur 410 px breit
   (`left:50%` lässt dem Kasten die halbe Bühne) und dadurch 200 px hoch — er lag über den untersten Feldern des Fensters. Bei offenem
   Fenster darf er deshalb die Breite der Bühne nutzen; die Bedingung ist das Gegenstück zum Telefon-Block (dort steht der Toast oben). */
@media (min-width:769px) and (min-height:501px){#buehne:has(> .ovl) > .toast{left:0;right:0;margin-inline:auto;width:fit-content;transform:none;max-width:92%}}   /* Anker CFRP_KAPUTT=toast-schmal-am-fenster */
/* A-1057 (Hans 06.10.2026, Entscheid Constantin „C“): am Telefon hochkant steht der Toast oben und lag bei offenem Fenster über dessen Schließen-Kreuz
   (gemessen WebKit 390×663: Toast 58–384, Kreuz Kundendetail 312–338, „Kunde anlegen“ 303–347). Solange ein Fenster offen ist, endet er links
   der Kreuz-Spalte; links rückt er an den Rand, die Zoom-Leiste liegt dann unter dem Fenster. Die 93 px sind GEMESSEN, nicht abgeleitet: die
   Blätter sind je Fenster anders breit (92 %, 94 %, 100 % − 40 px); größter Abstand Kreuz-links bis Bildrand 87 px (390) bzw. 84 px (320) über
   Kundendetail, Verlauf, Anmeldung und „Kunde anlegen“ — Wächter `tests/a1055-toast-ueber-fenster.test.mjs` K 390 / K 320. Quer gilt die Regel
   nicht: dort steht der Toast links über der Karte und trifft kein Kreuz (K quer). */
@media (max-width:768px) and (orientation:portrait){#buehne:has(> .ovl) > .toast{left:6px;right:93px}}   /* Anker CFRP_KAPUTT=toast-ueber-kreuz */
/* A-1116 (06.10.2026) — EIN DIALOG DER BÜHNE, DER BEI OFFENEM FORMULAR-FENSTER AUFGEHT, MUSS ZU SEHEN SEIN. Das Formular hängt am body über
   der ganzen Bühne (z 60); die Bühne ist `position:fixed` und damit ein eigener Stapel darunter — kein z-index hebt „Keine Verbindung“ oder
   die Anmeldung über das Blatt. Solange ein solcher Dialog oben liegt, ruht das Formular (`data-ruht`, dialog.js) und ist nicht im Bild;
   es bleibt mit allen Eingaben im Dokument und steht wieder da, sobald der Dialog zu ist. */
.fformhuelle[data-ruht]{visibility:hidden}   /* Anker CFRP_KAPUTT=formular-deckt-dialog */
