/* ==========================================================================
   Bahnmonitor — Komponenten  (Fassung 1, 27.10.2026)
   Setzt tokens.css voraus. Alle Klassen mit Präfix .bm- (kollisionsfrei).
   Regeln: eckig, Haarlinien statt Karten, keine Schatten, kein Verlauf,
   Bewegung nur über transform/opacity, UI < 300 ms.
   ========================================================================== */

/* ---------- Grundlage ---------- */
.bm-base, .bm-base *{box-sizing:border-box}
.bm-base{
  margin:0; background:var(--bm-paper); color:var(--bm-ink);
  font:400 var(--bm-fs-body)/var(--bm-lh-body) var(--bm-sans);
  -webkit-font-smoothing:antialiased; text-rendering:optimizeLegibility;
  font-variant-numeric:tabular-nums;
}
.bm-base :focus-visible{outline:3px solid var(--bm-accent);outline-offset:2px;box-shadow:0 0 0 5px var(--bm-ink)}
.bm-base ::selection{background:var(--bm-accent);color:var(--bm-on-accent)}

/* ---------- Typografie ---------- */
.bm-h1,.bm-h2,.bm-h3,.bm-tafel{font-family:var(--bm-display);font-weight:700;letter-spacing:var(--bm-track-display);line-height:var(--bm-lh-tight);margin:0;text-transform:none}
.bm-h1{font-size:var(--bm-fs-h1)}
.bm-h2{font-size:var(--bm-fs-h2);line-height:1}
.bm-h3{font-size:var(--bm-fs-h3);font-weight:600;line-height:1.1}
.bm-tafel{font-size:var(--bm-fs-tafel);font-variant-numeric:tabular-nums;line-height:.86}
.bm-lead{font-size:var(--bm-fs-lead);color:var(--bm-ink-soft);max-width:52ch}
.bm-text{max-width:60ch;color:var(--bm-ink-soft)}
.bm-label{font:600 var(--bm-fs-label)/1.2 var(--bm-sans);letter-spacing:var(--bm-track-label);text-transform:uppercase;color:var(--bm-muted)}
.bm-zahl{font-family:var(--bm-display);font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:0}
.bm-mark{background:var(--bm-accent);color:var(--bm-on-accent);padding:0 .18em;box-decoration-break:clone;-webkit-box-decoration-break:clone}

/* ---------- Knöpfe ---------- */
.bm-btn{
  -webkit-tap-highlight-color:transparent;
  display:inline-flex;align-items:center;justify-content:center;gap:10px;white-space:nowrap;
  min-height:var(--bm-tap);padding:0 22px;border:var(--bm-rule) solid var(--bm-ink);
  border-radius:var(--bm-radius-pill);background:transparent;color:var(--bm-ink);
  font:700 16px/1 var(--bm-sans);letter-spacing:.01em;text-decoration:none;cursor:pointer;
  transition:transform var(--bm-t-press) var(--bm-ease-out),background-color var(--bm-t-quick) var(--bm-ease-out),color var(--bm-t-quick) var(--bm-ease-out);
}
.bm-btn svg{width:20px;height:20px;flex:none}
.bm-btn:active{transform:scale(.97)}
.bm-btn--primary{background:var(--bm-accent);color:var(--bm-on-accent);border-color:var(--bm-accent)}
.bm-btn--ink{background:var(--bm-ink);color:var(--bm-paper);border-color:var(--bm-ink)}
.bm-btn--quiet{border-color:transparent;padding:0 12px}
@media (hover:hover) and (pointer:fine){
  .bm-btn:hover{background:var(--bm-surface)}
  .bm-btn--primary:hover{background:var(--bm-ink);color:var(--bm-accent);border-color:var(--bm-ink)}
  .bm-btn--ink:hover{background:var(--bm-ink-soft)}
}
.bm-link{color:inherit;text-decoration:underline;text-decoration-color:var(--bm-accent);text-decoration-thickness:3px;text-underline-offset:4px}
@media (hover:hover) and (pointer:fine){.bm-link:hover{background:var(--bm-accent);color:var(--bm-on-accent)}}

