<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Fußball-Ergebnisse heute live: Bundesliga, 2. Bundesliga, 3. Liga, DFB-Pokal, Österreich, Schweiz &amp; Luxemburg. Tabellen, Spielplan &amp; Live-Ticker auf Ergebnisse1.de.">
<meta name="robots" content="index,follow,max-snippet:-1,max-image-preview:large,max-video-preview:-1">
<meta name="theme-color" content="#0f1923">
<meta name="author" content="Ergebnisse1.de">
<meta property="og:type" content="website">
<meta property="og:locale" content="de_DE">
<meta property="og:site_name" content="Ergebnisse1.de">
<meta property="og:title" content="Fußball Heute Live, Ergebnisse Bundesliga, 2. Bundesliga, 3. Liga, DFB-Pokal, Österreich &amp; Schweiz 2025/26">
<meta property="og:description" content="Fußball-Ergebnisse heute live: Bundesliga, 2. Bundesliga, 3. Liga, DFB-Pokal, Österreich, Schweiz &amp; Luxemburg. Tabellen, Spielplan &amp; Live-Ticker auf Ergebnisse1.de.">
<meta property="og:url" content="https://ergebnisse1.de/bundesliga/heute">
<meta property="og:image" content="https://ergebnisse1.de/og-image.png">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Fußball Heute Live, Ergebnisse Bundesliga, 2. Bundesliga, 3. Liga, DFB-Pokal, Österreich &amp; Schweiz 2025/26">
<meta name="twitter:description" content="Fußball-Ergebnisse heute live: Bundesliga, 2. Bundesliga, 3. Liga, DFB-Pokal, Österreich, Schweiz &amp; Luxemburg. Tabellen, Spielplan &amp; Live-Ticker auf Ergebnisse1.de.">
<link rel="canonical" href="https://ergebnisse1.de/bundesliga/heute">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="apple-touch-icon" href="/favicon.svg">
<title>Fußball Heute Live, Ergebnisse Bundesliga, 2. Bundesliga, 3. Liga, DFB-Pokal, Österreich &amp; Schweiz 2025/26 - Ergebnisse1.de</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="preload" href="/fonts/RondiutCapitalsLight-rPnO.otf" as="font" type="font/otf" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&family=Teko:wght@500;600;700&family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20,500,1,0&display=swap" rel="stylesheet">
<script type="application/ld+json">[{"@context":"https://schema.org","@type":"WebSite","name":"Ergebnisse1.de","url":"https://ergebnisse1.de","description":"Fußball-Ergebnisse, Tabellen und Statistiken: Bundesliga, 2. Bundesliga, 3. Liga, DFB-Pokal, Regionalliga, Österreich, Schweiz & Luxemburg.","inLanguage":"de","potentialAction":{"@type":"SearchAction","target":"https://ergebnisse1.de/?q={search_term_string}","query-input":"required name=search_term_string"}},{"@context":"https://schema.org","@type":"Organization","name":"Ergebnisse1.de","url":"https://ergebnisse1.de","logo":"https://ergebnisse1.de/favicon.svg","description":"Live-Fußball-Ergebnisse, Tabellen und Statistiken für alle deutschsprachigen Ligen.","sameAs":[],"contactPoint":{"@type":"ContactPoint","contactType":"customer support","url":"https://ergebnisse1.de/kontakt","availableLanguage":"German"}}]</script>
<style>
@font-face{font-family:'Ronduit';src:url('/fonts/RondiutCapitalsLight-rPnO.otf') format('opentype');font-display:swap}
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
:root{
  --bg:#e9ecf1;--s0:#fff;--s1:#f2f3f6;--s2:rgba(0,10,40,.04);
  --bd:rgba(0,10,40,.1);--c1:#111318;--c2:rgba(17,19,24,.75);--c3:rgba(17,19,24,.48);--c4:rgba(17,19,24,.15);
  --ac:#c5102e;--ac-l:rgba(197,16,46,.08);--ac-d:#a30d26;
  --hdr:#0b1219;
  --live:#c5102e;--live-l:rgba(197,16,46,.06);
  --grn:#0f7b3a;--grn-l:rgba(15,123,58,.07);
  --yel:#b8860b;--gold:#d4960f;
  --r:6px;--r-lg:10px;--tr:.12s ease;
}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}
body{background:var(--bg);color:var(--c1);font-family:Inter,system-ui,-apple-system,sans-serif;font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;overflow-x:hidden}
a{color:inherit;text-decoration:none}
button{font-family:inherit;cursor:pointer;border:none;background:none}
img{display:block;max-width:100%}
::selection{background:var(--ac-l);color:var(--ac)}

.icon{font-family:"Material Symbols Rounded";font-style:normal;font-weight:normal;font-size:20px;line-height:1;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;user-select:none;vertical-align:middle}
.icon-s{font-size:16px}.icon-m{font-size:22px}.icon-l{font-size:28px}

@keyframes blink{0%,100%{opacity:1}50%{opacity:.15}}
@keyframes softpulse{0%,100%{opacity:1}50%{opacity:.5}}
@keyframes spin-r{to{transform:rotate(360deg)}}
@keyframes rise{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}

