@font-face{font-family:'New Rocker';font-style:normal;font-weight:400;font-display:swap;src:url('/fonts/new-rocker-latin.woff2') format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'New Rocker';font-style:normal;font-weight:400;font-display:swap;src:url('/fonts/new-rocker-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
:root{--bg:#080403;--panel:rgba(18,12,10,.90);--panel2:rgba(29,18,15,.94);--line:rgba(255,255,255,.13);--text:#fff8ef;--muted:#d6c5b5;--accent:#e21b23;--danger:#e21b23;--warn:#ffbf2e;--ok:#20d36b;--blue:#f05a28;--band-bg:none}*{box-sizing:border-box}body{margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;background:radial-gradient(circle at 20% 0%,#1a1840,transparent 38%),linear-gradient(135deg,#05070b,#121827);color:var(--text);transition:background .3s}body:before{content:"";position:fixed;inset:0;background-image:linear-gradient(rgba(4,7,12,.78),rgba(4,7,12,.88)),var(--band-bg);background-size:cover;background-position:center;z-index:-1}body.green{--accent:var(--ok)}body.yellow{--accent:var(--warn)}body.red{--accent:var(--danger)}body.blue{--accent:var(--blue)}body.pulse{animation:pulsebg 1s infinite alternate}body.softpulse{animation:pulsebg 2.5s infinite alternate}@keyframes pulsebg{from{filter:none}to{filter:brightness(1.32)}}h1,h2,h3,p{margin-top:0}.muted{color:var(--muted)}.badge{display:inline-flex;align-items:center;gap:8px;border:1px solid color-mix(in srgb,var(--accent),white 20%);background:color-mix(in srgb,var(--accent),transparent 82%);color:var(--accent);padding:9px 14px;border-radius:999px;font-weight:950;text-transform:uppercase;letter-spacing:.05em}.badge:before{content:"●"}.kicker{color:var(--accent);font-weight:950;text-transform:uppercase;letter-spacing:.09em}.app-shell{display:grid;grid-template-columns:280px 1fr;min-height:100vh}.sidebar{background:rgba(3,6,12,.72);border-right:1px solid var(--line);padding:28px;display:flex;flex-direction:column;gap:30px}.brand{display:flex;gap:14px;align-items:center}.brand-mark{width:58px;height:58px;border-radius:18px;background:linear-gradient(135deg,var(--accent),#111827);display:grid;place-items:center;font-weight:1000;font-size:30px}.brand b,.brand span{display:block}.brand span{color:var(--muted);font-size:14px}nav{display:grid;gap:10px}nav a{padding:15px 16px;border-radius:14px;color:var(--muted);font-weight:800}nav a.active{background:color-mix(in srgb,var(--accent),transparent 78%);color:var(--text)}.connection{margin-top:auto;background:var(--panel);border:1px solid var(--line);border-radius:18px;padding:16px}.connection span{display:block;color:var(--ok);margin:8px 0}.connection strong{font-size:27px;font-variant-numeric:tabular-nums}.workspace{padding:24px;max-width:1500px;width:100%;margin:auto}.topbar,.top{display:flex;justify-content:space-between;align-items:center;gap:16px;margin-bottom:18px}.topbar h1{font-size:30px;margin-bottom:4px}.day-tabs{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:18px}.day-tabs button{min-width:170px}.dashboard{display:grid;grid-template-columns:minmax(0,1.55fr) minmax(320px,.75fr);gap:18px}.now-card,.card,.control-card,.mini-card,.public-now>div,.backstage-cards>div{background:var(--panel);border:1px solid var(--line);border-radius:24px;padding:22px;box-shadow:0 18px 60px rgba(0,0,0,.32);backdrop-filter:blur(12px)}.now-card{min-height:480px;display:flex;flex-direction:column;justify-content:center;text-align:center}.now-card h2{font-size:clamp(42px,6vw,96px);line-height:.96;letter-spacing:-.05em;margin:12px 0}.timer{font-size:clamp(80px,13vw,190px);line-height:.88;font-weight:1000;letter-spacing:-.075em;color:var(--accent);font-variant-numeric:tabular-nums}.timer.huge{font-size:clamp(120px,23vw,360px)}.stage-title{font-size:clamp(52px,8vw,142px);line-height:.96;font-weight:1000;letter-spacing:-.055em}.phase{font-size:clamp(22px,3vw,46px);font-weight:950;color:var(--muted)}.hint{font-size:clamp(26px,4vw,72px);color:var(--accent);min-height:1.1em;font-weight:1000}.big-hint{font-size:clamp(40px,7vw,110px)}.pill:not(:empty){display:inline-flex;align-self:center;margin:12px auto 0;border:1px solid var(--accent);border-radius:18px;padding:10px 22px;background:color-mix(in srgb,var(--accent),transparent 84%)}button{border:0;border-radius:15px;padding:15px 18px;background:#222b3c;color:var(--text);font-size:17px;font-weight:900;cursor:pointer;min-height:54px}button:hover{filter:brightness(1.13)}button.primary{background:linear-gradient(180deg,#38d86c,#12a747);color:white}button.danger{background:linear-gradient(180deg,#ff5b4f,#c92318);color:white}button.warn{background:linear-gradient(180deg,#ffd85a,#ca9409);color:#1b1300}.quick-actions,.controls,.buttons{display:grid;grid-template-columns:repeat(4,1fr);gap:11px;margin-top:20px}.buttons.big{grid-template-columns:repeat(3,1fr)}.buttons.big button{font-size:clamp(20px,2.4vw,34px);min-height:88px}.side-stack{display:grid;gap:18px}.mini-card span,.public-now span,.backstage-cards span,.info-grid span{display:block;color:var(--muted);font-weight:950;text-transform:uppercase;font-size:14px;letter-spacing:.06em}.mini-card b{display:block;font-size:clamp(28px,3vw,48px);margin:8px 0}.mini-card small{color:var(--muted)}input,textarea,select{width:100%;border:1px solid rgba(255,255,255,.14);background:#0b1019;color:var(--text);border-radius:14px;padding:13px;font-size:16px}textarea{min-height:210px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.inline,.message-row{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:10px}.message-row{grid-template-columns:1fr auto auto}.lower-grid{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-top:18px}.lower-grid .card:last-child{grid-column:1/-1}ul{list-style:none;padding:0;margin:0}.ro-list li,li{padding:13px;border-bottom:1px solid rgba(255,255,255,.08)}.ro-list li.active,li.active{background:color-mix(in srgb,var(--accent),transparent 84%);border:1px solid color-mix(in srgb,var(--accent),transparent 60%);border-radius:14px}.ro-list li b{font-size:20px}.ro-list li span,.ro-list li small,li span,li small{display:block;color:var(--muted);margin-top:4px}.display{min-height:100vh;display:flex;align-items:center;justify-content:center;text-align:center;padding:4vw}.display-inner{width:100%}.ultra-simple .display-inner{max-width:1500px}.screen{min-height:100vh;padding:3vw}.hero{text-align:center;margin-bottom:22px}.hero.compact .timer{font-size:clamp(90px,16vw,220px)}.info-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-top:18px}.info-grid>div{background:var(--panel);border:1px solid var(--line);border-radius:20px;padding:18px}.info-grid b{display:block;font-size:clamp(18px,2vw,34px);margin-top:8px}.public-now{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin:20px 0}.public-now b{font-size:clamp(34px,5vw,74px);display:block;color:var(--accent)}.public-row{display:grid;grid-template-columns:180px 1fr 170px;gap:20px;padding:18px;border-bottom:1px solid rgba(255,255,255,.12);font-size:clamp(22px,3vw,42px);text-align:left;align-items:baseline}.public-row.active{color:var(--accent);font-size:clamp(30px,4vw,58px)}.public-row em{color:var(--muted);font-style:normal}.split-display{display:grid;grid-template-columns:1.2fr .8fr;gap:26px;align-items:center}.split-display h1{font-size:clamp(58px,8vw,140px);letter-spacing:-.06em}.split-display h2{font-size:clamp(42px,7vw,110px);line-height:1;margin:10px 0}.backstage-cards{display:grid;gap:18px;text-align:left}.backstage-cards b{font-size:clamp(28px,4vw,62px);display:block;margin-top:10px}.kiosk-footer{margin-top:36px;color:var(--muted);font-size:clamp(18px,2vw,32px)}@media(max-width:1050px){.app-shell{grid-template-columns:1fr}.sidebar{display:none}.dashboard,.lower-grid,.split-display,.info-grid{grid-template-columns:1fr}.quick-actions,.buttons.big{grid-template-columns:1fr 1fr}.public-row{grid-template-columns:1fr}.message-row{grid-template-columns:1fr}.topbar{align-items:flex-start;flex-direction:column}}@media(max-width:700px){.workspace{padding:14px}.now-card,.card,.control-card,.mini-card{border-radius:18px;padding:16px}.quick-actions,.buttons.big,.public-now{grid-template-columns:1fr}.day-tabs button{min-width:0;flex:1}.timer{font-size:clamp(70px,24vw,150px)}}


/* RockArea A7 inspired skin */
body{background:radial-gradient(circle at 14% 6%,rgba(226,27,35,.28),transparent 32%),radial-gradient(circle at 82% 10%,rgba(255,191,46,.16),transparent 30%),linear-gradient(135deg,#060302,#150807 55%,#080403)}
body:before{background-image:linear-gradient(rgba(5,2,2,.82),rgba(5,2,2,.91)),var(--band-bg)}
.brand-mark{background:linear-gradient(145deg,#e21b23,#ffbf2e 150%);color:#fff;border:2px solid rgba(255,255,255,.22);box-shadow:0 0 34px rgba(226,27,35,.30);font-family:Impact, Haettenschweiler, 'Arial Narrow Bold', sans-serif;letter-spacing:.02em}.brand b,.stage-title,.now-card h2,.split-display h1,.split-display h2,.timer,.kicker,h1,h2,h3{font-family:'New Rocker', Impact, Haettenschweiler, 'Arial Narrow Bold', sans-serif;text-transform:uppercase;letter-spacing:.015em}.kicker{color:#ffbf2e}.badge{border-color:rgba(226,27,35,.65);background:rgba(226,27,35,.16);color:#ffbf2e}.day-tabs button.active,nav a.active{box-shadow:inset 0 -3px 0 #ffbf2e}.now-card,.card,.control-card,.mini-card,.public-now>div,.backstage-cards>div,.info-grid>div{background:linear-gradient(180deg,rgba(25,15,12,.94),rgba(9,6,5,.90));border-color:rgba(255,191,46,.18)}button.primary{background:linear-gradient(180deg,#e21b23,#8d0e12);box-shadow:0 0 24px rgba(226,27,35,.18)}button.danger{background:linear-gradient(180deg,#ff3d2e,#a90f13)}button.warn{background:linear-gradient(180deg,#ffbf2e,#d46e00);color:#1b0902}.public-row.active{color:#ffbf2e}.timer{color:var(--accent);text-shadow:0 0 25px rgba(226,27,35,.20)}.public-view .timer,.public-now b{color:#ffbf2e}.sidebar{background:rgba(5,2,2,.82)}.kiosk-footer:after{content:' · Music for Charity';color:#ffbf2e}.ro-list li.active,li.active{background:rgba(226,27,35,.18);border-color:rgba(255,191,46,.35)}


/* V2.5 layout polish: safer typography and overflow handling */
html,html{overflow-x:hidden}body{width:100%;min-height:100%}.brand b,.brand span{white-space:normal}.brand b{font-size:20px;line-height:1.05}.brand-mark{flex:0 0 58px}.workspace{max-width:1540px}.foh-view .topbar h1{font-size:clamp(22px,2vw,34px);line-height:1.08}.foh-view .now-card{text-align:left;align-items:stretch;justify-content:flex-start;min-height:0}.foh-view .now-card h2{font-size:clamp(44px,4.2vw,76px);line-height:1.02;letter-spacing:.005em;overflow-wrap:anywhere;hyphens:auto;margin:10px 0 0}.foh-view .now-card .timer{font-size:clamp(72px,7vw,112px);line-height:.95;letter-spacing:-.035em}.foh-view .hint.pill{align-self:flex-start;margin:10px 0 0}.foh-view .dashboard{grid-template-columns:minmax(0,1.45fr) minmax(300px,.75fr)}.foh-view .quick-actions{grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}.foh-view .quick-actions button{font-size:clamp(14px,1.15vw,17px);padding:12px 10px;line-height:1.12;white-space:normal}.foh-view .mini-card{min-width:0}.foh-view .mini-card b{font-size:clamp(30px,2.7vw,46px);line-height:1.05;overflow-wrap:anywhere}.foh-view .day-tabs button{font-size:clamp(14px,1.2vw,17px);min-width:145px}.foh-view .lower-grid{grid-template-columns:1.15fr .85fr}.foh-view .lower-grid .card:last-child{grid-column:1/-1}.ro-list li b{font-size:clamp(17px,1.3vw,22px);line-height:1.1;overflow-wrap:anywhere}.timer,.stage-title,.split-display h1,.split-display h2,.backstage-cards b,.public-row b,.public-view h1{overflow-wrap:anywhere;hyphens:auto}.screen{padding:2.3vw}.tech-view .hero{text-align:left;margin-bottom:18px}.tech-view .hero h1{font-size:clamp(48px,7vw,104px);line-height:1.02;margin:8px 0;overflow-wrap:anywhere}.tech-view .hero .timer{font-size:clamp(80px,13vw,180px);line-height:.9}.tech-view .control-card{padding:20px}.tech-view .buttons.big{grid-template-columns:repeat(6,minmax(0,1fr));gap:12px}.tech-view .buttons.big button{font-size:clamp(16px,1.6vw,24px);min-height:78px;line-height:1.08;padding:12px 8px;white-space:normal}.tech-view .info-grid{grid-template-columns:repeat(4,minmax(0,1fr))}.tech-view .info-grid b{font-size:clamp(20px,2.2vw,36px);line-height:1.05;overflow-wrap:anywhere}.backstage-view .display{padding:2.8vw 3.8vw}.backstage-view .split-display{grid-template-columns:minmax(0,1.55fr) minmax(330px,.65fr);gap:28px}.backstage-view .split-display h1{font-size:clamp(38px,5vw,78px);letter-spacing:.01em}.backstage-view .split-display h2{font-size:clamp(44px,6vw,92px);letter-spacing:.005em;overflow-wrap:anywhere}.backstage-view .timer{font-size:clamp(80px,13vw,170px)}.backstage-view .backstage-cards b{font-size:clamp(28px,3.8vw,58px);line-height:1.08}.public-view .display{padding:3vw 4vw}.public-view h1,.public-view [data-current-band]{font-size:clamp(62px,8vw,130px);line-height:1.02;letter-spacing:.005em}.public-view .timer{font-size:clamp(88px,12vw,180px);line-height:.9}.public-view .public-now{grid-template-columns:minmax(0,1fr) 210px;align-items:end}.public-view .public-now>div:first-child{min-width:0}.public-view .public-now b{font-size:clamp(40px,5.5vw,88px);line-height:1.03;overflow-wrap:anywhere}.ultra-simple .stage-title{font-size:clamp(64px,9vw,150px);letter-spacing:.005em;line-height:1.02;max-width:96vw;margin-left:auto;margin-right:auto}.ultra-simple .timer{font-size:clamp(110px,18vw,260px);line-height:.86}.ultra-simple .hint{font-size:clamp(34px,4.8vw,70px);line-height:1.05;max-width:90vw;margin-left:auto;margin-right:auto}@media(max-width:1050px){.tech-view .buttons.big{grid-template-columns:repeat(3,1fr)}.foh-view .quick-actions{grid-template-columns:repeat(2,1fr)}}


/* V2.6: Ampel-Orange, Backstage-Bereitschaft, Log-Stationskennung */
:root{--orange:#ff8c1a}
body.orange{--accent:var(--orange)}
.ready-banner{display:none}
.ready-banner.show{display:inline-flex;align-items:center;gap:12px;background:linear-gradient(180deg,#38d86c,#12a747);color:#04210f;font-weight:1000;text-transform:uppercase;letter-spacing:.05em;border-radius:16px;padding:12px 24px;font-size:clamp(26px,4.5vw,60px);margin-bottom:14px;animation:pulsebg 1.1s infinite alternate}
.ready-banner.show:before{content:"●"}
.backstage-cards .highlight{border-color:rgba(56,216,108,.55);background:linear-gradient(180deg,rgba(20,60,35,.55),rgba(9,6,5,.92))}
.log-station{color:#ffbf2e;font-weight:800}
#log li{font-size:15px;line-height:1.35}
.tech-log{margin-top:18px}


/* V2.7: Zugriffsschutz-Overlay (nur Steuerseiten) */
.pin-overlay{position:fixed;inset:0;z-index:100;display:grid;place-items:center;background:rgba(3,4,8,.93);backdrop-filter:blur(6px)}
.pin-box{background:linear-gradient(180deg,rgba(25,15,12,.96),rgba(9,6,5,.94));border:1px solid rgba(255,191,46,.22);border-radius:22px;padding:34px;max-width:380px;width:90%;text-align:center;box-shadow:0 26px 80px rgba(0,0,0,.55)}
.pin-box h2{font-size:30px;margin-bottom:6px}
.pin-box input{font-size:30px;text-align:center;letter-spacing:.35em;margin:16px 0}
.pin-box button{width:100%}
.pin-error{color:#ff6a5a;min-height:1.3em;margin:10px 0 0;font-weight:800}


/* V2.7: Live-Verbindungsanzeige (Display-Präsenz) */
.disp-list{margin:8px 0}
.disp{display:flex;align-items:center;gap:10px;padding:7px 0;font-weight:800;font-size:15px;border-bottom:1px solid rgba(255,255,255,.06)}
.disp .dot{width:11px;height:11px;border-radius:50%;background:#555;flex:0 0 11px}
.disp.online{color:var(--text)}
.disp.online .dot{background:#20d36b;box-shadow:0 0 10px rgba(32,211,107,.7)}
.disp.stale{color:var(--muted)}
.disp.stale .dot{background:#e2b21b;animation:pulsebg 1s infinite alternate}
.disp em{margin-left:auto;font-style:normal;font-weight:600;font-size:13px;color:var(--muted)}
.disp-old{font-size:11px;font-weight:800;color:#ffbf2e;background:rgba(255,191,46,.14);border-radius:6px;padding:2px 6px;margin-left:6px}
.disp.none{color:var(--muted);font-weight:600;border:0}


/* ===== V2.8 · 2026-Skin: Schwarz/Violett (RockArea A7) ===== */
:root{--accent:#c15ad6;--danger:#e21b23;--orange:#ff8c1a;--ok:#20d36b;--blue:#8a5cff;--text:#f8f3fb;--muted:#c6b3d4;--line:rgba(190,90,225,.20);--panel:rgba(24,12,30,.92);--panel2:rgba(16,8,20,.94)}
body{background:radial-gradient(rgba(190,90,225,.05) 1px,transparent 1.4px) 0 0/16px 16px,radial-gradient(circle at 82% 10%,rgba(140,50,150,.34),transparent 42%),radial-gradient(circle at 12% 90%,rgba(80,26,86,.30),transparent 46%),linear-gradient(160deg,#0a0410,#060206 60%,#0a0410)}
body:before{background-image:linear-gradient(rgba(6,2,10,.82),rgba(6,2,10,.92)),var(--band-bg)}
.kicker{color:var(--accent)}
.badge{border-color:rgba(190,90,225,.55);background:rgba(190,90,225,.15);color:var(--accent)}
.now-card,.card,.control-card,.mini-card,.public-now>div,.backstage-cards>div,.info-grid>div{background:linear-gradient(180deg,rgba(32,14,38,.92),rgba(10,4,14,.94));border-color:var(--line)}
button{background:#241a30}
button.primary{background:linear-gradient(180deg,#c15ad6,#7a2d8c);box-shadow:0 0 24px rgba(193,90,214,.2)}
button.danger{background:linear-gradient(180deg,#ff3d2e,#a90f13);color:#fff}
button.warn{background:linear-gradient(180deg,#ffbf2e,#d46e00);color:#1b0902}
.timer{color:var(--accent);text-shadow:0 0 26px rgba(193,90,214,.32)}
.public-view .stage-title{color:var(--text)}
.public-view [data-current-band]{color:var(--accent)}
.public-view .timer,.public-now b{color:var(--accent)}
.public-row.active{color:var(--accent)}
.day-tabs button.active,nav a.active{box-shadow:inset 0 -3px 0 var(--accent)}
.ro-list li.active,li.active{background:rgba(193,90,214,.16);border-color:rgba(190,90,225,.4)}
.log-station{color:#d69ae0}
.kiosk-footer:after{color:var(--accent)}
.brand{align-items:center}
.brand-logo{height:44px;width:auto;display:block;filter:drop-shadow(0 0 16px rgba(193,90,214,.4))}
.screen-logo{height:clamp(46px,5.5vw,96px);width:auto;display:block;margin:0 auto 12px;filter:drop-shadow(0 0 22px rgba(193,90,214,.42))}
.pin-box{border-color:rgba(190,90,225,.3)}

.backstage-view .screen-logo{margin:0 auto 14px}


/* V2.8: Kiosk-Feinschliff (nur Anzeige-Displays, Klasse .kiosk) */
html,body{overscroll-behavior:none}
.kiosk,.kiosk *{cursor:none}
.kiosk{user-select:none;-webkit-user-select:none;-webkit-touch-callout:none;touch-action:none;overflow:hidden}
.kiosk img{-webkit-user-drag:none;user-drag:none;pointer-events:none}


/* V2.8: prominentes Band-Logo (Public, Backstage, FOH) – Fallback: Name */
.band-logo-img{display:none;width:auto;object-fit:contain;filter:drop-shadow(0 6px 20px rgba(0,0,0,.5))}
.foh-view .band-logo-img{max-height:80px;max-width:100%;margin:2px 0 8px}
.public-view .band-logo-img{max-height:clamp(80px,10vw,170px);max-width:min(80%,760px);margin:0 auto 12px}
.backstage-view .band-logo-img{max-height:clamp(60px,7vw,120px);max-width:min(75%,520px);margin:6px 0 8px}

.tech-view .band-logo-img{max-height:clamp(48px,5vw,80px);max-width:min(60%,420px);margin:4px 0 6px}


/* V2.9: Biertresen/Food Slide-Rotation + Sponsoren-Streifen */
.slideshow-view{overflow:hidden}
#slides{position:fixed;inset:0}
body.has-sponsors #slides{bottom:118px}
.slide{position:absolute;inset:0;opacity:0;transition:opacity .8s ease;display:flex;align-items:center;justify-content:center}
.slide.active{opacity:1}
.slide img{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain}
.slide-info .slide-inner{text-align:center;padding:4vw;width:100%}
.slide-info .screen-logo{margin:0 auto 14px}
.slide-info .s-now{color:var(--accent);font-weight:900;text-transform:uppercase;letter-spacing:.12em;font-size:clamp(16px,2vw,30px)}
.slide-info .stage-title{font-size:clamp(56px,9vw,148px);line-height:1.02;margin:6px 0}
.slide-info .timer{font-size:clamp(90px,16vw,220px);line-height:.9}
.slide-info .s-next{color:var(--muted);font-size:clamp(22px,3vw,46px);margin-top:10px}
.slide-info .s-next b{color:var(--text)}
.slide-menu .menu-inner{width:100%;padding:3.5vh 6vw;text-align:center}
.slide-menu .menu-title{font-family:'New Rocker',Impact,Haettenschweiler,sans-serif;font-size:clamp(52px,8vw,122px);line-height:.95;margin-bottom:.4em;text-shadow:0 4px 34px rgba(0,0,0,.6)}
.slide-menu .menu-list{width:min(1180px,90vw);margin:0 auto;display:flex;flex-direction:column;gap:clamp(8px,2vh,26px)}
.slide-menu .menu-row{display:flex;align-items:baseline;gap:20px;font-family:'Oswald','Roboto Condensed','Arial Narrow','Liberation Sans Narrow',sans-serif;font-size:clamp(28px,4.5vh,54px);font-weight:600}
.slide-menu .mn{white-space:nowrap;text-transform:uppercase;letter-spacing:.02em}
.slide-menu .mn em{font-style:italic;font-weight:400;color:var(--muted);font-size:.78em}
.slide-menu .ml{flex:1;border-bottom:3px dotted rgba(255,255,255,.20);transform:translateY(-.2em)}
.slide-menu .mp{white-space:nowrap;font-weight:800;color:#ffcf5a;font-variant-numeric:tabular-nums;text-shadow:0 0 18px rgba(255,191,46,.22)}
.slide-menu .menu-appetit{font-family:'New Rocker',Impact,Haettenschweiler,sans-serif;font-size:clamp(30px,4.6vw,66px);margin-top:.65em}
.slide-menu .menu-foot{margin-top:.85em;color:var(--muted);font-size:clamp(16px,2.4vh,27px);line-height:1.35}
.sponsorbar{position:fixed;left:0;right:0;bottom:0;height:118px;display:none;align-items:center;overflow:hidden;z-index:5;background:linear-gradient(0deg,rgba(6,2,10,.97),rgba(6,2,10,.78));border-top:1px solid var(--line)}
body.has-sponsors .sponsorbar{display:flex}
.sponsor-track{display:flex;align-items:center;gap:clamp(22px,4vw,72px);padding:0 3vw;width:100%;justify-content:center}
.sponsorbar.ticker .sponsor-track{width:max-content;justify-content:flex-start;gap:0;padding:0;animation:marquee var(--marquee-dur,50s) linear infinite;will-change:transform}
.sponsorbar.ticker .sponsor-group{display:flex;align-items:center;flex:0 0 auto;gap:clamp(22px,4vw,72px);padding-right:clamp(22px,4vw,72px)}
.sponsor-logo{height:clamp(48px,8vh,86px);width:auto;object-fit:contain;background:rgba(255,255,255,.95);border-radius:10px;padding:7px 13px}
@keyframes marquee{from{transform:translateX(0)}to{transform:translateX(-50%)}}
/* Public: Platz für den Streifen lassen */
.public-view.has-sponsors .display{padding-bottom:132px}


/* V2.9: Launcher (Rollen-Startseite unter /) */
.launcher{min-height:100vh;padding:4vw;text-align:center}
.launcher .screen-logo{margin:0 auto 10px}
.launcher h1{font-size:clamp(32px,5vw,64px);margin:4px 0}
.launcher .sub{color:var(--muted);margin-bottom:22px;font-size:clamp(15px,1.8vw,20px)}
.launch-group{margin:26px auto;max-width:1200px}
.launch-group h2{color:var(--accent);text-transform:uppercase;letter-spacing:.08em;font-size:clamp(16px,2vw,24px);margin-bottom:14px}
.tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:18px}
.tile{background:linear-gradient(180deg,rgba(32,14,38,.92),rgba(10,4,14,.94));border:1px solid var(--line);border-radius:20px;padding:20px;display:flex;flex-direction:column;align-items:center;gap:12px;text-decoration:none;color:var(--text)}
.tile:hover{border-color:var(--accent)}
.tile b{font-size:clamp(20px,2.4vw,30px)}
.tile .qr{background:#fff;border-radius:12px;padding:10px;line-height:0}
.tile .qr img,.tile .qr canvas{display:block}
.tile .url{color:var(--muted);font-size:13px;word-break:break-all}


/* ===== 2026 Look-Korrektur (final · überschreibt die Ebenen oben) =====
   Entscheidung Betreiber: Violett behalten, aber Schrift wieder klar/lesbar
   und Public-Layout reparieren.
   - New Rocker nur noch fürs Branding (Brand + Kicker).
   - Timer, Bandnamen und alle Readouts in klarer, kondensierter Schrift
     (wie in den Original-Mockups: Arial Narrow / Roboto Condensed / Impact,
     mit robustem Fallback für Raspberry Pi / Fire TV).
   - Public: kein senkrechter Umbruch von „Als Nächstes", keine tote
     Mittelfläche, kein Überlappen durch den Sponsoren-Streifen. */

/* 1) Klare, kondensierte Schrift für Ziffern, Bandnamen und Readouts ------ */
:root{--font-clear:'Oswald','Roboto Condensed','Arial Narrow','Liberation Sans Narrow','DejaVu Sans Condensed',Impact,'Haettenschweiler','Arial Narrow Bold',system-ui,-apple-system,'Segoe UI',Roboto,sans-serif}
.timer,[data-timer],
.stage-title,.now-card h2,.split-display h1,.split-display h2,
[data-current-band],[data-next-band],
.public-now b,.mini-card b,.info-grid b,.backstage-cards b,
.slide-info .stage-title,.slide-info .timer{
  font-family:var(--font-clear);
  font-weight:800;letter-spacing:-.01em;text-transform:uppercase
}
.timer,[data-timer],.slide-info .timer{font-weight:700;letter-spacing:-.02em;font-variant-numeric:tabular-nums}

/* 2) Public-Layout: Inhalt von oben nach unten füllen (keine tote Fläche) - */
.public-view .display{align-items:stretch;justify-content:flex-start;padding:2.5vw 4vw 3vw;height:100vh;overflow:hidden}
.public-view .display-inner{display:flex;flex-direction:column;gap:clamp(14px,2.2vh,30px);max-width:1680px;margin:0 auto;min-height:0;overflow:hidden}
.public-view .stage-title{margin:0}
/* Restzeit / Als Nächstes: zwei gleich große Karten, KEIN senkrechter Umbruch */
.public-view .public-now{grid-template-columns:1fr 1fr;align-items:stretch;gap:20px;margin:0}
.public-view .public-now>div{display:flex;flex-direction:column;justify-content:center;min-width:0}
.public-view .public-now b{font-size:clamp(30px,3.6vw,64px);line-height:1.05;overflow-wrap:normal;word-break:normal;hyphens:none}
/* Running Order füllt die Mitte statt sie leer zu lassen */
.public-view #publicSchedule{flex:1 1 0;min-height:0;overflow:hidden;display:flex;flex-direction:column;justify-content:flex-start;padding:4px 20px 0;-webkit-mask-image:linear-gradient(180deg,#000 86%,transparent);mask-image:linear-gradient(180deg,#000 86%,transparent)}
/* Erste Spalte 110 -> 150px (§9-Restpunkt): „Als Nächstes" braucht bei 1920 gemessene 141px und
   brach sonst auf zwei Zeilen um. Die Breite kommt aus der 1fr-Spalte daneben, nicht aus der Höhe —
   die Zeile wird dadurch sogar niedriger (Label 59px -> eine Zeile), der Abstand zur Sponsorenleiste
   also größer statt kleiner. 150 statt 141 als Puffer, weil die Schrift mit vw skaliert. */
.public-view .public-row{grid-template-columns:150px 1fr auto;gap:16px;padding:clamp(4px,.75vh,9px) 4px;font-size:clamp(15px,1.7vw,25px)}
.public-view .public-row>span{white-space:nowrap}
.public-view .public-row em{white-space:nowrap}
.public-view .public-row.active{font-size:clamp(19px,2.1vw,31px)}
.public-view .kiosk-footer{margin-top:0}

/* 3) Sponsoren-Streifen nicht mehr über die Kacheln/Running Order legen --- */
.public-view.has-sponsors .display{padding-bottom:150px}

/* 4) Sponsoren-Logos: helle Logos transparent auf dem dunklen Streifen,
      dunkle Logos (Klasse via JS) auf weißem Feld – so sind alle lesbar. */
.sponsor-logo{background:transparent;padding:6px 10px}
.sponsor-logo.on-light{background:rgba(255,255,255,.96);border-radius:10px;padding:7px 13px}

/* 5) Offizieller Monitor-Hintergrund (Background_Monitor_2026.png) statt CSS-Gradient.
      Die Abdunkelungs-Ebene (body:before) war nur für den alten Gradienten/Band-Logo-Tint;
      da keine Band-Logos verdrahtet sind (--band-bg = none), wird sie neutralisiert, damit
      der echte Hintergrund voll durchkommt. */
body{background:#060206 url('/bg-monitor.jpg') center center / cover no-repeat fixed}
body:before{background-image:var(--band-bg)}

/* 6) Running-Order-Editor: feste Felder statt Freitext */
.ro-editor{display:flex;flex-direction:column;gap:10px;margin:12px 0}
.ro-edit-row{display:grid;grid-template-columns:1fr auto;gap:8px 10px;background:rgba(255,255,255,.045);border:1px solid var(--line);border-radius:14px;padding:12px}
.ro-edit-row input{margin:0;color-scheme:dark}
.ro-edit-row .re-time{display:flex;align-items:center;gap:8px}
.ro-edit-row .re-time input{width:120px}
.ro-edit-row .re-dash{color:var(--muted)}
.ro-edit-row .re-name{grid-column:1/-1;font-weight:800}
.ro-edit-row .re-notes{grid-column:1/-1}
/* Extras pro Band (Idee 17 + 21): Soundcheck + Ampel-Schwellen. Beides optional, darum dezent und
   nicht wie ein Pflichtfeld — eine gemeinsame Zeile statt zwei. */
.ro-edit-row .re-warn{grid-column:1/-1;display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.ro-edit-row .re-warn label,.ro-edit-row .re-warn span{color:var(--muted);font-size:12.5px;font-weight:700;white-space:nowrap}
.ro-edit-row .re-warn input[type=number]{width:62px;padding:7px 8px;font-size:14px;text-align:center}
.ro-edit-row .re-warn input[type=time]{width:112px;padding:7px 8px;font-size:14px}
.ro-edit-row .re-warn .re-sep{opacity:.4;margin:0 2px}
/* Stage-Tech-Kacheln: 5. Kachel (Soundcheck) darf umbrechen statt die 4 zu quetschen. */
.tech-view .info-grid{grid-template-columns:repeat(auto-fit,minmax(190px,1fr))}
.ro-edit-row .re-actions{display:flex;gap:6px;align-items:center;justify-content:flex-end}
.ro-edit-row .re-actions button{min-height:0;padding:8px 11px;font-size:16px;line-height:1;background:#1e1e21;border-radius:10px}
.ro-edit-row .re-actions .re-del{background:color-mix(in srgb,#b5544a 18%,#1e1e21);box-shadow:inset 3px 0 0 #b5544a;color:#f2e3e1}
.ro-editor-actions{display:flex;gap:10px;margin-top:4px}
.ro-editor-actions #addBand{background:#1e1e21}

/* 7) Gezielte Nachrichten: Empfänger-Auswahl + Sende-Bestätigung */
.mini-card.message .msg-target{margin-bottom:8px}
.message-row{grid-template-columns:auto 1fr auto auto}
.message-row .msg-target{margin:0;min-width:150px}
.msg-status{color:var(--ok);font-weight:800;font-size:14px;min-height:1.1em;margin-top:8px;opacity:0;transition:opacity .2s}
.msg-status.show{opacity:1}
@media(max-width:1050px){.message-row .msg-target{grid-column:1/-1}}

/* Curfew-Wächter (Idee 2): Farbcode wie das Verzug-Badge (v-ok/v-warn/v-bad), damit die Regie
   dieselbe Sprache liest. Rot heißt hier: die Genehmigung reißt, nicht „der Plan wackelt". */
.foh-view .curfew-card b{font-size:clamp(26px,2.4vw,40px)}
.foh-view .curfew-card b.v-ok{color:#7ee2a0}
.foh-view .curfew-card b.v-warn{color:#ffbf2e}
.foh-view .curfew-card b.v-bad{color:#ff6a5a}
.foh-view .curfew-line{font-size:13px;font-weight:800;margin-top:2px}
.foh-view .curfew-line.ok{color:var(--muted)}
.foh-view .curfew-line.warn{color:#ffbf2e}
.foh-view .curfew-line.bad{color:#ff6a5a;animation:hintpulse 1.4s ease-in-out infinite alternate}
.foh-view .curfew-card small{display:block;margin-top:8px;font-size:11.5px;line-height:1.4}
/* Excel-Import (Idee 20): eingeklappt – Sonderweg, kein Alltagsbedienelement. */
.import-box{margin:0 0 14px;border:1px solid var(--line);border-radius:12px;background:rgba(255,255,255,.03)}
.import-box summary{cursor:pointer;padding:11px 14px;font-weight:800;font-size:14px;list-style:none}
.import-box summary::-webkit-details-marker{display:none}
.import-box>*:not(summary){margin:0 14px 12px}
.import-box .muted{font-size:12px;line-height:1.5}
.import-box textarea{min-height:96px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;white-space:pre}
.import-box .inline{grid-template-columns:auto auto;justify-content:start}
.import-box button{min-height:0;padding:10px 14px;font-size:14px}
.import-box button:disabled{opacity:.45;cursor:not-allowed}
.import-result:empty{display:none}
.imp-ok{color:#7ee2a0;font-size:13px;margin-bottom:8px}
.imp-bad{color:#ffbf2e;font-size:12.5px;line-height:1.5;margin-top:8px}
.imp-tbl{width:100%;border-collapse:collapse;font-size:12.5px}
.imp-tbl td{padding:5px 8px;border-bottom:1px solid rgba(255,255,255,.07)}
.imp-tbl td:first-child{color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap;width:1%}
.imp-tbl td:nth-child(2){font-weight:800}
.imp-tbl td:last-child{color:var(--muted)}

.curfew-edit{margin:0 0 14px;padding:12px 14px;border:1px solid rgba(255,191,46,.28);border-radius:12px;background:rgba(255,191,46,.05)}
.curfew-edit label{display:block;font-weight:800;font-size:13px;color:#ffbf2e;margin-bottom:7px}
.curfew-edit input{width:140px}
.curfew-edit small{display:block;margin-top:7px;color:var(--muted);font-size:11.5px;line-height:1.45}

/* Rückkanal „Band steht bereit" (Idee 18): Grün = Go, dieselbe Sprache wie der Start-Button.
   Zeile im Stage-Tech (Muster wie .encore-row), Haken in der FOH-Kachel „Als Nächstes". */
.tech-view .ready-row{display:flex;align-items:center;gap:12px;margin-top:12px;padding:12px 14px;border:1px solid var(--line,rgba(255,255,255,.08));border-radius:12px;background:rgba(56,216,108,.06);flex-wrap:wrap}
.tech-view .ready-row .rdylbl{font-weight:800;color:#4fd07a;font-size:15px}
.tech-view .ready-row .rdybtn{min-height:0;padding:11px 18px;font-size:15px;font-weight:800;background:color-mix(in srgb,#38d86c 12%,#1e1e21);box-shadow:inset 0 0 0 1px rgba(56,216,108,.35);color:#e6f7ec;border:0;border-radius:10px;cursor:pointer}
.tech-view .ready-row .rdybtn.on{background:linear-gradient(180deg,#38d86c,#12a747);color:#04220f;box-shadow:0 0 18px rgba(56,216,108,.35)}
.tech-view .ready-row .rdystate{color:var(--muted);font-size:12.5px;margin-left:auto}
.foh-view .ready-flag{margin-top:10px;padding:9px 12px;border-radius:10px;background:rgba(56,216,108,.12);border:1px solid rgba(56,216,108,.4);color:#7ee2a0;font-size:14px;font-weight:800;display:flex;align-items:baseline;gap:7px}
.foh-view .ready-flag b{font-size:14px;margin:0;display:inline}
.foh-view .ready-flag em{margin-left:auto;font-style:normal;font-size:11.5px;font-weight:600;color:var(--muted)}

/* Reload-Knopf im Verbindungspanel: dezent, gleiche Kompakt-Optik wie der RO-Bearbeiten-Knopf (kein
   Alltagsknopf, nur für Deploy-Tage) */
.foh-view .reload-btn{width:100%;margin-top:10px;min-height:0;padding:9px 12px;font-size:12.5px;font-weight:800;
  background:#1e1e21;box-shadow:inset 0 0 0 1px rgba(255,255,255,.12);border-radius:10px}

/* Rückblick-Archiv (nur off-season): eingeklappt, damit der Guide kurz bleibt. */
.info-view .info-archive{padding:0}
.info-view .info-archive summary{list-style:none;cursor:pointer;padding:14px 16px;display:flex;align-items:baseline;gap:9px}
.info-view .info-archive summary::-webkit-details-marker{display:none}
.info-view .info-archive summary:after{content:'▾';margin-left:auto;color:var(--imuted);font-size:12px;transition:transform .2s}
.info-view .info-archive[open] summary:after{transform:rotate(180deg)}
.info-view .info-archive summary b{font-family:var(--font-clear);font-weight:800;text-transform:uppercase;font-size:16px}
.info-view .info-archive #infoArchiveBody{padding:0 16px 14px}
.info-view .arc-jahr{margin-top:6px}
.info-view .arc-h{font-family:var(--font-clear);font-weight:800;text-transform:uppercase;font-size:15px;color:var(--iaccent2);display:flex;align-items:baseline;gap:8px;margin:10px 0 2px}
.info-view .arc-h em{margin-left:auto;font-style:normal;font-size:11px;font-weight:700;color:var(--imuted)}
.info-view .arc-tag{font-size:10.5px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--imuted);margin:9px 0 3px}
.info-view .arc-row{display:grid;grid-template-columns:88px 1fr;gap:9px;padding:4px 0;font-size:12.5px;align-items:baseline}
.info-view .arc-row span{color:var(--imuted);font-variant-numeric:tabular-nums;font-size:11px}
.info-view .arc-row b{font-weight:700;overflow-wrap:anywhere}

/* Countdown an der 2027-Karte (nur off-season, siehe Kommentar in info.html) */
.info-view .promo-countdown{margin:10px 0 0;text-align:center;font-size:13.5px;font-weight:700;color:var(--imuted)}
.info-view .promo-countdown b{font-family:var(--font-clear);font-size:19px;font-weight:800;color:var(--igold);font-variant-numeric:tabular-nums}

/* Spendenbarometer im Guide (über dem GiroCode): zeigt, wofür der Scan gleich zählt.
   Gold statt Violett — dieselbe Farbe wie der Ticket-/Early-Bird-Button, also "hier geht's um Geld".
   Kompakt gehalten (~60 statt ~89 px): jeder Pixel hier schiebt den QR-Code Richtung Falz — §19 hat
   dessen Position ausgemessen, das ist kein Geschmack. */
.info-view .baro{margin:10px 0 2px;padding:9px 12px;border-radius:12px;background:rgba(255,207,90,.06);border:1px solid rgba(255,207,90,.24)}
.info-view .baro-top{display:flex;align-items:baseline;gap:6px;flex-wrap:wrap}
.info-view .baro-top b{font-family:var(--font-clear);font-weight:800;font-size:21px;color:var(--igold);line-height:1;font-variant-numeric:tabular-nums}
.info-view .baro-top span{font-size:12px;color:var(--imuted);font-weight:700}
.info-view .baro-top em{margin-left:auto;font-style:normal;font-size:12px;font-weight:800;color:var(--igold);font-variant-numeric:tabular-nums}
.info-view .baro-bar{margin-top:7px;height:7px;border-radius:99px;background:rgba(255,255,255,.07);overflow:hidden}
.info-view .baro-bar i{display:block;height:100%;border-radius:99px;background:linear-gradient(90deg,#ffcf5a,#ff9d2e);transition:width .6s ease}
.info-view .baro-when{margin-top:4px;font-size:10px;color:var(--imuted);opacity:.8}

/* Notfall-Broadcast-Kachel im FOH: rot umrandet, bewusst anders als die neutrale Nachrichten-Kachel */
.mini-card.alertcard{border-color:rgba(255,61,46,.55);background:linear-gradient(180deg,rgba(58,10,8,.5),var(--panel))}
.mini-card.alertcard>span{color:#ff6a5a}
.mini-card.alertcard small{display:block;margin-top:8px;font-size:12px;line-height:1.4}


/* ===== 8) FOH & Stage-Tech: ruhiges, neutrales Regiepult =====
   Klare System-Schrift (keine New Rocker), neutral-dunkle Kacheln (kein Lila),
   entsättigte Funktions-Buttons (Farbe nur als feiner Code: grün Start / rot Stop /
   ocker Songs). Gilt NUR für diese beiden Steuerseiten – Anzeige-Displays bleiben. */
.foh-view *, .tech-view *{font-family:system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif !important}
.foh-view, .tech-view{--accent:#cfd3da; --text:#eef0f3; --muted:#a4a8b0}

/* Kacheln + Chrome neutral-dunkel */
.foh-view .sidebar{background:#0e0e10;border-color:rgba(255,255,255,.07)}
.foh-view :is(.now-card,.card,.control-card,.mini-card,.info-grid>div,.connection),
.tech-view :is(.now-card,.card,.control-card,.mini-card,.info-grid>div){
  background:#141416;border-color:rgba(255,255,255,.075);box-shadow:none;backdrop-filter:none}
.foh-view .kicker,.tech-view .kicker{color:var(--muted)}
.foh-view .badge,.tech-view .badge{background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.14);color:var(--muted)}
.foh-view .log-station,.tech-view .log-station{color:var(--muted)}
.foh-view nav a.active{background:rgba(255,255,255,.08);color:var(--text)}
.foh-view :is(.ro-list li.active,li.active),.tech-view li.active{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.14)}

/* Eingaben neutral */
.foh-view :is(input,select,textarea),.tech-view :is(input,select,textarea){background:#111214;border-color:rgba(255,255,255,.14);color:var(--text)}

/* Buttons neutral-dunkel; Funktion nur als feiner Farb-Code (Streifen links) */
.foh-view button,.tech-view button{background:#1e1e21;box-shadow:inset 0 0 0 1px rgba(255,255,255,.08);color:var(--text)}
.foh-view .day-tabs button.active{background:rgba(255,255,255,.10);box-shadow:inset 0 0 0 1px rgba(255,255,255,.14)}
.foh-view button.primary,.tech-view button.primary{background:color-mix(in srgb,#3d8e69 13%,#1e1e21);box-shadow:inset 4px 0 0 #3d8e69,inset 0 0 0 1px rgba(61,142,105,.30);color:var(--text)}
.foh-view button.danger,.tech-view button.danger{background:color-mix(in srgb,#b5544a 13%,#1e1e21);box-shadow:inset 4px 0 0 #b5544a,inset 0 0 0 1px rgba(181,84,74,.30);color:var(--text)}
.foh-view button.warn,.tech-view button.warn{background:color-mix(in srgb,#c2a054 11%,#1e1e21);box-shadow:inset 4px 0 0 #c2a054,inset 0 0 0 1px rgba(194,160,84,.26);color:var(--text)}
.tech-view .buttons.big button.primary{box-shadow:inset 6px 0 0 #3d8e69,inset 0 0 0 1px rgba(61,142,105,.30)}
.tech-view .buttons.big button.danger{box-shadow:inset 6px 0 0 #b5544a,inset 0 0 0 1px rgba(181,84,74,.30)}
.tech-view .buttons.big button.warn{box-shadow:inset 6px 0 0 #c2a054,inset 0 0 0 1px rgba(194,160,84,.26)}

/* farbige Button-Icons als Code */
.foh-view .ic,.tech-view .ic{font-weight:800;margin-right:6px}
.ic-go{color:#5ec08a}.ic-stop{color:#d1786c}.ic-warn{color:#d8b45f}

/* Timer: Ruhe = neutral, Glow weg; Ampel bleibt beim Laufen grün/orange/rot */
.foh-view .timer,.tech-view .timer{text-shadow:none}
.foh-view.idle .timer,.tech-view.idle .timer{color:#dadde2}


/* ===== 9) Nachrichten-Banner (Regie-Durchsage) – einheitlich, auffällig, fix am oberen Rand =====
   Erscheint auf allen Anzeige-Screens (Public, Stage, Backstage, Biertresen, Food), sobald eine
   Nachricht an diesen Screen (oder „Alle") anliegt. Farbe über Variablen (Standard: Grün). */
:root{--msg-bg:linear-gradient(180deg,#3ee07a,#1fb257);--msg-fg:#07160c;--msg-edge:#053a1e}
.msg-banner:empty{display:none}
.msg-banner{position:fixed;top:0;left:0;right:0;z-index:60;
  display:flex;align-items:center;justify-content:center;gap:16px;text-align:center;
  font-weight:900;color:var(--msg-fg);line-height:1.15;
  background:var(--msg-bg);border:0;border-bottom:4px solid var(--msg-edge);border-radius:0;
  padding:clamp(12px,1.7vw,22px) 28px;font-size:clamp(24px,3vw,46px);
  box-shadow:0 12px 44px rgba(0,0,0,.55)}
.msg-banner:before{content:"";flex:0 0 auto;width:16px;height:16px;border-radius:50%;
  background:var(--msg-fg);animation:msgpulse 1.4s ease-in-out infinite}
@keyframes msgpulse{0%,100%{opacity:.45}50%{opacity:1}}
/* Inhalt unter das Banner schieben, damit nichts verdeckt wird (nur bei aktiver Nachricht) */
body.has-message .display{padding-top:clamp(74px,10vh,120px)}
.slideshow-view.has-message #slides{top:clamp(70px,9vh,110px)}
/* Regie (FOH/Stage-Tech): Durchsage im Fluss oben statt fix – kein Konflikt mit Sidebar/Layout */
.foh-view .msg-banner,.tech-view .msg-banner{position:static;margin:0 0 16px;border-radius:14px;border-bottom:0;box-shadow:none;font-size:clamp(17px,1.7vw,26px);padding:13px 22px}


/* ===== 13) Besucher-Guide (info.html) – offene, mobile Festival-Info per QR ===== */
body.info-view{background:radial-gradient(130% 55% at 50% -6%,rgba(193,90,214,.20),transparent 60%),#0a0510;overflow-x:hidden}
.info-view{--iaccent:#c15ad6;--iaccent2:#db84ef;--igold:#ffcf5a;--ipanel:#160c22;--iedge:rgba(193,90,214,.20);--iedge2:rgba(193,90,214,.44);--itext:#f3ebfa;--imuted:#a893bd;color:var(--itext)}
.info-view .info-wrap{max-width:480px;margin:0 auto;padding:0 15px calc(46px + env(safe-area-inset-bottom))}
/* Durchsage-Banner klebt oben fest – immer im Blick, auch beim Runterscrollen */
.info-view .msg-banner{position:fixed;top:0;left:0;right:0;z-index:50;margin:0;border-radius:0;border-bottom:0;box-shadow:0 10px 30px rgba(0,0,0,.5);font-size:clamp(14px,3.6vw,17px);padding:13px 16px}
body.info-view.has-message .info-wrap{padding-top:clamp(60px,15vw,82px)}
/* Kopf */
.info-view .info-hdr{text-align:center;padding:18px 0 10px}
.info-view .info-hdr .screen-logo{height:64px;width:auto;margin:0 auto;display:block}
.info-view .info-tag{font-size:13px;letter-spacing:.22em;color:var(--imuted);text-transform:uppercase;margin-top:9px}
/* Live-Karte */
.info-view .info-live{background:linear-gradient(160deg,#271441,#160c22);border:1px solid var(--iedge2);border-radius:20px;padding:18px 18px 16px;position:relative;overflow:hidden;box-shadow:0 18px 42px rgba(0,0,0,.5)}
.info-view .info-live:before{content:"";position:absolute;top:0;bottom:0;left:0;width:5px;background:linear-gradient(var(--iaccent),var(--iaccent2))}
.info-view .eyebrow{font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--iaccent2);font-weight:800;display:flex;align-items:center;gap:9px}
.info-view .eyebrow .ld{width:9px;height:9px;border-radius:50%;background:var(--iaccent2);animation:iring 1.8s infinite}
@keyframes iring{0%{box-shadow:0 0 0 0 rgba(219,132,239,.5)}100%{box-shadow:0 0 0 13px rgba(219,132,239,0)}}
.info-view .info-live h2{font-family:var(--font-clear);font-weight:800;text-transform:uppercase;font-size:clamp(30px,8vw,40px);line-height:.98;margin:9px 0 3px;letter-spacing:.005em;overflow-wrap:anywhere}
.info-view .info-sub{color:var(--imuted);font-size:12.5px}
.info-view .info-cd{margin:12px 0 2px}
.info-view .info-cd small{font-size:11px;letter-spacing:.14em;color:var(--imuted);display:block;text-transform:uppercase;font-weight:700;margin-bottom:1px}
.info-view .info-cd [data-timer]{font-family:var(--font-clear);font-weight:700;font-size:clamp(44px,13vw,56px);letter-spacing:.01em;font-variant-numeric:tabular-nums;line-height:1;color:var(--iaccent2)}
.info-view .info-next{margin-top:13px;padding-top:12px;border-top:1px solid var(--iedge);display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}
.info-view .info-next .l{font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--imuted);font-weight:700}
.info-view .info-next b{font-family:var(--font-clear);font-weight:800;text-transform:uppercase;font-size:19px}
.info-view .info-next em{color:var(--iaccent2);font-style:normal;font-size:13px;margin-left:auto;font-variant-numeric:tabular-nums}
/* Abschnitt */
.info-view .info-sec{margin-top:26px}
.info-view .info-sec-h{font-family:var(--font-clear);font-weight:800;text-transform:uppercase;font-size:22px;letter-spacing:.01em;display:flex;align-items:center;justify-content:space-between;margin-bottom:11px}
.info-view .swipe-hint{font-size:10.5px;letter-spacing:.08em;color:var(--imuted);text-transform:uppercase;font-weight:700;animation:inudge 2s ease-in-out infinite}
@keyframes inudge{0%,100%{transform:translateX(0);opacity:.7}50%{transform:translateX(4px);opacity:1}}
/* Tag-Tabs */
.info-view .info-days{display:flex;gap:7px;padding-bottom:9px}
.info-view .info-days button{flex:1;border:1px solid var(--iedge);background:var(--ipanel);color:var(--imuted);font:inherit;font-weight:800;font-size:13px;padding:9px 4px;border-radius:11px;cursor:pointer;text-transform:uppercase;letter-spacing:.05em}
.info-view .info-days button.on{background:linear-gradient(180deg,var(--iaccent),#8e35a6);color:#fff;border-color:transparent;box-shadow:0 6px 18px rgba(193,90,214,.4)}
/* Carousel (swipebar) */
.info-view .info-carousel{display:flex;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory;scrollbar-width:none;-webkit-overflow-scrolling:touch;transition:height .28s ease}
.info-view .info-carousel::-webkit-scrollbar{display:none}
.info-view .info-day{flex:0 0 100%;scroll-snap-align:start}
.info-view .info-day-inner{background:var(--ipanel);border:1px solid var(--iedge);border-radius:16px;overflow:hidden}
.info-view .info-row{display:grid;grid-template-columns:84px 1fr auto auto;gap:8px;padding:13px 15px;align-items:center;border-bottom:1px solid rgba(193,90,214,.10)}
.info-view .ics-link{display:grid;place-items:center;width:34px;height:34px;font-size:16px;text-decoration:none;border-radius:9px;background:rgba(193,90,214,.10)}
/* Merkliste: Stern pro Zeile + Filter im Sektionskopf. Rein lokal (localStorage), kein Server. */
.info-view .fav-btn{display:grid;place-items:center;width:34px;height:34px;padding:0;min-height:0;border:0;border-radius:9px;cursor:pointer;background:rgba(193,90,214,.10);color:var(--imuted);font-size:17px;line-height:1;font-family:inherit}
.info-view .fav-btn.on{color:var(--igold);background:rgba(255,207,90,.14)}
.info-view .fav-filter{min-height:0;padding:5px 10px;border:1px solid var(--iedge);border-radius:99px;background:transparent;color:var(--imuted);font:inherit;font-size:11.5px;font-weight:800;cursor:pointer;margin-left:8px;vertical-align:middle}
.info-view .fav-filter.on{background:rgba(255,207,90,.14);border-color:rgba(255,207,90,.4);color:var(--igold)}
/* Bewertung („hat mir gefallen") – nur bei bereits gespielten Bands, ersetzt dort den Kalender-Link.
   Die Zahl sieht ausschließlich die Regie (Chronik, PIN); im Guide gibt es bewusst kein Ranking. */
.info-view .vote-btn{display:grid;place-items:center;width:34px;height:34px;padding:0;min-height:0;border:0;border-radius:9px;cursor:pointer;background:rgba(193,90,214,.10);color:var(--imuted);font-size:16px;line-height:1;font-family:inherit}
.info-view .vote-btn.on{color:#ff5a8a;background:rgba(255,90,138,.14)}
.info-view .ics-day-link{display:block;text-align:center;margin-top:10px;padding:11px;border-radius:12px;background:var(--ipanel);border:1px solid var(--iedge);color:var(--itext);text-decoration:none;font-weight:700;font-size:13px}
.info-view .info-row:last-child{border-bottom:0}
.info-view .info-row .t{font-variant-numeric:tabular-nums;font-weight:800;font-size:12.5px;color:var(--imuted);line-height:1.25}
.info-view .info-row .n{font-family:var(--font-clear);font-weight:800;text-transform:uppercase;font-size:20px;letter-spacing:.005em;line-height:1;overflow-wrap:anywhere}
.info-view .info-row .note{display:block;font-size:11px;color:var(--imuted);font-weight:600;margin-top:3px}
.info-view .info-row.now{background:linear-gradient(90deg,rgba(193,90,214,.24),rgba(193,90,214,.04))}
.info-view .info-row.now .n,.info-view .info-row.now .t{color:var(--iaccent2)}
.info-view .bnow{display:inline-block;font-size:9.5px;font-weight:900;letter-spacing:.09em;background:var(--iaccent);color:#fff;padding:2px 7px;border-radius:6px;margin-left:8px;vertical-align:2px;font-family:var(--body,system-ui)}
.info-view .info-empty{padding:22px 16px;color:var(--imuted);font-size:13px;text-align:center}
/* Karten: 2027 / Charity */
.info-view .info-card{border-radius:18px;padding:18px;margin-top:14px}
.info-view .info-card .k{font-size:11px;letter-spacing:.18em;text-transform:uppercase;font-weight:800}
.info-view .info-promo{background:linear-gradient(150deg,#3c2b0f,#241a2e);border:1px solid rgba(255,207,90,.42)}
.info-view .info-promo .k{color:var(--igold)}
.info-view .info-promo h3{font-family:var(--font-clear);font-weight:800;text-transform:uppercase;font-size:27px;margin:6px 0 5px;line-height:.98}
.info-view .info-promo p{color:#e9dcc4;font-size:13px;margin:0 0 12px;line-height:1.45}
.info-view .promo-poster-link{display:block}
.info-view .promo-poster{display:block;width:100%;height:auto;border-radius:10px;border:1px solid rgba(255,207,90,.35)}
.info-view .promo-cap{color:#f0e4c8;font-size:12.5px;line-height:1.4;margin:11px 0 12px;text-align:center}
.info-view .promo-cap b{color:var(--igold)}
.info-view .code{display:inline-block;font-weight:900;letter-spacing:.09em;border:1px dashed var(--igold);color:var(--igold);padding:6px 13px;border-radius:9px;margin-bottom:13px;font-size:14px}
.info-view .info-charity{background:var(--ipanel);border:1px solid var(--iedge)}
.info-view .info-charity .k{color:var(--iaccent2)}
.info-view .info-charity h3{font-family:var(--font-clear);font-weight:800;text-transform:uppercase;font-size:25px;margin:6px 0 6px;line-height:1}
.info-view .info-charity p{color:var(--imuted);font-size:13px;margin:0 0 13px;line-height:1.45}
.info-view .info-btn{display:block;text-align:center;text-decoration:none;font-weight:900;text-transform:uppercase;letter-spacing:.04em;padding:14px;border-radius:12px;font-size:15px}
.info-view .btn-gold{background:linear-gradient(180deg,#ffd76a,#eaa61f);color:#241800}
.info-view .btn-accent{background:linear-gradient(180deg,var(--iaccent),#8e35a6);color:#fff}
/* Spenden-Karte (GiroCode) */
.info-view .info-spende{background:linear-gradient(160deg,#241441,#160c22);border:1px solid var(--iedge2);text-align:center}
.info-view .info-spende .k{color:var(--iaccent2)}
.info-view .info-spende h3{font-family:var(--font-clear);font-weight:800;text-transform:uppercase;font-size:23px;margin:6px 0 6px;line-height:1.02}
.info-view .info-spende p{color:var(--imuted);font-size:13px;margin:0 0 15px;line-height:1.45}
.info-view .spende-qr{width:min(258px,74vw);margin:0 auto 13px;padding:14px;background:#fff;border-radius:16px;box-shadow:0 12px 28px rgba(0,0,0,.45)}
.info-view .spende-qr .qr{line-height:0}
.info-view .spende-qr canvas,.info-view .spende-qr img{width:100%!important;height:auto!important;display:block}
.info-view .spende-scan{font-size:13.5px;font-weight:700;color:var(--itext);margin-bottom:12px}
.info-view .spende-scan b{color:var(--iaccent2);font-weight:900}
.info-view .spende-iban{color:var(--imuted);font-size:12.5px;line-height:1.5}
.info-view .spende-iban b{display:block;color:var(--itext);font-size:15px;font-weight:800;letter-spacing:.5px;font-variant-numeric:tabular-nums;margin-top:3px}
.info-view .spende-foot{margin-top:12px;font-size:10.5px;letter-spacing:.09em;text-transform:uppercase;color:var(--imuted);font-weight:700;opacity:.72}
/* Kachel-Paar */
.info-view .info-grid2{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:14px}
.info-view .info-tile{background:var(--ipanel);border:1px solid var(--iedge);border-radius:14px;padding:15px;text-decoration:none;color:var(--itext);display:block}
.info-view .info-tile .ti{font-family:var(--font-clear);font-weight:800;text-transform:uppercase;font-size:17px}
.info-view .info-tile .td{color:var(--imuted);font-size:11.5px;margin-top:4px;line-height:1.35}
.info-view .info-grid2.one{grid-template-columns:1fr}
.info-view .menu-card{display:block;position:relative;margin-top:10px;border:1px solid var(--iedge);border-radius:14px;overflow:hidden;text-decoration:none;line-height:0}
.info-view .menu-card img{display:block;width:100%;height:auto}
.info-view .menu-tap{position:absolute;left:0;right:0;bottom:0;background:linear-gradient(transparent,rgba(0,0,0,.78));color:#fff;font-size:11px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;text-align:center;padding:20px 12px 9px;line-height:1.2}
.info-view .menu-note{color:var(--itext);font-size:13.5px;text-align:center;margin:12px 4px;line-height:1.4}
.info-view .menu-note b{color:var(--igold)}
.info-view .info-food{background:var(--ipanel);border:1px solid var(--iedge);border-radius:14px;margin-top:14px;overflow:hidden}
.info-view .food-summary{list-style:none;cursor:pointer;padding:15px 42px 15px 15px;position:relative}
.info-view .food-summary::-webkit-details-marker{display:none}
.info-view .food-summary .ti{display:block;font-family:var(--font-clear);font-weight:800;text-transform:uppercase;font-size:17px}
.info-view .food-summary .td{display:block;color:var(--imuted);font-size:11.5px;margin-top:4px}
.info-view .food-chev{position:absolute;right:16px;top:50%;transform:translateY(-50%);color:var(--imuted);font-size:16px;transition:transform .2s}
.info-view .info-food[open] .food-chev{transform:translateY(-50%) rotate(180deg)}
.info-view .food-body{padding:2px 12px 14px}
.info-view .drinks-card{background:#0d0a12;border:1px solid var(--iedge);border-radius:12px;padding:15px 16px 13px;margin-top:10px}
.info-view .drinks-title{font-family:'New Rocker',Impact,Haettenschweiler,sans-serif;font-size:28px;text-align:center;margin-bottom:12px;line-height:1}
.info-view .drinks-list{display:flex;flex-direction:column}
.info-view .drink{display:flex;align-items:baseline;gap:9px;font-size:14.5px;padding:7px 0;border-bottom:1px solid rgba(255,255,255,.07)}
.info-view .drink:last-child{border-bottom:0}
.info-view .drink .dn{text-transform:uppercase;font-weight:700;letter-spacing:.01em}
.info-view .drink .dz{color:var(--imuted);font-size:10.5px;white-space:nowrap}
.info-view .drink .dp{margin-left:auto;color:var(--igold);font-weight:800;white-space:nowrap;font-variant-numeric:tabular-nums}
.info-view .drinks-foot{text-align:center;color:var(--imuted);font-size:11.5px;margin-top:12px;text-transform:uppercase;letter-spacing:.06em}
/* Sponsoren (adaptiv: helle Logos auf dunkler Kachel, dunkle Logos auf weißem Feld) */
.info-view .info-sponsors{display:flex;flex-wrap:wrap;gap:8px}
.info-view .info-sponsors .isp{flex:1 1 28%;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.05);border:1px solid var(--iedge);border-radius:10px;padding:9px;min-height:54px}
.info-view .info-sponsors .isp img{max-width:100%;max-height:36px;width:auto;height:auto;object-fit:contain}
.info-view .info-sponsors .isp img.on-light{background:#fff;border-radius:6px;padding:4px 6px;max-height:44px}
.info-view .info-sponsors .isp-none{flex:1 1 100%;text-align:center;color:var(--imuted);font-size:13px;padding:8px}
/* Verlinkte Logos sind <a> statt <span> (Idee 14) – optisch identisch, damit die Kachelreihe ruhig
   bleibt: ob ein Sponsor eine Website hinterlegt hat, ist keine Aussage über ihn. */
.info-view .info-sponsors a.isp{text-decoration:none;-webkit-tap-highlight-color:transparent}
.info-view .info-sponsors a.isp:active{border-color:var(--iaccent)}
/* Footer */
.info-view .info-foot{margin-top:30px;text-align:center;color:var(--imuted);font-size:12px;line-height:1.7}
.info-view .info-foot a{color:var(--iaccent2);text-decoration:none;font-weight:700}
.info-view .info-foot .soc{display:flex;gap:9px;justify-content:center;margin-bottom:11px}
.info-view .info-foot .soc a{border:1px solid var(--iedge2);border-radius:11px;padding:9px 15px;font-size:13px}
.info-view .info-foot b{color:var(--iaccent2)}


/* ===== 10) Smartphone / schmale Screens ===== */
@media(max-width:820px){
  /* FOH: alles einspaltig – nichts läuft rechts über */
  .foh-view .dashboard,.foh-view .lower-grid{grid-template-columns:1fr}
  .foh-view .lower-grid .card:last-child{grid-column:auto}
  .foh-view .day-tabs{flex-wrap:wrap}
  .foh-view .day-tabs button{min-width:0;flex:1 1 44%}
  .foh-view .quick-actions{grid-template-columns:1fr 1fr}

  /* Public: scrollbar statt fixer Kiosk-Höhe → volle Running Order + Sponsoren sichtbar */
  html{overflow-y:auto;-webkit-overflow-scrolling:touch}
  body.public-view.kiosk{overflow:visible!important;overflow-x:hidden;height:auto;min-height:100%;touch-action:pan-y!important;-webkit-overflow-scrolling:touch;overscroll-behavior:auto;position:static}
  .public-view .display{height:auto!important;min-height:100vh;overflow:visible!important;display:block;padding-bottom:2vw;touch-action:pan-y}
  .public-view .display-inner{overflow:visible!important;min-height:0}
  .public-view #publicSchedule{flex:none;overflow:visible;-webkit-mask-image:none;mask-image:none}
  .public-view .sponsorbar{position:static;height:auto;min-height:92px}
  .public-view.has-sponsors .display{padding-bottom:2vw}
}


/* ===== 11) Zeitmodell-UI: Verzug-Badge, Zugabe-Stepper, „verfügbar", effektive Zeit ===== */
.topbar-right{display:flex;gap:10px;align-items:center;flex-wrap:wrap;justify-content:flex-end}
.verzug-badge{display:inline-flex;align-items:center;font-weight:800;font-size:15px;padding:8px 14px;border-radius:999px;border:1px solid var(--line2);background:rgba(255,255,255,.05);font-variant-numeric:tabular-nums;white-space:nowrap}
.verzug-badge.v-ok{color:#7fd3a4;border-color:rgba(61,142,105,.4);background:rgba(61,142,105,.14)}
.verzug-badge.v-warn{color:#e0c274;border-color:rgba(194,160,84,.4);background:rgba(194,160,84,.14)}
.verzug-badge.v-bad{color:#e39a90;border-color:rgba(181,84,74,.45);background:rgba(181,84,74,.16)}
.verzug-badge input{width:58px;background:#111214;border:1px solid var(--line2);color:inherit;border-radius:6px;padding:2px 6px;font:inherit;font-weight:800}
.avail{color:var(--muted);font-size:14px;margin:4px 0 0;min-height:1.05em}
.encore-row{display:flex;align-items:center;gap:12px;margin-top:12px;padding:12px 14px;border:1px solid var(--line,rgba(255,255,255,.08));border-radius:12px;background:rgba(194,160,84,.06);flex-wrap:wrap}
.encore-row .enclbl{font-weight:800;color:#d8b45f;font-size:15px}
.encore-row [data-encore]{min-width:80px;text-align:center;font-size:17px;font-weight:800}
.encore-row .encbtn{min-height:0;padding:11px 16px;font-size:15px;font-weight:700;background:color-mix(in srgb,#c2a054 12%,#1e1e21);box-shadow:inset 0 0 0 1px rgba(194,160,84,.35);color:#f4ecd8;border:0;border-radius:10px;cursor:pointer}
.encore-row .encbtn:hover{filter:brightness(1.12)}
.hero-row{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.next-eff{display:block;color:var(--muted);font-size:.62em;font-weight:700;margin-top:3px;letter-spacing:.01em}


/* ===== 12) FOH-Cockpit-Redesign (2026-07-07) =====
   Running Order dauerhaft schmal in die linke Spalte (statt Nav-Reiter), Hauptbereich = Cockpit
   (Aktuelle Situation + Als Nächstes/Changeover/Nachricht + Protokoll), „Running Order bearbeiten"
   als von rechts einfahrende Schublade. Nur FOH – neutraler Regie-Look bleibt (Punkt 8). */

/* Sidebar: Logo oben · Running Order (scrollbar) in der Mitte · Verbindung/Uhr unten.
   Sidebar auf volle Höhe fixiert (sticky), damit bei vielen Bands (Sa = 11) die RO INNEN
   scrollt und Verbindung/Uhr unten sichtbar bleiben, statt aus dem Bild zu wachsen. */
.foh-view .app-shell{align-items:start}
.foh-view .foh-sidebar{gap:18px;overflow:hidden;position:sticky;top:0;height:100vh}
.foh-view .foh-sidebar .brand{flex:0 0 auto}
.foh-view .side-ro{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;gap:10px}
.foh-view .side-ro-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex:0 0 auto}
.foh-view .side-ro-head b{font-size:15px;letter-spacing:.05em;text-transform:uppercase;color:var(--muted)}
.foh-view .ro-edit-btn{min-height:0;padding:8px 12px;font-size:13px;font-weight:800;line-height:1;
  background:#1e1e21;box-shadow:inset 0 0 0 1px rgba(255,255,255,.12);border-radius:10px;white-space:nowrap}
.foh-view .side-ro #scheduleList{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;margin:0;padding-right:4px}
/* kompakte Zeilen für die schmale Spalte */
.foh-view .side-ro .ro-list li{padding:9px 11px;border-radius:12px;border-bottom:1px solid rgba(255,255,255,.06)}
.foh-view .side-ro .ro-list li b{font-size:15px;line-height:1.14}
.foh-view .side-ro .ro-list li span{font-size:12px;margin-top:3px}
.foh-view .side-ro .ro-list li small{font-size:11.5px;margin-top:2px;color:var(--muted)}
.foh-view .side-ro #scheduleList::-webkit-scrollbar{width:8px}
.foh-view .side-ro #scheduleList::-webkit-scrollbar-thumb{background:rgba(255,255,255,.14);border-radius:8px}
.foh-view .side-ro #scheduleList::-webkit-scrollbar-track{background:transparent}
.foh-view .foh-sidebar .connection{flex:0 0 auto;margin-top:0}

/* Cockpit: Protokoll unter dem Dashboard, in der Höhe begrenzt */
.foh-view .cockpit-log{margin-top:18px}
.foh-view .cockpit-log #log{max-height:230px;overflow-y:auto}

/* „Running Order bearbeiten" als Schublade (fährt von rechts ein) */
.drawer-backdrop{position:fixed;inset:0;z-index:60;background:rgba(3,4,8,.62);backdrop-filter:blur(2px);
  opacity:0;pointer-events:none;transition:opacity .25s ease}
.drawer-backdrop.open{opacity:1;pointer-events:auto}
.editor-drawer{position:fixed;top:0;right:0;bottom:0;z-index:61;width:min(580px,94vw);
  display:flex;flex-direction:column;gap:12px;padding:22px 24px 32px;overflow-y:auto;
  background:#141416;border-left:1px solid rgba(255,255,255,.10);box-shadow:-30px 0 80px rgba(0,0,0,.55);
  transform:translateX(102%);transition:transform .3s cubic-bezier(.4,0,.2,1);will-change:transform}
.editor-drawer.open{transform:translateX(0)}
.editor-drawer .drawer-head{display:flex;align-items:center;justify-content:space-between;gap:12px}
.editor-drawer .drawer-head h2{margin:0;font-size:22px}
.editor-drawer .drawer-close{min-height:0;padding:9px 13px;font-size:16px;line-height:1;
  background:#1e1e21;box-shadow:inset 0 0 0 1px rgba(255,255,255,.12);border-radius:10px}
.editor-drawer .ro-editor{margin:4px 0}
body.drawer-open{overflow:hidden}

/* Stage-Tech: einklappbares Protokoll */
.tech-view details.tech-log{padding:0}
.tech-view details.tech-log>summary{list-style:none;cursor:pointer;padding:18px 20px;display:flex;
  align-items:center;justify-content:space-between;gap:10px;font-weight:800}
.tech-view details.tech-log>summary::-webkit-details-marker{display:none}
.tech-view details.tech-log>summary:after{content:"▾";color:var(--muted);transition:transform .2s}
.tech-view details.tech-log[open]>summary:after{transform:rotate(180deg)}
.tech-view details.tech-log>summary h2{margin:0;font-size:20px}
.tech-view details.tech-log #log{padding:0 20px 18px;max-height:260px;overflow-y:auto}

/* Stage-Tech: beschrifteter Status + Verzug direkt unter der Uhr (Verzug antippbar) */
.tech-view .hero-row{gap:28px;align-items:flex-start;margin-top:8px}
.tech-view .statchip{display:flex;flex-direction:column;gap:6px}
.tech-view .statchip .stat-lbl{font-size:13px;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);font-weight:800}
.tech-view .statchip .phase{font-size:clamp(24px,2.6vw,38px);font-weight:900;color:var(--text);line-height:1;margin:0}
.tech-view .statchip .verzug-badge{align-self:flex-start;font-size:clamp(18px,1.9vw,25px);padding:9px 17px}
.tech-view .statchip .verzug-badge input{width:70px;font-size:.9em}

/* Stage-Tech: aktiver Song-Hinweis (Toggle) – Button leuchtet; nochmal drücken = Hinweis aus */
.tech-view .buttons.big button.warn.active{background:color-mix(in srgb,#d8b45f 34%,#1e1e21);box-shadow:inset 6px 0 0 #e6c56a,inset 0 0 0 2px rgba(216,180,95,.7),0 0 22px rgba(216,180,95,.30);color:#fff}

/* Schmale Screens: Sidebar sichtbar lassen (RO steckt dort), Cockpit zuerst */
@media(max-width:1050px){
  .foh-view .app-shell{display:flex;flex-direction:column;min-height:0;align-items:stretch}
  .foh-view .workspace{order:1}
  .foh-view .sidebar{display:flex;order:2;border-right:0;border-top:1px solid var(--line)}
  .foh-view .foh-sidebar{overflow:visible;position:static;height:auto}
  .foh-view .foh-sidebar .brand{display:none}
  .foh-view .side-ro{max-height:none}
  .foh-view .side-ro #scheduleList{max-height:50vh}
  .foh-view .connection{margin-top:12px}
  .editor-drawer{width:min(560px,100vw)}
}

/* =====================================================================
   Food HOCHKANT-Variante (Portrait 9:16) · food-hoch.html
   Gescopter Layer: greift NUR bei body.foodhoch (food.html quer bleibt unberührt).
   Gleiche Inhalte wie Food quer (Speisekarte-HTML + Info + NOL/Dose/2027);
   hier fürs Hochformat vergrößert und vertikal ausbalanciert.
   ===================================================================== */
/* Slides über die volle Höhe zentrieren */
.foodhoch #slides .slide{align-items:center}
/* Quer-Promo-Bilder (NOL/Dose/2027 sind 16:9): sitzen mittig, füllen die Breite,
   Letterbox oben/unten läuft auf dem Monitor-Hintergrund – bewusst, bis Hochkant-Assets da sind */
.foodhoch #slides .slide img{max-width:100%;max-height:100%;object-fit:contain}

/* --- Speisekarte fürs Hochformat: großzügiger, füllt die Höhe --- */
.foodhoch .slide-menu .menu-inner{padding:7vh 8vw}
.foodhoch .slide-menu .menu-title{font-size:clamp(80px,14vw,190px);margin-bottom:.55em}
.foodhoch .slide-menu .menu-list{width:min(900px,88vw);gap:clamp(20px,3.4vh,46px)}
.foodhoch .slide-menu .menu-row{font-size:clamp(40px,3.6vh,66px);gap:26px}
.foodhoch .slide-menu .ml{border-bottom-width:4px}
.foodhoch .slide-menu .menu-appetit{font-size:clamp(52px,11vw,104px);margin-top:1.05em}
.foodhoch .slide-menu .menu-foot{font-size:clamp(24px,2.8vh,36px);margin-top:1.2em;line-height:1.4}

/* --- Info-/Band-Slide fürs Hochformat --- */
.foodhoch .slide-info .slide-inner{padding:8vw}
.foodhoch .slide-info .s-now{font-size:clamp(24px,3.4vw,42px)}
.foodhoch .slide-info .stage-title{font-size:clamp(70px,12vw,168px)}
.foodhoch .slide-info .timer{font-size:clamp(120px,26vw,300px)}
.foodhoch .slide-info .s-next{font-size:clamp(30px,4.4vw,58px)}

/* =====================================================================
   Kopfbereich der Anzeige-Screens entzerren (2026-07-08) · nur Stage + Backstage.
   Die .badge (data-phase „Show läuft/Changeover") hatte KEIN Margin → klebte am
   Logo und am Kicker („Stage · Donnerstag" / „Jetzt auf der Bühne"). Regiepulte
   (foh/stage-tech) bewusst NICHT betroffen (nutzen .badge anders).
   ===================================================================== */
.band-view .screen-logo,.backstage-view .screen-logo{margin-bottom:clamp(16px,2.4vh,26px)}
.band-view .badge,.backstage-view .badge{margin:clamp(12px,1.8vh,20px) 0}
.band-view .kicker{margin:0 0 clamp(12px,1.8vh,20px)}
.backstage-view .kicker{margin:clamp(8px,1.4vh,16px) 0 clamp(10px,1.6vh,18px)}
.band-view .stage-title{margin-bottom:clamp(6px,1.2vh,16px)}
/* Stage: „Stage · Tag" entfernt (Band weiß das) → freier Platz, Timer größer/dominanter */
.band-view .ultra-simple .timer,.band-view .timer.huge{font-size:clamp(130px,21vw,320px)}
/* Backstage: „Backstage"-Titel raus + Logo zentriert (§style.css oben) → linker Block als symmetrischer
   Stapel wie Stage; Bandname etwas größer, damit „wer spielt gerade" klar knallt */
.backstage-view .split-display h2{font-size:clamp(48px,6.6vw,104px)}

/* =====================================================================
   Changeover-Ansicht aufgeräumt (2026-07-08) · greift NUR im Umbau (body.is-changeover,
   gesetzt in renderCommon). WICHTIG: der laufende Betrieb bleibt unberührt — dort sind
   „Timer links" (Restspielzeit aktuelle Band) und „Ihr seid dran" (rechts, = Restzeit +
   Changeover) VERSCHIEDEN und beide nötig. Nur im Changeover fallen sie zusammen.
   Stage: „Umbaupause"-Riesentext raus (Badge „Changeover" reicht).
   Backstage: EINE zentrierte Spalte wie die Stage — Kacheln aus, „Bereit machen" dezent,
   Countdown NUR EINMAL (= Zeit bis nächste Band = „ihr seid dran"). Patron-Screens
   (public/biertresen/food) NICHT betroffen — dort bleibt „Umbaupause".
   ===================================================================== */
.cg-only{display:none}
.is-changeover .cg-only{display:block}
.band-view.is-changeover .stage-title{display:none}
.backstage-view.is-changeover .split-display{grid-template-columns:1fr}
.backstage-view.is-changeover .backstage-cards,
.backstage-view.is-changeover .kicker,
.backstage-view.is-changeover .split-display h2,
.backstage-view.is-changeover .band-logo-img,
.backstage-view.is-changeover .hint{display:none}
.backstage-view.is-changeover .cg-avail{color:var(--muted);text-transform:uppercase;letter-spacing:.06em;font-weight:600;font-size:clamp(16px,2vh,28px);margin:clamp(12px,2vh,24px) 0 2px}
.backstage-view.is-changeover .cg-next{font-family:var(--font-clear);text-transform:uppercase;letter-spacing:.03em;color:var(--muted);font-size:clamp(22px,2.8vh,40px);margin-top:clamp(12px,2vh,22px)}
.backstage-view.is-changeover .cg-next b{color:var(--text)}
/* „Bereit machen" dezenter (gilt auch im Running-Countdown der letzten 5 Min) */
.ready-banner.show{font-size:clamp(22px,3vw,42px);padding:10px 22px}
/* Changeover-Symmetrie: „Bereit machen" auf eine EIGENE, mittige Zeile (nicht neben das schmale
   „Changeover"-Badge) – sonst teilen sich Badge + grüner Balken eine zentrierte Inline-Zeile und
   die Kopfzeile kippt aus der Mittelachse (Badge links, Balken rechts). So steht der ganze Stapel
   Logo · Badge · „Bereit machen" · „Ihr seid dran" · Timer · „Gleich: …" sauber senkrecht mittig.
   Nur Backstage-Changeover; Running-Layout und alle anderen Screens bleiben unberührt. */
.backstage-view.is-changeover #readyBanner.show{display:flex;width:max-content;max-width:92%;margin:clamp(10px,1.6vh,18px) auto 0}

/* =====================================================================
   Song-Hinweis mit eigener Dringlichkeitsfarbe (2026-07-08) · NICHT die Timer-Ampel.
   Grün war irreführend („weiter so"), obwohl „Noch 1 Song" = „zum Ende kommen".
   Abstufung: „Noch 2 Songs" = Orange (Vorwarnung); „Noch 1 Song" + „Spielzeit abgelaufen"
   = Rot + leicht pulsierend. Klassen `hint-warn`/`hint-urgent` setzt renderCommon am Body
   (aus state.songHint). Nur Stage + Backstage — Regiepulte (foh/stage-tech) bleiben neutral. */
.band-view.hint-warn .hint,.backstage-view.hint-warn .hint{color:#ffbf2e}
.band-view.hint-urgent .hint,.backstage-view.hint-urgent .hint{color:#ff3d2e;animation:hintpulse 1.05s ease-in-out infinite alternate}
@keyframes hintpulse{from{opacity:1}to{opacity:.5}}

/* =====================================================================
   Public auf iPad / flachen Screens scrollbar machen (2026-07-15)
   Auf echten 16:9-TVs (Höhe 1080/1440 px) bleibt Public bewusst fixe
   Kiosk-Höhe (.kiosk = overflow:hidden + touch-action:none). Auf iPads
   (Querformat, 4:3, Höhe ≤1024 px) passt die volle Running Order nicht in
   die Höhe → der Rest war abgeschnitten UND per Touch nicht erreichbar.
   Bei begrenzter Viewport-Höhe daher Public scrollbar: Touch-Scroll
   erlauben, feste Höhe/Maske aus, Sponsorleiste fließt ans Ende.
   Greift NUR bei Höhe ≤1040 px (iPads/kleine Screens) → 1080/1440-TVs
   unberührt. Nur .public-view; andere Rollen bleiben Kiosk. */
@media (max-height: 1040px) {
  .public-view.kiosk{ overflow:visible; touch-action:auto; -webkit-overflow-scrolling:touch; }
  .public-view .display{ height:auto; min-height:100vh; overflow:visible; display:block; }
  .public-view .display-inner{ min-height:0; overflow:visible; }
  .public-view #publicSchedule{ flex:none; overflow:visible; -webkit-mask-image:none; mask-image:none; }
  .public-view .sponsorbar{ position:static; height:auto; min-height:92px; }
  .public-view.has-sponsors .display{ padding-bottom:16px; }
}

/* =====================================================================
   Dezente „Min"-Einheit an allen Countdowns/Timern (2026-07-15)
   Klarstellung, dass die großen MM:SS-Countdowns Minutenangaben sind:
   kleine, gedämpfte, leicht hochgestellte Einheit hinter der Zahl –
   per em proportional auf jedem Screen (groß auf der Stage, winzig im
   Guide). Greift auf ALLE [data-timer] (Stage/Backstage/Public/Regie/
   Slide-Info/Guide). Bei „gleich" (Changeover ohne Restzeit) blendet
   body.timer-word (renderCommon) die Einheit aus. */
[data-timer], [data-next-on].has-min{ white-space:nowrap; }
[data-timer]::after,
[data-next-on].has-min::after{
  content:"Min";
  font-size:.18em;
  font-weight:700;
  letter-spacing:.05em;
  color:var(--muted);
  opacity:.7;
  margin-left:.16em;
  vertical-align:.55em;
}
body.timer-word [data-timer]::after{ display:none; }

/* =====================================================================
   Backstage handytauglich (2026-07-15) · greift NUR ≤820px (Handy) – TVs unberührt.
   Vorher kaputt: der feste 2-Spalten-Grid (.split-display) quetschte die linke
   Spalte auf ~15px → Bandname brach Buchstabe für Buchstabe senkrecht; Kiosk
   (overflow:hidden + touch-action:none) verhinderte Scrollen → die Kacheln unter
   dem Rand waren unerreichbar. Jetzt: einspaltig gestapelt, scrollbar, Bandname
   waagerecht, Kacheln volle Breite. Fließend für alle iPhone-Größen. */
@media (max-width: 820px) {
  .backstage-view.kiosk{ overflow:visible; touch-action:auto; -webkit-overflow-scrolling:touch; }
  .backstage-view .display{ display:block; height:auto; min-height:100vh;
    padding:6vw 5vw calc(8vw + env(safe-area-inset-bottom)); }
  .backstage-view .display-inner.split-display{ display:flex; flex-direction:column; gap:5vw; align-items:stretch; }
  .backstage-view .split-display > section{ width:100%; }
  .backstage-view .split-display > section:first-child{ text-align:center; }
  .backstage-view .screen-logo{ height:clamp(38px,10vw,58px); margin:0 auto 3vw; }
  .backstage-view .split-display h2{ font-size:clamp(38px,10vw,62px); line-height:1.05; letter-spacing:.005em; margin:2vw 0; }
  .backstage-view .timer{ font-size:clamp(64px,19vw,118px); line-height:.95; }
  .backstage-view .backstage-cards{ display:flex; flex-direction:column; gap:3.5vw; text-align:left; }
  .backstage-view .backstage-cards > div{ padding:4.5vw 5vw; border-radius:18px; }
  .backstage-view .backstage-cards span{ font-size:12px; letter-spacing:.06em; }
  .backstage-view .backstage-cards b{ font-size:clamp(26px,6.8vw,40px); line-height:1.1; }
  .backstage-view .ready-banner.show{ font-size:clamp(20px,5.5vw,30px); }
}

/* =====================================================================
   Off-Season-Ansicht des Besucher-Guides (2026-07-16)
   ---------------------------------------------------------------------
   Der Guide ist 51 Wochen im Jahr off-season und nur an den vier
   Festivaltagen live. Off-Season ist darum der Default (normalize() in
   server.js); die Regie schaltet im FOH um (state.guideMode → body.offseason).
   Greift ausschliesslich bei gesetzter body.offseason: die Live-Ansicht
   bleibt unberuehrt.
   ===================================================================== */
.info-view .os-only{ display:none; }
.info-view.offseason .os-only{ display:revert; }
.info-view.offseason .live-only{ display:none; }

/* Was auf dem Gelaende hilft, ist danach sinnlos oder schlicht falsch:
   der Live-Block behauptet sonst „Jetzt auf der Buehne: DOORS OPEN". */
.info-view.offseason .info-live,
.info-view.offseason .info-sec-ro,
.info-view.offseason .info-food,
.info-view.offseason .info-grid2{ display:none; }

/* Spende nach oben. .info-wrap ist sonst ein Blockcontainer – hier kurz Flex,
   damit order greift. Alle Bausteine nutzen nur margin-top, es kollabiert
   also nichts, was der Blockfluss vorher zusammengezogen haette.
   .info-hdr bleibt ohne order (=0) ganz oben. */
.info-view.offseason .info-wrap{ display:flex; flex-direction:column; }
.info-view.offseason .info-thanks{ order:1; }
.info-view.offseason .info-spende{ order:2; }
.info-view.offseason .info-promo{ order:3; }
.info-view.offseason .info-charity{ order:4; }
.info-view.offseason .info-archive{ order:5; }          /* Rückblick: nach Charity, vor den Partnern */
.info-view.offseason .info-sec-sponsors{ order:6; }
.info-view.offseason .info-foot{ order:7; }

/* Danke-Karte: gleiche Sprache wie die anderen Karten, nur ruhiger. */
.info-view .info-thanks{ background:var(--ipanel); border:1px solid var(--iedge); text-align:center; }
.info-view .info-thanks .k{ color:var(--iaccent2); }
.info-view .info-thanks h3{ font-family:var(--font-clear); font-weight:800; text-transform:uppercase; font-size:23px; margin:6px 0 6px; line-height:1.02; }
.info-view .info-thanks p{ color:var(--imuted); font-size:13px; margin:0; line-height:1.45; }

/* Vereinskarte: PDF-Hinweis + Link auf die Spendenübersicht (2026-07-17).
   Der Button führt auf /der-verein/ (Beitrittserklärung als PDF, keine Spendenmöglichkeit) –
   der Hinweis kündigt den Medienbruch an, damit am Handy niemand in die Sackgasse läuft. */
.info-view .charity-note{ margin-top:9px; text-align:center; font-size:11px; line-height:1.45; color:var(--imuted); opacity:.85; }

/* Notfall-/Unwetter-Broadcast (2027): eigener Vollbild-Kanal, unabhängig vom grünen Durchsage-Banner.
   z-index über dem PIN-Overlay (100) — auch ein nicht eingeloggtes FOH/Stage-Tech muss das sofort sehen.
   Läuft auf ALLEN Screens inkl. Regie (data-alert-Markup steckt in allen 9 Screen-Seiten). */
.alert-overlay{position:fixed;inset:0;z-index:120;display:flex;align-items:center;justify-content:center;
  padding:5vh 5vw;background:radial-gradient(120% 100% at 50% 0%,#7a0d10,#2a0403 72%);text-align:center}
.alert-box{max-width:900px;padding:clamp(24px,4vw,54px) clamp(20px,5vw,60px);border-radius:22px;
  background:linear-gradient(180deg,rgba(30,4,4,.92),rgba(12,2,2,.94));
  border:3px solid #ff3d2e;box-shadow:0 0 0 8px rgba(255,61,46,.14),0 20px 60px rgba(0,0,0,.6);
  animation:alertpulse 1.6s ease-in-out infinite}
.alert-badge{display:inline-block;font-family:var(--font-clear);font-weight:800;letter-spacing:.08em;
  text-transform:uppercase;font-size:clamp(15px,2.2vw,22px);color:#ffbf2e;margin-bottom:clamp(10px,2vh,20px)}
.alert-text{font-family:var(--font-clear);font-weight:800;color:#fff;line-height:1.25;
  font-size:clamp(22px,4.4vw,52px);word-break:break-word}
.alert-time{margin-top:clamp(10px,2vh,18px);font-size:clamp(12px,1.6vw,16px);color:rgba(255,255,255,.68);
  font-variant-numeric:tabular-nums}
@keyframes alertpulse{0%,100%{box-shadow:0 0 0 8px rgba(255,61,46,.14),0 20px 60px rgba(0,0,0,.6)}50%{box-shadow:0 0 0 16px rgba(255,61,46,.04),0 20px 60px rgba(0,0,0,.6)}}
/* Regiepulte: Overlay im Fluss statt Vollbild-Blackout — FOH/Stage-Tech müssen währenddessen weiter bedienen können. */
.foh-view .alert-overlay,.tech-view .alert-overlay{position:static;padding:0;margin:0 0 16px;background:none;display:block}
.foh-view .alert-box,.tech-view .alert-box{max-width:none;padding:16px 20px;border-radius:14px}
.foh-view .alert-text,.tech-view .alert-text{font-size:clamp(18px,2vw,26px)}
.info-view .charity-more{ display:block; margin-top:13px; padding-top:12px; border-top:1px solid var(--iedge); text-align:center; font-size:13px; font-weight:700; color:var(--iaccent2); text-decoration:none; }