/* ---------- Linien-Plakette (S4, RE2, RB77, 10 …) ----------
   Immer Tinte, nie Linienfarben der Betreiber: neutral und unverwechselbar mit DB/üstra. */
.bm-linie{
  display:inline-flex;align-items:center;justify-content:center;min-width:2.6em;height:1.7em;padding:0 .45em;
  background:var(--bm-ink);color:var(--bm-paper);
  font:700 1em/1 var(--bm-display);letter-spacing:.02em;font-variant-numeric:tabular-nums;
}
.bm-linie--s{clip-path:none}
.bm-linie--re{box-shadow:inset 0 -.22em 0 var(--bm-paper),inset 0 -.32em 0 var(--bm-ink)} /* Regionalzug: Doppelkante unten */
.bm-linie--stadtbahn{background:transparent;color:var(--bm-ink);outline:2px solid var(--bm-ink);outline-offset:-2px}
.bm-linie--lg{font-size:28px}

/* ---------- Zustand ---------- */
.bm-punkt{display:inline-block;width:10px;height:10px;border-radius:50%;background:var(--bm-ok);flex:none}
.bm-punkt--late{background:var(--bm-late)} .bm-punkt--cancel{background:var(--bm-cancel)}
.bm-punkt--live{position:relative}
.bm-punkt--live::after{content:"";position:absolute;inset:0;border-radius:50%;background:inherit;animation:bm-puls 2.4s var(--bm-ease-out) infinite}
@keyframes bm-puls{from{transform:scale(1);opacity:.6}to{transform:scale(2.8);opacity:0}}

.bm-status{white-space:nowrap;display:inline-flex;align-items:center;gap:8px;font:700 var(--bm-fs-small)/1 var(--bm-sans)}
.bm-status--ok{color:var(--bm-ok)} .bm-status--late{color:var(--bm-late)} .bm-status--cancel{color:var(--bm-cancel)}

.bm-delta{font-family:var(--bm-display);font-weight:700;font-variant-numeric:tabular-nums}
.bm-delta--ok{color:var(--bm-ok)} .bm-delta--late{color:var(--bm-late)}
.bm-delta--cancel{color:var(--bm-cancel);text-decoration:line-through;text-decoration-thickness:.08em}

/* ---------- Pünktlichkeitsstreifen (Signatur) ----------
   Ein Strich je Tag (oder je Fahrt). Farbe = Anteil verspäteter Fahrten.
   Markup: <div class="bm-streifen"><i data-q="0"></i><i data-q="2"></i>…</div>
   data-q: 0 pünktlich · 1 leicht · 2 verspätet · 3 stark · x keine Daten · c Ausfall */
.bm-streifen{display:flex;gap:2px;height:44px;align-items:stretch}
.bm-streifen i{flex:1 1 0;min-width:2px;background:var(--bm-ok)}
.bm-streifen i[data-q="1"]{background:var(--bm-ok-2)}
.bm-streifen i[data-q="2"]{background:var(--bm-late)}
.bm-streifen i[data-q="3"]{background:var(--bm-late-2)}
.bm-streifen i[data-q="c"]{background:var(--bm-cancel)}
.bm-streifen i[data-q="x"]{background:var(--bm-nodata)}
.bm-streifen--fein{height:14px;gap:1px}

/* ---------- Fallblatt (Signatur-Effekt) ----------
   Nur für Zahlen, die sich live ändern (Verspätung, Abfahrt). Max. eine Stelle pro Ansicht. */