/* ── HEADER ── */
header{position:sticky;top:0;z-index:300;background:var(--hdr);border-bottom:none;transition:transform .15s ease;box-shadow:0 1px 6px rgba(0,0,0,.15)}
.hdr{max-width:1440px;margin:0 auto;padding:0 24px;height:54px;display:flex;align-items:center;gap:8px}
.logo{display:flex;align-items:center;gap:9px;flex-shrink:0;margin-right:14px}
.logo-mark{width:34px;height:34px;background:var(--ac);border-radius:8px;display:flex;align-items:center;justify-content:center}
.logo-mark .icon{font-size:18px;color:#fff}
.logo-txt{font-size:17px;font-weight:800;letter-spacing:-.5px;color:#fff}
.logo-txt span{color:var(--ac);font-weight:900}
.logo-txt .logo-de{color:#d4960f;font-weight:700;font-size:14px}
.hdr-nav{display:flex;gap:2px;overflow-x:auto;scrollbar-width:none;flex:1;-webkit-overflow-scrolling:touch}
.hdr-nav::-webkit-scrollbar{display:none}
.hn-a{font-size:13px;font-weight:500;color:rgba(255,255,255,.65);padding:8px 13px;white-space:nowrap;display:flex;align-items:center;gap:5px;border-bottom:2px solid transparent;transition:all var(--tr)}
.hn-a:hover{color:#fff}
.hn-a.on{color:#fff;border-color:var(--ac);font-weight:700}
.hn-a .icon{font-size:16px}
.hn-live{display:none;align-items:center;gap:5px;font-size:11px;font-weight:800;color:var(--live);padding:6px 12px;border-radius:12px;background:rgba(197,16,46,.12);white-space:nowrap;letter-spacing:.4px;animation:softpulse 3s ease-in-out infinite;text-decoration:none}
.hdr-end{margin-left:auto;flex-shrink:0;display:flex;align-items:center;gap:8px}
.live-pill{display:flex;align-items:center;gap:4px;color:var(--ac);font-size:10px;font-weight:700;padding:4px 10px;border-radius:12px;background:var(--ac-l);letter-spacing:.4px}
.live-pill::before{content:"";width:6px;height:6px;background:var(--ac);border-radius:50%;animation:blink 1s infinite;flex-shrink:0}
.clk{font-size:12px;font-weight:600;color:rgba(255,255,255,.45);font-variant-numeric:tabular-nums;min-width:54px;text-align:right}

/* ── SEARCH ── */
.srch-wrap{position:relative}
.srch-btn{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:var(--r);color:rgba(255,255,255,.6);transition:color .15s}
.srch-btn:hover{color:#fff}
.srch-box{display:none;position:absolute;right:0;top:50%;transform:translateY(-50%);background:rgba(255,255,255,.1);backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.12);border-radius:8px;padding:0 10px;height:38px;align-items:center;gap:6px;min-width:280px}
.srch-box.open{display:flex}
.srch-box input{background:none;border:none;outline:none;color:#fff;font-family:inherit;font-size:13px;flex:1;min-width:0;padding:0}
.srch-box input::placeholder{color:rgba(255,255,255,.3)}
.srch-close{display:flex;align-items:center;color:rgba(255,255,255,.4);padding:0;flex-shrink:0}
.srch-close:hover{color:#fff}
.srch-results{display:none;position:absolute;right:0;top:calc(100% + 6px);background:var(--s0);border:1px solid var(--bd);border-radius:var(--r-lg);box-shadow:0 8px 24px rgba(0,0,0,.15);min-width:300px;max-width:360px;max-height:400px;overflow-y:auto;z-index:400}
.srch-results.open{display:block}
.srch-item{display:flex;align-items:center;gap:10px;padding:10px 14px;border-bottom:1px solid var(--bd);color:var(--c1);text-decoration:none;transition:background .1s}
.srch-item:last-child{border-bottom:none}
.srch-item:hover{background:var(--s1)}
.srch-item img{width:24px;height:24px;object-fit:contain;flex-shrink:0}
.srch-item-info{flex:1;min-width:0}
.srch-item-name{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.srch-item-sub{font-size:10px;color:var(--c3)}
.srch-empty{padding:20px;text-align:center;font-size:12px;color:var(--c3)}
@media(max-width:480px){.srch-box{min-width:220px;right:-40px}.srch-results{min-width:260px;right:-40px}}

/* ── MOBILE DRAWER ── */
.mob-btn{display:none;width:40px;height:40px;border-radius:var(--r);color:rgba(255,255,255,.75);align-items:center;justify-content:center}
.mob-drawer{display:none;position:fixed;top:54px;left:0;right:0;bottom:0;z-index:290;background:rgba(0,0,0,.35);opacity:0;transition:opacity .2s}
.mob-drawer.open{opacity:1}
.mob-panel{position:absolute;top:0;left:0;width:280px;max-width:82vw;height:100%;background:var(--s0);overflow-y:auto;-webkit-overflow-scrolling:touch;transform:translateX(-100%);transition:transform .22s ease}
.mob-drawer.open .mob-panel{transform:none}
.mob-panel .ln-sect{padding:14px 16px 4px;font-size:10px;font-weight:800;letter-spacing:.8px;color:var(--c3)}
.mob-panel .ln-a{padding:9px 16px;font-size:14px;gap:10px;border-radius:0;min-height:44px}
.mob-panel .ln-a:active{background:var(--s1)}
.mob-panel .ln-a.on{border-left:3px solid var(--ac);color:var(--ac);font-weight:700;background:var(--ac-l)}
@media(max-width:1100px){.mob-btn{display:flex}}
@media(max-width:820px){.hdr-nav{display:none}}

/* ── LEFT NAV ── */
.lnav{display:flex;flex-direction:column;position:sticky;top:60px;max-height:calc(100vh - 68px);overflow-y:auto;scrollbar-width:thin}

/* ── PAGE GRID ── */
.page{max-width:1440px;margin:0 auto;padding:14px 24px;display:grid;grid-template-columns:210px 1fr 280px;gap:16px}
@media(max-width:1100px){.page{grid-template-columns:1fr 240px;padding:12px 16px}.lnav{display:none !important}}
@media(max-width:768px){.page{grid-template-columns:1fr;padding:8px;gap:8px}.rnav{display:none}}
.ln-sect{font-size:9px;font-weight:800;letter-spacing:.9px;text-transform:uppercase;color:var(--c3);padding:10px 10px 3px;display:flex;align-items:center;gap:4px}
.ln-a{display:flex;align-items:center;gap:7px;padding:4px 10px;border-radius:var(--r);font-size:12px;font-weight:500;color:var(--c2);transition:all var(--tr);min-height:32px}
.ln-a:hover{color:var(--c1);background:var(--s1)}
.ln-a.on{color:var(--ac);font-weight:700;background:var(--ac-l)}
.ln-a .icon{font-size:15px;color:var(--c3)}
.ln-a.on .icon{color:var(--ac)}

/* ── MAIN ── */
.main{min-width:0;animation:rise .15s ease}

/* ── VIEW CONTROLS ── */
.vc{display:flex;gap:4px;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;margin-bottom:8px;padding:4px 0}
.vc::-webkit-scrollbar{display:none}
.vbtn{font-size:11px;font-weight:600;padding:7px 14px;border-radius:20px;background:var(--s0);border:1px solid var(--bd);color:var(--c2);cursor:pointer;white-space:nowrap;display:flex;align-items:center;gap:4px;transition:var(--tr);box-shadow:0 1px 2px rgba(0,0,0,.03)}
.vbtn:hover{color:var(--ac);border-color:var(--ac)}
.vbtn.on{background:var(--hdr);border-color:var(--hdr);color:#fff}
.vbtn .icon{font-size:13px}

/* ── SECTION LABEL ── */
.slbl{font-size:11px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--c3);padding:14px 0 8px;display:flex;align-items:center;gap:8px}
.slbl::after{content:"";flex:1;height:1px;background:var(--bd)}

/* ── DATE NAV ── */
.date-nav{display:flex;align-items:center;justify-content:space-between;background:var(--s0);border-bottom:1px solid var(--bd);padding:10px 16px;margin-bottom:0;border-radius:var(--r-lg) var(--r-lg) 0 0}
.date-nav-btn{display:flex;align-items:center;gap:3px;font-size:13px;font-weight:600;color:var(--c2);padding:8px 14px;border-radius:var(--r);cursor:pointer;transition:var(--tr);min-height:40px}
.date-nav-btn:hover{color:var(--ac);background:var(--ac-l)}
.date-nav-btn:active{transform:scale(.97)}
.date-nav-lbl .day{font-size:14px;font-weight:700;color:var(--c1);text-align:center}
.date-nav-lbl .full{font-size:11px;color:var(--c3);text-align:center;margin-top:2px}

/* ── MATCH CARD ── */
.mcard{background:var(--s0);border-radius:var(--r-lg);overflow:hidden;margin-bottom:10px;box-shadow:0 1px 4px rgba(0,0,0,.08)}
.mcard-hdr{display:flex;align-items:center;gap:8px;padding:10px 16px;border-bottom:1px solid var(--bd);cursor:pointer;user-select:none;min-height:44px}
.mcard-hdr:active{background:var(--s1)}
.mcard-hdr-l{display:flex;align-items:center;gap:8px;min-width:0;flex:1}
.mcard-title{font-size:13px;font-weight:600}
.mcard-r{display:flex;align-items:center;gap:8px;flex-shrink:0}
.mcard-count{font-size:11px;color:var(--c3)}
.live-cnt{font-size:11px;font-weight:700;color:var(--live);display:flex;align-items:center;gap:4px}
.live-cnt::before{content:"";width:6px;height:6px;background:var(--live);border-radius:50%;animation:blink 1s infinite;flex-shrink:0}
.mcard-tog{font-size:18px;color:var(--c3);transition:transform .15s}
.mcard.coll .mcard-tog{transform:rotate(-90deg)}
.mcard.coll .mrows{display:none}

/* ── MATCH ROW ── */
.mrow{display:grid;grid-template-columns:62px 1fr 84px 1fr 28px;align-items:center;gap:6px;padding:10px 16px;border-bottom:1px solid var(--bd);color:inherit;text-decoration:none;min-height:48px}
.mrow:last-child{border-bottom:none}
.mrow:hover{background:var(--s1)}
.mrow:active{background:var(--s2)}
.mt{font-size:10px;font-weight:600;color:var(--c2);text-align:center;line-height:1.35;font-variant-numeric:tabular-nums;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mt small{display:block;font-size:9px;color:var(--c3);margin-top:2px}
.mt.live-t{color:var(--live);font-weight:700}
.mt.fin-t{color:var(--c3)}
.trow{display:flex;align-items:center;gap:7px;overflow:hidden;min-width:0}
.trow.r{flex-direction:row-reverse;text-align:right}
.tn{font-size:13px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tn.w{font-weight:700;color:var(--c1)}
.tn.l{font-weight:400;color:var(--c3)}
.tn.d{color:var(--c2)}

/* ── SCORE ── */
.scr{display:flex;align-items:center;justify-content:center}
.sn{font-size:17px;font-weight:700;min-width:22px;text-align:center;line-height:1;font-variant-numeric:tabular-nums;color:var(--c1)}
.sn.s-fin{color:var(--c1)}
.sn.s-live{color:var(--live);animation:blink 2s infinite}
.sn.s-up{color:var(--c3);font-size:14px;font-weight:400}
.ssep{font-size:13px;color:var(--c4);padding:0 3px;font-weight:300}
.ms{display:flex;align-items:center;justify-content:flex-end}
.ft{font-size:10px;font-weight:700;color:var(--c3);letter-spacing:.3px}
@media(max-width:480px){
  .mrow{grid-template-columns:52px 1fr 68px 1fr 22px;padding:9px 12px;gap:4px}
  .sn{font-size:15px;min-width:18px}.tn{font-size:12px}
  .mcard-hdr{padding:9px 12px}
  .date-nav{padding:8px 12px}
  .date-nav-btn{padding:6px 10px;font-size:12px}
}

/* ── STANDINGS ── */
.stbl-wrap{background:var(--s0);border-radius:var(--r-lg);overflow:hidden;margin-bottom:10px;box-shadow:0 1px 4px rgba(0,0,0,.08)}
.stbl-hdr{display:flex;align-items:center;gap:8px;padding:12px 16px;border-bottom:1px solid var(--bd)}
.stbl-title{font-size:14px;font-weight:700}
.stbl-sub{margin-left:auto;font-size:10px;color:var(--c3);background:var(--s2);padding:3px 10px;border-radius:10px}
table.stbl{width:100%;border-collapse:collapse}
table.stbl th{font-size:10px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;color:var(--c3);padding:8px 10px;text-align:right;border-bottom:1px solid var(--bd);background:var(--s1)}
table.stbl th:first-child{text-align:center;width:36px}
table.stbl th:nth-child(2){text-align:left}
table.stbl td{padding:9px 10px;text-align:right;border-bottom:1px solid var(--bd);font-size:13px}
table.stbl tr:last-child td{border-bottom:none}
table.stbl tr:hover td{background:var(--s1)}
table.stbl td:first-child{text-align:center}
table.stbl td:nth-child(2){text-align:left}
.pos-badge{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:var(--r);font-size:10px;font-weight:700}
.p-cl{background:var(--ac-l);color:var(--ac)}
.p-el{background:rgba(199,146,31,.1);color:var(--yel)}
.p-rel{background:var(--live-l);color:var(--live)}
.tc-row{display:flex;align-items:center;gap:6px;color:inherit}
.tc-name{font-size:12px;font-weight:500;transition:color var(--tr)}
.pts-big{font-size:14px;font-weight:800;color:var(--c1)}
.diff-p{color:var(--grn);font-weight:700}
.diff-n{color:var(--live);font-weight:700}
.legend-bar{display:flex;gap:10px;padding:8px 12px;border-top:1px solid var(--bd);font-size:10px;color:var(--c3);flex-wrap:wrap}
.leg-dot{width:8px;height:8px;border-radius:2px;flex-shrink:0}

/* ── CHARTS ── */
.chart-card{background:var(--s0);border-radius:var(--r-lg);overflow:hidden;margin-bottom:10px;box-shadow:0 1px 4px rgba(0,0,0,.08)}
.chart-ttl,.chart-title{display:flex;align-items:center;gap:6px;padding:10px 14px;border-bottom:1px solid var(--bd);font-size:12px;font-weight:700}
.chart-ttl .icon,.chart-title .icon{font-size:16px;color:var(--ac)}
.cvs-wrap{position:relative;width:100%;overflow:hidden}
.brow{display:flex;align-items:center;gap:6px;margin-bottom:4px}
.blbl{font-size:10px;color:var(--c2);width:80px;text-align:right;flex-shrink:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.btrk{flex:1;height:6px;background:var(--s2);border-radius:3px;overflow:hidden}
.bfill{height:100%;border-radius:3px;transition:width .5s ease}
.bval{font-size:10px;font-weight:700;color:var(--c2);min-width:24px}

/* ── MATCH HERO (dark) ── */
.mh{background:var(--hdr);color:#fff;border-radius:var(--r-lg);margin-bottom:0;overflow:hidden;box-shadow:0 2px 8px rgba(0,0,0,.15)}
.mh-top{display:flex;align-items:center;gap:6px;padding:10px 16px;font-size:11px;color:rgba(255,255,255,.55);border-bottom:1px solid rgba(255,255,255,.08)}
.mh-top a{color:rgba(255,255,255,.7)}.mh-top a:hover{color:#fff}
.mh-duel{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:16px;padding:24px 20px}
.mh-side{display:flex;flex-direction:column;align-items:center;gap:8px;min-width:0}
.mh-logo-box{display:flex;align-items:center;justify-content:center}
.mh-logo{width:56px;height:56px;object-fit:contain;filter:drop-shadow(0 2px 4px rgba(0,0,0,.2))}
.mh-logo-ph{width:56px;height:56px;display:flex;align-items:center;justify-content:center}
.mh-tname{font-size:14px;font-weight:700;text-align:center;line-height:1.25;color:#fff}
.mh-tlink{font-size:10px;color:rgba(255,255,255,.4);transition:color .15s}.mh-tlink:hover{color:rgba(255,255,255,.8)}
.mh-center{display:flex;flex-direction:column;align-items:center;gap:4px;min-width:100px}
.mh-score{display:flex;align-items:center;gap:4px}
.mh-n{font-family:'Teko',sans-serif;font-size:48px;font-weight:700;line-height:1;min-width:40px;text-align:center;color:rgba(255,255,255,.85)}
.mh-n.mh-w{color:#fff}
.mh-live-n{color:var(--live)!important}
.mh-sep{font-size:28px;color:rgba(255,255,255,.2);font-weight:300}
.mh-sub{font-size:11px;color:rgba(255,255,255,.35);margin-top:-2px}
.mh-kickoff{font-family:'Teko',sans-serif;font-size:36px;font-weight:600;color:rgba(255,255,255,.7);letter-spacing:1px}
.mh-status{font-size:11px;font-weight:600;color:rgba(255,255,255,.4);display:flex;align-items:center;gap:4px;margin-top:2px}
.mh-status.mh-fin{color:rgba(255,255,255,.35)}
.mh-status.mh-live{color:#ff4757}
.mh-tv{font-size:10px;color:rgba(255,255,255,.35);display:flex;align-items:center;gap:4px;margin-top:4px}
.mh-details{display:flex;flex-wrap:wrap;gap:4px 14px;padding:10px 16px;font-size:10px;color:rgba(255,255,255,.4);border-top:1px solid rgba(255,255,255,.06)}
.mh-details .icon{color:rgba(255,255,255,.25)}

/* ── MATCH TABS ── */
.mtabs{display:flex;overflow-x:auto;scrollbar-width:none;border-bottom:1px solid var(--bd);background:var(--s0);border-radius:0 0 var(--r-lg) var(--r-lg);margin-bottom:10px;padding:0 12px}
.mtabs::-webkit-scrollbar{display:none}
.mtab{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.4px;color:var(--c3);padding:0 14px;height:42px;display:flex;align-items:center;white-space:nowrap;cursor:pointer;border-bottom:3px solid transparent;transition:color .12s}
.mtab:hover{color:var(--c1)}
.mtab.on{color:var(--ac);border-color:var(--ac)}

/* ── SECTION TITLE (gray bar) ── */
.sec-title{background:var(--s1);border-radius:4px;color:var(--c3);font-size:11px;font-weight:700;padding:6px 12px;text-transform:uppercase;letter-spacing:.4px;margin:0 0 8px}

@media(max-width:480px){.mh-n{font-size:36px;min-width:32px}.mh-logo{width:44px;height:44px}.mh-tname{font-size:12px}.mh-duel{padding:16px 12px;gap:10px}.mh-center{min-width:80px}}

/* ── MATCH INFO BAR ── */
.mi-bar{display:flex;flex-wrap:wrap;gap:4px 12px;padding:10px 14px;margin-bottom:10px;background:var(--s0);border-radius:var(--r-lg);font-size:10px;color:var(--c2);box-shadow:0 1px 4px rgba(0,0,0,.08)}
.mi-item{display:flex;align-items:center;gap:4px}
.mi-item .icon{font-size:13px;color:var(--ac);opacity:.6}
.mi-sub{color:var(--c3);font-size:10px}

/* ── TABLE COMPARISON ── */
.tv-grid{display:grid;grid-template-columns:minmax(80px,1fr) 28px 28px 28px 28px 28px 48px 36px minmax(90px,1fr);gap:0;align-items:center;font-size:11px}
.tv-hdr{font-size:9px;color:var(--c3);font-weight:700;text-transform:uppercase;padding:4px 2px 6px;text-align:center}
.tv-hdr:first-child{text-align:left}
.tv-team{display:flex;align-items:center;gap:5px;padding:6px 4px;font-weight:600}
.tv-tname{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:11px}
.tv-pos{text-align:center;font-weight:800;font-size:12px;color:var(--ac)}
.tv-val{text-align:center;color:var(--c2);padding:6px 2px}
.tv-pts{text-align:center;font-weight:800;font-size:12px;color:var(--c1)}
.tv-form{display:flex;gap:2px;padding:6px 2px}
.fm-dot{width:16px;height:16px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:8px;font-weight:700;color:#fff}
.fm-w{background:var(--grn)}.fm-d{background:var(--yel)}.fm-l{background:var(--live)}
@media(max-width:600px){.tv-grid{grid-template-columns:minmax(50px,1fr) 22px 22px 22px 22px 22px 36px 26px minmax(60px,1fr);font-size:10px;overflow-x:auto}.fm-dot{width:14px;height:14px;font-size:7px}}

/* ── H2H ── */
.h2h-bar{height:10px;border-radius:5px;overflow:hidden;display:flex;gap:1px;margin:8px 0}
.h2h-bar-h{background:var(--ac);border-radius:5px 0 0 5px;transition:width .5s}
.h2h-bar-d{background:var(--yel)}
.h2h-bar-a{background:var(--live);border-radius:0 5px 5px 0}

/* ── SPIELVERLAUF ── */
.ev-card{background:var(--s0);border-radius:var(--r-lg);overflow:hidden;margin-bottom:10px;box-shadow:0 1px 4px rgba(0,0,0,.08)}
.ev-hdr{display:flex;align-items:center;gap:6px;padding:12px 16px;font-size:13px;font-weight:700;border-bottom:1px solid var(--bd)}
.ev-hdr .icon{color:var(--ac)}
/* Half headers */
.ev-half{display:flex;align-items:center;background:var(--s1);margin:0;padding:0;border-bottom:1px solid var(--bd)}
.ev-half-side{flex:1;display:flex;align-items:center;padding:8px 14px;font-size:12px;font-weight:700;color:var(--c2);gap:6px}
.ev-half-side.ev-h{justify-content:flex-start}
.ev-half-side.ev-a{justify-content:flex-end;flex-direction:row-reverse}
.ev-half-mid{font-size:10px;font-weight:700;color:var(--c3);text-transform:uppercase;letter-spacing:.5px;padding:0 10px;white-space:nowrap}
.ev-half-score{font-size:15px;font-weight:900;color:var(--c1)}
/* Event rows */
.ev-timeline{padding:4px 0}
.ev-row{display:grid;grid-template-columns:1fr 40px 1fr;align-items:center;padding:8px 14px;min-height:42px;border-bottom:1px solid rgba(0,0,0,.03)}
.ev-row:last-child{border-bottom:none}
.ev-row:hover{background:var(--s1)}
.ev-left{display:flex;align-items:center;gap:8px;justify-content:flex-end;min-width:0}
.ev-right{display:flex;align-items:center;gap:8px;justify-content:flex-start;min-width:0}
.ev-center{display:flex;align-items:center;justify-content:center}
.ev-min-box{font-size:11px;font-weight:800;color:var(--c3);background:var(--s0);border:1px solid var(--bd);border-radius:10px;padding:3px 7px;min-width:30px;text-align:center;font-variant-numeric:tabular-nums}
/* Goal icon */
.ev-icon-box{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:50%;flex-shrink:0;background:var(--s1)}
.ev-icon-goal .ev-icon-box{background:rgba(15,123,58,.08)}
.ev-icon-pen .ev-icon-box{background:#fef3c7}
.ev-icon-og .ev-icon-box{background:var(--live-l)}
.ev-icon-box .icon{font-size:16px}
.ev-icon-goal .icon{color:var(--grn)}
.ev-icon-pen .icon{color:#92400e}
.ev-icon-og .icon{color:var(--live)}
/* Player */
.ev-player{font-size:13px;font-weight:700;color:var(--c1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ev-player a{color:var(--ac);text-decoration:none;font-weight:700}.ev-player a:hover{text-decoration:underline}
.ev-detail{font-size:10px;color:var(--c3);margin-top:1px}
.ev-score-after{font-family:'Teko',sans-serif;font-size:18px;font-weight:700;color:var(--c1);flex-shrink:0;letter-spacing:.5px}
/* Alignment */
.ev-left .ev-player,.ev-left .ev-detail{text-align:right}
.ev-right .ev-player,.ev-right .ev-detail{text-align:left}
/* Badges */
.ev-badge{font-size:8px;font-weight:700;padding:2px 5px;border-radius:4px;margin:0 3px;letter-spacing:.3px}
.ev-pen{background:#fef3c7;color:#92400e}
.ev-og{background:var(--live-l);color:var(--live)}
/* Final separator */
.ev-sep{text-align:center;padding:10px 14px;position:relative}
.ev-sep::before{content:'';position:absolute;left:14px;right:14px;top:50%;height:1px;background:var(--bd)}
.ev-sep span{position:relative;z-index:1;font-size:11px;font-weight:700;color:var(--c3);background:var(--s0);padding:3px 14px;text-transform:uppercase;letter-spacing:.5px;border-radius:12px;border:1px solid var(--bd)}
.ev-sep-ft span{color:var(--c1);font-weight:800;background:var(--s1);border-color:var(--c4)}
@media(max-width:480px){.ev-row{grid-template-columns:1fr 34px 1fr;padding:6px 8px;min-height:36px}.ev-player{font-size:12px}.ev-icon-box{width:26px;height:26px}.ev-score-after{font-size:16px}.ev-left,.ev-right{gap:6px}}

.sv-card{background:var(--s0);border-radius:var(--r-lg);overflow:hidden;margin-bottom:10px;box-shadow:0 1px 4px rgba(0,0,0,.08)}
.sv-hdr{display:flex;align-items:center;gap:6px;padding:12px 16px;border-bottom:1px solid var(--bd);font-size:12px;font-weight:700;color:var(--c1)}
.sv-hdr .icon{color:var(--ac)}
/* Score progress bar */
.sv-bar-wrap{padding:12px 16px 8px;display:flex;flex-direction:column;gap:8px}
.sv-bar-team{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:600;color:var(--c1)}
.sv-bar-team-a{flex-direction:row-reverse}
.sv-bar-team-a span{text-align:right}
.sv-bar{position:relative;height:8px;background:var(--s2);border-radius:4px;margin:2px 0}
.sv-bar-fill{position:absolute;inset:0;background:linear-gradient(90deg,var(--ac) 0%,var(--ac) 50%,var(--live) 50%,var(--live) 100%);border-radius:4px;opacity:.06}
.sv-bar-ht{position:absolute;left:50%;top:-3px;bottom:-3px;width:1px;background:var(--c4)}
.sv-bar-dot{position:absolute;top:50%;width:12px;height:12px;border-radius:50%;border:2px solid var(--s0);transform:translate(-50%,-50%);z-index:1;box-shadow:0 1px 3px rgba(0,0,0,.15)}
.sv-dot-h{background:var(--ac)}
.sv-dot-a{background:var(--live)}
/* Vertical goal list */
.sv-list{padding:6px 0}
.sv-goal{display:grid;grid-template-columns:40px 24px 1fr;align-items:center;padding:8px 16px;gap:0;transition:background .1s}
.sv-goal:hover{background:var(--s1)}
.sv-goal-a{direction:rtl}
.sv-goal-a .sv-info{direction:ltr;text-align:right}
.sv-goal-a .sv-min{direction:ltr;text-align:right}
.sv-min{font-size:12px;font-weight:800;color:var(--c3);font-variant-numeric:tabular-nums;text-align:left}
.sv-dot-line{display:flex;align-items:center;justify-content:center;position:relative}
.sv-dot-line::before{content:"";position:absolute;top:-16px;bottom:-16px;left:50%;width:2px;background:var(--bd);border-radius:1px}
.sv-dot{width:10px;height:10px;border-radius:50%;position:relative;z-index:1;box-shadow:0 0 0 3px var(--s0)}
.sv-dh{background:var(--ac)}
.sv-da{background:var(--live)}
.sv-info{display:flex;align-items:center;gap:8px;padding-left:10px;min-width:0}
.sv-goal-a .sv-info{padding-left:0;padding-right:10px;justify-content:flex-end}
.sv-score{font-size:15px;font-weight:800;font-variant-numeric:tabular-nums;color:var(--c1);flex-shrink:0;min-width:30px}
.sv-scorer{font-size:12px;font-weight:500;color:var(--c2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sv-scorer a,.sv-scorer-link{color:var(--c1);text-decoration:none;font-weight:600;transition:color .12s}
.sv-scorer a:hover,.sv-scorer-link:hover{color:var(--ac)}
.sv-badge{font-size:8px;font-weight:700;padding:2px 5px;border-radius:3px;vertical-align:middle;margin-left:3px}
.sv-pen{background:#fef3c7;color:#92400e}
.sv-og{background:var(--live-l);color:var(--live)}
/* Separator lines (HT, FT) */
.sv-sep{text-align:center;padding:10px 16px;position:relative}
.sv-sep::before{content:"";position:absolute;left:16px;right:16px;top:50%;height:1px;background:var(--bd)}
.sv-sep span{position:relative;z-index:1;font-size:10px;font-weight:700;color:var(--c3);background:var(--s0);padding:2px 12px;text-transform:uppercase;letter-spacing:.5px;border-radius:10px;border:1px solid var(--bd)}
.sv-ft span{color:var(--c1);font-weight:800;background:var(--s1);border-color:var(--c4)}
.sv-kick{text-align:center;padding:6px 16px}
.sv-kick span{font-size:10px;font-weight:600;color:var(--c3);text-transform:uppercase;letter-spacing:.3px}
.bpill{font-size:8px;font-weight:700;padding:1px 4px;border-radius:2px;margin-left:2px}
.bpill-e{background:#fef3c7;color:#92400e}
.bpill-og{background:var(--live-l);color:var(--live)}

/* ── TEAM HERO ── */
.team-hero{background:var(--hdr);color:#fff;border-radius:var(--r-lg);margin-bottom:10px;overflow:hidden;box-shadow:0 2px 8px rgba(0,0,0,.15)}
.th-banner{padding:20px 16px;display:flex;align-items:center;gap:16px}
.th-logo-wrap{flex-shrink:0}
.th-logo{width:64px;height:64px;object-fit:contain}
.th-info{flex:1;min-width:0}
.th-info h1{font-size:20px;font-weight:800;margin-bottom:4px;letter-spacing:-.3px;line-height:1.1;color:#fff}
.th-badge{display:inline-flex;align-items:center;gap:5px;font-size:10px;color:rgba(255,255,255,.5);margin-bottom:6px}
.th-kpis{display:flex;gap:12px;flex-wrap:wrap;margin-top:4px}
.th-kpi{text-align:center}
.th-kpi-v{font-size:18px;font-weight:800;line-height:1;color:#fff}
.th-kpi-l{font-size:9px;font-weight:600;color:rgba(255,255,255,.4);text-transform:uppercase;letter-spacing:.5px;margin-top:2px}
.th-form{display:flex;gap:3px;margin-top:8px}
.form-pill{width:18px;height:18px;border-radius:var(--r);display:inline-flex;align-items:center;justify-content:center;font-size:9px;font-weight:700;color:#fff}
.form-w{background:var(--grn)}.form-d{background:var(--yel)}.form-l{background:var(--live)}
.th-tabs{display:flex;gap:0;border-top:1px solid rgba(255,255,255,.08);overflow-x:auto;scrollbar-width:none}
.th-tabs::-webkit-scrollbar{display:none}
.th-tab{font-size:11px;font-weight:600;color:rgba(255,255,255,.45);padding:8px 14px;white-space:nowrap;cursor:pointer;border-bottom:2px solid transparent;transition:color var(--tr)}
.th-tab:hover{color:rgba(255,255,255,.8)}
.th-tab.on{color:#fff;border-color:var(--ac);font-weight:700}
@media(max-width:480px){.th-logo{width:48px;height:48px}.th-info h1{font-size:17px}.th-kpi-v{font-size:15px}}

/* ── STAT BOXES ── */
.stat-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(90px,1fr));gap:6px;margin-bottom:8px}
.stat-box{background:var(--s0);border-radius:var(--r-lg);padding:12px 10px;text-align:center;box-shadow:0 1px 4px rgba(0,0,0,.08)}
.stat-v{font-size:22px;font-weight:800;line-height:1;margin-bottom:3px}
.stat-l{font-size:9px;font-weight:600;color:var(--c3);text-transform:uppercase;letter-spacing:.4px}
.stat-box.sb-blue .stat-v{color:var(--ac)}
.stat-box.sb-green .stat-v{color:var(--grn)}
.stat-box.sb-red .stat-v{color:var(--live)}
.stat-box.sb-gold .stat-v{color:var(--gold)}

/* ── KPI ── */
.kpi-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:6px;margin-bottom:12px}
.kpi-card{background:var(--s0);border-radius:var(--r);padding:12px 8px;text-align:center}
.kpi-icon{font-size:20px;margin-bottom:4px;display:block}
.kpi-val{font-size:22px;font-weight:800;line-height:1.1;margin-bottom:3px}
.kpi-lbl{font-size:9px;font-weight:600;color:var(--c3);text-transform:uppercase;letter-spacing:.4px}
.chart-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;margin-bottom:8px}
.chart-scroll .chart-card,.chart-scroll .sv-card{min-width:400px}
@media(min-width:600px){.kpi-grid{grid-template-columns:repeat(6,1fr)}.chart-scroll .chart-card,.chart-scroll .sv-card{min-width:0}}
@media(max-width:420px){.kpi-grid{grid-template-columns:repeat(2,1fr)}.kpi-val{font-size:18px}}

/* ── CUP BRACKET ── */
.cup-rounds{display:flex;gap:0;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;background:var(--s0);border-bottom:1px solid var(--bd);margin-bottom:8px}
.cup-rounds::-webkit-scrollbar{display:none}
.cup-tab{font-size:11px;font-weight:600;color:var(--c3);padding:10px 14px;white-space:nowrap;cursor:pointer;border-bottom:2px solid transparent;transition:color .12s}
.cup-tab:hover{color:var(--c1)}
.cup-tab.on{color:var(--ac);border-color:var(--ac);font-weight:700}
.cup-tab .cup-badge{font-size:9px;font-weight:700;background:var(--s2);color:var(--c3);padding:1px 5px;border-radius:8px;margin-left:4px}
.cup-tab.on .cup-badge{background:var(--ac-l);color:var(--ac)}
/* Bracket grid */
.cup-bracket{display:grid;gap:0;overflow-x:auto;-webkit-overflow-scrolling:touch;padding:12px 8px}
.cup-bracket-cols{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(140px,1fr);gap:4px;min-width:min-content}
.cup-col{display:flex;flex-direction:column;justify-content:space-around;gap:4px;min-width:130px}
.cup-col-hdr{font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.4px;color:var(--c3);text-align:center;padding:0 0 6px;white-space:nowrap}
/* Match card in bracket */
.cup-m{background:var(--s0);border:1px solid var(--bd);border-radius:var(--r);overflow:hidden;cursor:pointer;transition:border-color .12s;text-decoration:none;color:inherit;display:block}
.cup-m:active{border-color:var(--ac)}
.cup-m-row{display:flex;align-items:center;gap:5px;padding:5px 8px;font-size:11px}
.cup-m-row:first-child{border-bottom:1px solid var(--bd)}
.cup-m-row img{width:16px;height:16px;object-fit:contain;flex-shrink:0}
.cup-m-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}
.cup-m-name.w{font-weight:700;color:var(--c1)}
.cup-m-name.l{color:var(--c3)}
.cup-m-score{font-weight:700;font-variant-numeric:tabular-nums;min-width:14px;text-align:right}
.cup-m-score.w{color:var(--c1)}
.cup-m-score.l{color:var(--c3)}
.cup-m-tbd{padding:8px;text-align:center;font-size:10px;color:var(--c3)}
/* Connector lines */
.cup-col .cup-m{position:relative}
.cup-line-r::after{content:"";position:absolute;right:-4px;top:50%;width:4px;height:1px;background:var(--bd)}
.cup-line-l::before{content:"";position:absolute;left:-4px;top:50%;width:4px;height:1px;background:var(--bd)}
/* Mobile: full width stacked */
@media(max-width:600px){
  .cup-bracket{padding:8px 4px}
  .cup-bracket-cols{grid-auto-flow:row;grid-auto-columns:1fr;gap:12px}
  .cup-col{min-width:0;gap:4px}
  .cup-line-r::after,.cup-line-l::before{display:none}
  .cup-m-row{padding:6px 8px}
}
/* Round list (for earlier rounds with many matches) */
.cup-list{padding:0}
.cup-list .mcard{margin-bottom:4px}

/* ── FORM TABLE ── */
.form-tbl{width:100%;border-collapse:collapse}
.form-tbl td{padding:6px 8px;border-bottom:1px solid var(--bd);font-size:11px}
.form-tbl tr:last-child td{border-bottom:none}
.form-tbl tr:active td{background:var(--s1)}
.form-res{font-weight:800;font-size:12px}
.form-res.win{color:var(--grn)}.form-res.loss{color:var(--live)}.form-res.draw{color:var(--yel)}

/* ── HISTORY ── */
.hist-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:6px;margin-bottom:8px}
.hcard{background:var(--s0);border-radius:var(--r-lg);padding:12px;color:inherit;display:block;border:1px solid transparent;box-shadow:0 1px 4px rgba(0,0,0,.08)}
.hcard:active{background:var(--s1)}
.hcard.on{border-color:var(--ac);background:var(--ac-l)}
.hcard-t{font-size:13px;font-weight:700;margin-bottom:2px}
.hcard-s{font-size:10px;color:var(--c3)}

/* ── WIDGETS ── */
.widget{background:var(--s0);border-radius:var(--r-lg);overflow:hidden;margin-bottom:10px;box-shadow:0 1px 4px rgba(0,0,0,.08)}
.w-hdr{display:flex;align-items:center;gap:6px;padding:10px 14px;border-bottom:1px solid var(--bd);font-size:12px;font-weight:700}
.w-hdr .icon{font-size:16px;color:var(--ac)}
.w-body{padding:10px 14px;overflow:hidden}

/* ── NEWS ── */
.nitem{display:flex;gap:8px;padding:8px 0;border-bottom:1px solid var(--bd);color:inherit;overflow:hidden;min-width:0}
.nitem img{max-width:56px;max-height:42px}
.nitem:last-child{border-bottom:none}
.nthumb{width:52px;height:40px;object-fit:cover;border-radius:var(--r);flex-shrink:0;background:var(--s2)}
.ntxt{min-width:0;flex:1}
.ntitle{font-size:11px;font-weight:500;line-height:1.3;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.nmeta{font-size:9px;color:var(--c3);margin-top:2px;display:flex;align-items:center;gap:3px}
.nsrc{color:var(--ac);font-weight:600}

/* ── ODDS ── */
.odds-row{display:grid;grid-template-columns:1fr auto;align-items:center;gap:6px;padding:6px 0;border-bottom:1px solid var(--bd)}
.odds-row:last-child{border-bottom:none}
.odds-teams{font-size:11px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.odds-time{font-size:9px;color:var(--c3);margin-top:1px}
.odds-btns{display:flex;gap:3px;flex-shrink:0}
.odds-btn{display:flex;flex-direction:column;align-items:center;min-width:34px;padding:3px 4px;border-radius:var(--r);font-size:9px;font-weight:600;border:1px solid var(--bd);background:var(--s1)}
.odds-btn.best{background:var(--ac-l);border-color:rgba(55,77,245,.2);color:var(--ac)}
.odds-lbl{font-size:8px;color:var(--c3);margin-bottom:1px}
.odds-val{font-size:11px;font-weight:800}
.odds-btn.best .odds-val{color:var(--ac)}

/* ── UTILS ── */
.spin-wrap{display:flex;align-items:center;justify-content:center;padding:40px;gap:10px;color:var(--c3);font-size:13px}
.spin{width:22px;height:22px;border:2px solid var(--bd);border-top-color:var(--ac);border-radius:50%;animation:spin-r .6s linear infinite;flex-shrink:0}
.empty{text-align:center;padding:40px 20px;color:var(--c3);font-size:13px;line-height:1.5}
/* ── SEO BAR (dark strip below header, like FlashScore) ── */
.seo-top{background:var(--hdr);padding:5px 24px}
.seo-top h1{max-width:1440px;margin:0 auto;font-size:11px;font-weight:400;color:rgba(255,255,255,.35);line-height:1.3;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
@media(max-width:768px){.seo-top{padding:4px 10px}.seo-top h1{font-size:9px}}
/* Legacy seo-bar inside main (match/team/player) */
.seo-bar{padding:6px 0 4px}
.seo-bar h1{font-size:12px;font-weight:400;color:var(--c3);line-height:1.4}
.seo-bar p{font-size:11px;color:var(--c4);line-height:1.4;margin-top:2px}

.tab{display:none}.tab.on{display:block}
.rbar{border-top:1px solid var(--bd);padding:6px 16px;display:flex;align-items:center;gap:6px;font-size:11px;color:var(--c3);background:var(--s1)}
.rbar-dot{width:6px;height:6px;background:var(--grn);border-radius:50%;flex-shrink:0;animation:blink 3s infinite}
.bc{font-size:12px;color:var(--c3);margin-bottom:10px;padding:0 16px;display:flex;align-items:center;gap:4px;flex-wrap:wrap}
.bc a{color:var(--ac);font-weight:600}
@media(max-width:768px){.bc{padding:8px 12px;margin-bottom:4px}}
.toast{position:fixed;bottom:16px;left:50%;transform:translateX(-50%) translateY(8px);background:var(--c1);color:#fff;padding:8px 16px;border-radius:16px;font-size:12px;font-weight:600;z-index:999;opacity:0;transition:.2s;pointer-events:none;max-width:calc(100vw - 32px);white-space:nowrap}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
footer{border-top:1px solid var(--bd);background:var(--hdr);padding:28px 20px 24px;text-align:center;color:rgba(255,255,255,.4);font-size:12px;margin-top:24px}
.flinks{display:flex;justify-content:center;gap:16px;flex-wrap:wrap;margin-bottom:8px}
.flinks a{color:rgba(255,255,255,.65);font-weight:500;transition:color var(--tr)}.flinks a:hover{color:#fff}

/* ── VERTICAL MATCH ROW ── */
.vrow{display:grid;grid-template-columns:30px 58px 1fr 80px minmax(70px,120px);align-items:center;padding:10px 14px;border-bottom:1px solid var(--bd);color:inherit;text-decoration:none;transition:background var(--tr)}
.vrow:last-child{border-bottom:none}
.vrow:hover{background:var(--s1);box-shadow:inset 0 0 0 1px var(--bd)}
.vrow:active{background:var(--s2)}
.vrow.vrow-live{background:var(--live-l)}
/* Fav star */
.vrow-fav{display:flex;align-items:center;justify-content:center;align-self:stretch;color:var(--c4);font-size:15px;cursor:pointer;transition:color .15s}
.vrow-fav:hover{color:var(--yel)}
.vrow-fav.on{color:var(--yel)}
/* Time column */
.vrow-time{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;font-size:10px;font-weight:600;color:var(--c3);padding-right:12px;border-right:2px solid var(--s2);margin-right:12px;align-self:stretch}
.vrow-min{font-size:12px;font-weight:800;color:var(--live)}
.vrow-ft{font-size:9px;font-weight:700;color:var(--c3);letter-spacing:.3px}
.vrow-ts{font-size:11px;font-variant-numeric:tabular-nums;text-align:center;line-height:1.3}
/* Teams stacked */
.vrow-teams{display:flex;flex-direction:column;gap:6px;min-width:0;flex:1;padding-right:12px}
.vrow-team{display:flex;align-items:center;gap:8px;min-width:0}
.vrow-logo{width:18px;height:18px;object-fit:contain;flex-shrink:0}
.vrow-logo-ph{width:18px;height:18px;flex-shrink:0}
.vrow-name{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;color:var(--c1)}
.vt-w .vrow-name{font-weight:600;color:var(--c1)}
.vt-l .vrow-name{font-weight:500;color:var(--c3)}
/* Score column */
.vrow-scores{display:flex;flex-direction:column;gap:4px;align-items:center;min-width:36px;padding:0 8px}
/* Score — Ronduit Capitals */
.vrow-scores{display:flex;flex-direction:column;gap:2px;align-items:flex-start;min-width:44px;padding:0 20px 0 0}
.vrow-sc{font-family:'Teko',sans-serif;font-size:22px;font-weight:600;line-height:1;text-align:center;min-width:30px;padding:3px 4px;color:var(--c1)}
.vrow-sc.s-fin{color:#2d3748}
.vrow-sc.s-live{color:var(--live)}
.vrow-sc.s-up{font-family:Inter,system-ui,sans-serif;color:var(--c4);font-size:14px;font-weight:300;letter-spacing:2px}
.vrow-sc.sc-w{color:#0a6e32}
.vrow-sc.sc-d{color:#9a7209}
.vrow-sc.sc-l{color:#a0a8b4}
/* Info/TV column */
.vrow-info{display:flex;flex-direction:column;align-items:flex-end;justify-content:center;gap:3px;padding-left:10px;border-left:1px solid var(--bd);align-self:stretch}
.vrow-tv{font-size:10px;color:var(--c3);display:flex;align-items:center;gap:3px;white-space:nowrap}
.vrow-tv .icon{font-size:12px;color:var(--ac);opacity:.7}
.vrow-ht{font-size:10px;color:var(--c3);font-variant-numeric:tabular-nums;font-weight:600}
.vrow-odd{font-size:10px;font-weight:700;padding:2px 5px;border-radius:3px;font-variant-numeric:tabular-nums;flex-shrink:0;margin-left:6px}
.vrow-odd.odd-hot{color:#0a6e32;background:rgba(10,110,50,.08)}
.vrow-odd.odd-med{color:#9a7209;background:rgba(154,114,9,.08)}
.vrow-odd.odd-cold{color:var(--ac);background:var(--ac-l)}
@media(max-width:768px){.vrow{grid-template-columns:26px 48px 1fr 38px minmax(50px,90px);padding:9px 10px}.vrow-time{padding-right:8px;margin-right:8px}.vrow-teams{padding-right:8px}}
@media(max-width:480px){.vrow{grid-template-columns:24px 42px 1fr 32px;padding:8px 8px}.vrow-info{display:none}.vrow-name{font-size:12px}.vrow-sc{font-size:14px}.vrow-time{padding-right:6px;margin-right:6px}}

/* ── LEGACY MATCH ROW (used in H2H, history etc.) ── */
.mrow-wrap{display:block;border-bottom:1px solid var(--bd);color:inherit;text-decoration:none}
.mrow-wrap:last-child{border-bottom:none}
.mrow-wrap:active{background:var(--s1)}
.mrow-wrap.mrow-live{background:var(--live-l)}
.mrow-wrap .mrow{border-bottom:none}
.mrow-goals{display:grid;grid-template-columns:1fr 80px 1fr;gap:3px;padding:0 12px 6px;font-size:10px;color:var(--c3)}
.mg-home{text-align:right}.mg-away{text-align:left}
.mg-g{display:block;line-height:1.5}
.mg-ico{font-size:9px;margin:0 1px;vertical-align:middle}
.ft-badge{font-size:9px;font-weight:700;color:var(--c3);background:var(--s2);padding:1px 5px;border-radius:var(--r);letter-spacing:.3px}
.dot-live{width:6px;height:6px;background:var(--live);border-radius:50%;animation:blink 1s infinite;flex-shrink:0;display:inline-block}
.msec{font-size:10px;font-weight:700;letter-spacing:.4px;text-transform:uppercase;color:var(--c3);padding:8px 14px;background:var(--s1);border-bottom:1px solid var(--bd);display:flex;align-items:center;gap:5px;margin-top:2px}
.msec-live{color:var(--live);background:var(--live-l)}
/* Events timeline */
.mev{position:relative;padding:8px 0}
.mev-line{position:absolute;left:50%;top:0;bottom:0;width:1px;background:var(--bd);transform:translateX(-50%)}
.mev-item{display:grid;grid-template-columns:1fr 44px 1fr;align-items:center;gap:4px;padding:4px 12px;position:relative}
.mev-home{text-align:right;font-size:11px;font-weight:500}
.mev-away{text-align:left;font-size:11px;font-weight:500}
.mev-detail{font-size:9px;color:var(--c3);font-weight:400}
.mev-mid{text-align:center;z-index:1}
.mev-min{display:inline-block;font-size:9px;font-weight:700;background:var(--s0);border:1px solid var(--bd);padding:1px 6px;border-radius:8px;color:var(--c2)}
.mev-ht{text-align:center;padding:8px;font-size:9px;font-weight:700;color:var(--c3);text-transform:uppercase;letter-spacing:.6px;position:relative;z-index:1}
.mev-ht span{background:var(--s0);padding:2px 10px;border:1px solid var(--bd);border-radius:8px}
.match-stats{display:grid;gap:8px;padding:12px}
.ms-row{display:grid;grid-template-columns:36px 1fr 36px;align-items:center;gap:6px}
.ms-val{font-size:12px;font-weight:700;text-align:center}
.ms-bar{height:4px;border-radius:2px;background:var(--s2);overflow:hidden;display:flex}
.ms-bar-h{background:var(--ac);border-radius:2px 0 0 2px;transition:width .4s}
.ms-bar-a{background:var(--live);border-radius:0 2px 2px 0;transition:width .4s}
.ms-lbl{font-size:9px;color:var(--c3);text-align:center;font-weight:600;text-transform:uppercase;letter-spacing:.2px}
@media(max-width:480px){.mrow-goals{grid-template-columns:1fr 64px 1fr;padding:0 8px 5px}}
</style></head><body><div class='seo-top'><h1>Fußball Heute Live, Ergebnisse Bundesliga, 2. Bundesliga, 3. Liga, DFB-Pokal, Österreich &amp; Schweiz 2025/26</h1></div><header><div class='hdr'>
<button class='mob-btn' id='mobBtn' onclick='toggleDrawer()' aria-label='Menü'><span class='icon'>menu</span></button>
<a href='/' class='logo'>
  <div class='logo-mark'><span class='icon'>sports_soccer</span></div>
  <span class='logo-txt'>Ergebnisse<span>1</span><span class='logo-de'>.de</span></span>
</a>
<nav class='hdr-nav'><a href='/bundesliga/heute' class='hn-a on'><span class='icon icon-s'>today</span>Heute</a><a href='/live' class='hn-live' id='hdrLive' style='display:none'><span class='dot-live'></span>LIVE</a><a href='/bundesliga/tabelle' class='hn-a'><span class='icon icon-s'>table_rows</span>Tabelle</a><a href='/bundesliga/spielplan' class='hn-a'><span class='icon icon-s'>calendar_month</span>Spielplan</a><a href='/bundesliga/ergebnisse' class='hn-a'><span class='icon icon-s'>scoreboard</span>Ergebnisse</a><a href='/bundesliga/nachrichten' class='hn-a'><span class='icon icon-s'>newspaper</span>News</a><a href='/fussball-heute-im-tv' class='hn-a'><span class='icon icon-s'>tv</span>TV</a><a href='/bundesliga/historie' class='hn-a'><span class='icon icon-s'>history</span>Archiv</a></nav>
<div class='hdr-end'>
  <div class='srch-wrap' id='srchWrap'>
    <button class='srch-btn' onclick='toggleSearch()' aria-label='Suche'><span class='icon'>search</span></button>
    <div class='srch-box' id='srchBox'>
      <span class='icon' style='color:rgba(255,255,255,.3);font-size:18px'>search</span>
      <input type='text' id='srchInput' placeholder='Team, Spieler oder Liga suchen...' autocomplete='off' oninput='doSearch(this.value)'>
      <button class='srch-close' onclick='toggleSearch()'><span class='icon' style='font-size:18px'>close</span></button>
    </div>
    <div class='srch-results' id='srchResults'></div>
  </div>
  <div class='live-pill' id='livePill' style='display:none'>LIVE</div>
  <div class='clk' id='clk'></div>
</div>
</div></header><div class='mob-drawer' id='mobDrawer' onclick='closeDrawer(event)'><div class='mob-panel'><a href='/bundesliga/heute' class='ln-a on'><span class='icon icon-s'>today</span><span>Heute</span></a><a href='/live' class='ln-a'><span class='icon icon-s'></span><span>LIVE</span></a><a href='/bundesliga/tabelle' class='ln-a'><span class='icon icon-s'>table_rows</span><span>Tabelle</span></a><a href='/bundesliga/spielplan' class='ln-a'><span class='icon icon-s'>calendar_month</span><span>Spielplan</span></a><a href='/bundesliga/ergebnisse' class='ln-a'><span class='icon icon-s'>scoreboard</span><span>Ergebnisse</span></a><a href='/bundesliga/nachrichten' class='ln-a'><span class='icon icon-s'>newspaper</span><span>News</span></a><a href='/fussball-heute-im-tv' class='ln-a'><span class='icon icon-s'>tv</span><span>TV</span></a><a href='/bundesliga/historie' class='ln-a'><span class='icon icon-s'>history</span><span>Archiv</span></a><div style='height:1px;background:var(--bd);margin:8px 0'></div><div class='ln-sect'><span class='icon icon-s'>public</span>Deutschland</div><a href='/bundesliga/heute' class='ln-a'><img src='https://r2.thesportsdb.com/images/media/league/badge/teqh1b1679952008.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'"><span>1. Bundesliga</span></a><a href='/2-bundesliga/heute' class='ln-a'><img src='https://r2.thesportsdb.com/images/media/league/badge/hl40981534764789.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'"><span>2. Bundesliga</span></a><a href='/3-liga/heute' class='ln-a'><img src='https://r2.thesportsdb.com/images/media/league/badge/dbb5wp1534868931.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'"><span>3. Liga</span></a><a href='/dfb-pokal/heute' class='ln-a'><img src='https://r2.thesportsdb.com/images/media/league/badge/dbb5wp1534868931.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'"><span>DFB-Pokal</span></a><div class='ln-sect'><span class='icon icon-s'>public</span>Regionalliga</div><a href='/regionalliga-nordost/heute' class='ln-a'><img src='https://r2.thesportsdb.com/images/media/league/badge/iei25s1582561197.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'"><span>Regionalliga Nordost</span></a><a href='/regionalliga-west/heute' class='ln-a'><img src='https://r2.thesportsdb.com/images/media/league/badge/khq3aw1582561159.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'"><span>Regionalliga West</span></a><a href='/regionalliga-suedwest/heute' class='ln-a'><img src='https://r2.thesportsdb.com/images/media/league/badge/iwuc2m1728142585.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'"><span>Regionalliga Südwest</span></a><a href='/regionalliga-bayern/heute' class='ln-a'><img src='https://r2.thesportsdb.com/images/media/league/badge/jxmdm71728143121.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'"><span>Regionalliga Bayern</span></a><a href='/regionalliga-nord/heute' class='ln-a'><img src='https://r2.thesportsdb.com/images/media/league/badge/vs2x381582561207.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'"><span>Regionalliga Nord</span></a><div class='ln-sect'><span class='icon icon-s'>public</span>Österreich</div><a href='/oesterreich/heute' class='ln-a'><img src='https://r2.thesportsdb.com/images/media/league/badge/vcgyu71686617925.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'"><span>Bundesliga Österreich</span></a><a href='/oesterreich-2-liga/heute' class='ln-a'><img src='https://r2.thesportsdb.com/images/media/league/badge/cfk37g1583582239.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'"><span>2. Liga Österreich</span></a><div class='ln-sect'><span class='icon icon-s'>public</span>Schweiz</div><a href='/schweiz/heute' class='ln-a'><img src='https://r2.thesportsdb.com/images/media/league/badge/id6q2r1635867584.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'"><span>Swiss Super League</span></a><a href='/challenge-league/heute' class='ln-a'><img src='https://r2.thesportsdb.com/images/media/league/badge/5816yi1635867610.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'"><span>Challenge League</span></a><div class='ln-sect'><span class='icon icon-s'>public</span>Luxemburg</div><a href='/luxemburg/heute' class='ln-a'><img src='https://r2.thesportsdb.com/images/media/league/badge/raduqp1589303531.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'"><span>BGL Ligue Luxemburg</span></a></div></div><script>
setInterval(function(){var e=document.getElementById('clk');if(e)e.textContent=new Date().toLocaleTimeString('de-DE',{hour:'2-digit',minute:'2-digit',second:'2-digit'});},1000);
function toggleDrawer(){var d=document.getElementById('mobDrawer');d.style.display='block';requestAnimationFrame(function(){d.classList.add('open')});}
function closeDrawer(e){var d=document.getElementById('mobDrawer');if(e&&e.target!==d)return;d.classList.remove('open');setTimeout(function(){d.style.display='none'},250);}
</script><div class="page">
<nav class='lnav'><div class='ln-sect'><span class='icon icon-s'>public</span>Deutschland</div><a href='/bundesliga/heute' class='ln-a on'>
              <img src='https://r2.thesportsdb.com/images/media/league/badge/teqh1b1679952008.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">
              <span>1. Bundesliga</span>
            </a><a href='/2-bundesliga/heute' class='ln-a'>
              <img src='https://r2.thesportsdb.com/images/media/league/badge/hl40981534764789.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">
              <span>2. Bundesliga</span>
            </a><a href='/3-liga/heute' class='ln-a'>
              <img src='https://r2.thesportsdb.com/images/media/league/badge/dbb5wp1534868931.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">
              <span>3. Liga</span>
            </a><a href='/dfb-pokal/heute' class='ln-a'>
              <img src='https://r2.thesportsdb.com/images/media/league/badge/dbb5wp1534868931.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">
              <span>DFB-Pokal</span>
            </a><div class='ln-sect'><span class='icon icon-s'>public</span>Deutschland Frauen</div><a href='/frauen-bundesliga/heute' class='ln-a'>
              <img src='https://r2.thesportsdb.com/images/media/league/badge/y3h7ps1696002598.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">
              <span>Frauen-Bundesliga</span>
            </a><a href='/frauen-2-bundesliga/heute' class='ln-a'>
              <img src='https://r2.thesportsdb.com/images/media/league/badge/y3h7ps1696002598.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">
              <span>2. Frauen-Bundesliga</span>
            </a><div class='ln-sect'><span class='icon icon-s'>public</span>Regionalliga</div><a href='/regionalliga-nordost/heute' class='ln-a'>
              <img src='https://r2.thesportsdb.com/images/media/league/badge/iei25s1582561197.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">
              <span>Regionalliga Nordost</span>
            </a><a href='/regionalliga-west/heute' class='ln-a'>
              <img src='https://r2.thesportsdb.com/images/media/league/badge/khq3aw1582561159.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">
              <span>Regionalliga West</span>
            </a><a href='/regionalliga-suedwest/heute' class='ln-a'>
              <img src='https://r2.thesportsdb.com/images/media/league/badge/iwuc2m1728142585.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">
              <span>Regionalliga Südwest</span>
            </a><a href='/regionalliga-bayern/heute' class='ln-a'>
              <img src='https://r2.thesportsdb.com/images/media/league/badge/jxmdm71728143121.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">
              <span>Regionalliga Bayern</span>
            </a><a href='/regionalliga-nord/heute' class='ln-a'>
              <img src='https://r2.thesportsdb.com/images/media/league/badge/vs2x381582561207.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">
              <span>Regionalliga Nord</span>
            </a><div class='ln-sect'><span class='icon icon-s'>public</span>Österreich</div><a href='/oesterreich/heute' class='ln-a'>
              <img src='https://r2.thesportsdb.com/images/media/league/badge/vcgyu71686617925.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">
              <span>Bundesliga Österreich</span>
            </a><a href='/oesterreich-2-liga/heute' class='ln-a'>
              <img src='https://r2.thesportsdb.com/images/media/league/badge/cfk37g1583582239.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">
              <span>2. Liga Österreich</span>
            </a><div class='ln-sect'><span class='icon icon-s'>public</span>Schweiz</div><a href='/schweiz/heute' class='ln-a'>
              <img src='https://r2.thesportsdb.com/images/media/league/badge/id6q2r1635867584.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">
              <span>Swiss Super League</span>
            </a><a href='/challenge-league/heute' class='ln-a'>
              <img src='https://r2.thesportsdb.com/images/media/league/badge/5816yi1635867610.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">
              <span>Challenge League</span>
            </a><div class='ln-sect'><span class='icon icon-s'>public</span>Luxemburg</div><a href='/luxemburg/heute' class='ln-a'>
              <img src='https://r2.thesportsdb.com/images/media/league/badge/raduqp1589303531.png' width='18' height='18' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">
              <span>BGL Ligue Luxemburg</span>
            </a></nav><main class="main">

<div class="tab on" id="t-heute">
  <div class="date-nav" id="dateNav">
    <button class="date-nav-btn" onclick="navDay(-1)">
      <span class="icon icon-s">chevron_left</span>Zurück
    </button>
    <div class="date-nav-lbl">
      <div class="day" id="navDayLbl">Heute</div>
      <div class="full" id="navFullLbl"></div>
    </div>
    <button class="date-nav-btn" onclick="navDay(1)">
      Weiter<span class="icon icon-s">chevron_right</span>
    </button>
  </div>
  <div id="heute-body"><div class="spin-wrap"><div class="spin"></div></div></div>
  <div class="rbar"><div class="rbar-dot"></div><span id="rbar-txt">Lade...</span></div>
</div>

<div class="tab " id="t-tabelle">
  <div class="vc" id="vc-tabelle" style="display:none"></div>
  <div id="tabelle-body"><div class="spin-wrap"><div class="spin"></div></div></div>
</div>

<div class="tab " id="t-spielplan">
  <div class="vc" id="vc-spielplan" style="display:none"></div>
  <div id="spielplan-body"><div class="spin-wrap"><div class="spin"></div></div></div>
</div>

<div class="tab " id="t-ergebnisse">
  <div class="vc" id="vc-ergebnisse" style="display:none"></div>
  <div id="ergebnisse-body"><div class="spin-wrap"><div class="spin"></div></div></div>
</div>

<div class="tab " id="t-stats">
  <div class="vc" id="vc-stats" style="display:none"></div>
  <div id="stats-body"><div class="spin-wrap"><div class="spin"></div></div></div>
</div>

<div class="tab " id="t-history">

  <p class="slbl"><span class="icon icon-s">calendar_today</span>Saison</p>
  <div class="hist-grid">
      <a href="/bundesliga/historie?hs=2025&amp;hd=1" class="hcard on">
      <div class="hcard-t">2025/26</div>
      <div class="hcard-s">477 Spiele &middot; 1527 Tore &middot; &Oslash; 3.2/Spiel</div>
    </a>
      <a href="/bundesliga/historie?hs=2024&amp;hd=1" class="hcard">
      <div class="hcard-t">2024/25</div>
      <div class="hcard-s">306 Spiele &middot; 959 Tore &middot; &Oslash; 3.1/Spiel</div>
    </a>
      <a href="/bundesliga/historie?hs=2023&amp;hd=1" class="hcard">
      <div class="hcard-t">2023/24</div>
      <div class="hcard-s">321 Spiele &middot; 1039 Tore &middot; &Oslash; 3.2/Spiel</div>
    </a>
      <a href="/bundesliga/historie?hs=2022&amp;hd=1" class="hcard">
      <div class="hcard-t">2022/23</div>
      <div class="hcard-s">306 Spiele &middot; 454 Tore &middot; &Oslash; 1.5/Spiel</div>
    </a>
      <a href="/bundesliga/historie?hs=2021&amp;hd=1" class="hcard">
      <div class="hcard-t">2021/22</div>
      <div class="hcard-s">306 Spiele &middot; 441 Tore &middot; &Oslash; 1.4/Spiel</div>
    </a>
      <a href="/bundesliga/historie?hs=2020&amp;hd=1" class="hcard">
      <div class="hcard-t">2020/21</div>
      <div class="hcard-s">306 Spiele &middot; 405 Tore &middot; &Oslash; 1.3/Spiel</div>
    </a>
      <a href="/bundesliga/historie?hs=2019&amp;hd=1" class="hcard">
      <div class="hcard-t">2019/20</div>
      <div class="hcard-s">306 Spiele &middot; 982 Tore &middot; &Oslash; 3.2/Spiel</div>
    </a>
      <a href="/bundesliga/historie?hs=2018&amp;hd=1" class="hcard">
      <div class="hcard-t">2018/19</div>
      <div class="hcard-s">306 Spiele &middot; 973 Tore &middot; &Oslash; 3.2/Spiel</div>
    </a>
      <a href="/bundesliga/historie?hs=2017&amp;hd=1" class="hcard">
      <div class="hcard-t">2017/18</div>
      <div class="hcard-s">306 Spiele &middot; 855 Tore &middot; &Oslash; 2.8/Spiel</div>
    </a>
    </div>

    <p class="slbl"><span class="icon icon-s">sports_soccer</span>Spieltag &mdash; 2025/26</p>
  <div style="display:flex;gap:4px;flex-wrap:wrap;margin-bottom:14px">
        <a href="/bundesliga/historie?hs=2025&amp;hd=1" class="vbtn on" title="1. Spieltag" style="min-width:42px;justify-content:center">1. Spi</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=2" class="vbtn" title="2. Spieltag" style="min-width:42px;justify-content:center">2. Spi</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=3" class="vbtn" title="3. Spieltag" style="min-width:42px;justify-content:center">3. Spi</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=4" class="vbtn" title="4. Spieltag" style="min-width:42px;justify-content:center">4. Spi</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=5" class="vbtn" title="5. Spieltag" style="min-width:42px;justify-content:center">5. Spi</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=6" class="vbtn" title="6. Spieltag" style="min-width:42px;justify-content:center">6. Spi</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=7" class="vbtn" title="7. Spieltag" style="min-width:42px;justify-content:center">7. Spi</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=8" class="vbtn" title="8. Spieltag" style="min-width:42px;justify-content:center">8. Spi</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=9" class="vbtn" title="9. Spieltag" style="min-width:42px;justify-content:center">9. Spi</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=10" class="vbtn" title="10. Spieltag" style="min-width:42px;justify-content:center">10. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=11" class="vbtn" title="11. Spieltag" style="min-width:42px;justify-content:center">11. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=12" class="vbtn" title="12. Spieltag" style="min-width:42px;justify-content:center">12. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=13" class="vbtn" title="13. Spieltag" style="min-width:42px;justify-content:center">13. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=14" class="vbtn" title="14. Spieltag" style="min-width:42px;justify-content:center">14. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=15" class="vbtn" title="15. Spieltag" style="min-width:42px;justify-content:center">15. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=16" class="vbtn" title="16. Spieltag" style="min-width:42px;justify-content:center">16. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=17" class="vbtn" title="17. Spieltag" style="min-width:42px;justify-content:center">17. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=18" class="vbtn" title="18. Spieltag" style="min-width:42px;justify-content:center">18. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=19" class="vbtn" title="19. Spieltag" style="min-width:42px;justify-content:center">19. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=20" class="vbtn" title="20. Spieltag" style="min-width:42px;justify-content:center">20. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=21" class="vbtn" title="21. Spieltag" style="min-width:42px;justify-content:center">21. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=22" class="vbtn" title="22. Spieltag" style="min-width:42px;justify-content:center">22. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=23" class="vbtn" title="23. Spieltag" style="min-width:42px;justify-content:center">23. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=24" class="vbtn" title="24. Spieltag" style="min-width:42px;justify-content:center">24. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=25" class="vbtn" title="25. Spieltag" style="min-width:42px;justify-content:center">25. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=26" class="vbtn" title="26. Spieltag" style="min-width:42px;justify-content:center">26. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=27" class="vbtn" title="27. Spieltag" style="min-width:42px;justify-content:center">27. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=28" class="vbtn" title="28. Spieltag" style="min-width:42px;justify-content:center">28. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=29" class="vbtn" title="29. Spieltag" style="min-width:42px;justify-content:center">29. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=30" class="vbtn" title="30. Spieltag" style="min-width:42px;justify-content:center">30. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=31" class="vbtn" title="31. Spieltag" style="min-width:42px;justify-content:center">31. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=32" class="vbtn" title="32. Spieltag" style="min-width:42px;justify-content:center">32. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=33" class="vbtn" title="33. Spieltag" style="min-width:42px;justify-content:center">33. Sp</a>
        <a href="/bundesliga/historie?hs=2025&amp;hd=34" class="vbtn" title="34. Spieltag" style="min-width:42px;justify-content:center">34. Sp</a>
      </div>
  
    <p class="slbl"><img src='https://flagcdn.com/16x12/de.png' width='16' height='12' alt='' loading='lazy' style='border-radius:2px;object-fit:cover;flex-shrink:0'> 1. Bundesliga &mdash; 2025/26 &mdash; Spieltag 1</p>
  <div class="mcard"><div class="mrows">
    <a href='/spiel/77256/fc-bayern-muenchen-vs-rb-leipzig' class='mrow'>
      <div class='mt fin-t'><div style='font-size:10px;font-weight:700;color:var(--c2)'>22.08.</div><div style='font-size:10px;color:var(--c3)'>20:30<small>(3:0)</small></div></div>
      <div class='trow'><img src='https://r2.thesportsdb.com/images/media/team/badge/01ogkh1716960412.png' width='22' height='22' alt='FC Bayern München' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn w'>Bayern</span></div>
      <div class='scr'><span class='sn s-fin'>6</span><span class='ssep'>:</span><span class='sn s-fin'>0</span></div>
      <div class='trow r'><img src='https://r2.thesportsdb.com/images/media/team/badge/zjgapo1594244951.png' width='22' height='22' alt='RB Leipzig' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn l'>Leipzig</span></div>
      <div class='ms'><span class='ft'>FT</span></div>
    </a><a href='/spiel/77257/bayer-04-leverkusen-vs-tsg-hoffenheim' class='mrow'>
      <div class='mt fin-t'><div style='font-size:10px;font-weight:700;color:var(--c2)'>23.08.</div><div style='font-size:10px;color:var(--c3)'>15:30<small>(1:1)</small></div></div>
      <div class='trow'><img src='https://r2.thesportsdb.com/images/media/team/badge/wuvsup1473453369.png' width='22' height='22' alt='Bayer 04 Leverkusen' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn l'>Leverkusen</span></div>
      <div class='scr'><span class='sn s-fin'>1</span><span class='ssep'>:</span><span class='sn s-fin'>2</span></div>
      <div class='trow r'><img src='https://r2.thesportsdb.com/images/media/team/badge/9hwvb21621593919.png' width='22' height='22' alt='TSG Hoffenheim' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn w'>Hoffenheim</span></div>
      <div class='ms'><span class='ft'>FT</span></div>
    </a><a href='/spiel/77258/eintracht-frankfurt-vs-sv-werder-bremen' class='mrow'>
      <div class='mt fin-t'><div style='font-size:10px;font-weight:700;color:var(--c2)'>23.08.</div><div style='font-size:10px;color:var(--c3)'>15:30<small>(2:0)</small></div></div>
      <div class='trow'><img src='https://r2.thesportsdb.com/images/media/team/badge/rurwpy1473453269.png' width='22' height='22' alt='Eintracht Frankfurt' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn w'>Frankfurt</span></div>
      <div class='scr'><span class='sn s-fin'>4</span><span class='ssep'>:</span><span class='sn s-fin'>1</span></div>
      <div class='trow r'><img src='https://r2.thesportsdb.com/images/media/team/badge/tkvqan1716960454.png' width='22' height='22' alt='SV Werder Bremen' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn l'>Bremen</span></div>
      <div class='ms'><span class='ft'>FT</span></div>
    </a><a href='/spiel/77259/sc-freiburg-vs-fc-augsburg' class='mrow'>
      <div class='mt fin-t'><div style='font-size:10px;font-weight:700;color:var(--c2)'>23.08.</div><div style='font-size:10px;color:var(--c3)'>15:30<small>(0:3)</small></div></div>
      <div class='trow'><img src='https://r2.thesportsdb.com/images/media/team/badge/urwtup1473453288.png' width='22' height='22' alt='SC Freiburg' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn l'>Freiburg</span></div>
      <div class='scr'><span class='sn s-fin'>1</span><span class='ssep'>:</span><span class='sn s-fin'>3</span></div>
      <div class='trow r'><img src='https://r2.thesportsdb.com/images/media/team/badge/xqyyvq1473453233.png' width='22' height='22' alt='FC Augsburg' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn w'>Augsburg</span></div>
      <div class='ms'><span class='ft'>FT</span></div>
    </a><a href='/spiel/77262/1-fc-union-berlin-vs-vfb-stuttgart' class='mrow'>
      <div class='mt fin-t'><div style='font-size:10px;font-weight:700;color:var(--c2)'>23.08.</div><div style='font-size:10px;color:var(--c3)'>15:30<small>(2:0)</small></div></div>
      <div class='trow'><img src='https://r2.thesportsdb.com/images/media/team/badge/q0o5001599679795.png' width='22' height='22' alt='1. FC Union Berlin' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn w'>Union Berlin</span></div>
      <div class='scr'><span class='sn s-fin'>2</span><span class='ssep'>:</span><span class='sn s-fin'>1</span></div>
      <div class='trow r'><img src='https://r2.thesportsdb.com/images/media/team/badge/yppyux1473454085.png' width='22' height='22' alt='VfB Stuttgart' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn l'>Stuttgart</span></div>
      <div class='ms'><span class='ft'>FT</span></div>
    </a><a href='/spiel/77264/1-fc-heidenheim-1846-vs-vfl-wolfsburg' class='mrow'>
      <div class='mt fin-t'><div style='font-size:10px;font-weight:700;color:var(--c2)'>23.08.</div><div style='font-size:10px;color:var(--c3)'>15:30<small>(1:1)</small></div></div>
      <div class='trow'><img src='https://r2.thesportsdb.com/images/media/team/badge/lbj7g01608236988.png' width='22' height='22' alt='1. FC Heidenheim 1846' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn l'>Heidenheim</span></div>
      <div class='scr'><span class='sn s-fin'>1</span><span class='ssep'>:</span><span class='sn s-fin'>3</span></div>
      <div class='trow r'><img src='https://r2.thesportsdb.com/images/media/team/badge/07kp421599680274.png' width='22' height='22' alt='VfL Wolfsburg' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn w'>Wolfsburg</span></div>
      <div class='ms'><span class='ft'>FT</span></div>
    </a><a href='/spiel/77263/fc-st-pauli-vs-borussia-dortmund' class='mrow'>
      <div class='mt fin-t'><div style='font-size:10px;font-weight:700;color:var(--c2)'>23.08.</div><div style='font-size:10px;color:var(--c3)'>18:30<small>(0:1)</small></div></div>
      <div class='trow'><img src='https://r2.thesportsdb.com/images/media/team/badge/5qupxa1608237013.png' width='22' height='22' alt='FC St. Pauli' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn d'>St. Pauli</span></div>
      <div class='scr'><span class='sn s-fin'>3</span><span class='ssep'>:</span><span class='sn s-fin'>3</span></div>
      <div class='trow r'><img src='https://r2.thesportsdb.com/images/media/team/badge/tqo8ge1716960353.png' width='22' height='22' alt='Borussia Dortmund' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn d'>Dortmund</span></div>
      <div class='ms'><span class='ft'>FT</span></div>
    </a><a href='/spiel/77260/1-fsv-mainz-05-vs-1-fc-koeln' class='mrow'>
      <div class='mt fin-t'><div style='font-size:10px;font-weight:700;color:var(--c2)'>24.08.</div><div style='font-size:10px;color:var(--c3)'>15:30<small>(0:1)</small></div></div>
      <div class='trow'><img src='https://r2.thesportsdb.com/images/media/team/badge/fhm9v51552134916.png' width='22' height='22' alt='1. FSV Mainz 05' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn l'>Mainz</span></div>
      <div class='scr'><span class='sn s-fin'>0</span><span class='ssep'>:</span><span class='sn s-fin'>1</span></div>
      <div class='trow r'><img src='https://r2.thesportsdb.com/images/media/team/badge/u2qj9m1630021108.png' width='22' height='22' alt='1. FC Köln' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn w'>Köln</span></div>
      <div class='ms'><span class='ft'>FT</span></div>
    </a><a href='/spiel/77261/borussia-moenchengladbach-vs-hamburger-sv' class='mrow'>
      <div class='mt fin-t'><div style='font-size:10px;font-weight:700;color:var(--c2)'>24.08.</div><div style='font-size:10px;color:var(--c3)'>17:30<small>(0:0)</small></div></div>
      <div class='trow'><img src='https://r2.thesportsdb.com/images/media/team/badge/sysurw1473453380.png' width='22' height='22' alt='Borussia Mönchengladbach' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn d'>Gladbach</span></div>
      <div class='scr'><span class='sn s-fin'>0</span><span class='ssep'>:</span><span class='sn s-fin'>0</span></div>
      <div class='trow r'><img src='https://r2.thesportsdb.com/images/media/team/badge/tvtppt1473453296.png' width='22' height='22' alt='Hamburger SV' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn d'>HSV</span></div>
      <div class='ms'><span class='ft'>FT</span></div>
    </a>  </div></div>

    <p class="slbl"><span class="icon icon-s">analytics</span>Saisonstatistik</p>
  <div class="stat-grid">
        <div class="stat-box">
      <div class="stat-v" style="color:var(--ac)">477</div>
      <div class="stat-l">Spiele</div>
    </div>
        <div class="stat-box">
      <div class="stat-v" style="color:var(--grn)">1527</div>
      <div class="stat-l">Tore</div>
    </div>
        <div class="stat-box">
      <div class="stat-v" style="color:var(--yel)">3.20</div>
      <div class="stat-l">Ø Tore</div>
    </div>
        <div class="stat-box">
      <div class="stat-v" style="color:var(--ac)">213</div>
      <div class="stat-l">Heimsiege</div>
    </div>
        <div class="stat-box">
      <div class="stat-v" style="color:var(--live)">147</div>
      <div class="stat-l">Auswärts</div>
    </div>
        <div class="stat-box">
      <div class="stat-v" style="color:var(--c2)">117</div>
      <div class="stat-l">Remis</div>
    </div>
      </div>
  
  
    <p class="slbl"><span class="icon icon-s">local_fire_department</span>Torreichste Spiele</p>
  <div class="mcard"><div class="mrows">
    <a href='/spiel/77295/borussia-moenchengladbach-vs-eintracht-frankfurt' class='mrow'>
      <div class='mt fin-t'><div style='font-size:10px;font-weight:700;color:var(--c2)'>27.09.</div><div style='font-size:10px;color:var(--c3)'>18:30<small>(0:5)</small></div></div>
      <div class='trow'><img src='https://r2.thesportsdb.com/images/media/team/badge/sysurw1473453380.png' width='22' height='22' alt='Borussia Mönchengladbach' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn l'>Gladbach</span></div>
      <div class='scr'><span class='sn s-fin'>4</span><span class='ssep'>:</span><span class='sn s-fin'>6</span></div>
      <div class='trow r'><img src='https://r2.thesportsdb.com/images/media/team/badge/rurwpy1473453269.png' width='22' height='22' alt='Eintracht Frankfurt' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn w'>Frankfurt</span></div>
      <div class='ms'><span class='ft'>FT</span><span style='font-size:10px;color:var(--live);font-weight:700;background:var(--live-l);padding:1px 5px;border-radius:3px;margin-left:4px'>10T</span></div>
    </a><a href='/spiel/6746762/borussia-moenchengladbach-vs-eintracht-frankfurt' class='mrow'>
      <div class='mt fin-t'><div style='font-size:10px;font-weight:700;color:var(--c2)'>27.09.</div><div style='font-size:10px;color:var(--c3)'>16:30</div></div>
      <div class='trow'><img src='https://r2.thesportsdb.com/images/media/team/badge/sysurw1473453380.png' width='22' height='22' alt='Borussia Mönchengladbach' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn l'>BMG</span></div>
      <div class='scr'><span class='sn s-fin'>4</span><span class='ssep'>:</span><span class='sn s-fin'>6</span></div>
      <div class='trow r'><img src='https://r2.thesportsdb.com/images/media/team/badge/rurwpy1473453269.png' width='22' height='22' alt='Eintracht Frankfurt' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn w'>SGE</span></div>
      <div class='ms'><span class='ft'>FT</span><span style='font-size:10px;color:var(--live);font-weight:700;background:var(--live-l);padding:1px 5px;border-radius:3px;margin-left:4px'>10T</span></div>
    </a><a href='/spiel/77391/fc-bayern-muenchen-vs-vfl-wolfsburg' class='mrow'>
      <div class='mt fin-t'><div style='font-size:10px;font-weight:700;color:var(--c2)'>11.01.</div><div style='font-size:10px;color:var(--c3)'>17:30<small>(2:1)</small></div></div>
      <div class='trow'><img src='https://r2.thesportsdb.com/images/media/team/badge/01ogkh1716960412.png' width='22' height='22' alt='FC Bayern München' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn w'>Bayern</span></div>
      <div class='scr'><span class='sn s-fin'>8</span><span class='ssep'>:</span><span class='sn s-fin'>1</span></div>
      <div class='trow r'><img src='https://r2.thesportsdb.com/images/media/team/badge/07kp421599680274.png' width='22' height='22' alt='VfL Wolfsburg' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn l'>Wolfsburg</span></div>
      <div class='ms'><span class='ft'>FT</span><span style='font-size:10px;color:var(--live);font-weight:700;background:var(--live-l);padding:1px 5px;border-radius:3px;margin-left:4px'>9T</span></div>
    </a><a href='/spiel/77500/bayer-04-leverkusen-vs-vfl-wolfsburg' class='mrow'>
      <div class='mt fin-t'><div style='font-size:10px;font-weight:700;color:var(--c2)'>04.04.</div><div style='font-size:10px;color:var(--c3)'>15:30<small>(2:3)</small></div></div>
      <div class='trow'><img src='https://r2.thesportsdb.com/images/media/team/badge/wuvsup1473453369.png' width='22' height='22' alt='Bayer 04 Leverkusen' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn w'>Leverkusen</span></div>
      <div class='scr'><span class='sn s-fin'>6</span><span class='ssep'>:</span><span class='sn s-fin'>3</span></div>
      <div class='trow r'><img src='https://r2.thesportsdb.com/images/media/team/badge/07kp421599680274.png' width='22' height='22' alt='VfL Wolfsburg' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn l'>Wolfsburg</span></div>
      <div class='ms'><span class='ft'>FT</span><span style='font-size:10px;color:var(--live);font-weight:700;background:var(--live-l);padding:1px 5px;border-radius:3px;margin-left:4px'>9T</span></div>
    </a><a href='/spiel/6746858/bayern-munich-vs-vfl-wolfsburg' class='mrow'>
      <div class='mt fin-t'><div style='font-size:10px;font-weight:700;color:var(--c2)'>11.01.</div><div style='font-size:10px;color:var(--c3)'>16:30</div></div>
      <div class='trow'><img src='https://r2.thesportsdb.com/images/media/team/badge/01ogkh1716960412.png' width='22' height='22' alt='Bayern Munich' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn w'>MUN</span></div>
      <div class='scr'><span class='sn s-fin'>8</span><span class='ssep'>:</span><span class='sn s-fin'>1</span></div>
      <div class='trow r'><img src='https://r2.thesportsdb.com/images/media/team/badge/07kp421599680274.png' width='22' height='22' alt='VfL Wolfsburg' loading='lazy' onerror="this.style.display='none'" style='object-fit:contain;flex-shrink:0'><span class='tn l'>WOB</span></div>
      <div class='ms'><span class='ft'>FT</span><span style='font-size:10px;color:var(--live);font-weight:700;background:var(--live-l);padding:1px 5px;border-radius:3px;margin-left:4px'>9T</span></div>
    </a>  </div></div>
  
  
</div>
<!-- NEWS SECTION (bottom of main) -->
<div id="main-news" style="margin-top:14px"></div>

</main>

<aside class="rnav">
  <div class="widget">
    <div class="w-hdr"><span class="icon">public</span><span>Ligen</span></div>
    <div class="w-body" style="padding:4px 10px">
            <a href="/bundesliga/heute" style="display:flex;align-items:center;gap:6px;padding:5px 6px;border-radius:var(--r);font-size:12px;font-weight:700;color:var(--ac);background:var(--ac-l);margin-bottom:1px;text-decoration:none">
        <img src='https://r2.thesportsdb.com/images/media/league/badge/teqh1b1679952008.png' width='16' height='16' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">        <span>1. Bundesliga</span>
      </a>
            <a href="/2-bundesliga/heute" style="display:flex;align-items:center;gap:6px;padding:5px 6px;border-radius:var(--r);font-size:12px;font-weight:500;color:var(--c2);background:transparent;margin-bottom:1px;text-decoration:none">
        <img src='https://r2.thesportsdb.com/images/media/league/badge/hl40981534764789.png' width='16' height='16' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">        <span>2. Bundesliga</span>
      </a>
            <a href="/3-liga/heute" style="display:flex;align-items:center;gap:6px;padding:5px 6px;border-radius:var(--r);font-size:12px;font-weight:500;color:var(--c2);background:transparent;margin-bottom:1px;text-decoration:none">
        <img src='https://r2.thesportsdb.com/images/media/league/badge/dbb5wp1534868931.png' width='16' height='16' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">        <span>3. Liga</span>
      </a>
            <a href="/dfb-pokal/heute" style="display:flex;align-items:center;gap:6px;padding:5px 6px;border-radius:var(--r);font-size:12px;font-weight:500;color:var(--c2);background:transparent;margin-bottom:1px;text-decoration:none">
        <img src='https://r2.thesportsdb.com/images/media/league/badge/dbb5wp1534868931.png' width='16' height='16' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">        <span>DFB-Pokal</span>
      </a>
            <a href="/oesterreich/heute" style="display:flex;align-items:center;gap:6px;padding:5px 6px;border-radius:var(--r);font-size:12px;font-weight:500;color:var(--c2);background:transparent;margin-bottom:1px;text-decoration:none">
        <img src='https://r2.thesportsdb.com/images/media/league/badge/vcgyu71686617925.png' width='16' height='16' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">        <span>Bundesliga Österreich</span>
      </a>
            <a href="/schweiz/heute" style="display:flex;align-items:center;gap:6px;padding:5px 6px;border-radius:var(--r);font-size:12px;font-weight:500;color:var(--c2);background:transparent;margin-bottom:1px;text-decoration:none">
        <img src='https://r2.thesportsdb.com/images/media/league/badge/id6q2r1635867584.png' width='16' height='16' alt='' loading='lazy' style='object-fit:contain;flex-shrink:0;border-radius:2px' onerror="this.style.display='none'">        <span>Swiss Super League</span>
      </a>
          </div>
  </div>
  <div class="widget" id="sw-tbl-wrap">
    <div class="w-hdr"><span class="icon">table_rows</span><span>BL1 Tabelle</span></div>
    <div class="w-body" id="sw-tbl"><div class="spin-wrap" style="padding:14px"><div class="spin"></div></div></div>
  </div>
  <div class="widget">
    <div class="w-hdr"><span class="icon">event</span><span>Nächste Spiele</span></div>
    <div class="w-body" id="sw-next"><div class="spin-wrap" style="padding:14px"><div class="spin"></div></div></div>
  </div>

  <div class="widget" id="sw-odds-widget">
    <div class="w-hdr"><span class="icon">casino</span><span>Quoten BL1</span></div>
    <div class="w-body" id="sw-odds"><div class="spin-wrap" style="padding:14px"><div class="spin"></div></div></div>
  </div>

  <!-- Top scorers widget -->
  
  <!-- News widget -->
  <div class="widget">
    <div class="w-hdr"><span class="icon">newspaper</span>Nachrichten</div>
    <div class="w-body" style="padding:8px 13px" id="sw-news"><div class="spin-wrap" style="padding:14px"><div class="spin"></div></div></div>
  </div>

    <div class="widget">
    <div class="w-hdr"><span class="icon">local_fire_department</span>Torreichste Spiele</div>
    <div class="w-body">
          <a href="/spiel/77295/borussia-moenchengladbach-vs-eintracht-frankfurt" style="display:block;padding:7px 0;border-bottom:1px solid var(--bd);text-decoration:none;color:inherit">
        <div style="font-size:13px;font-weight:600">
          Gladbach          <span style="color:var(--live);font-weight:800"> 4:6 </span>
          Frankfurt        </div>
        <div style="font-size:11px;color:var(--c3);margin-top:1px"><span class="icon icon-s" style="font-size:12px;color:var(--live)">sports_soccer</span> 10 Tore &middot; ST 5</div>
      </a>
          <a href="/spiel/6746762/borussia-moenchengladbach-vs-eintracht-frankfurt" style="display:block;padding:7px 0;border-bottom:1px solid var(--bd);text-decoration:none;color:inherit">
        <div style="font-size:13px;font-weight:600">
          BMG          <span style="color:var(--live);font-weight:800"> 4:6 </span>
          SGE        </div>
        <div style="font-size:11px;color:var(--c3);margin-top:1px"><span class="icon icon-s" style="font-size:12px;color:var(--live)">sports_soccer</span> 10 Tore &middot; ST 0</div>
      </a>
          <a href="/spiel/77391/fc-bayern-muenchen-vs-vfl-wolfsburg" style="display:block;padding:7px 0;border-bottom:1px solid var(--bd);text-decoration:none;color:inherit">
        <div style="font-size:13px;font-weight:600">
          Bayern          <span style="color:var(--live);font-weight:800"> 8:1 </span>
          Wolfsburg        </div>
        <div style="font-size:11px;color:var(--c3);margin-top:1px"><span class="icon icon-s" style="font-size:12px;color:var(--live)">sports_soccer</span> 9 Tore &middot; ST 16</div>
      </a>
        </div>
  </div>
  </aside>
</div>


<script>
var API    = '/api/proxy.php';
var SEASON = 2025;
var LG     = {"bl1":{"name":"1. Bundesliga","cc":"de"},"bl2":{"name":"2. Bundesliga","cc":"de"},"bl3":{"name":"3. Liga","cc":"de"},"dfb":{"name":"DFB-Pokal","cc":"de"},"fbl1":{"name":"Frauen-Bundesliga","cc":"de"},"fbl2":{"name":"2. Frauen-Bundesliga","cc":"de"},"rlno":{"name":"Regionalliga Nordost","cc":"de"},"rlw":{"name":"Regionalliga West","cc":"de"},"rlsw":{"name":"Regionalliga S\u00fcdwest","cc":"de"},"rlby":{"name":"Regionalliga Bayern","cc":"de"},"rlnord":{"name":"Regionalliga Nord","cc":"de"},"oefb":{"name":"Bundesliga \u00d6sterreich","cc":"at"},"at2":{"name":"2. Liga \u00d6sterreich","cc":"at"},"snl":{"name":"Swiss Super League","cc":"ch"},"ch2":{"name":"Challenge League","cc":"ch"},"lux":{"name":"BGL Ligue Luxemburg","cc":"lu"}};
var view   = 'heute';
var initLg = 'bl1';
var isHome = true;

// ── HELPERS ──────────────────────────────────────────────────────────────────
function $(id){return document.getElementById(id);}
function set(id,html){var el=$(id);if(el)el.innerHTML=html;}
function spin(){return '<div class="spin-wrap"><div class="spin"></div></div>';}
function err(m){return '<div class="empty">'+m+'</div>';}
function empty(){return '<div class="empty" style="padding:14px">Keine Spiele gefunden</div>';}
function flag(cc){return '<img src="https://flagcdn.com/16x12/'+cc+'.png" width="16" height="12" style="border-radius:2px;object-fit:cover" alt="" loading="lazy">';}
function slug(s){return s.toLowerCase().replace(/ä/g,'ae').replace(/ö/g,'oe').replace(/ü/g,'ue').replace(/ß/g,'ss').replace(/[^a-z0-9]+/g,'-').replace(/^-|-$/g,'');}

var LG_BASE={bl1:'bundesliga',bl2:'2-bundesliga',bl3:'3-liga',dfb:'dfb-pokal',fbl1:'frauen-bundesliga',fbl2:'frauen-2-bundesliga',rlno:'regionalliga-nordost',rlw:'regionalliga-west',rlsw:'regionalliga-suedwest',rlby:'regionalliga-bayern',rlnord:'regionalliga-nord',oefb:'oesterreich',at2:'oesterreich-2-liga',snl:'schweiz',ch2:'challenge-league',lux:'luxemburg'};
var VIEW_PATH={tabelle:'tabelle',spielplan:'spielplan',ergebnisse:'ergebnisse',stats:'statistik'};

// Sync left nav highlight when league changes
function syncNav(league, viewKey){
  var LG_BASE_R={bl1:'bundesliga',bl2:'2-bundesliga',bl3:'3-liga',dfb:'dfb-pokal',fbl1:'frauen-bundesliga',fbl2:'frauen-2-bundesliga',rlno:'regionalliga-nordost',oefb:'oesterreich',snl:'schweiz',lux:'luxemburg'};
  var VIEW_PATH_R={tabelle:'tabelle',spielplan:'spielplan',ergebnisse:'ergebnisse',stats:'statistik'};
  var base=LG_BASE_R[league]||league;
  var vp=VIEW_PATH_R[viewKey]||viewKey;
  var href='/'+base+'/'+vp;
  document.querySelectorAll('.lnav .ln-a').forEach(function(a){
    a.classList.toggle('on', a.getAttribute('href')===href);
  });
  // Also update header nav active state
  document.querySelectorAll('.hdr-nav .hn-a').forEach(function(a){
    var url=a.getAttribute('href')||'';
    a.classList.toggle('on', url.indexOf('/'+vp)!==-1 || url.indexOf(viewKey)!==-1);
  });
}
function pushLeagueUrl(league, viewKey){
  var base=LG_BASE[league]||league;
  var vp=VIEW_PATH[viewKey]||viewKey;
  var url='/'+base+'/'+vp;
  if(window.location.pathname!==url) history.pushState({league:league,view:viewKey},'',url);
  syncNav(league,viewKey);
}
async function apicall(p){
  var r = await fetch(API+'?'+new URLSearchParams(p));
  if(!r.ok) throw new Error(r.status);
  return r.json();
}

// ── DATE NAVIGATOR ───────────────────────────────────────────────────────────
var navDate = new Date();
navDate.setHours(0,0,0,0);
var todayCache = null, refreshTimer = null, oddsCache = {};
var browsingDate = false;

function updateNavLabel(){
  var today = new Date(); today.setHours(0,0,0,0);
  var diff  = Math.round((navDate-today)/86400000);
  var days  = ['So','Mo','Di','Mi','Do','Fr','Sa'];
  var months= ['Jan','Feb','Mär','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'];
  var lbl   = !browsingDate?'Aktueller Spieltag':diff===0?'Heute':diff===-1?'Gestern':diff===1?'Morgen':days[navDate.getDay()]+', '+navDate.getDate()+'. '+months[navDate.getMonth()];
  var full  = browsingDate?navDate.getDate()+'.'+(navDate.getMonth()+1)+'.'+navDate.getFullYear():'';
  var dayEl = $('navDayLbl'), fullEl = $('navFullLbl');
  if(dayEl) dayEl.textContent = lbl;
  if(fullEl) fullEl.textContent = full;
}

function localDateStr(d){
  return d.getFullYear()+'-'+String(d.getMonth()+1).padStart(2,'0')+'-'+String(d.getDate()).padStart(2,'0');
}

function navDay(d){
  var today = new Date(); today.setHours(0,0,0,0);
  if(!browsingDate){ browsingDate = true; navDate = new Date(today); }
  navDate.setDate(navDate.getDate()+d);
  var newDiff = Math.round((navDate-today)/86400000);
  if(newDiff===0){ browsingDate=false; }
  updateNavLabel();
  if(browsingDate){ loadByDate(localDateStr(navDate)); } else { loadMatchday(); }
}

function loadToday(){ loadMatchday(); }

// ── CUP: HEUTE VIEW WITH ROUND TABS ─────────────────────────────────────────
async function loadCupHeuteView(league){
  // Hide date nav for cups
  var dn=document.getElementById('dateNav'); if(dn) dn.style.display='none';
  set('heute-body', spin());
  try {
    var meta = LG[league]||{name:league,cc:'de'};
    var roundNums = [1,2,3,4,5,6];
    var results = await Promise.allSettled(roundNums.map(function(r){
      return apicall({action:'matchday',league:league,season:SEASON,group:r});
    }));
    var rounds = {};
    results.forEach(function(r,i){
      if(r.status==='fulfilled'&&Array.isArray(r.value)&&r.value.length) rounds[roundNums[i]]=r.value;
    });

    // Find current round (first with unfinished matches)
    if(!cupActiveRound){
      cupActiveRound = 6;
      for(var ri=1;ri<=6;ri++){
        if(rounds[ri]&&rounds[ri].some(function(m){return !m.matchIsFinished;})){ cupActiveRound=ri; break; }
      }
    }

    // Round tabs
    var tabs='<div class="cup-rounds">';
    roundNums.forEach(function(r){
      var name=CUP_ROUND_NAMES[r]||('Runde '+r);
      var ms=rounds[r]||[];
      var on=r===cupActiveRound?' on':'';
      var fin=ms.length&&ms.every(function(m){return m.matchIsFinished;});
      var badge='';
      if(ms.length){
        badge=fin?'<span class="cup-badge" style="background:var(--grn-l);color:var(--grn)">✓</span>':'<span class="cup-badge">'+ms.length+'</span>';
      }
      tabs+='<div class="cup-tab'+on+'" onclick="cupActiveRound='+r+';loadCupHeuteView(\''+league+'\')">'+name+badge+'</div>';
    });
    tabs+='</div>';

    // Active round content
    var activeMs=rounds[cupActiveRound]||[];
    var activeName=CUP_ROUND_NAMES[cupActiveRound]||'';
    var content='';

    if(activeMs.length){
      var liveMs=activeMs.filter(isLive);
      var finMs=activeMs.filter(function(m){return m.matchIsFinished;});
      var upMs=activeMs.filter(function(m){return !m.matchIsFinished&&!isLive(m);});
      finMs.sort(function(a,b){return new Date(b.matchDateTime||0)-new Date(a.matchDateTime||0);});
      upMs.sort(function(a,b){return new Date(a.matchDateTime||0)-new Date(b.matchDateTime||0);});

      var rows='';
      if(liveMs.length) rows+='<div class="msec msec-live"><span class="dot-live"></span> LIVE</div>'+liveMs.map(mrow).join('');
      if(upMs.length) rows+='<div class="msec"><span class="icon icon-s" style="font-size:13px">schedule</span> Kommend</div>'+upMs.map(mrow).join('');
      if(finMs.length) rows+='<div class="msec"><span class="icon icon-s" style="font-size:13px;color:var(--grn)">check_circle</span> Ergebnisse</div>'+finMs.map(mrow).join('');

      content='<div class="mcard"><div class="mcard-hdr"><div class="mcard-hdr-l">'+
        flag(meta.cc)+'<span class="icon icon-s">emoji_events</span><span class="mcard-title">'+activeName+'</span></div>'+
        '<div class="mcard-r"><span class="mcard-count">'+activeMs.length+' Spiele</span></div></div>'+
        '<div class="mrows">'+rows+'</div></div>';

      // Add bracket for QF+
      if(cupActiveRound>=4) content+=renderCupBracket(rounds);
    } else {
      content='<div class="empty">Keine Spiele in dieser Runde</div>';
    }

    set('heute-body', tabs+content);
    // Hide refresh bar for cups
    var rbar=document.querySelector('.rbar'); if(rbar) rbar.style.display='none';
  } catch(e){ set('heute-body', err('Verbindungsfehler')); }
}

// ── LOAD CURRENT MATCHDAY (default — shows all finished + live + upcoming) ──
async function loadMatchday(){
  browsingDate = false;

  // Cup leagues get round-based view
  var singleLg = (!isHome && initLg && view === 'heute');
  if(singleLg && CUP_LEAGUES.indexOf(initLg) !== -1){
    return loadCupHeuteView(initLg);
  }
  // Show date nav for non-cup
  var dn=document.getElementById('dateNav'); if(dn) dn.style.display='';

  set('heute-body', spin());
  try {
    var mainLgs = ['bl1','bl2','bl3','dfb','fbl1','fbl2','oefb','at2','snl','ch2','lux'];
    var lgs = singleLg ? [initLg] : mainLgs;
    var res = await Promise.allSettled(lgs.map(function(l){
      return apicall({action:'live', league:l, season:SEASON});
    }));
    var grouped = {};
    res.forEach(function(r,i){
      if(r.status!=='fulfilled'||!Array.isArray(r.value)||!r.value.length) return;
      grouped[lgs[i]] = r.value;
    });

    // If all matches of the current matchday are finished, also fetch next matchday
    var OL_LEAGUES = ['bl1','bl2','bl3','dfb','fbl1','fbl2','rlno','rlw','rlsw','rlby','rlnord','olw'];
    var needsNext = [];
    Object.keys(grouped).forEach(function(lg){
      if(!grouped[lg]||!grouped[lg].length) return;
      var allFin = grouped[lg].every(function(m){ return m.matchIsFinished; });
      if(allFin){
        var grp = grouped[lg][0] && grouped[lg][0].group ? grouped[lg][0].group.groupOrderID : 0;
        if(grp > 0 && OL_LEAGUES.indexOf(lg) !== -1) needsNext.push({lg:lg, nextGroup:grp+1});
      }
    });

    if(needsNext.length){
      var nextRes = await Promise.allSettled(needsNext.map(function(n){
        return apicall({action:'matchday', league:n.lg, season:SEASON, group:n.nextGroup});
      }));
      nextRes.forEach(function(r,i){
        if(r.status!=='fulfilled'||!Array.isArray(r.value)||!r.value.length) return;
        var lg = needsNext[i].lg;
        grouped[lg] = grouped[lg].concat(r.value);
      });
    }

    // For single league view: if all foreign matches finished, fetch upcoming too
    if(singleLg){
      var FOREIGN = ['oefb','at2','snl','ch2','lux'];
      if(FOREIGN.indexOf(initLg) !== -1 && grouped[initLg] && grouped[initLg].every(function(m){return m.matchIsFinished;})){
        try {
          var upAll = await apicall({action:'matchday', league:initLg, season:SEASON});
          if(Array.isArray(upAll)){
            var upcoming = upAll.filter(function(m){return !m.matchIsFinished;}).slice(0,10);
            if(upcoming.length) grouped[initLg] = grouped[initLg].concat(upcoming);
          }
        } catch(e){}
      }
    }

    todayCache = grouped;
    renderMatches(grouped);
    scheduleRefresh(grouped);
  } catch(e){ set('heute-body', err('Verbindungsfehler')); }
}

// ── LOAD BY DATE (when user navigates with arrows) ──────────────────────────
async function loadByDate(dateStr){
  set('heute-body', spin());
  try {
    var allLgs = ['bl1','bl2','bl3','dfb','fbl1','fbl2','oefb','at2','snl','ch2','lux'];
    var singleLg = (!isHome && initLg && view === 'heute');
    var lgs = singleLg ? [initLg] : allLgs;
    var res = await Promise.allSettled(lgs.map(function(l){
      return apicall({action:'matchday', league:l, season:SEASON, date:dateStr});
    }));
    var grouped = {};
    res.forEach(function(r,i){
      if(r.status!=='fulfilled'||!Array.isArray(r.value)) return;
      var ms = r.value.filter(function(m){
        return (m.matchDateTime||m.matchDateTimeUTC||'').slice(0,10) === dateStr;
      });
      if(ms.length) grouped[lgs[i]] = ms;
    });
    if(!Object.keys(grouped).length){
      var res2 = await Promise.allSettled(lgs.map(function(l){
        return apicall({action:'matchday',league:l,season:SEASON-1,date:dateStr});
      }));
      res2.forEach(function(r,i){
        if(r.status!=='fulfilled'||!Array.isArray(r.value)) return;
        var ms = r.value.filter(function(m){ return (m.matchDateTime||'').slice(0,10)===dateStr; });
        if(ms.length) grouped[lgs[i]] = ms;
      });
    }
    todayCache = grouped;
    renderMatches(grouped);
    scheduleRefresh(grouped);
  } catch(e){ set('heute-body', err('Verbindungsfehler')); }
}

// ── RENDER MATCHES — SofaScore-style with sections ──────────────────────────
function renderMatches(data){
  var keys = Object.keys(data);
  if(!keys.length){
    set('heute-body','<div class="empty"><span class="icon icon-l" style="display:block;margin:0 auto 8px;color:var(--c3)">event_busy</span>Keine Spiele gefunden</div>');
    return;
  }
  set('heute-body', keys.map(function(k){
    var meta = LG[k]||{name:k,cc:'de'};
    var ms   = data[k];
    var liveMs = ms.filter(isLive);
    var finMs  = ms.filter(function(m){return m.matchIsFinished;});
    var upMs   = ms.filter(function(m){return !m.matchIsFinished && !isLive(m);});
    finMs.sort(function(a,b){return new Date(b.matchDateTime||0)-new Date(a.matchDateTime||0);});
    upMs.sort(function(a,b){return new Date(a.matchDateTime||0)-new Date(b.matchDateTime||0);});

    var rows = '';
    if(liveMs.length){
      rows += '<div class="msec msec-live"><span class="dot-live"></span> LIVE</div>';
      rows += liveMs.map(mrow).join('');
    }
    if(finMs.length){
      rows += '<div class="msec"><span class="icon icon-s" style="font-size:13px;color:var(--grn)">check_circle</span> Ergebnisse</div>';
      rows += finMs.map(mrow).join('');
    }
    if(upMs.length){
      rows += '<div class="msec"><span class="icon icon-s" style="font-size:13px">schedule</span> Kommend</div>';
      rows += upMs.map(mrow).join('');
    }
    return '<div class="mcard '+(liveMs.length?'has-live':'')+'" id="mc-'+k+'">'+
      '<div class="mcard-hdr" onclick="toggleCard(\'mc-'+k+'\')">'+
        '<div class="mcard-hdr-l">'+flag(meta.cc)+' <span class="mcard-title">'+meta.name+'</span>'+
        (liveMs.length?'<span class="live-cnt">'+liveMs.length+' Live</span>':'')+'</div>'+
        '<div class="mcard-r"><span class="mcard-count">'+ms.length+' Spiele</span>'+
        '<span class="icon mcard-tog">expand_more</span></div>'+
      '</div>'+
      '<div class="mrows">'+rows+'</div>'+
    '</div>';
  }).join(''));
}

function scheduleRefresh(data){
  clearTimeout(refreshTimer);
  var hasLive = Object.values(data).some(function(ms){return ms.some(isLive);});
  var pill = $('livePill');
  if(pill) pill.style.display = hasLive?'flex':'none';
  var iv = hasLive?60000:300000;
  var rbar = $('rbar-txt');
  if(rbar) rbar.textContent = 'Aktualisierung alle '+(iv/1000)+'s · '+new Date().toLocaleTimeString('de-DE',{hour:'2-digit',minute:'2-digit'});
  refreshTimer = setTimeout(function(){ if(browsingDate) loadByDate(localDateStr(navDate)); else loadMatchday(); }, iv);
}

// ── MATCH ROW — SofaScore-style with goal scorers ───────────────────────────
function mrow(m){
  var t1=m.team1||{}, t2=m.team2||{};
  var hn=t1.teamName||t1.shortName||'—', an=t2.teamName||t2.shortName||'—';
  var hs=t1.shortName||hn, as2=t2.shortName||an;
  var hl=t1.teamIconUrl||'', al=t2.teamIconUrl||'';
  var res=m.matchResults||[];
  var ft=null,ht=null;
  res.forEach(function(r){if(r.resultTypeID===2||r.resultOrderID===2)ft=r;if(r.resultTypeID===1)ht=r;});
  if(!ft&&res.length)ft=res[res.length-1];
  var fin=!!m.matchIsFinished, live=isLive(m);
  var score,hc='',ac='';
  var g1=null, g2=null;
  if(ft&&ft.pointsTeam1!==undefined){
    g1=ft.pointsTeam1; g2=ft.pointsTeam2;
  }
  // For live matches, goals array has the most up-to-date score
  if(m.goals && m.goals.length > 0) {
    var lastGoal = m.goals[m.goals.length - 1];
    if(lastGoal.scoreTeam1!==undefined && lastGoal.scoreTeam2!==undefined){
      var gH=lastGoal.scoreTeam1, gA=lastGoal.scoreTeam2;
      if(g1===null || (gH+gA)>(g1+g2)){ g1=gH; g2=gA; }
    }
  }
  if(g1!==null && g2!==null){
    var cls=live?'s-live':'s-fin';
    score='<span class="sn '+cls+'">'+g1+'</span><span class="ssep">:</span><span class="sn '+cls+'">'+g2+'</span>';
    hc=g1>g2?'w':g1<g2?'l':'d'; ac=g2>g1?'w':g2<g1?'l':'d';
  } else if(live) {
    score='<span class="sn s-live">0</span><span class="ssep">:</span><span class="sn s-live">0</span>';
  } else {
    score='<span class="sn s-up">-</span><span class="ssep">:</span><span class="sn s-up">-</span>';
  }
  var rawDt=m.matchDateTime||m.matchDateTimeUTC||m.dateTime||'';
  var dt2=new Date(rawDt);
  var ts='';
  if(rawDt && !isNaN(dt2.getTime())){
    var today=new Date(); today.setHours(0,0,0,0);
    var matchDay=new Date(dt2); matchDay.setHours(0,0,0,0);
    var diff=Math.round((matchDay-today)/(1000*60*60*24));
    var timeStr=dt2.toLocaleTimeString('de-DE',{hour:'2-digit',minute:'2-digit'});
    if(diff===0) ts=timeStr;
    else ts=dt2.toLocaleDateString('de-DE',{day:'2-digit',month:'2-digit'})+' '+timeStr;
  }
  var htS=ht?'<small>('+ht.pointsTeam1+':'+ht.pointsTeam2+')</small>':'';
  var liveMin='';
  if(live){
    // Prefer ESPN clock if available (accurate to the second)
    if(m._espnClock) { liveMin=m._espnClock; }
    else {
      var elapsed=Math.round((Date.now()-dt2)/60000);
      if(elapsed>=0&&elapsed<=120) liveMin=elapsed>90?'90+':elapsed+"'";
    }
  }
  // Date label for non-today matches
  var dateLbl='';
  if(!isNaN(dt2.getTime())){
    var dayDiff=Math.round((dt2-new Date())/86400000);
    if(dayDiff<-1||dayDiff>1){
      dateLbl='<div style="font-size:9px;color:var(--c3)">'+dt2.toLocaleDateString('de-DE',{weekday:'short',day:'2-digit',month:'2-digit'})+'</div>';
    }
  }
  var statHtml;
  if(live) statHtml='<div class="mt live-t">'+(liveMin||'LIVE')+htS+'</div>';
  else if(fin) statHtml='<div class="mt fin-t"><span class="ft-badge">FT</span>'+dateLbl+htS+'</div>';
  else statHtml='<div class="mt">'+ts+dateLbl+'</div>';

  var l1=hl?'<img src="'+hl+'" width="22" height="22" style="object-fit:contain;flex-shrink:0" loading="lazy" onerror="this.style.display=\'none\'" alt="">':'';
  var l2=al?'<img src="'+al+'" width="22" height="22" style="object-fit:contain;flex-shrink:0" loading="lazy" onerror="this.style.display=\'none\'" alt="">':'';
  var mid=m.matchID||0;
  var url=mid?'/spiel/'+mid+'/'+slug(hn)+'-vs-'+slug(an):'#';

  // Goal scorers — SofaScore-style under match row
  var goalInfo='';
  if(m.goals && m.goals.length>0 && (fin||live)){
    var hGoals=[], aGoals=[], prevH=0, prevA=0;
    m.goals.forEach(function(g){
      var name=g.goalGetterName||g.scorer||'';
      if(!name) return;
      var min=g.matchMinute||g.minute||0;
      var pen=(g.isPenalty||g.is_penalty)?'(P)':'';
      var og=(g.isOwnGoal||g.is_owngoal)?'(OG)':'';
      var sH=g.scoreTeam1, sA=g.scoreTeam2;
      var isHome=(sH!==undefined && sH>prevH);
      if(sH!==undefined) prevH=sH;
      if(sA!==undefined) prevA=sA;
      var txt=name+(min?' '+min+"'":'')+(pen||og?' '+pen+og:'');
      if(isHome) hGoals.push(txt); else aGoals.push(txt);
    });
    if(hGoals.length||aGoals.length){
      goalInfo='<div class="mrow-goals">'+
        '<div class="mg-home">'+hGoals.map(function(g){return '<span class="mg-g"><span class="mg-ico">⚽</span>'+g+'</span>';}).join('')+'</div>'+
        '<div class="mg-sep"></div>'+
        '<div class="mg-away">'+aGoals.map(function(g){return '<span class="mg-g"><span class="mg-ico">⚽</span>'+g+'</span>';}).join('')+'</div>'+
      '</div>';
    }
  }

  // TV channel — detailed per day/time
  var tvTxt='';
  var mLg=m._league||initLg||'';
  if(mLg && !isNaN(dt2.getTime())){
    var tvDay=dt2.getDay(); // 0=Sun,6=Sat
    var tvH=dt2.getHours(), tvM=dt2.getMinutes(), tvT=tvH*100+tvM;
    if(mLg==='bl1'){
      if(tvDay===5&&tvT>=2000) tvTxt='Sky Sport 1';
      else if(tvDay===6&&tvT>=1500&&tvT<1600) tvTxt='Sky Konferenz';
      else if(tvDay===6&&tvT>=1800) tvTxt='Sky Sport 1';
      else if(tvDay===0&&tvT>=1500&&tvT<1600) tvTxt='DAZN 1';
      else if(tvDay===0&&tvT>=1700&&tvT<1800) tvTxt='DAZN 1';
      else if(tvDay===0&&tvT>=1930) tvTxt='DAZN 1';
      else tvTxt='Sky/DAZN';
    } else if(mLg==='bl2'){
      if(tvDay===5&&tvT>=1800) tvTxt='Sky Sport 2';
      else if(tvDay===6&&tvT>=1300&&tvT<1400) tvTxt='Sky Konferenz';
      else if(tvDay===6&&tvT>=2000) tvTxt='Sky/Sport1';
      else if(tvDay===0&&tvT>=1330) tvTxt='Sky Sport 2';
      else tvTxt='Sky Sport';
    } else if(mLg==='bl3') tvTxt='MagentaSport';
    else if(mLg==='dfb'){
      if(tvDay>=2&&tvDay<=4) tvTxt='ARD/ZDF';
      else tvTxt='Sky Sport';
    } else if(mLg==='fbl1'||mLg==='fbl2') tvTxt='MagentaSport';
    else if(mLg==='oefb'||mLg==='at2') tvTxt='Sky Sport Austria';
    else if(mLg==='snl'||mLg==='ch2') tvTxt='blue Sport';
    else if(mLg.indexOf('rl')===0) tvTxt='MagentaSport';
  }

  var g1s = g1!==null ? g1 : '–';
  var g2s = g2!==null ? g2 : '–';
  var sCls = live ? 's-live' : (fin ? 's-fin' : 's-up');

  var rcls=hc==='d'?' vrow-draw':(!hc?' vrow-upcoming':'');
  return '<a href="'+url+'" class="vrow'+(live?' vrow-live':'')+rcls+'">'+
    '<div class="vrow-fav" onclick="event.preventDefault();this.classList.toggle(\'on\')" title="Favorit"><span class="icon">star</span></div>'+
    '<div class="vrow-time">'+
      (live?'<span class="dot-live"></span><span class="vrow-min">'+(liveMin||'LIVE')+'</span>':
       fin?'<span class="vrow-ft">Beendet</span>':
       '<span class="vrow-ts">'+ts+'</span>')+
    '</div>'+
    '<div class="vrow-teams">'+
      (function(){
        var oKey=hn.toLowerCase()+'|'+an.toLowerCase();
        var oKey2=hs.toLowerCase()+'|'+as2.toLowerCase();
        var od=oddsCache[oKey]||oddsCache[oKey2]||null;
        function oddCls(v){return v<1.8?'odd-hot':v<3?'odd-med':'odd-cold';}
        var oh=od&&!fin&&od.home>0?'<span class="vrow-odd '+oddCls(od.home)+'">'+od.home.toFixed(2)+'</span>':'';
        var oa=od&&!fin&&od.away>0?'<span class="vrow-odd '+oddCls(od.away)+'">'+od.away.toFixed(2)+'</span>':'';
        return '<div class="vrow-team'+(hc==='w'?' vt-w':'')+(hc==='l'?' vt-l':'')+(hc==='d'?' vt-d':'')+'">'+
          (hl?'<img src="'+hl+'" width="16" height="16" class="vrow-logo" loading="lazy" onerror="this.style.display=\'none\'">':'<span class="vrow-logo-ph"></span>')+
          '<span class="vrow-name">'+hs+'</span>'+oh+
        '</div>'+
        '<div class="vrow-team'+(ac==='w'?' vt-w':'')+(ac==='l'?' vt-l':'')+(ac==='d'?' vt-d':'')+'">'+
          (al?'<img src="'+al+'" width="16" height="16" class="vrow-logo" loading="lazy" onerror="this.style.display=\'none\'">':'<span class="vrow-logo-ph"></span>')+
          '<span class="vrow-name">'+as2+'</span>'+oa+
        '</div>';
      })()+
    '</div>'+
    '<div class="vrow-scores">'+
      '<div class="vrow-sc '+sCls+(live?'':(hc==='w'?' sc-w':'')+(hc==='l'?' sc-l':'')+(hc==='d'?' sc-d':''))+'">'+g1s+'</div>'+
      '<div class="vrow-sc '+sCls+(live?'':(ac==='w'?' sc-w':'')+(ac==='l'?' sc-l':'')+(ac==='d'?' sc-d':''))+'">'+g2s+'</div>'+
    '</div>'+
    '<div class="vrow-info">'+
      (tvTxt&&!fin?'<div class="vrow-tv"><span class="icon">tv</span>'+tvTxt+'</div>':'')+
      (ht?'<div class="vrow-ht">HZ '+ht.pointsTeam1+':'+ht.pointsTeam2+'</div>':'')+
    '</div>'+
  '</a>';
}

function isLive(m){
  if(m.matchIsFinished)return false;
  var d=new Date(m.matchDateTime||'');
  if(isNaN(d.getTime()))return false;
  var diff=(Date.now()-d)/60000;
  return diff>=0&&diff<130;
}

// ── TABELLE ──────────────────────────────────────────────────────────────────
async function loadTable(league, btn){
  activateBtn(btn);
  pushLeagueUrl(league,'tabelle');
  set('tabelle-body', spin());
  try {
    var d = await apicall({action:'table',league:league,season:SEASON});
    var meta = LG[league]||{name:league,cc:'de'};
    var html = '<div class="stbl-wrap">'+
      '<div class="stbl-hdr">'+flag(meta.cc)+' <span class="stbl-title">'+meta.name+'</span><span class="stbl-sub">'+SEASON+'/'+(SEASON+1).toString().slice(2)+'</span></div>'+
      '<table class="stbl"><thead><tr>'+
        '<th>#</th><th>Verein</th><th>Sp</th><th>S</th><th>U</th><th>N</th><th>Tore</th><th>Diff</th><th>Pkt</th><th>Form</th>'+
      '</tr></thead><tbody>'+
      d.map(function(r,i){return stblRow(r,i+1,league);}).join('')+
      '</tbody></table>'+
      '<div class="legend-bar">'+
        '<span style="display:flex;align-items:center;gap:4px"><div class="leg-dot" style="background:rgba(55,77,245,.5)"></div>Champions League</span>'+
        '<span style="display:flex;align-items:center;gap:4px"><div class="leg-dot" style="background:rgba(180,83,9,.5)"></div>Europa League</span>'+
        '<span style="display:flex;align-items:center;gap:4px"><div class="leg-dot" style="background:rgba(224,36,36,.4)"></div>Abstieg</span>'+
      '</div></div>';
    // Compact league summary below table
    var totalGoals = d.reduce(function(s,r){return s+(r.goals||0);},0);
    var totalGames = d.reduce(function(s,r){return s+(r.matches||0);},0)/2;
    var avgGoals = totalGames ? (totalGoals/totalGames).toFixed(1) : '–';
    var homeW = d.reduce(function(s,r){return s+(r.won||0);},0);
    var draws = d.reduce(function(s,r){return s+(r.draw||0);},0);
    html += '<div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(100px,1fr));gap:8px;margin-top:10px">';
    [{l:'Spiele',v:Math.round(totalGames),c:'var(--c1)'},{l:'Tore',v:totalGoals,c:'var(--grn)'},{l:'Ø Tore/Spiel',v:avgGoals,c:'var(--ac)'},{l:'Siege',v:homeW,c:'var(--c2)'},{l:'Remis',v:draws,c:'var(--yel)'}].forEach(function(k){
      html+='<div style="background:var(--s0);border-radius:var(--r-lg);padding:12px 10px;text-align:center"><div style="font-size:20px;font-weight:800;color:'+k.c+'">'+k.v+'</div><div style="font-size:9px;color:var(--c3);text-transform:uppercase;letter-spacing:.4px;margin-top:2px">'+k.l+'</div></div>';
    });
    html += '</div>';
    set('tabelle-body', html);
  } catch(e){ set('tabelle-body', err('Tabelle nicht verfügbar')); }
}

function stblRow(r,pos,league){
  var nm=r.shortName||r.teamName||'—', ic=r.teamIconUrl||'';
  var pts=r.points||0,sp=r.matches||0,w=r.won||0,dr=r.draw||0,l=r.lost||0;
  var gs=r.goals||0,gc=r.opponentGoals||0,diff=gs-gc;
  var pc='';
  if(league==='bl1'){if(pos<=4)pc='p-cl';else if(pos<=6)pc='p-el';else if(pos>=16)pc='p-rel';}
  else if(league==='bl2'){if(pos<=2)pc='p-cl';else if(pos===3)pc='p-el';else if(pos>=16)pc='p-rel';}
  var tid=r.teamInfoId||0;
  var tUrl=tid?'/verein/'+tid+'/'+slug(r.teamName||'')+'?lg='+league:'#';
  // Form bar (W/D/L percentage)
  var tot=w+dr+l||1;
  var wp=Math.round(w/tot*100), dp=Math.round(dr/tot*100), lp=100-wp-dp;
  var formBar='<div style="display:flex;height:8px;border-radius:4px;overflow:hidden;min-width:50px">'+
    '<div style="width:'+wp+'%;background:var(--grn)"></div>'+
    '<div style="width:'+dp+'%;background:var(--yel)"></div>'+
    '<div style="width:'+lp+'%;background:var(--live)"></div></div>';

  return '<tr>'+
    '<td><span class="pos-badge '+pc+'">'+pos+'</span></td>'+
    '<td><a href="'+tUrl+'" class="tc-row">'+
      (ic?'<img src="'+ic+'" width="18" height="18" style="object-fit:contain;flex-shrink:0" loading="lazy" onerror="this.style.display=\'none\'" alt="">':'')+
      '<span class="tc-name">'+nm+'</span></a></td>'+
    '<td>'+sp+'</td><td style="color:var(--grn);font-weight:700">'+w+'</td><td>'+dr+'</td><td style="color:var(--live)">'+l+'</td>'+
    '<td>'+gs+':'+gc+'</td>'+
    '<td class="'+(diff>0?'diff-p':diff<0?'diff-n':'')+'">'+(diff>0?'+':'')+diff+'</td>'+
    '<td class="pts-big">'+pts+'</td>'+
    '<td>'+formBar+'</td>'+
  '</tr>';
}


// ── SPIELPLAN — upcoming matches only ────────────────────────────────────────
var CUP_LEAGUES = ['dfb'];
var CUP_ROUND_NAMES = {1:'1. Runde',2:'2. Runde',3:'Achtelfinale',4:'Viertelfinale',5:'Halbfinale',6:'Finale'};
var cupActiveRound = 0;

// Cup bracket match card
function cupMatch(m){
  if(!m) return '<div class="cup-m"><div class="cup-m-tbd">TBD</div></div>';
  var t1=m.team1||{}, t2=m.team2||{};
  var res=m.matchResults||[]; var ft=null;
  res.forEach(function(r){if(r.resultTypeID===2||r.resultOrderID===2)ft=r;});
  if(!ft&&res.length)ft=res[res.length-1];
  var g1=ft?ft.pointsTeam1:null, g2=ft?ft.pointsTeam2:null;
  var fin=!!m.matchIsFinished;
  var h1c='',h2c='',s1c='',s2c='';
  if(fin&&g1!==null){
    h1c=g1>g2?'w':'l'; h2c=g2>g1?'w':'l';
    s1c=g1>g2?'w':'l'; s2c=g2>g1?'w':'l';
    if(g1===g2){h1c='';h2c='';s1c='';s2c='';}
  }
  var mid=m.matchID||0;
  var url=mid?'/spiel/'+mid+'/'+slug((t1.teamName||''))+'-vs-'+slug((t2.teamName||'')):'#';
  var i1=t1.teamIconUrl?'<img src="'+t1.teamIconUrl+'" onerror="this.style.display=\'none\'" loading="lazy">':'';
  var i2=t2.teamIconUrl?'<img src="'+t2.teamIconUrl+'" onerror="this.style.display=\'none\'" loading="lazy">':'';
  var sc1=g1!==null?g1:'-', sc2=g2!==null?g2:'-';
  return '<a href="'+url+'" class="cup-m cup-line-r">'+
    '<div class="cup-m-row">'+i1+'<span class="cup-m-name '+h1c+'">'+(t1.shortName||t1.teamName||'?')+'</span><span class="cup-m-score '+s1c+'">'+sc1+'</span></div>'+
    '<div class="cup-m-row">'+i2+'<span class="cup-m-name '+h2c+'">'+(t2.shortName||t2.teamName||'?')+'</span><span class="cup-m-score '+s2c+'">'+sc2+'</span></div>'+
  '</a>';
}

function renderCupRound(roundMs, roundName){
  if(!roundMs||!roundMs.length) return '<div class="empty">Keine Spiele in dieser Runde</div>';
  var h='<div class="cup-list"><div class="mcard"><div class="mcard-hdr"><div class="mcard-hdr-l"><span class="icon icon-s">emoji_events</span><span class="mcard-title">'+roundName+'</span></div><div class="mcard-r"><span class="mcard-count">'+roundMs.length+' Spiele</span></div></div><div class="mrows">'+roundMs.map(mrow).join('')+'</div></div></div>';
  return h;
}

function renderCupBracket(rounds){
  // Build bracket for QF (4) → HF (2) → F (1)
  var qf=rounds[4]||[], hf=rounds[5]||[], fi=rounds[6]||[];
  if(!qf.length&&!hf.length&&!fi.length) return '';

  var h='<div class="cup-bracket"><div class="cup-bracket-cols">';

  // QF column
  if(qf.length){
    h+='<div class="cup-col"><div class="cup-col-hdr">Viertelfinale</div>';
    qf.forEach(function(m){h+=cupMatch(m);});
    h+='</div>';
  }

  // HF column
  h+='<div class="cup-col"><div class="cup-col-hdr">Halbfinale</div>';
  if(hf.length){ hf.forEach(function(m){h+=cupMatch(m);}); }
  else { h+=cupMatch(null)+cupMatch(null); }
  h+='</div>';

  // Final column
  h+='<div class="cup-col"><div class="cup-col-hdr">Finale</div>';
  if(fi.length){ fi.forEach(function(m){h+=cupMatch(m);}); }
  else { h+=cupMatch(null); }
  h+='</div>';

  h+='</div></div>';
  return h;
}

async function loadCupPlan(league){
  set('spielplan-body', spin());
  try {
    var meta = LG[league]||{name:league,cc:'de'};
    // Fetch all rounds (1-6)
    var roundNums = [1,2,3,4,5,6];
    var results = await Promise.allSettled(roundNums.map(function(r){
      return apicall({action:'matchday',league:league,season:SEASON,group:r});
    }));
    var rounds = {};
    results.forEach(function(r,i){
      if(r.status==='fulfilled'&&Array.isArray(r.value)&&r.value.length){
        rounds[roundNums[i]] = r.value;
      }
    });

    // Find current round (first with unfinished matches)
    var curRound = 6;
    for(var ri=1;ri<=6;ri++){
      if(rounds[ri]&&rounds[ri].some(function(m){return !m.matchIsFinished;})){curRound=ri;break;}
    }
    if(!cupActiveRound) cupActiveRound = curRound;

    // Round tabs
    var tabs = '<div class="cup-rounds">';
    roundNums.forEach(function(r){
      var name = CUP_ROUND_NAMES[r]||('Runde '+r);
      var cnt = rounds[r]?rounds[r].length:0;
      var on = r===cupActiveRound?' on':'';
      tabs+='<div class="cup-tab'+on+'" onclick="cupActiveRound='+r+';loadCupPlan(\''+league+'\')">';
      tabs+=name;
      if(cnt) tabs+='<span class="cup-badge">'+cnt+'</span>';
      tabs+='</div>';
    });
    tabs+='</div>';

    // Content for active round
    var content = '';
    var activeMs = rounds[cupActiveRound]||[];
    var activeName = CUP_ROUND_NAMES[cupActiveRound]||('Runde '+cupActiveRound);

    if(cupActiveRound >= 4){
      // Bracket view for QF+
      content = renderCupBracket(rounds);
    } else {
      // List view for earlier rounds
      content = renderCupRound(activeMs, activeName);
    }

    set('spielplan-body', tabs + content);
  } catch(e){ set('spielplan-body', err('Pokal-Spielplan nicht verfügbar')); }
}

async function loadPlan(league, btn){
  activateBtn(btn);
  pushLeagueUrl(league,'spielplan');

  // Cup leagues get special bracket display
  if(CUP_LEAGUES.indexOf(league) !== -1){
    cupActiveRound = 0;
    return loadCupPlan(league);
  }

  set('spielplan-body', spin());
  try {
    var meta = LG[league]||{name:league,cc:'de'};
    var grp  = await apicall({action:'currentgroup', league:league});
    var noMd = grp && grp.noMatchdays;
    var curMd = (grp && grp.groupOrderID) ? grp.groupOrderID : 1;

    if (noMd) {
      var allMs = await apicall({action:'matchday', league:league, season:SEASON});
      if (!Array.isArray(allMs)) allMs = [];
      var upcom = allMs.filter(function(m){ return !m.matchIsFinished; }).slice(0, 30);
      var recnt = allMs.filter(function(m){ return m.matchIsFinished; }).slice(-10).reverse();
      var h = '';
      if (upcom.length) h += '<p class="slbl">'+flag(meta.cc)+' Kommende Spiele</p><div class="mcard"><div class="mrows">'+upcom.map(mrow).join('')+'</div></div>';
      if (recnt.length) h += '<p class="slbl">'+flag(meta.cc)+' Letzte Ergebnisse</p><div class="mcard"><div class="mrows">'+recnt.map(function(m){return '<div style="opacity:.5">'+mrow(m)+'</div>';}).join('')+'</div></div>';
      set('spielplan-body', h || '<div class="empty">Keine Spieldaten verfügbar</div>');
      return;
    }

    var mds  = [curMd, curMd+1, curMd+2].filter(function(d){return d >= 1 && d <= 38;});
    var data = await Promise.all(mds.map(function(g){
      return apicall({action:'matchday', league:league, season:SEASON, group:g});
    }));

    var sections = [];
    data.forEach(function(ms, i){
      if(!Array.isArray(ms)||!ms.length) return;
      var finished = ms.every(function(m){ return m.matchIsFinished; });
      var upcoming = ms.filter(function(m){ return !m.matchIsFinished; });
      var mdNum = mds[i];
      var mdName = (ms[0] && ms[0].group && ms[0].group.groupName) ? ms[0].group.groupName : ('Spieltag ' + mdNum);
      var allRows = ms.map(function(m){
        return m.matchIsFinished ? '<div style="opacity:.45">'+mrow(m)+'</div>' : mrow(m);
      });
      if(!finished || upcoming.length > 0) {
        sections.push({mdName: mdName, rows: allRows, upcoming: upcoming.length, total: ms.length});
      }
    });

    if(!sections.length){
      sections.push({mdName: 'Spieltag ' + (curMd+3), rows: ['<div class="empty">Keine kommenden Spiele geplant</div>'], upcoming: 0, total: 0});
    }

    var html = '';
    sections.forEach(function(sec){
      var badge = sec.upcoming > 0
        ? '<span style="font-size:10px;color:var(--ac);font-weight:700">'+sec.upcoming+' ausstehend</span>'
        : '<span style="font-size:10px;color:var(--c3)">Abgeschlossen</span>';
      html += '<p class="slbl">'+flag(meta.cc)+' '+sec.mdName+' '+badge+'</p>'+
              '<div class="mcard"><div class="mrows">'+sec.rows.join('')+'</div></div>';
    });

    set('spielplan-body', html);
  } catch(e){ set('spielplan-body', err('Spielplan nicht verfügbar')); }
}

async function loadPlanAt(league, matchday, btn){
  activateBtn(btn);
  set('spielplan-body', spin());
  try {
    var meta = LG[league]||{name:league,cc:'de'};
    var mds  = [matchday, matchday+1].filter(function(d){return d>=1&&d<=38;});
    var data = await Promise.all(mds.map(function(g){
      return apicall({action:'matchday',league:league,season:SEASON,group:g});
    }));
    var html = '';
    data.forEach(function(ms, i){
      if(!Array.isArray(ms)||!ms.length) return;
      var g = mds[i];
      var mdName = (ms[0]&&ms[0].group&&ms[0].group.groupName) ? ms[0].group.groupName : 'Spieltag '+g;
      var upcoming = ms.filter(function(m){return !m.matchIsFinished;}).length;
      var badge = upcoming > 0
        ? '<span style="font-size:10px;color:var(--ac);font-weight:600">'+upcoming+' ausstehend</span>'
        : '<span style="font-size:10px;color:var(--c3)">Abgeschlossen</span>';
      var rows = ms.map(function(m){
        var row = mrow(m);
        return m.matchIsFinished ? '<div style="opacity:.45;pointer-events:none">'+row+'</div>' : row;
      });
      html += '<p class="slbl">'+flag(meta.cc)+' '+mdName+' '+badge+'</p>'+
              '<div class="mcard"><div class="mrows">'+rows.join('')+'</div></div>';
    });
    set('spielplan-body', html || err('Keine Daten'));
  } catch(e){ set('spielplan-body', err('Spielplan nicht verfügbar')); }
}

// ── ERGEBNISSE — finished matches with scores ────────────────────────────────
async function loadResults(league, btn){
  activateBtn(btn);
  pushLeagueUrl(league,'ergebnisse');
  set('ergebnisse-body', spin());
  try {
    var meta = LG[league]||{name:league,cc:'de'};
    var grp  = await apicall({action:'currentgroup', league:league});
    var curMd = (grp && grp.groupOrderID) ? grp.groupOrderID : 1;

    // Load last 3 finished matchdays from current going backwards
    var groups = [];
    for(var g = curMd; g >= 1 && groups.length < 3; g--){
      groups.push(g);
    }

    var data = await Promise.all(groups.map(function(g){
      return apicall({action:'matchday', league:league, season:SEASON, group:g});
    }));

    // Build matchday nav
    var navBtns = groups.map(function(g, i){
      return '<button class="vbtn'+(i===0?' on':'')+'" onclick="loadResultsAt(\''+league+'\','+g+',this)">'+
        (data[i] && data[i][0] && data[i][0].group && data[i][0].group.groupName
          ? data[i][0].group.groupName
          : 'ST '+g)+'</button>';
    }).join('');

    var html = '<div class="vc" style="margin-bottom:14px">'+
      '<button class="vbtn" onclick="loadResultsAt(\''+league+'\','+(groups[groups.length-1]-1)+',this)" '+
        (groups[groups.length-1]<=1?'disabled':'')+'>'+
        '<span class="icon icon-s">chevron_left</span> Ältere</button>'+
      navBtns+
      '<button class="vbtn" onclick="loadResultsAt(\''+league+'\','+(curMd+1)+',this)">'+
        'Spielplan <span class="icon icon-s">chevron_right</span></button>'+
      '</div>';

    // Render each matchday — only show finished matches
    groups.forEach(function(g, i){
      var ms = data[i];
      if(!Array.isArray(ms)||!ms.length) return;
      var finished = ms.filter(function(m){ return m.matchIsFinished; });
      if(!finished.length) return;

      var mdName = (ms[0]&&ms[0].group&&ms[0].group.groupName) ? ms[0].group.groupName : 'Spieltag '+g;

      // Group by date within matchday
      var byDate = {};
      finished.forEach(function(m){
        var dt = new Date(m.matchDateTime||'');
        var dk = isNaN(dt.getTime()) ? 'Unbekannt' :
          dt.toLocaleDateString('de-DE',{weekday:'long',day:'2-digit',month:'2-digit',year:'numeric'});
        (byDate[dk] = byDate[dk]||[]).push(m);
      });

      html += '<p class="slbl">'+flag(meta.cc)+' '+mdName+
        '<span style="margin-left:8px;font-size:10px;color:var(--c3)">'+finished.length+' Spiele</span></p>';

      Object.keys(byDate).forEach(function(dk){
        html += '<div class="mcard">'+
          '<div class="mcard-hdr" onclick="this.parentElement.classList.toggle(\'coll\')">'+
            '<div class="mcard-hdr-l"><span class="icon icon-s" style="color:var(--c3)">calendar_today</span>'+
            '<span class="mcard-title">'+dk+'</span></div>'+
            '<div class="mcard-r"><span class="mcard-count">'+byDate[dk].length+' Spiele</span>'+
            '<span class="icon mcard-tog">expand_more</span></div>'+
          '</div>'+
          '<div class="mrows">'+byDate[dk].map(mrow).join('')+'</div></div>';
      });
    });

    if(!html.includes('mrow')) {
      html += err('Keine abgeschlossenen Spiele gefunden');
    }

    set('ergebnisse-body', html);
  } catch(e){ set('ergebnisse-body', err('Ergebnisse nicht verfügbar')); }
}

async function loadResultsAt(league, matchday, btn){
  activateBtn(btn);
  set('ergebnisse-body', spin());
  try {
    var meta = LG[league]||{name:league,cc:'de'};
    var mds  = [matchday, matchday-1].filter(function(d){return d>=1;});
    var data = await Promise.all(mds.map(function(g){
      return apicall({action:'matchday',league:league,season:SEASON,group:g});
    }));
    var html = '<div class="vc" style="margin-bottom:14px">'+
      '<button class="vbtn" onclick="loadResultsAt(\''+league+'\','+(matchday-2)+',this)" '+(matchday<=2?'disabled':'')+'>'+
        '<span class="icon icon-s">chevron_left</span> Ältere</button>'+
      '<button class="vbtn on">ST '+matchday+'</button>'+
      '<button class="vbtn" onclick="loadResultsAt(\''+league+'\','+(matchday+1)+',this)">'+
        'ST '+(matchday+1)+' <span class="icon icon-s">chevron_right</span></button>'+
      '</div>';
    data.forEach(function(ms, i){
      if(!Array.isArray(ms)||!ms.length) return;
      var g = mds[i];
      var finished = ms.filter(function(m){return m.matchIsFinished;});
      if(!finished.length) return;
      var mdName = (ms[0]&&ms[0].group&&ms[0].group.groupName) ? ms[0].group.groupName : 'Spieltag '+g;
      var byDate = {};
      finished.forEach(function(m){
        var dt = new Date(m.matchDateTime||'');
        var dk = isNaN(dt.getTime()) ? 'Unbekannt' :
          dt.toLocaleDateString('de-DE',{weekday:'short',day:'2-digit',month:'2-digit'});
        (byDate[dk]=byDate[dk]||[]).push(m);
      });
      html += '<p class="slbl">'+flag(meta.cc)+' '+mdName+'</p>';
      Object.keys(byDate).forEach(function(dk){
        html += '<div class="mcard"><div class="mcard-hdr" onclick="this.parentElement.classList.toggle(\'coll\')">'+
          '<div class="mcard-hdr-l"><span class="icon icon-s" style="color:var(--c3)">calendar_today</span>'+
          '<span class="mcard-title">'+dk+'</span></div>'+
          '<div class="mcard-r"><span class="mcard-count">'+byDate[dk].length+'</span>'+
          '<span class="icon mcard-tog">expand_more</span></div></div>'+
          '<div class="mrows">'+byDate[dk].map(mrow).join('')+'</div></div>';
      });
    });
    set('ergebnisse-body', html || err('Keine Ergebnisse'));
  } catch(e){ set('ergebnisse-body', err('Fehler beim Laden')); }
}

// ── STATISTIK ────────────────────────────────────────────────────────────────
async function loadStats(league, btn){
  activateBtn(btn);
  pushLeagueUrl(league,'stats');
  set('stats-body', spin());
  try {
    var meta = LG[league]||{name:league,cc:'de'};
    var d    = await apicall({action:'table',league:league,season:SEASON});
    if (!d||!d.length) throw new Error('empty');

    // ── KPI summary ──
    var totalGoals = d.reduce(function(s,r){return s+(r.goals||0)+(r.opponentGoals||0);},0)/2;
    var totalGames = d.reduce(function(s,r){return s+(r.matches||0);},0)/2;
    var avgGoals   = totalGames ? (totalGoals/totalGames).toFixed(1) : '–';
    var nTeams = d.length;
    var topN = Math.min(nTeams, 10);

    var html = '<div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(90px,1fr));gap:8px;margin-bottom:12px">';
    [{l:'Spiele',v:Math.round(totalGames),c:'var(--c1)'},{l:'Tore',v:Math.round(totalGoals),c:'var(--grn)'},{l:'Ø Tore/Spiel',v:avgGoals,c:'var(--ac)'}].forEach(function(k){
      html+='<div style="background:var(--s0);border-radius:var(--r-lg);padding:14px 8px;text-align:center"><div style="font-size:22px;font-weight:800;color:'+k.c+'">'+k.v+'</div><div style="font-size:9px;color:var(--c3);text-transform:uppercase;letter-spacing:.4px;margin-top:3px">'+k.l+'</div></div>';
    });
    html += '</div>';

    // ── Torstarke Teams (compact rows) ──
    var gpgD = d.slice().sort(function(a,b){return(b.goals||0)-(a.goals||0);}).slice(0,topN);
    var maxG = gpgD[0]?(gpgD[0].goals||1):1;
    html += '<div class="sv-card" style="margin-bottom:10px"><div class="sv-hdr"><span class="icon icon-s">bolt</span>Torstarke Teams</div><div style="padding:6px 14px">';
    gpgD.forEach(function(r,i){
      var pct=Math.round(((r.goals||0)/maxG)*100);
      var ic=r.teamIconUrl?'<img src="'+r.teamIconUrl+'" width="16" height="16" style="object-fit:contain;flex-shrink:0" loading="lazy" onerror="this.style.display=\'none\'">':'';
      html+='<div style="display:flex;align-items:center;gap:8px;padding:5px 0;border-bottom:1px solid var(--bd)">'+
        '<div style="font-size:10px;font-weight:700;color:var(--c3);width:16px;text-align:right;flex-shrink:0">'+(i+1)+'</div>'+ic+
        '<div style="font-size:12px;font-weight:500;width:80px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:0">'+(r.shortName||r.teamName)+'</div>'+
        '<div style="flex:1;height:6px;background:var(--s2);border-radius:3px;overflow:hidden"><div style="height:100%;width:'+pct+'%;background:var(--grn);border-radius:3px"></div></div>'+
        '<div style="font-size:12px;font-weight:800;min-width:24px;text-align:right">'+(r.goals||0)+'</div></div>';
    });
    html += '</div></div>';

    // ── Beste Defensive (compact rows) ──
    var defD = d.slice().sort(function(a,b){return(a.opponentGoals||99)-(b.opponentGoals||99);}).slice(0,topN);
    var maxDef = defD.length?Math.max.apply(null,defD.map(function(r){return r.opponentGoals||0;}))||1:1;
    html += '<div class="sv-card" style="margin-bottom:10px"><div class="sv-hdr"><span class="icon icon-s">shield</span>Beste Defensive</div><div style="padding:6px 14px">';
    defD.forEach(function(r,i){
      var pct=Math.round(((r.opponentGoals||0)/maxDef)*100);
      var ic=r.teamIconUrl?'<img src="'+r.teamIconUrl+'" width="16" height="16" style="object-fit:contain;flex-shrink:0" loading="lazy" onerror="this.style.display=\'none\'">':'';
      html+='<div style="display:flex;align-items:center;gap:8px;padding:5px 0;border-bottom:1px solid var(--bd)">'+
        '<div style="font-size:10px;font-weight:700;color:var(--c3);width:16px;text-align:right;flex-shrink:0">'+(i+1)+'</div>'+ic+
        '<div style="font-size:12px;font-weight:500;width:80px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:0">'+(r.shortName||r.teamName)+'</div>'+
        '<div style="flex:1;height:6px;background:var(--s2);border-radius:3px;overflow:hidden"><div style="height:100%;width:'+pct+'%;background:var(--ac);border-radius:3px"></div></div>'+
        '<div style="font-size:12px;font-weight:800;min-width:24px;text-align:right">'+(r.opponentGoals||0)+'</div></div>';
    });
    html += '</div></div>';

    // ── Bilanz S/U/N (compact stacked bars) ──
    html += '<div class="sv-card" style="margin-bottom:10px"><div class="sv-hdr"><span class="icon icon-s">stacked_bar_chart</span>Bilanz</div><div style="padding:6px 14px">';
    d.forEach(function(r,i){
      var tot=(r.won||0)+(r.draw||0)+(r.lost||0)||1;
      var wp=Math.round(((r.won||0)/tot)*100),dp=Math.round(((r.draw||0)/tot)*100),lp=100-wp-dp;
      var ic=r.teamIconUrl?'<img src="'+r.teamIconUrl+'" width="16" height="16" style="object-fit:contain;flex-shrink:0" loading="lazy" onerror="this.style.display=\'none\'">':'';
      html+='<div style="display:flex;align-items:center;gap:6px;padding:4px 0;border-bottom:1px solid var(--bd)">'+
        '<div style="font-size:10px;color:var(--c3);width:14px;text-align:right;flex-shrink:0">'+(i+1)+'</div>'+ic+
        '<div style="font-size:11px;font-weight:500;width:70px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:0">'+(r.shortName||r.teamName)+'</div>'+
        '<div style="flex:1;display:flex;height:8px;border-radius:4px;overflow:hidden">'+
          '<div style="width:'+wp+'%;background:var(--grn)"></div>'+
          '<div style="width:'+dp+'%;background:var(--yel)"></div>'+
          '<div style="width:'+lp+'%;background:var(--live)"></div></div>'+
        '<div style="font-size:10px;font-weight:600;color:var(--c2);min-width:44px;text-align:right;font-variant-numeric:tabular-nums">'+r.won+'S '+r.draw+'U '+r.lost+'N</div></div>';
    });
    html += '<div style="display:flex;gap:12px;margin-top:6px;font-size:10px;color:var(--c3)">'+
      '<span style="display:flex;align-items:center;gap:3px"><span style="width:8px;height:8px;background:var(--grn);border-radius:2px"></span>Siege</span>'+
      '<span style="display:flex;align-items:center;gap:3px"><span style="width:8px;height:8px;background:var(--yel);border-radius:2px"></span>Remis</span>'+
      '<span style="display:flex;align-items:center;gap:3px"><span style="width:8px;height:8px;background:var(--live);border-radius:2px"></span>Niederlagen</span>'+
    '</div></div></div>';

    set('stats-body', html);
  } catch(e){ set('stats-body', err('Statistik nicht verfügbar. Kurz warten und neu laden.')); }
}

// ── SIDEBAR ──────────────────────────────────────────────────────────────────
async function loadSidebar(){
  // Use selected league for sidebar, default to bl1
  var sLg = initLg || 'bl1';
  var sLgMeta = LG[sLg]||{name:sLg,cc:'de'};
  var isCup = CUP_LEAGUES.indexOf(sLg) !== -1;

  // Table widget (skip for cups)
  if(!isCup){
    try {
      var d=await apicall({action:'table',league:sLg,season:SEASON});
      if(d&&d.length){
        var html=d.slice(0,10).map(function(r,i){
          var tUrl='/verein/'+(r.teamInfoId||0)+'/'+slug(r.teamName||'')+'?lg='+sLg;
          return '<a href="'+tUrl+'" style="display:grid;grid-template-columns:20px 1fr 26px;gap:5px;padding:5px 0;border-bottom:1px solid var(--bd);text-decoration:none;color:inherit;align-items:center">'+
            '<div style="font-size:11px;color:var(--c3);text-align:center">'+(i+1)+'</div>'+
            '<div style="display:flex;align-items:center;gap:5px;font-size:12px;font-weight:600;overflow:hidden;white-space:nowrap;text-overflow:ellipsis">'+
              (r.teamIconUrl?'<img src="'+r.teamIconUrl+'" style="width:15px;height:15px;object-fit:contain;flex-shrink:0" loading="lazy" onerror="this.style.display=\'none\'" alt="">':'')+
              (r.shortName||r.teamName)+
            '</div>'+
            '<div style="font-weight:800;font-size:13px;text-align:right">'+(r.points||0)+'</div>'+
          '</a>';
        }).join('');
        var tblUrl = '/'+(LG_BASE[sLg]||'bundesliga')+'/tabelle';
        html+='<a href="'+tblUrl+'" style="display:block;text-align:center;margin-top:8px;font-size:12px;color:var(--ac);font-weight:600">Vollständige Tabelle →</a>';
        set('sw-tbl', html);
        // Update widget header
        var swHdr=document.querySelector('#sw-tbl-wrap .w-hdr span:last-child');
        if(swHdr) swHdr.textContent=sLgMeta.name+' Tabelle';
      }
    } catch(e){}
  } else {
    set('sw-tbl','<div class="empty" style="padding:10px;font-size:11px">Pokalwettbewerb – keine Tabelle</div>');
  }

  // Next matches
  try {
    var d2=await apicall({action:'live',league:sLg});
    if(Array.isArray(d2)){
      var up=d2.filter(function(m){return !m.matchIsFinished;}).slice(0,5);
      set('sw-next', up.length?up.map(function(m){
        var h1=(m.team1&&m.team1.shortName)||'?', a1=(m.team2&&m.team2.shortName)||'?';
        var ic1=(m.team1&&m.team1.teamIconUrl)||'', ic2=(m.team2&&m.team2.teamIconUrl)||'';
        var dt3=new Date(m.matchDateTime||'');
        var ds=isNaN(dt3.getTime())?'':dt3.toLocaleDateString('de-DE',{weekday:'short',day:'2-digit',month:'2-digit'});
        var ts2=isNaN(dt3.getTime())?'':dt3.toLocaleTimeString('de-DE',{hour:'2-digit',minute:'2-digit'});
        var url=m.matchID?'/spiel/'+m.matchID+'/'+slug(m.team1&&m.team1.teamName||'')+'-vs-'+slug(m.team2&&m.team2.teamName||''):'#';
        var logo = function(u){return u?'<img src="'+u+'" width="18" height="18" style="object-fit:contain;flex-shrink:0" onerror="this.style.display=\'none\'" loading="lazy">':'';};
        return '<a href="'+url+'" style="display:flex;align-items:center;gap:8px;padding:8px 0;border-bottom:1px solid var(--bd);text-decoration:none;color:inherit">'+
          '<div style="display:flex;align-items:center;gap:4px;flex:1;min-width:0">'+
            logo(ic1)+'<span style="font-size:12px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">'+h1+'</span>'+
          '</div>'+
          '<span style="font-size:10px;color:var(--c3);flex-shrink:0">'+ts2+'</span>'+
          '<div style="display:flex;align-items:center;gap:4px;flex:1;min-width:0;justify-content:flex-end">'+
            '<span style="font-size:12px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right">'+a1+'</span>'+logo(ic2)+
          '</div>'+
        '</a>';
      }).join(''):'<div class="empty" style="padding:12px">Keine bevorstehenden Spiele</div>');
    }
  } catch(e){}

  // News & odds for selected league
  loadNews(sLg);
  loadOdds(sLg);
}

async function loadNews(sport){
  var el = document.getElementById('sw-news');
  // Try server-side proxy first, then rss2json.com as client-side fallback
  var news = null;

  // Server proxy
  try {
    var r = await fetch('/api/news.php?sport='+(sport||'bl1')+'&limit=6&_t='+Date.now());
    if(r.ok){
      var d = await r.json();
      if(Array.isArray(d) && d.length >= 1) news = d;
    }
  } catch(e){}

  // Client-side fallback: rss2json.com (free, no auth, CORS ok)
  if(!news){
    var queryMap = {bl1:'Bundesliga',bl2:'2+Bundesliga',bl3:'3+Liga',dfb:'DFB+Pokal',oefb:'Bundesliga+Oesterreich',snl:'Super+League+Schweiz'};
    var q = queryMap[sport] || 'Bundesliga';
    var rssFeed = 'https://news.google.com/rss/search?q='+q+'&hl=de&gl=DE&ceid=DE:de';
    try {
      var apiUrl = 'https://api.rss2json.com/v1/api.json?rss_url='+encodeURIComponent(rssFeed)+'&api_key=public&count=6';
      var r2 = await fetch(apiUrl);
      if(r2.ok){
        var d2 = await r2.json();
        if(d2.status==='ok' && Array.isArray(d2.items) && d2.items.length){
          news = d2.items.map(function(it){
            var dt = it.pubDate ? new Date(it.pubDate) : new Date();
            return {
              title:  it.title,
              link:   it.link,
              img:    it.thumbnail||it.enclosure&&it.enclosure.link||'',
              source: it.author||'Google News',
              date:   dt.toLocaleDateString('de-DE',{day:'2-digit',month:'2-digit'}),
              time:   dt.toLocaleTimeString('de-DE',{hour:'2-digit',minute:'2-digit'})
            };
          });
        }
      }
    } catch(e2){}
  }

  // Sort by team relevance if we have cached match data
  if(news && todayCache){
    var teamNames = [];
    var sData = todayCache[sport] || [];
    sData.forEach(function(m){
      if(m.team1&&m.team1.teamName) teamNames.push(m.team1.teamName.toLowerCase());
      if(m.team2&&m.team2.teamName) teamNames.push(m.team2.teamName.toLowerCase());
      if(m.team1&&m.team1.shortName) teamNames.push(m.team1.shortName.toLowerCase());
      if(m.team2&&m.team2.shortName) teamNames.push(m.team2.shortName.toLowerCase());
    });
    if(teamNames.length){
      news.sort(function(a,b){
        var aMatch = teamNames.some(function(t){ return a.title.toLowerCase().indexOf(t) !== -1; });
        var bMatch = teamNames.some(function(t){ return b.title.toLowerCase().indexOf(t) !== -1; });
        if(aMatch && !bMatch) return -1;
        if(!aMatch && bMatch) return 1;
        return 0;
      });
    }
  }

  if(!news || !news.length){
    if(el) el.innerHTML = '<div style="padding:10px 13px;font-size:11px;color:var(--c3);text-align:center">Keine News verfügbar</div>';
    return;
  }

  if(el) el.style.padding = '6px 14px';
  var html = news.map(function(n){
    var srcLetter = (n.source||'N').charAt(0).toUpperCase();
    var placeholder = '<div style="width:56px;height:42px;background:var(--ac-l);border-radius:var(--r);display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:11px;font-weight:800;color:var(--ac)">'+srcLetter+'</div>';
    var thumb = n.img
      ? '<img src="'+n.img+'" width="56" height="42" alt="" loading="lazy" onerror="this.style.display=\'none\'" style="width:56px;max-width:56px;height:42px;object-fit:cover;border-radius:var(--r);flex-shrink:0;background:var(--s2);display:block">'
      : placeholder;
    return '<a href="'+n.link+'" target="_blank" rel="noopener" class="nitem">'+
      '<div style="flex-shrink:0">'+thumb+'</div>'+
      '<div style="min-width:0;flex:1">'+
        '<div class="ntitle">'+n.title+'</div>'+
        '<div class="nmeta"><span class="nsrc">'+(n.source||'')+'</span>'+(n.date?' · '+n.date+' '+n.time:'')+
      '</div></div></a>';
  }).join('');
  if(el) el.innerHTML = html;
}

async function loadOdds(league){
  var widget = document.getElementById('sw-odds-widget');
  try {
    var r = await fetch('/api/odds.php?league='+(league||'bl1')+'&_t='+Date.now());
    if(!r.ok) throw new Error('HTTP '+r.status);
    var data = await r.json();
    if(!data || data.error || !Array.isArray(data) || !data.length){
      if(widget) widget.style.display = 'none';
      return;
    }
    // Cache odds for match rows
    data.forEach(function(ev){
      var key=(ev.home||'').toLowerCase()+'|'+(ev.away||'').toLowerCase();
      if(ev.odds) oddsCache[key]=ev.odds;
    });
    var html = data.slice(0,6).map(function(ev){
      var o = ev.odds||{};
      var dt = ev.time ? new Date(ev.time) : null;
      var ds = dt && !isNaN(dt.getTime())
        ? dt.toLocaleDateString('de-DE',{weekday:'short',day:'2-digit',month:'2-digit'})+' '+dt.toLocaleTimeString('de-DE',{hour:'2-digit',minute:'2-digit'})
        : '';
      var vals = [o.home, o.draw, o.away].filter(function(v){return v && v > 0;});
      var mn = vals.length ? Math.min.apply(null, vals) : 0;
      function obtn(lbl, val){
        var best = val && mn > 0 && val === mn;
        return '<div class="odds-btn'+(best?' best':'')+'">'+
          '<div class="odds-lbl">'+lbl+'</div>'+
          '<div class="odds-val">'+(val && val>0 ? val.toFixed(2) : '–')+'</div>'+
          '</div>';
      }
      return '<div class="odds-row">'+
        '<div style="min-width:0">'+
          '<div class="odds-teams">'+(ev.home||'?')+' – '+(ev.away||'?')+'</div>'+
          '<div class="odds-time">'+ds+'</div>'+
        '</div>'+
        '<div class="odds-btns">'+obtn('1',o.home)+obtn('X',o.draw)+obtn('2',o.away)+'</div>'+
      '</div>';
    }).join('');
    set('sw-odds', html || '<div style="padding:10px;font-size:11px;color:var(--c3)">Keine Quoten verfügbar</div>');
  } catch(e){
    if(widget) widget.style.display = 'none';
  }
}

// ── INIT ─────────────────────────────────────────────────────────────────────
// DOMContentLoaded ensures all scripts (incl. footer) are parsed before init runs
document.addEventListener('DOMContentLoaded', async function(){
  updateNavLabel();
  // Pre-load odds so they're available when matches render
  try{
    var or=await fetch('/api/odds.php?league='+(initLg||'bl1')+'&_t='+Date.now());
    if(or.ok){var od=await or.json();if(Array.isArray(od))od.forEach(function(ev){
      var key=(ev.home||'').toLowerCase()+'|'+(ev.away||'').toLowerCase();
      if(ev.odds)oddsCache[key]=ev.odds;
    });}
  }catch(e){}
  if(view==='heute'){
    loadMatchday();
  } else if(view==='tabelle'){
    var b=document.querySelector('#vc-tabelle .vbtn.on');
    loadTable(initLg, b);
  } else if(view==='spielplan'){
    var b=document.querySelector('#vc-spielplan .vbtn.on');
    loadPlan(initLg, b);
  } else if(view==='ergebnisse'){
    var b=document.querySelector('#vc-ergebnisse .vbtn.on');
    loadResults(initLg, b);
  } else if(view==='stats'){
    var b=document.querySelector('#vc-stats .vbtn.on');
    loadStats(initLg, b);
  }
  loadSidebar();
  loadMainNews();
});

async function loadMainNews(){
  var el=document.getElementById('main-news');
  if(!el) return;
  var lg=initLg||'bl1';
  try{
    var r=await fetch('/api/news.php?sport='+lg+'&limit=6&_t='+Date.now());
    if(!r.ok) return;
    var news=await r.json();
    if(!Array.isArray(news)||!news.length) return;
    var meta=LG[lg]||{name:lg,cc:'de'};
    var lgBase=LG_BASE[lg]||'bundesliga';
    var html='<p class="slbl"><span class="icon icon-s">newspaper</span>'+meta.name+' Nachrichten</p>';
    html+='<div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(min(260px,100%),1fr));gap:10px">';
    news.forEach(function(n){
      if(n.img){
        html+='<a href="'+n.link+'" target="_blank" rel="noopener" style="background:var(--s0);border-radius:var(--r-lg);overflow:hidden;text-decoration:none;color:inherit;display:flex;flex-direction:column">';
        html+='<div style="height:110px;overflow:hidden;background:var(--s1)"><img src="'+n.img+'" alt="" loading="lazy" onerror="this.parentElement.style.display=\'none\'" style="width:100%;height:100%;object-fit:cover;display:block"></div>';
      } else {
        html+='<a href="'+n.link+'" target="_blank" rel="noopener" style="background:var(--s0);border-radius:var(--r-lg);overflow:hidden;text-decoration:none;color:inherit;display:flex;flex-direction:column">';
        html+='<div style="height:110px;background:linear-gradient(135deg,var(--s1) 0%,var(--s2) 100%);display:flex;align-items:center;justify-content:center"><span class="icon" style="font-size:32px;color:var(--c4)">article</span></div>';
      }
      html+='<div style="padding:10px 12px;flex:1;display:flex;flex-direction:column">';
      html+='<div style="font-size:13px;font-weight:700;line-height:1.35;color:var(--c1);margin-bottom:4px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden">'+n.title+'</div>';
      if(n.desc) html+='<div style="font-size:11px;color:var(--c3);line-height:1.4;margin-bottom:6px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden">'+n.desc+'</div>';
      html+='<div style="margin-top:auto;display:flex;align-items:center;gap:5px;font-size:10px;color:var(--c3)">';
      html+='<span style="color:var(--ac);font-weight:600">'+(n.source||'')+'</span>';
      html+='<span style="margin-left:auto">'+(n.date||'')+' '+(n.time||'')+'</span>';
      html+='</div></div></a>';
    });
    html+='</div>';
    html+='<a href="/'+lgBase+'/nachrichten" style="display:block;text-align:center;margin-top:10px;font-size:12px;color:var(--ac);font-weight:700">Alle '+meta.name+' Nachrichten →</a>';
    el.innerHTML=html;
  }catch(e){}
}
</script>

<footer>
<div class='flinks'>
  <a href='/bundesliga/tabelle'>Bundesliga</a>
  <a href='/2-bundesliga/tabelle'>2. Bundesliga</a>
  <a href='/3-liga/tabelle'>3. Liga</a>
  <a href='/dfb-pokal/ergebnisse'>DFB-Pokal</a>
  <a href='/oesterreich/tabelle'>Österreich</a>
  <a href='/schweiz/tabelle'>Schweiz</a>
  <a href='/nachrichten'>Nachrichten</a>
  <a href='/fussball-heute-im-tv'>TV</a>
</div>
<div class='flinks' style='margin-top:4px;font-size:11px'>
  <a href='/oesterreich/heute'>Österreich</a>
  <a href='/oesterreich-2-liga/heute'>ÖL2</a>
  <a href='/schweiz/heute'>Schweiz</a>
  <a href='/challenge-league/heute'>Challenge L.</a>
  <a href='/luxemburg/heute'>Luxemburg</a>
  <a href='/frauen-bundesliga/heute'>Frauen-BL</a>
</div>
<div class='flinks' style='margin-top:4px;font-size:11px'>
  <a href='/ueber-uns'>Über uns</a>
  <a href='/kontakt'>Kontakt</a>
  <a href='/impressum'>Impressum</a>
  <a href='/datenschutz'>Datenschutz</a>
</div>
<div style='margin-top:8px;border-top:1px solid rgba(255,255,255,.1);padding-top:10px;font-size:10px;color:rgba(255,255,255,.25)'>Daten: OpenLigaDB (ODbL), TheSportsDB, ESPN</div>
<div style='margin-top:4px;font-size:10px;color:rgba(255,255,255,.25)'>&copy; 2026 ergebnisse1.de | Fußball-Ergebnisse, Tabellen &amp; Statistiken</div>
</footer>
<div class='toast' id='toast'></div>
<script>
function showToast(m){var t=document.getElementById('toast');t.textContent=m;t.classList.add('show');setTimeout(function(){t.classList.remove('show');},2500);}
// Check live matches for header LIVE button
(function checkLive(){
  var btn=document.getElementById('hdrLive');
  if(!btn) return;
  var lgs=['bl1','bl2','bl3','dfb','oefb','snl'];
  Promise.allSettled(lgs.map(function(l){return fetch('/api/proxy.php?action=live&league='+l).then(function(r){return r.json();});})).then(function(results){
    var total=0;
    results.forEach(function(r){
      if(r.status!=='fulfilled'||!Array.isArray(r.value)) return;
      r.value.forEach(function(m){
        if(m.matchIsFinished) return;
        var dt=new Date(m.matchDateTime||'');
        if(isNaN(dt.getTime())) return;
        var diff=(Date.now()-dt)/60000;
        if(diff>=0&&diff<130) total++;
      });
    });
    if(total>0){btn.style.display='flex';btn.innerHTML='<span class="dot-live"></span>LIVE <span style="font-weight:400;opacity:.7">('+total+')</span>';}
    else{btn.style.display='none';}
  });
  setTimeout(checkLive,60000);
})();
var srchTimer=null;
function toggleSearch(){
  var box=document.getElementById('srchBox'),res=document.getElementById('srchResults'),inp=document.getElementById('srchInput'),btn=document.querySelector('.srch-btn');
  if(box.classList.contains('open')){box.classList.remove('open');res.classList.remove('open');if(btn)btn.style.display='';inp.value='';}
  else{box.classList.add('open');if(btn)btn.style.display='none';setTimeout(function(){inp.focus();},100);}
}
function doSearch(q){
  clearTimeout(srchTimer);
  var res=document.getElementById('srchResults');
  if(!q||q.length<2){res.classList.remove('open');return;}
  srchTimer=setTimeout(function(){
    fetch('/api/proxy.php?action=search&q='+encodeURIComponent(q)).then(function(r){return r.json();}).then(function(d){
      if(!d||(!d.teams&&!d.players)){res.innerHTML='<div class="srch-empty">Keine Ergebnisse</div>';res.classList.add('open');return;}
      var html='';
      if(d.leagues&&d.leagues.length){d.leagues.forEach(function(l){
        html+='<a href="'+l.url+'" class="srch-item">'+(l.logo?'<img src="'+l.logo+'" onerror="this.style.display=\'none\'">':'')+'<div class="srch-item-info"><div class="srch-item-name">'+l.name+'</div><div class="srch-item-sub">Liga</div></div></a>';
      });}
      if(d.teams&&d.teams.length){d.teams.forEach(function(t){
        html+='<a href="'+t.url+'" class="srch-item">'+(t.icon?'<img src="'+t.icon+'" onerror="this.style.display=\'none\'">':'')+'<div class="srch-item-info"><div class="srch-item-name">'+t.name+'</div><div class="srch-item-sub">'+t.league+'</div></div></a>';
      });}
      if(d.players&&d.players.length){d.players.forEach(function(p){
        html+='<a href="'+p.url+'" class="srch-item"><span class="icon" style="font-size:20px;color:var(--c3)">person</span><div class="srch-item-info"><div class="srch-item-name">'+p.name+'</div><div class="srch-item-sub">'+p.team+' &middot; '+p.goals+' Tore</div></div></a>';
      });}
      if(!html) html='<div class="srch-empty">Keine Ergebnisse für "'+q+'"</div>';
      res.innerHTML=html;res.classList.add('open');
    }).catch(function(){res.innerHTML='<div class="srch-empty">Fehler</div>';res.classList.add('open');});
  },300);
}
document.addEventListener('click',function(e){var w=document.getElementById('srchWrap');if(w&&!w.contains(e.target)){var b=document.getElementById('srchBox'),r=document.getElementById('srchResults');if(b)b.classList.remove('open');if(r)r.classList.remove('open');var btn=document.querySelector('.srch-btn');if(btn)btn.style.display='';}});
function toggleCard(id){var el=document.getElementById(id);if(el)el.classList.toggle('coll');}
function activateBtn(btn){
  if(!btn)return;
  var c=btn.closest('.vc');
  if(c){c.querySelectorAll('.vbtn').forEach(function(b){b.classList.remove('on');});}
  btn.classList.add('on');
}
</script></body></html>