.bm-flap{display:inline-flex;gap:.06em;font-family:var(--bm-display);font-weight:700;font-variant-numeric:tabular-nums;line-height:1}
.bm-flap__z{position:relative;display:inline-block;width:.62em;height:1.12em;perspective:4em}
.bm-flap__z>span{position:absolute;left:0;right:0;height:50%;overflow:hidden;background:var(--bm-ink);color:var(--bm-paper);backface-visibility:hidden}
.bm-flap__z>.o{top:0} .bm-flap__z>.u{bottom:0}
.bm-flap__z>span>b{position:absolute;left:0;right:0;height:200%;display:flex;align-items:center;justify-content:center;font-weight:700}
.bm-flap__z>.o>b{top:0} .bm-flap__z>.u>b{bottom:0}
.bm-flap__z::after{content:"";position:absolute;left:0;right:0;top:50%;height:max(1px,.02em);background:var(--bm-paper);opacity:.9;z-index:3}
.bm-flap__z>.f{z-index:2;transform-origin:50% 100%;transition:transform var(--bm-t-flap) var(--bm-ease-in-out)}
.bm-flap__z>.f.u{transform-origin:50% 0}
.bm-flap--accent .bm-flap__z>span{background:var(--bm-accent);color:var(--bm-on-accent)}
.bm-flap--accent .bm-flap__z::after{background:var(--bm-on-accent);opacity:.35}

/* ---------- Linienband (Strecke mit Halten) ---------- */
.bm-band{position:relative;display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);padding-top:28px}
.bm-band::before{content:"";position:absolute;left:0;right:0;top:34px;height:var(--bm-rule);background:var(--bm-ink)}
.bm-band__halt{position:relative;padding-top:24px;font:600 13px/1.25 var(--bm-sans);color:var(--bm-ink-soft)}
.bm-band__halt::before{content:"";position:absolute;left:0;top:-1px;width:14px;height:14px;background:var(--bm-paper);border:var(--bm-rule) solid var(--bm-ink)}
.bm-band__halt--ziel::before,.bm-band__halt--start::before{background:var(--bm-ink)}
.bm-band__halt--ende{text-align:right}
.bm-band__halt--ende::before{left:auto;right:0}
.bm-band__zug{position:absolute;top:22px;width:28px;height:26px;background:var(--bm-accent);border:var(--bm-rule) solid var(--bm-ink);transform:translateX(-50%);transition:transform 120ms linear}

/* ---------- Listenzeilen statt Karten ---------- */
.bm-liste{list-style:none;margin:0;padding:0;border-top:var(--bm-hair) solid var(--bm-line)}
.bm-zeile{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:16px;min-height:64px;padding:12px 0;border-bottom:var(--bm-hair) solid var(--bm-line)}
.bm-zeile__titel{font-weight:700}
.bm-zeile__sub{font-size:var(--bm-fs-small);color:var(--bm-muted)}
button.bm-zeile,a.bm-zeile{width:100%;background:none;border-left:0;border-right:0;border-top:0;color:inherit;text-align:left;font:inherit;cursor:pointer;text-decoration:none;transition:background-color var(--bm-t-quick) var(--bm-ease-out)}
@media (hover:hover) and (pointer:fine){button.bm-zeile:hover,a.bm-zeile:hover{background:var(--bm-surface)}}

/* ---------- Eingaben ---------- */
.bm-feld{display:grid;gap:8px}
.bm-input,.bm-select{min-height:var(--bm-tap);padding:0 14px;border:0;border-bottom:var(--bm-rule) solid var(--bm-ink);background:var(--bm-surface);color:var(--bm-ink);font:500 17px/1 var(--bm-sans);border-radius:0;width:100%}
.bm-input:focus{outline:none;border-bottom-color:var(--bm-accent);box-shadow:inset 0 -2px 0 var(--bm-ink)}

/* Segmentwahl (z. B. Prüf-Takt 5 · 15 · 30 · 60) */
.bm-seg{display:inline-grid;grid-auto-flow:column;grid-auto-columns:minmax(56px,1fr);border:var(--bm-rule) solid var(--bm-ink)}
.bm-seg input{position:absolute;opacity:0;pointer-events:none}
.bm-seg label{display:flex;align-items:center;justify-content:center;min-height:44px;padding:0 12px;font:600 18px/1 var(--bm-display);font-variant-numeric:tabular-nums;cursor:pointer;border-left:var(--bm-hair) solid var(--bm-line-strong);transition:background-color var(--bm-t-quick) var(--bm-ease-out)}
.bm-seg label:first-of-type{border-left:0}
.bm-seg input:checked+label{background:var(--bm-ink);color:var(--bm-paper)}
.bm-seg input:focus-visible+label{outline:3px solid var(--bm-accent);outline-offset:-3px}

/* Schalter — Pille erlaubt, Knopf eckig */
.bm-switch{position:relative;display:inline-block;width:52px;height:30px;flex:none}
.bm-switch input{position:absolute;inset:0;opacity:0;margin:0;cursor:pointer;z-index:1}
.bm-switch span{position:absolute;inset:0;border:var(--bm-rule) solid var(--bm-ink);border-radius:var(--bm-radius-pill);background:var(--bm-paper);transition:background-color var(--bm-t-quick) var(--bm-ease-out)}
.bm-switch span::after{content:"";position:absolute;top:4px;left:4px;width:18px;height:18px;border-radius:50%;background:var(--bm-ink);transition:transform var(--bm-t-quick) var(--bm-ease-out)}
.bm-switch input:checked+span{background:var(--bm-accent)}
.bm-switch input:checked+span::after{transform:translateX(22px)}
.bm-switch input:focus-visible+span{outline:3px solid var(--bm-accent);outline-offset:2px}

/* Schwellenregler (Verspätung ab … Min.) */
.bm-range{-webkit-appearance:none;appearance:none;width:100%;height:28px;background:transparent}
.bm-range::-webkit-slider-runnable-track{height:2px;background:var(--bm-ink)}
.bm-range::-moz-range-track{height:2px;background:var(--bm-ink)}
.bm-range::-webkit-slider-thumb{-webkit-appearance:none;width:22px;height:22px;margin-top:-10px;background:var(--bm-accent);border:2px solid var(--bm-ink);border-radius:0}
.bm-range::-moz-range-thumb{width:18px;height:18px;background:var(--bm-accent);border:2px solid var(--bm-ink);border-radius:0}

/* ---------- Navigation ---------- */
.bm-tabbar{position:fixed;left:0;right:0;bottom:0;display:grid;grid-template-columns:repeat(5,minmax(0,1fr));background:var(--bm-paper);border-top:var(--bm-hair) solid var(--bm-line-strong);padding-bottom:env(safe-area-inset-bottom)}
.bm-tabbar a,.bm-tabbar button{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;min-height:60px;background:none;border:0;color:var(--bm-muted);font:600 11px/1 var(--bm-sans);letter-spacing:.04em;text-decoration:none;cursor:pointer;position:relative}
.bm-tabbar svg{width:24px;height:24px}
.bm-tabbar [aria-current="page"]{color:var(--bm-ink)}
.bm-tabbar [aria-current="page"]::before{content:"";position:absolute;top:-1px;left:22%;right:22%;height:3px;background:var(--bm-accent)}

/* ---------- Meldung (Toast) ---------- */
.bm-toast{display:grid;grid-template-columns:auto minmax(0,1fr);gap:12px;align-items:start;max-width:420px;padding:14px 16px;background:var(--bm-ink);color:var(--bm-paper);border-left:6px solid var(--bm-accent)}
.bm-toast[data-state="enter"]{opacity:0;transform:translateY(8px)}
.bm-toast{transition:opacity var(--bm-t-quick) var(--bm-ease-out),transform var(--bm-t-quick) var(--bm-ease-out)}

/* ---------- Tabelle ---------- */
.bm-table{width:100%;border-collapse:collapse;font-variant-numeric:tabular-nums}
.bm-table th{font:600 var(--bm-fs-label)/1.2 var(--bm-sans);letter-spacing:var(--bm-track-label);text-transform:uppercase;color:var(--bm-muted);text-align:left;padding:10px 12px 10px 0;border-bottom:var(--bm-rule) solid var(--bm-ink)}
.bm-table td{padding:14px 12px 14px 0;border-bottom:var(--bm-hair) solid var(--bm-line);vertical-align:top}
.bm-table td.num,.bm-table th.num{text-align:right}

/* ---------- Bewegung reduzieren ---------- */
@media (prefers-reduced-motion: reduce){
  .bm-btn:active{transform:none}
  .bm-punkt--live::after{animation:none}
  .bm-flap__z>.f{transition:opacity 120ms linear}
  .bm-band__zug{transition:none}
  .bm-toast[data-state="enter"]{transform:none}
  .bm-switch span::after{transition:none}
}
